版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、语言的函数定义是互相平行、独立的语言的函数定义是互相平行、独立的即函数不能嵌套定义即函数不能嵌套定义但可以嵌套调用函数但可以嵌套调用函数即调用一个函数的过程中,又可以调用另即调用一个函数的过程中,又可以调用另一个函数一个函数main函数函数调用调用a函数函数结束结束a函数函数调用调用b函数函数b函数函数 例例7.5 输入输入4个整数,找出其中最大的数。个整数,找出其中最大的数。用函数的嵌套调用来处理。用函数的嵌套调用来处理。解题思路:解题思路:umain中调用中调用max4函数,找函数,找4个数中最大者个数中最大者umax4中再调用中再调用max2,找两个数中的大者找两个数中的大者umax4中
2、多次调用中多次调用max2,可找,可找4个数中的大个数中的大者,然后把它作为函数值返回者,然后把它作为函数值返回main函数函数umain函数中输出结果函数中输出结果#include int main() int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函数主函数对对max4 函数声明函数声明#include int m
3、ain() int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函数主函数输入输入4个整数个整数#include int main() int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%
4、d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函数主函数调用后肯定是调用后肯定是4个数中最大者个数中最大者输出最大者输出最大者int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函数函数对对max2 函数声明函数声明int max4(int a,int b,int c,int d) int max2(int a,int b)
5、; int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函数函数a,b中较大者中较大者a,b,c中较大者中较大者a,b,c,d中最大者中最大者int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函数函数int max2(int a,int b) if(a=b) return a; else return b; max2函数函数找找a,b中较大者
6、中较大者int max4(int a,int b,int c,int d) int max2(int a,int b); ruturn max2(max2(max2(a,b),c),d);int max2(int a,int b) return(ab?a:b); #include int main() max=max4(a,b,c,d); 在调用一个函数的过程中又出现直接或间在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的接地调用该函数本身,称为函数的递归调递归调用用。语言的特点之一就在于允许函数的递归语言的特点之一就在于允许函数的递归调用。调用。 f2函数函数调用调用f1函
7、数函数 int f(int x) int y,z; z=f(y); return (2*z); f函数函数调用调用f函数函数 f1函数函数调用调用f2函数函数应使用应使用if语句控制结束调用语句控制结束调用直接调用本函数直接调用本函数间接调用本函数间接调用本函数 例例7.6 有有5个学生坐在一起个学生坐在一起u问第问第5个学生多少岁?他说比第个学生多少岁?他说比第4个学生大个学生大2岁岁u问第问第4个学生岁数,他说比第个学生岁数,他说比第3个学生大个学生大2岁岁u问第问第3个学生,又说比第个学生,又说比第2个学生大个学生大2岁岁u问第问第2个学生,说比第个学生,说比第1个学生大个学生大2岁岁u
8、最后问第最后问第1个学生,他说是个学生,他说是10岁岁u请问第请问第5个学生多大个学生多大解题思路:解题思路:u要求第个年龄,就必须先知道第个年龄要求第个年龄,就必须先知道第个年龄u要求第个年龄必须先知道第个年龄要求第个年龄必须先知道第个年龄u第个年龄又取决于第个年龄第个年龄又取决于第个年龄u第个年龄取决于第个年龄第个年龄取决于第个年龄u每个学生年龄都比其前个学生的年龄大每个学生年龄都比其前个学生的年龄大解题思路:解题思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10) 1(2) 1()() 1(10
9、)(nnagenagennage age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =16 age(5) =18 回溯阶段回溯阶段 递推阶段递推阶段 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =16 age(5) =18 回回溯溯阶段阶段 递推阶段递推阶段结束递归的条件结束递
10、归的条件#include int main() int age(int n); printf(NO.5,age:%dn,age(5); return 0; int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); age(5)输出输出age(5)mainc=age(4)+2age函数函数n=5c=age(3)+2age函数函数n=4c=age(1)+2age函数函数n=2c=age(2)+2age函数函数n=3c=10age函数函数n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)
11、=18187.7.1数组元素作函数实参数组元素作函数实参7.7.2数组名作函数参数数组名作函数参数7.7.3多维数组名作函数参数多维数组名作函数参数 例例7.9 输入输入10个数,要求输出其中值个数,要求输出其中值最大的元素和该数是第几个数。最大的元素和该数是第几个数。解题思路:解题思路:u定义数组定义数组a,用来存放,用来存放10个数个数u设计函数设计函数max,用来求两个数中的大者,用来求两个数中的大者u在主函数中定义变量在主函数中定义变量m,初值为,初值为a0,每次调用每次调用max函数后的返回值存放在函数后的返回值存放在m中中u用用“打擂台打擂台”算法,依次将数组元素算法,依次将数组元
12、素a1到到a9与与m比较,最后得到的比较,最后得到的m值值就是就是10个数中的最大者个数中的最大者#include int main() int max(int x,int y); int a10,m,n,i; printf(“10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); for(i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(“largest number is %dn,m); printf(“%dth number.n“,n+1);int max(int x,int y)
13、 return(xy?x:y); 除了可以用数组元素作为函数参数外除了可以用数组元素作为函数参数外,还可以用数组名作函数参数,还可以用数组名作函数参数(包括实包括实参和形参参和形参)用数组元素作实参时,向形参变量传用数组元素作实参时,向形参变量传递的是数组元素的值递的是数组元素的值用数组名作函数实参时,向形参用数组名作函数实参时,向形参 传递传递的是数组首元素的地址的是数组首元素的地址 例例7.10 有一个一维数组有一个一维数组score,内放,内放10个学生成绩,求平均成绩。个学生成绩,求平均成绩。解题思路:解题思路:u用函数用函数average求平均成绩,用数组名求平均成绩,用数组名作为函
14、数实参,形参也用数组名作为函数实参,形参也用数组名u在在average函数中引用各数组元素,求函数中引用各数组元素,求平均成绩并返回平均成绩并返回main函数函数#include int main() float average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); printf(n); aver=average(score); printf(%5.2fn,aver); return 0; 定义实参数组定义实参数组float
15、 average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver);定义形参数组定义形参数组相当于相当于score0相当于相当于scorei7.8.1 局部变量局部变量7.8.2 全局变量全局变量定义变量可能有三种情况:定义变量可能有三种情况:u在函数的开头定义在函数的开头定义u在函数内的复合语句内定义在函数内的复合语句内定义u在函数的外部定义在函数的外部定义在一个函数内部定义的变量只在本函数在一个函数内部定义的变量只在本函数范围内有效范围
16、内有效在复合语句内定义的变量只在本复合语在复合语句内定义的变量只在本复合语句范围内有效句范围内有效在在函数内部函数内部或复合语句内部定义的变量或复合语句内部定义的变量称为称为“局部变量局部变量”float f1( int a) int b,c; char f2(int x,int y) int i,j; int main( ) int m,n; return 0; a、b、c仅在仅在此函数内此函数内有效有效x、y、i、j仅在仅在此函数内此函数内有效有效m、n仅在此仅在此函数内函数内有效有效float f1( int a) int b,c; char f2(int x,int y) int i,
17、j; int main( ) int a,b; return 0; 类似于不同类似于不同班同名学生班同名学生a、b也仅在此也仅在此函数内函数内有效有效int main ( ) int a,b; int c; c=a+b; c仅在此复合仅在此复合语句内语句内有效有效a、b仅在此复仅在此复合语句内合语句内有效有效在函数内定义的变量是局部变量在函数内定义的变量是局部变量,而在函而在函数之外定义的变量称为数之外定义的变量称为外部变量外部变量外部变量是全局变量外部变量是全局变量(也称全程变量也称全程变量)全局变量可以为本文件中其他函数所共用全局变量可以为本文件中其他函数所共用有效范围为从定义变量的位置开
18、始到本源有效范围为从定义变量的位置开始到本源文件结束文件结束int p=1,q=5float f1(int a) int b,c; char c1,c2;char f2 (int x, int y) int i,j; int main ( ) int m,n; return 0;p、q、c1、c2为为全局变量全局变量int p=1,q=5float f1(int a) int b,c; char c1,c2;char f2 (int x, int y) int i,j; int main ( ) int m,n; return 0;p、q的有效范围的有效范围c1、c2的有效范围的有效范围 例例
19、7.14 有一个一维数组,内放有一个一维数组,内放10个学生个学生成绩,写一个函数,当主函数调用此函数成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。后,能求出平均分、最高分和最低分。解题思路:调用一个函数可以得到一个函解题思路:调用一个函数可以得到一个函数返回值,现在希望通过函数调用能得到数返回值,现在希望通过函数调用能得到3个结果。可以利用全局变量来达到此目个结果。可以利用全局变量来达到此目的。的。#include float Max=0,Min=0; int main() float average(float array ,int n); float ave,sc
20、ore10; int i; printf(Please enter 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); ave=average(score,10); printf(max=%6.2fnmin=%6.2fn average=%6.2fn,Max,Min,ave); return 0; float average(float array ,int n) int i; float aver,sum=array0; Max=Min=array0; for(i=1;iMax) Max=arrayi; else if(arrayiMin) Mi
21、n=arrayi; sum=sum+arrayi; aver=sum/n; return(aver); ave score 10 Max Min aver array n Max Minmain函数函数average函数函数建议不在必要时不要使用全局变量建议不在必要时不要使用全局变量 例例7.15 若外部变量与局部变量同名,分若外部变量与局部变量同名,分析结果。析结果。#include int a=3,b=5; int main() int max(int a,int b); int a=8; printf(“max=%dn”,max(a,b); return 0; int max(int a
22、,int b) int c; c=ab?a:b; return(c); a为为局局部部变量变量,仅,仅在此函数内有效在此函数内有效b为全部为全部变量变量#include int a=3,b=5; int main() int max(int a,int b); int a=8; printf(“max=%dn”,max(a,b); return 0; int max(int a,int b) int c; c=ab?a:b; return(c); a、b为为局局部部变量变量,仅,仅在此函数内有效在此函数内有效7.9.1动态存储方式与静态存储方式动态存储方式与静态存储方式7.9.2 局部变量的存
23、储类别局部变量的存储类别7.9.3 全局变量的存储类别全局变量的存储类别7.9.4 存储类别小结存储类别小结从变量的作用域的角度来观察,变量可以分从变量的作用域的角度来观察,变量可以分为为全局变量全局变量和和局部变量局部变量从变量值存在的时间从变量值存在的时间(即生存期即生存期)观察观察,变量变量的存储有两种不同的方式:的存储有两种不同的方式:静态存储方式静态存储方式和和动态存储方式动态存储方式u静态存储方式是指在程序运行期间由系统静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式分配固定的存储空间的方式u动态存储方式是在程序运行期间根据需要动态存储方式是在程序运行期间根据需要进行动
24、态的分配存储空间的方式进行动态的分配存储空间的方式程序区程序区静态存储区静态存储区动态存储区动态存储区用户区用户区将将数据存放在数据存放在此区此区全局变量全部存放全局变量全部存放在静态存储区中在静态存储区中函数形式参数函函数形式参数函数中定义的没有用关数中定义的没有用关键字键字static声明的变量声明的变量函数调用时的现场函数调用时的现场保护和返回地址等保护和返回地址等存存放在动态存储区放在动态存储区程序程序开始执行时给全局开始执行时给全局变量分配存储区,程序变量分配存储区,程序执行完毕就释放。在程执行完毕就释放。在程序执行过程中占据固定序执行过程中占据固定的存储单元的存储单元函数调用开始时
25、分配,函数调用开始时分配,函数结束时释放。在程函数结束时释放。在程序执行过程中,这种分序执行过程中,这种分配和释放是动态的配和释放是动态的每一个变量和函数都有两个属性:每一个变量和函数都有两个属性:数据类数据类型型和数据的和数据的存储类别存储类别u数据类型数据类型,如整型、浮点型等,如整型、浮点型等u存储类别存储类别指的是数据在内存中存储的方式指的是数据在内存中存储的方式(如如静态存储和动态存储静态存储和动态存储)u存储类别存储类别包括包括: 自动的、静态的、寄存器的、外部的自动的、静态的、寄存器的、外部的u根据变量的存储类别,可以知道变量的作用域根据变量的存储类别,可以知道变量的作用域和生存
26、期和生存期1.自动变量自动变量(auto变量变量)u局部变量,如果不专门声明存储类别,都局部变量,如果不专门声明存储类别,都是动态地分配存储空间的是动态地分配存储空间的u调用函数时,系统会给调用函数时,系统会给局部局部变量分配存储变量分配存储空间,调用结束时就自动释放空间。因此空间,调用结束时就自动释放空间。因此这类局部变量称为自动变量这类局部变量称为自动变量u自动变量用关键字自动变量用关键字auto作存储类别的声明作存储类别的声明int f(int a) auto int b,c=3; 可以省略可以省略2.静态局部变量静态局部变量(static局部变量局部变量)希望函数中的局部变量在函数调用
27、结束希望函数中的局部变量在函数调用结束后不消失而继续后不消失而继续保留原值保留原值,即其占用的,即其占用的存储单元不释放,在下一次再调用该函存储单元不释放,在下一次再调用该函数时,该变量已有值数时,该变量已有值(就是上一次函数就是上一次函数调用结束时的值调用结束时的值),这时就应该指定该这时就应该指定该局部变量为局部变量为“静态局部变量静态局部变量”,用关键,用关键字字static进行声明进行声明 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”
28、,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);调用三次调用三次每调用一次,开辟每调用一次,开辟新新a和和b,但,但c不是不是 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+
29、b+c);03bc第一次调用开始第一次调用开始 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);03bc第一次调用期间第一次调用期间14 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a=2,i; f
30、or(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第一次调用结束第一次调用结束147 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; ret
31、urn(a+b+c);bc第二次调用开始第二次调用开始04 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次调用期间第二次调用期间04 51 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a
32、=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次调用结束第二次调用结束158 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c
33、+1; return(a+b+c);bc第三次调用开始第三次调用开始05 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第三次调用期间第三次调用期间05 61 例例7.16 考察静态局部变量的值。考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教科版科学六上《打开盖子的工具》课件
- 《会跳舞的洋娃娃》课件一
- 教科版科学五下《摆的研究》课件
- 冀教版数学四上第六单元《认识更大的数》课件2
- 高三成绩分析班会
- 第8章 企业投资的税务合规计划
- 信阳市出山店水库集中式饮用水水源地生态环境保护项目环境影响报告表
- 药师考试临床用药技能专项训练题库及答案
- 危险化学品通风设施基础知识安全培训
- 危险化学品剧毒品基础知识安全培训
- “练、强、学”题库(全警普测)及答案
- 2025年高尔夫球教练职业能力测试卷:初级技能评估试题
- 共享仓库管理合作协议
- 12~30月龄儿童健康检查记录表
- 体育-水平二-三年级篮球大单元教学计划表及原地运球教学设计、教案
- 食管胃底静脉曲张出血课件
- DL-T5191-2004风力发电场项目建设工程验收规程
- JJG 693-2011可燃气体检测报警器
- 水质自动监测系统
- 幼儿园优质公开课:大班数学《数字捉迷藏》课件PPT
- 个人理财理论与实务李杰辉课后参考答案
评论
0/150
提交评论