C语言程序设计第四版PPT_谭浩强-7函数_第1页
C语言程序设计第四版PPT_谭浩强-7函数_第2页
C语言程序设计第四版PPT_谭浩强-7函数_第3页
C语言程序设计第四版PPT_谭浩强-7函数_第4页
C语言程序设计第四版PPT_谭浩强-7函数_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第7 7章章 函数函数引例引例 求阶乘求阶乘n!int i,n;float fac=1;printf(n=);scanf(%d,&n);for(i=1;i=n;i+) fac=fac*i;printf (%d!=%.0fn,n,fac);引例引例求任意求任意3个正整数的阶乘的和个正整数的阶乘的和 a!+b!+c! fa=1;for(i=1;i=a;i+) fa=fa*i;fb=1;for(i=1;i=b;i+) fb=fb*i;fc=1;for(i=1;i=c;i+) fc=fc*i;printf(%d!+%d!+%d!=%.0f,a,b,c,fa+fb+fc);引例引例求任意求任意3个正整

2、数的阶乘的和个正整数的阶乘的和 a!+b!+c! #include stdio.hint main() float factorial(int n); int a,b,c; float sum; printf(a=); scanf(%d,&a); printf(b=); scanf(%d,&b); printf(c=); scanf(%d,&c); sum=factorial(a)+factorial(b)+factorial(c); printf(%d!+%d!+%d!=%.0f,a,b,c,sum); return 0;float factorial(int n) int i; float

3、 fac; fac=1; for(i=1;i=n;i+) fac=fac*i; return fac;引例引例 求任意求任意3个正整数的阶乘的和个正整数的阶乘的和 a!+b!+c! 使用函数可减少程序的重复段落使用函数可减少程序的重复段落使用函数可使程序功能相对独立,使用函数可使程序功能相对独立,便于维护便于维护模块化的程序设计模块化的程序设计应用程序应用程序源程序文件源程序文件1函数函数1函数函数2函数函数3源程序文件源程序文件2函数函数1函数函数2函数的概念函数的概念#include int main ( ) int max(int x,int y); int a, b, c; scanf

4、 (%d,%d,&a,&b); c=max (a,b); printf (max=%d,c); return 0;int max(int x,int y) int z; if (xy) z=x; else z=y; return z; 程序必备的程序必备的 main函数函数有返回值的函数有返回值的函数函数的概念函数的概念上述问题也可只用一个上述问题也可只用一个main函数实现函数实现int main ( ) int a, b, c; scanf (%d,%d,&a,&b); if (ab) c=a; else c=b; printf (max=%d,c); return 0;函数的概念函数的概

5、念int main( ) void stars( ); stars( ); printf(Hello!n); stars( ); printf(Bye!n); stars( ); return 0;void stars( ) int i; for (i=1;i=8;i+) printf(*); printf(n);无返回值的函数无返回值的函数函数的概念函数的概念int main( ) void stars(int n); int n=20; stars(10); printf(Hello!n); stars(5); printf(Bye!n); stars(n); return 0;void

6、stars(int n) int i; for (i=1;i=n;i+) printf(*); printf(n);有参数,无返回值有参数,无返回值函数的概念函数的概念int main( ) void stars(int, char); int n=20; stars(10,%); printf(Hello!n); stars(5,-); printf(Bye!n); stars(n,$); return 0;void stars(int n,char c) int i; for (i=1;iy) z=x; else z=y; return z; 函数首部函数首部函数体函数体函数的返回值,类函

7、数的返回值,类型与首部定义一致型与首部定义一致函数首部,不是语函数首部,不是语句,行尾无分号句,行尾无分号函数的定义函数的定义关于函数类型的说明关于函数类型的说明u无返回值的函数类型为无返回值的函数类型为void;u有返回值的函数,其类型根据返回值有返回值的函数,其类型根据返回值类型决定;省略类型时默认为类型决定;省略类型时默认为int(建议(建议不要省略)不要省略)函数的调用函数的调用调用函数的准备工作调用函数的准备工作包含或声明包含或声明u调用库函数应在调用库函数应在C文件开头部分使用文件开头部分使用 #includeu要调用要调用其他自定义函数其他自定义函数,应在,应在本函数本函数体体开

8、始的声明部分加上开始的声明部分加上被调用函数的声被调用函数的声明明(与(与函数首部内容函数首部内容相同的一个语句),相同的一个语句),供编译时使用供编译时使用如果如果被调用函数被调用函数出现出现在在本函数本函数之前可省略此部分之前可省略此部分 详见详见7.4节节函数的调用函数的调用函数(实参列表)函数(实参列表) 调用无返回值的函数可以把上述函数调用无返回值的函数可以把上述函数直接作为语句使用,以完成其功能。直接作为语句使用,以完成其功能。 例如:例如: stars(10);函数的调用函数的调用函数(实参列表)函数(实参列表) 调用有返回值的函数,应注意返回值调用有返回值的函数,应注意返回值的

9、处理,如赋值或输出等。的处理,如赋值或输出等。 例如:例如: c=max(a,b); 或或 printf(%d,max(a,b);函数的参数函数的参数u形式参数(形参,形式参数(形参,Formal parameter):): 定义函数时首部括号中定义的变量定义函数时首部括号中定义的变量u实际参数(实参,实际参数(实参,Actual parameter):): 调用函数时,在函数名后括号中使用调用函数时,在函数名后括号中使用的表达式的表达式调用函数时,实参将值传递给形参调用函数时,实参将值传递给形参函数的参数函数的参数形式参数和实际参数形式参数和实际参数void main ( )int max(

10、int x,int y); int a, b, c; scanf (%d,%d,&a,&b); c=max (a,b); printf (max=%d,c); return 0;int max(int x,int y) int z; if (xy) z=x; else z=y; return z; 函数的参数函数的参数形式参数和实际参数形式参数和实际参数u形参在函数调用时分配内存单元,调用结束形参在函数调用时分配内存单元,调用结束后释放;后释放;u实参可以是常量、变量、表达式实参可以是常量、变量、表达式u实参与形参的数目、类型应一致实参与形参的数目、类型应一致uC语言中,实参向形参传递其值语言

11、中,实参向形参传递其值“值传值传递递”,不传递地址,形参值变化不影响实参,不传递地址,形参值变化不影响实参函数的返回值函数的返回值u通过函数体通过函数体return语句中的表达式值获语句中的表达式值获得,例如:得,例如: int max(int x,int y) return xy?x:y; u无返回值的函数可省略无返回值的函数可省略return语句语句u函数执行到函数执行到return语句结束语句结束关于例题和习题关于例题和习题 通过本章例题、习题,不仅要掌握函数定义和通过本章例题、习题,不仅要掌握函数定义和调用的语法,也要掌握更多算法和编程技巧。调用的语法,也要掌握更多算法和编程技巧。 正

12、如学习语文、英语要大量阅读一样,学习计正如学习语文、英语要大量阅读一样,学习计算机语言也要阅读例题,掌握一些基本的编程思算机语言也要阅读例题,掌握一些基本的编程思路、技巧和表达,才可能对新的问题较快地找到路、技巧和表达,才可能对新的问题较快地找到解决方法;同时要多了解语法规则解决方法;同时要多了解语法规则相当于认相当于认字。另外,还应对计算机的工作原理和方式多一字。另外,还应对计算机的工作原理和方式多一些了解。些了解。例:最大公约数函数和最小公倍数函数例:最大公约数函数和最小公倍数函数求最大公约数的算法:求最大公约数的算法: 从从1开始,逐个找公约数,直至两数中较小开始,逐个找公约数,直至两数

13、中较小的一个;的一个; 辗转求余辗转求余(循环结构实验指导有流程图循环结构实验指导有流程图); .求最小公倍数的算法:求最小公倍数的算法: 从两数中较大的一个开始,由小到大找公从两数中较大的一个开始,由小到大找公倍数,直至找到;倍数,直至找到; 两数的乘积两数的乘积 / 两数的最大公约数。两数的最大公约数。函数的嵌套调用函数的嵌套调用调用最小公倍数函数调用最小公倍数函数(两数乘积两数乘积/两数的最大两数的最大公约数公约数),当中需要调用最大公倍数函数,当中需要调用最大公倍数函数函数的嵌套调用:在一个被调用的函数中调函数的嵌套调用:在一个被调用的函数中调用另一个函数用另一个函数例:例:P183

14、例例7.5函数的递归调用函数的递归调用概念:在一个被调用的函数中直接概念:在一个被调用的函数中直接或间接地调用函数本身或间接地调用函数本身n! =1 , n=0,1n (n-1)! , n1函数的递归调用函数的递归调用递归的另一个典型实例递归的另一个典型实例 汉诺塔(汉诺塔(P.189例例7.8)算法讲解算法讲解http:/ 实参是数组元素,对应的形参是变量实参是数组元素,对应的形参是变量以以数组名数组名作为函数的参数作为函数的参数 实参和形参都是数组名实参和形参都是数组名数组元素作为函数的参数数组元素作为函数的参数数组元素数组元素作为作为实参实参形参是普通变量,形参是普通变量,值传递值传递i

15、nt main( ) int a11,i; float fac(int n); for (i=1;i=10;i+) ai=i; printf(%d!=%.0fn,ai,fac(ai); return 0;float fac(int n) float t=1; int i; for(i=1;i=n;i+) t=t*i; return t;等价于普通变量等价于普通变量数组作为函数的参数数组作为函数的参数以以数组名作数组名作为函数的参数为函数的参数实参向形参实参向形参传递首元素地址传递首元素地址int main( ) int max(int a ,int n); int x6,i; for(i=0;

16、i=5;i+) scanf(%d,&xi); printf(max=%d,max(x,6); return 0;int max(int a ,int n) int m,i; m=a0; for (i=1;im) m=ai; return m; 实参为数组名实参为数组名形参为数组,形参为数组,不指定大小不指定大小数组作为函数的参数数组作为函数的参数以以数组名数组名作为函数的参数作为函数的参数注意事项注意事项形参和实参都是数组名,类型要一致;形参和实参都是数组名,类型要一致;形参中不指定数组大小,指定无实际作用形参中不指定数组大小,指定无实际作用;形参数组名形参数组名获得获得实参首元素实参首元素的

17、的地址地址,即形参第,即形参第一个元素与实参第一个元素占用相同的地址一个元素与实参第一个元素占用相同的地址这就是这就是“地址传递地址传递”方式方式,形参值改变会引起实形参值改变会引起实参值的变化参值的变化为了使形参获得实参数组的大小为了使形参获得实参数组的大小(元素个数元素个数),通常在形参和实参对应地增加一个数值型的参数通常在形参和实参对应地增加一个数值型的参数数组作为函数的参数数组作为函数的参数以以数组名作数组名作为函数的参数为函数的参数考虑:如何写一个排序函数?考虑:如何写一个排序函数?多个函数组成的程序中多个函数组成的程序中变量引用的一些规则变量引用的一些规则应用程序应用程序源程序文件

18、源程序文件1函数函数1函数函数2函数函数3源程序文件源程序文件2函数函数1函数函数2变量作用域变量作用域局部变量和全局变量局部变量和全局变量u局部变量局部变量只在一个函数内或只在一个只在一个函数内或只在一个复合语句内有效的变量(复合语句内有效的变量(“花括号内有效花括号内有效”)u全局变量(外部变量)全局变量(外部变量)在一个模块内在一个模块内多个函数中均有效多个函数中均有效u扩展的外部变量扩展的外部变量在多个程序文件的函在多个程序文件的函数中有效(数中有效(extern)变量作用域变量作用域局部变量和全局变量局部变量和全局变量局部变量局部变量函数内定义,只在该函数有效函数内定义,只在该函数有

19、效#include int main() int a,b,c; . float fac(int n) float t=0; . return t;主函数中不存在主函数中不存在变量变量n和和tfac函数中不存函数中不存在变量在变量a和和b变量作用域变量作用域局部变量和全局变量局部变量和全局变量局部变量局部变量复合语句内定义,只在语句内复合语句内定义,只在语句内有效有效编译错编译错误:变误:变量量k未未定义定义int main() int i; for (i=0;i=10;i+) int k; k=i*2; printf(%dn,k); printf(%dn,i); printf(%dn,k);变

20、量作用域变量作用域局部变量和全局变量局部变量和全局变量局部变量局部变量在函数内定义,只在该函数内有效在函数内定义,只在该函数内有效在复合语句内定义,只在该语句内有效在复合语句内定义,只在该语句内有效形式参数也是局部变量,只在函数内有效形式参数也是局部变量,只在函数内有效变量作用域变量作用域局部变量和全局变量局部变量和全局变量全局变量全局变量在函数外定义,在其后的多个在函数外定义,在其后的多个函数中均有效函数中均有效#include int A,B,C;int main() int X,Y;float f1(int n) int f2( ) 变量作用域变量作用域局部变量和全局变量局部变量和全局变

21、量全局变量全局变量 例:例:#include int A,B,C;int main( ) int f1(int n); void f2(); printf(%dn,f1(3); printf(main: %dn,A); A=88; f2();int f1(int n) int m; m=n*n; A=n*n*n; return m;void f2() printf(f2:%dn,A);变量作用域变量作用域局部变量和全局变量局部变量和全局变量扩展的外部变量扩展的外部变量在多个程序文件的函在多个程序文件的函数中有效(见数中有效(见7.9.3节)节)在程序中可以调用其他文件中的函数(外在程序中可以调

22、用其他文件中的函数(外部函数)部函数)可通过全局变量在函数间传递多个数据可通过全局变量在函数间传递多个数据变量作用域变量作用域局部变量和全局变量局部变量和全局变量判断下面程序的运行结果:判断下面程序的运行结果:#include int a,b,n;int main( ) void f1(int n); a=18;b=100;n=20; printf(main: a=%d,b=%d;n=%dn,a,b,n); f1(50);void f1(int n) float a=13.89; printf(f1: a=%f,b=%d;n=%dn,a,b,n);变量作用域变量作用域局部变量和全局变量局部变量

23、和全局变量关于全局变量应用的说明关于全局变量应用的说明u全局变量命名时通常首字母大写全局变量命名时通常首字母大写u通过使用全局变量,使函数能够传递实参通过使用全局变量,使函数能够传递实参-形参和返回值之外的其他数据形参和返回值之外的其他数据u滥用全局变量会造成系统资源占用,降低滥用全局变量会造成系统资源占用,降低函数可移植性和程序的清晰度函数可移植性和程序的清晰度(P.202-203)u在函数中定义了与外部变量(全局变量)在函数中定义了与外部变量(全局变量)同名的局部变量时,外部变量被屏蔽同名的局部变量时,外部变量被屏蔽变量的存储方式和生存期变量的存储方式和生存期u动态存储(自动变量,形式参数

24、)动态存储(自动变量,形式参数) 临时、动态地分配存储单元临时、动态地分配存储单元u静态存储(全局变量,静态局部变量)静态存储(全局变量,静态局部变量) 程序运行整个过程中都存在程序运行整个过程中都存在局部变量的存储方式和生存期局部变量的存储方式和生存期u自动局部变量自动局部变量(auto):函数中定义的变量函数中定义的变量和形参。函数被调用时动态分配存储空间,和形参。函数被调用时动态分配存储空间,调用结束时释放。默认方式。调用结束时释放。默认方式。u静态局部变量静态局部变量(static):函数中加函数中加static定定义的变量,编译时赋初值,调用结束时保义的变量,编译时赋初值,调用结束时

25、保留存储空间和当前值。留存储空间和当前值。P.206-207说明。说明。u寄存器变量寄存器变量(register):保存在保存在CPU中,中,现已少用。现已少用。全局变量的存储方式和生存期全局变量的存储方式和生存期均为静态存储均为静态存储u在同一文件定义点之前引用全局变量在同一文件定义点之前引用全局变量引用前使用引用前使用 extern 声明声明u引用另一文件中的全局变量引用另一文件中的全局变量引用前使用引用前使用 extern 声明声明u限制全局变量的作用域在本文件中限制全局变量的作用域在本文件中定义时增加定义时增加 static 声明声明“定义定义”与与“声明声明”的区分的区分函数的函数的“定义定义”和和“声明声明”#include int main( ) int f1(int); int f2(); . a=f1(5)+f2(); int f1(int n) .int f2() .函数定义函数定义确定确定函数的名称、类函数的名称、类型、功能型、功能函数声明函数声明(函数原型函数原型) 确定要调用函数的名称、确定要调用函数的名称、参数类型参数类型函数调函数调用,运用,运行函数行函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论