导图社区 C语言函数
C语言函数思维导图。该导图介绍了用函数实现模块化程序设计。其中包含了为什么要用函数、怎么定义函数、调用函数等。
编辑于2021-06-13 14:59:47C语言
1. 程序设计和C语言
2. 算法
3. 顺序程序设计
4. 选择结构程序设计
5. 循环结构程序设计
6. 利用数组处理批量数据
7. 用函数实现模块化程序设计
7.1. 为什么要用函数
7.1.1. 模块化程序设计思路
7.2. 怎样定义函数
7.2.1. 为什么要定义函数
先定义后使用
定义函数应包含
函数的名字
函数的返回值类型
函数的参数名字和类型
功能
7.2.2. 定义函数的方法
定义无参函数
类型名 函数名() { 函数体 }
void类型表示没有函数值
定义有参函数
类型名 函数名(形式参数表列) { 函数体 }
return(z)表示将z的值作为函数返回值带回主调函数
定义空函数
类型名 函数名() { }
7.3. 调用函数
7.3.1. 函数调用的形式
一般形式:函数名(实参表列)
函数调用语句
把函数调用单独作为一个语句——不要求函数带回返回值
函数表达式
函数调用出现在另一个语句中,如c=max{a,b}——要求函数带回一个确定的值以参加表达式的运算
函数参数
函数调用作为另一个函数调用时的实参,如m=max(a,max(x,y))
7.3.2. 函数调用时的数据传递
形式参数和实际参数
形参:定义函数时,函数名后面括号中的变量名称
实参:在主函数中调用函数时,函数名后面括号里的参数(常量、变量、表达式)
实参和形参间的数值传递
在调用函数时,系统把实参的值传递给被调用函数的形参(形参从实参得到一个值)
7.3.3. 函数调用的过程
形参未被调用时不占内存
单向值传递,实参给形参
返回值的类型与函数类型一致
void类型不需要返回值
调用结束,形参单元释放
7.3.4. 函数的返回值
函数返回值通过return语句获得
一个函数可以有多个return语句
return后面括号可要可不要
return后面的值可以是一个表达式
返回值的类型应在定义函数时明确
函数类型决定返回值类型
void类型不带回返回值,不得出现return
7.4. 对被调用函数的声明和函数原型
7.4.1. 在一个函数中调用另一个函数
被调用函数必须已定义
使用库函数需用#include
自己定义的函数,被调用的函数应在调用它的函数的后面,且要在主调函数中作声明
7.4.2. 函数原型:函数的首行,一般用函数原型作为函数声明
函数声明比函数定义中的首行多了个分号
7.4.3. 函数声明
函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,……参数类型n 参数名n);
函数类型 函数名(参数类型1,参数类型2,参数类型3);
7.5. 函数的嵌套调用
7.5.1. 函数定义互相平行、独立,不能嵌套定义
7.5.2. 递推方法——输入4个整数,找出其中的最大值
7.6. 函数的递归调用
7.6.1. 调用函数过程中,直接或间接地调用该函数本身(应用if语句控制其结束,否则无终止)
7.6.2. 分为回溯和递推两个阶段
7.6.3. 例子
求n!
放盘子
7.7. 数组作为函数参数
7.7.1. 数组元素作函数实参
数组元素可做函数实参,不可做形参
从实参到形参,单向值传递
例子:输入10个数,要求输出最大的值的元素,和它是第几个数
7.7.2. 一维数组名作函数参数
数组名可以做形参或实参,传递的是第一个元素的地址
例子
一维数组score内存放10个学生成绩,要求输出
#include<stdio.h> float FindAver(float score[],int n); int main() { float score[10],ever; int i; for(i=0;i<10;i++) { scanf("%f",&score[i]); } ever=FindAver(score,10); printf("aver = %5.2f\n",ever); for(i=0;i<10;i++) { if(score[i]>ever) { printf("score = %5.2f\n",score[i]); } } } float FindAver(float score[],int n) { int i; float sum=0; for(i=0;i<=n;i++) { sum+=score[i]/(float)n; } return sum; }
用选择法对10个整数从小到大排序
#include<stdio.h> int main() { void sort(int a[10],int n); //声明函数 int a[10]; //定义变量 int i; printf("\n请输入十个整数(中间用空格相隔) \n"); for(i=0;i<10;i++) //输入数据 { scanf("%d",&a[i]); } printf("\n整理后从小到大的排序为:\n"); sort(a); for(i=0;i<10;i++) //输出整理后数据 { printf("%d ",a[i]); } return 0; } void sort(int a[10],int n) //定义函数 { int i,j,k,t; for(i=0;i<n-1;i++) { k=i for(j=0;j<n;j++) if(a[j]<a[k]) { k=j; t=a[k]; a[k]=a[i]; a[i]=t; } } }
注意
1.数组名做形参,应在主调函数和被调用函数分别定义数组
2.实参数组和形参数组类型应一致
3.形参数组名获得实参数组的首元素的地址
4.形参数组可以不指定大小
7.7.3. 多维数组名作函数参数
第一维大小可以省略,第二维不可以
例子:有一个3×4的矩阵,找出元素中的最大值
#include<stdio.h> int main() { int max(int array[][4]); int a[3][4]={{1,3,5,7},{2,4,6,8},{1,2,3,4}}; printf("最大值为:%d\n",max(a)); return 0; } int max(int array[][4]) { int i,j,max; max=array[0][0]; for(i=0;i<3;i++) for(j=0;j<4;j++) if(array[i][j]>max) max=array[i][j]; return(max); }
7.8. 局部变量和全局变量
7.8.1. 局部变量
在函数的开头定义的变量
在一个函数内部定义的变量只能在本函数内使用
在函数的复合语句内定义的变量
在一个复合语句内定义的变量只能在该复合语句中使用
7.8.2. 全局变量
在函数的外部定义的变量
全局变量的使用范围是从定义变量的位置开始代本源文件结束
7.9. 变量的存储方式和生存期
7.9.1. 动态存储方式与静态存储方式
7.9.2. 局部变量的存储方式
7.9.3. 全局变量的存储方式
7.9.4. 存储类别小结
7.10. 关于变量的声明和定义
7.11. 内部函数和外部函数
7.11.1. 内部函数
7.11.2. 外部函数