一、函数引入
例:微信红包排序
主要功能:输入N个红包金额,输出N个红包,N个红包按照金额排序,输出排序后的N个红包。
问题分析
(源代码)
(运行结果截图)
问题:
解决的方法:用模块化程序设计的思路
(源代码)
主函数与程序模块之间的关系
二、函数基础知识
(一)库函数和自定义函数
C系统中函数分为两大类,分别是库函数(标准函数)和自定义函数。
1.库函数
常见的头文件
2.自定义函数
注意
(二)函数定义
1.为什么要定义函数
2.定义函数的方法
说明
例:用函数实现微信红包排序程序代码
(源代码)
(运行结果截图)
3.编程经验
4.常见错误
(三)函数声明
说明
三、函数的调用和返回
(一)函数的调用
1.函数调用格式
说明
函数调用形式
(1)函数调用语句
例
(2)函数表达式
(3)函数参数
(二)return语句和函数类型
return语句的一般格式
说明
例:用二分法查找一个红包
问题分析
编程思路
(源代码)
(运行结果截图)
说明:本例使用两个return语句,返回不同情况
常见编程错误:对于数组作为形参,注意数组起点下标是0,不是1.所以返回位置是从0开始的。
编程经验:在编写有返回值函数时,函数最好只有一条return语句,避免出现返回值错误。
四、函数的参数
C语言函数之间有两种传递参数的方法:值传递、地址传递
(一)值传递
例1:计算排列数Pnm
问题分析
(源代码)
运行过程
(运行结果截图)
说明
编程经验
(二)地址传递
例:从键盘输入两个数,调用函数将两个数交换
问题分析
(源代码)
(运行结果截图)
说明
常见编程错误
编程经验
(三)数组作函数参数
例:编写程序,接受用户输入的一行字符(不超过80个字符),将其中出现字母转成大写字母,其它字符不变。
方法一:数组元素作参数
问题分析
(源代码)
(运行结果截图)
方法二:数组名作参数
问题分析
(源代码)
(运行结果截图)
运行过程
·在函数transform执行时,通过实参地址数据的传递,形参被临时分配内存单元。
·在函数transform执行时,将数组ptr内字符小写字母转换成大写字母。
·函数调用结束时,形参分配空间被收回
说明
常见编程错误
编程经验
五、函数的嵌套和递归
(一)函数的嵌套调用
执行过程
例:输入4个整数,用函数的嵌套调用找出其中最大的数
编程思路
(源代码)
(运行结果截图)
(二)函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。
1.直接递归
2.间接递归
注意
在写递归程序中,一定要有递归结束条件,应使用if语句控制结束调用,否则,无限制递归,终将使栈内存空间溢出。
例:计算某个整数的阶乘
问题分析
(源代码)
(运行结果截图)
执行流程
常见编程错误
编程经验
六、变量和函数的作用域
(一)全局变量与局部变量
1.全局变量
说明
2.局部变量
说明
C语言中允许在函数或程序块内定义与全局变量重名的变量。在不同的作用域内,允许对某个变量进行重新定义。
例:10个职工的年龄存放在一维数组,写一个函数求职工的最大年龄、最小年龄和平均年龄。
问题分析
(源代码)
(运行结果截图)
编程经验
·建议不在必要时不要使用全局变量
·编程时提倡多使用局部变量
(二)变量的存储类别
动态存储方式与静态存储方式
从变量的作用域的角度来观察,变量可以分为全局变量和局部变量。
从变量值存在的时间(即生存期)观察,变量的存储有两种不同的方式:静态存储方式和动态存储方式。
静态存储区:全局变量和局部static变量存放在静态存储区中。
程序开始执行时给全局变量和局部static分配存储区,程序执行完毕就释放。在程序执行过程中占据固定的存储单元。
动态存储区:
(1)函数形式参数
(2)函数中定义的没有用关键字static声明的变量
(3)函数调用时的现场保护和返回地址等存放在动态存储区
函数调用开始时分配,函数结束时释放。在程序执行过程中,这种分配和释放是动态的。
局部变量的存储类别
每一个变量和函数都有两个属性:数据类型和数据的存储类别。
存储类别包括:自动的、静态的、寄存器的、外部的。
根据变量的存储类别,可以知道变量的作用域和生存期。
1.自动变量(auto变量)
2.静态局部变量(static局部变量)
auto类型变量和static类型变量的区别
注意:若非必要,不要多用静态局部变量
3.寄存器变量(register变量)
全局变量的存储类别
全局变量都是存放在静态存储区中的。因此它们的生存期是固定的,存在于程序的整个运行过程。
一般来说,外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本文件的末尾。在此作用域内,全局变量可以为本文件中各个函数所引用。
1.在一个文件内扩展外部变量的作用域
例:调用函数,求三个整数中的大者。
编程思路
(源代码)
(运行结果截图)
2.将外部变量的作用域扩展到其他文件
例:给定b的值,输入a和m,求a*b和am的值
编程思路
(源代码)
(运行结果截图)
3.将外部变量的作用域限制在本文件中
说明
用static声明一个变量的作用
注意
(三)内部函数和外部函数
函数按其存储类别可以分为两类:内部函数和外部函数
1.内部函数
内部函数的作用域只限于定义它的文件,在同一个程序的不同文件中可以有相同命名的函数,它们互不干扰,提高了程序的可靠性。
2.外部函数
如果定义时没有声明函数的存储类型,系统默认为extern型。
例:输入一个字符,将字符串中该字符删去。用外部函数实现。
编程思路
(源代码)
(运行结果截图)
编程经验
七、综合示例
例:微信红包管理系统
主要功能
问题分析
流程图
(源代码)
(运行结果截图)
八、函数常见错误
例1:编写函数实现两个整数之和
问题:定义函数时,函数头后面多加了分号
修改后
例2:编写函数实现两个整数的最大值
问题:定义函数时,形参前没写类型
修改后
例3:编写函数求10个红包的平均值
问题:调用函数前没声明函数
修改后
例4:编写函数实现指定整数的阶乘
问题:调用函数时实参前面多加类型
修改后
例5:编写函数对10个红包排序
问题:数组名作形式参数时,缺[ ]或多维数组缺第一维之后的维度大小
问题:数组名作实在参数时,多谢了下标
修改后
例6:编写函数交换两个整数
问题:调用函数时实在参数必须是变量的地址,数组名或指针类型
修改后
该文章属于个人课后学习笔记,内容来源于知到智慧树共享课-C语言程序设计(上海电力大学)。