| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言学习-函数(3) -> 正文阅读 |
|
[C++知识库]C语言学习-函数(3) |
目录 思维导图:1. 函数是什么?函数就是子程序,就是一个大型程序中的部分代码,并具有相对独立性。 2. C语言中函数的分类:2.1 库函数:标准库-提供了C语言相关的库函数 那为什么要有库函数呢? 在编程的过程中,我们总是会用到printf去打印一个数; 或者是经常会用到scanf去输入一些值。 拥有了库函数,程序员就不用每次使用这些值得时候去写程序,直接调用库函数就行, 这样就大大提高了编写代码的效率。 2.1.1 如何学会使用库函数?cplusplus.com - The C++ Resources Networkhttps://legacy.cplusplus.com/这里推荐一个可以学习C语言库函数的网站。
?我们参照网站的文档,可以学习库函数。 ?这是库string.h中的函数。 ?我们可以看到它的返回类型是char*类型的指针,函数名是strcpy,需要传两个char*类型的参数。 通过它的描述,我们可以得知这个函数是将字符source拷贝到‘目的地’destination,包括‘\0’字符。 ? 这是对两个参数的具体解释。 ?函数的返回值是destination这个字符。 这样我们就大致了解了这个函数,可以进行简单的应用了。
打印出来的结果是:
当然,这并不代表我们已经精通这个函数了,重要的是多加练习。 2.2 自定义函数不过,比库函数更重要的是自定义函数,顾名思义,这需要我们自己来设计函数。 比如说:我想设计一个函数找出两个整数的最大值:
输出的结果是:
这就是一个函数的基本形式。 再举一个例子: 设计一个函数交换两个整形变量的值:
?但是输出的结果是:
我们发现它并a和b没有交换各自的值,究竟是为什么呢? 这就要说到函数的参数。 3. 函数的参数3.1 实际参数(实参):我们传给函数的参数是实参;实参可以是:常量、变量、表达式、函数等。 但实参一定要是一个确切的数。 3.2 形式参数(形参):形参是指函数名后面,接收我们传过去的参数的参数。 形式参数当函数调用完成之后就会自动销毁,类似于局部变量,形参只在函数内生效。 而且形参在创建时会拥有自己的内存空间,并拥有实参的内容,这也是上文出错的原因, 总结:所以形参可以被看成是实参的一份临时拷贝。 那我们该如何实现上文的那个函数呢? 这就要说到函数的调用规则了: 4. 函数的调用:4.1 传值调用函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。 4.2 传址调用这种传参方式可以让函数和函数外边的变量建立起真正的联系, 也就是函数内部可以直接操作函数外部的变量,也就是实现所谓的远程操控。
输出的结果:
这样就能成功交换a和b的值了。 4.3 练习趁热打铁,练习是巩固新知的最好方法。 1. 写一个函数判断一个数是不是素数:
输出结果:
2. 写一个函数判断一年是不是闰年:
输出结果:
3.??写一个函数,实现一个整形有序数组的二分查找:
输出结果:
4.?写一个函数,每调用一次这个函数,就会将 num 的值增加1
输出结果:
5. 函数的嵌套调用和链式访问、函数与函数之间是可以互相调用的。 5.1 嵌套调用例:
输出结果:
注:函数可以嵌套调用但是不能嵌套定义。 5.2 链式访问例:
?你们可以猜猜输出的结果是什么? 输出结果:
为什么会出现这种情况呢? 其实,在不同的编译器会有不同的结果,在VS2019这个编译器中 printf函数的返回值是打印在屏幕上的字符的个数。 6. 函数的声明和定义6.1 函数声明:1. 函数的声明就是告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。 2. 函数的声明一般出现在函数的使用之前,函数需要先声明再使用。 3. 函数的声明一般放在头文件。 例:
输出结果:
6.2 函数定义:函数的定义是指函数的具体实现。 例:
输出结果:
拓展: 变量也遵循类似的规则:
输出结果:
以上是函数定义的基本规则,那函数定义与声明的应用场景是什么呢? 我们将主函数放在11_1.c源文件中。(这是我的测试模块) 引了头文件后我们就能正常使用函数了 。 将函数的实现放在add.c源文件中,函数定义放在add.h头文件中。(加法模块) ? ?这样做有些什么好处呢? 1. 可以实现模块化开发,也就是分工: 在一个大的项目中,例如实现一个计算器,可以一个程序员写加法,另一个写减法,提高效率。 2. 可以实现代码的隐藏。 7. 函数递归7.1 什么是递归程序调用自身的编程技巧称为递归。(即函数自己调用自己) 递归能将一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 只需少量的程序就可描述出解题过程所需要的多次重复计算,从而大大地减少程序的代码量, 递归的主要思考方式在于:把大事化小。 例:
输出结果:
这是一种错误的递归。 这段代码打印到最后,程序会挂掉: ?编译器提醒:Stack overflow(意思是:栈溢出) 那什么是栈溢出呢? 我曾在初识C语言中提到过内存的三个分区: 然后程序就挂了。 那怎样才能写出一个正确的递归呢?? 7.2 递归的两个必要条件1. 存在限制条件,当满足这个限制条件的时候,递归便不再继续。 2. 每次递归调用之后越来越接近这个限制条件。 我们通过练习来感受递归是怎么使用的。 7.2.1 练习1:接受一个无符号整形,按照顺序打印它的每一位: 例如:输入:1234? ?打印:1 2 3 4
输出结果:
分析: 7.2.2 练习2:编写函数求字符串的长度:(模拟实现strlen函数)
输出结果:
这个代码通过创建临时变量count,记录字符数。 如果不允许创建临时变量,又该怎么做呢?
输出结果:
其实这个代码的原理与练习1的是相同的,这就是函数递归的思考方式与应用。 7.3 递归与迭代有些时候,我们遇到的问题可能递归并不好用了 7.3.1 练习3:求n的阶乘:
输出结果:
(弊端)但是,如果要计算的值太大,函数调用太多,会导致栈溢出。 7.3.2 练习4:求第n个斐波那契数:
输出结果:
为什么会出现这样的结果呢? 因为使用递归来求效率太低了。?? 因此,我们可以用迭代来求,其实迭代可以简单理解成除递归以外的方法(循环)
输出结果:
总结: 1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。 2. 许多问题的迭代实现比递归实现效率更高,但是递归的形式更容易理解。 3. 如果问题太复杂,用迭代实现代码量太多,用递归实现会更简洁(补偿代码效率低的缺点)。 写在最后:以上就是本篇文章的内容了,感谢你的阅读。 如果喜欢本文的话,欢迎点赞和评论,写下你的见解。 如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。 之后我还会输出更多高质量内容,欢迎收看。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 14:36:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |