c语言程序设计课件:第八章函数.ppt

上传人(卖家):罗嗣辉 文档编号:2057667 上传时间:2022-01-26 格式:PPT 页数:42 大小:161KB
下载 相关 举报
c语言程序设计课件:第八章函数.ppt_第1页
第1页 / 共42页
c语言程序设计课件:第八章函数.ppt_第2页
第2页 / 共42页
c语言程序设计课件:第八章函数.ppt_第3页
第3页 / 共42页
c语言程序设计课件:第八章函数.ppt_第4页
第4页 / 共42页
c语言程序设计课件:第八章函数.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

1、第八章第八章 函数函数 8 81 1 概述概述 C C语言的程序除主函数外,还可以有若干语言的程序除主函数外,还可以有若干个其他函数个其他函数块状结构块状结构。 对于较大的程序来说,往往把其中相对独对于较大的程序来说,往往把其中相对独立的算法和功能立的算法和功能定义定义成一个独立的函数,以供成一个独立的函数,以供需要的地方需要的地方调用调用。 将一个程序分解成多个函数有如下优点:将一个程序分解成多个函数有如下优点: (1 1) 减少代码的重复现象。减少代码的重复现象。 (2 2) 便于分工合作。便于分工合作。 (3 3) 便于阅读。便于阅读。 (4 4) 便于独立算法的代码移植。便于独立算法的

2、代码移植。 8 82 2 函数的定义和调用函数的定义和调用 通过例子来说明如何通过例子来说明如何定义定义和和调用调用函数:函数: 对于求两个数中的最大值,有三个步骤:对于求两个数中的最大值,有三个步骤: (1 1)从键盘输入两个数给)从键盘输入两个数给a a和和b b。 (2 2)求)求a a和和b b中的最大值。中的最大值。 (3 3)输出结果。)输出结果。 把求最大值的算法部分定义成一个独立的把求最大值的算法部分定义成一个独立的函数:函数: 函数类型函数类型 函数名函数名 函数参数(形参)函数参数(形参)int max(int x,intint max(int x,int y) y) ma

3、in()main() int int z; z; int int a,b,c; a,b,c; if(xy)z=x; if(xy)z=x; scanfscanf(“%d%d”,&a,&b);(“%d%d”,&a,&b); else z=y; else z=y; c=max(a,b);c=max(a,b); return(z); return(z); printfprintf(“%d”,c);(“%d”,c); x y z a b c35说明:说明:(1 1)程序由两个函数组成,它们逻辑上相互独程序由两个函数组成,它们逻辑上相互独立(功能、变量)。立(功能、变量)。(2 2)程序的执行总是从主函数

4、开始,主函数总程序的执行总是从主函数开始,主函数总是被执行一次,其他函数只有在被调用时才获是被执行一次,其他函数只有在被调用时才获得控制。得控制。(3 3)函数调用有两个作用:转移控制权和传递函数调用有两个作用:转移控制权和传递参数。参数。(4 4)returnreturn的作用也有两个:交回控制权和返的作用也有两个:交回控制权和返回结果。回结果。(5 5)实参可以是常量、变量或表达式,但类型实参可以是常量、变量或表达式,但类型要一致。要一致。 定义一个函数除考虑算法外就是定义一个函数除考虑算法外就是: :如何设如何设计函数的参数,通过何种途径交回结果。计函数的参数,通过何种途径交回结果。 例

5、:求自然数例:求自然数1 1100100中的素数之和。中的素数之和。 ? prime( ? ) main() int i; int i,s=0; for(i=2;im;i+) for(i=1;i=100;i+) if(m%i=0) ? if(prime(i) ) s+=i; ? printf(“n %d”,s); int m)int returm 0;else return 1;return 1;例:求例:求5 5!+7+7!+4+4!的值。!的值。 ? ? facfac( ( ? ? ) ) int int i,s=1;i,s=1; for(i=1;i=n;i+) s for(i=1;i=n

6、;i+) s* *=i;=i; return(s); return(s); main()main() printf(“n%d”,fac(5)+fac(7)+fac printf(“n%d”,fac(5)+fac(7)+fac(4); (4); int int n nint int main()main() float s,float s,facfac()(); ; 对被调函数声明对被调函数声明 s=fac(5)+fac(7)+facs=fac(5)+fac(7)+fac(4);(4); printf printf(“n%f”,s);(“n%f”,s); float fac(intfloat f

7、ac(int n) n) int int i; float s=1;i; float s=1; for(i=1;i=n;i+) s for(i=1;i=n;i+) s* *=i;=i; return(s); return(s); 不需声明的情况:不需声明的情况:int int char char 主调函数在后主调函数在后 若被调用的函数是库函数,则应用若被调用的函数是库函数,则应用#include#include命令将所调用函数的有关信息包含进来,如:命令将所调用函数的有关信息包含进来,如:例:例: #include “math.h”#include “math.h” main()main()

8、 float x,y; float x,y; scanf scanf(%f”,&x);(%f”,&x); y=sin(x); y=sin(x); printf printf(“%f”,y);(“%f”,y); 8 83 3 函数的嵌套调用函数的嵌套调用 C C语言的函数定义虽然相互平行、相互独立的,语言的函数定义虽然相互平行、相互独立的,但可以嵌套调用,形如:但可以嵌套调用,形如: 主函数主函数 函数函数A A 函数函数B B例:求多项式例:求多项式 S= S= i!+ i!+ i i!+ + i i!的值。的值。 float fac(intfloat fac(int n) n) ? sum(

9、 ? ? sum( ? ) ) int int i; float s=0; i; float s=0; for( for( i=? ) s+= i=? ) s+=facfac(i)(i); ; return(s); return(s); main()main() printf printf(“%f”,sum(1,5)+sum(7,11)+sum(15,20); (“%f”,sum(1,5)+sum(7,11)+sum(15,20); 157111520int a, int int a, int b bfloatfloati=a;i=b;i+i=a;i1n1时时 float fac(int fl

10、oat fac(int n) n) main() main() float f; float f; float f; float f; if(n=0|n=1) f=1; if(n=0|n=1) f=1; f=facf=fac(4);(4); else f= else f= ? ? printfprintf(“n%f”,f);(“n%f”,f); return(f); return(f); 递归调用的执行过程:递归调用的执行过程: n n* *facfac(n-1);(n-1); 主函数 函数fac 函数fac 函数fac 函数fac问题:4个return的执行顺序?后进先出! f=fac(4)

11、; n=4if(n=0|n=1)f=1;else f=n*fac(n-1);return(f) n=3if(n=0|n=1)f=1;else f=n*fac(n-1);return(f )n=2if(n=0|n=1)f=1;else f=n*fac(n-1);return(f) n=1if(n=0|n=1)f=1;else f=n*fac(n-1);return(f) 8 85 5 数组作为函数的参数数组作为函数的参数 当要传递的参数较少时,用简单变量作为当要传递的参数较少时,用简单变量作为函数的参数是方便的函数的参数是方便的, ,但当要传递的参数是批量但当要传递的参数是批量时,需要时,需要用

12、数组作为函数的参数。用数组作为函数的参数。 例:编写函数,求例:编写函数,求100100个数的平均数。个数的平均数。float aver(int float aver(int a100)a100) int int i; float s=0; i; float s=0; for(i=0;i100;i+) s+=ai ; for(i=0;i100;i+) s+=ai ; return(s/100); return(s/100); main()main() int x100; float av int x100; float av; ; 输入输入x x; avav=aver(x); =aver(x)

13、; 对应的实参也应为数组对应的实参也应为数组型参数组的长度可省略型参数组的长度可省略aa通用函数考虑:通用函数考虑: float aver(int a,int n) main() int i; float s=0; int x100,n=100; for(i=0;in;i+) float av; s+=ai; 输入输入x return(s/n); av=aver(x,n); xa 100 n n值传递地址传递 100 n=5; 5 a0=3 ; 3 例:阅读程序:例:阅读程序:main() swap(int a, int b) int a=3,b=5; int t; swap(a,b); t=

14、a; a=b; b=t; printf(“n%d,%d”,a,b); printf(“n%d,%d”,a,b); a b a b35以下程序的运行结果是以下程序的运行结果是 ? main() f ( int b, int x) int a2=2,4, x=5; x+; f (a,x); b0+=2; printf(“%d,%d,%d”, b1+=3; x,a0,a1); A) 5,2,4 B) 6,4,7 C) 6,2,4 D) 5,4,7例:排序。例:排序。 void sort(int a, int n) int i,j,t; for(i=0;in-1;i+) for(j=i+1;jaj)t

15、=ai;ai=aj; aj=t;main() int x5,i; for(i=0;i5;i+) scanf(“%d”,&xi); sort(x,5); for(i=0;i5;i+) printf(“%4d”,xi);xa例:方阵转置(二维数组情况)。例:方阵转置(二维数组情况)。at(int a33) x a int i,j,t; for(i=0;i3;i+) for(j=i+1;j3;j+) t=aij; aij=aji; aji=t;int x33; at(x); 行长不等情况?通用函数的处理?行长不等情况?通用函数的处理? 通用函数,按一维数组处理:通用函数,按一维数组处理:at(int

16、 a,int n) int i,j,t; for(i=0;in;i+) for(j=i+1;jn;j+) t=ai*n+j; ai*n+j=aj*n+i; aj*n+i=t; int x33;int y44; at(x,3); at(y,4); 8 86 6 局部变量和全局变量局部变量和全局变量 1 1、局部变量、局部变量 在函数内定义的变量称局部变量。在函数内定义的变量称局部变量。 局部变量只在该函数内使用。局部变量只在该函数内使用。 float f1(int x) int f2() main() int i,j; int a,b,c; int m,n; int int i,j; i,j;

17、说明:说明:(1 1)任何函数(包括主函数)内定义的变量都)任何函数(包括主函数)内定义的变量都是局部变量。是局部变量。(2 2)不同函数内定义的变量即使同名也互不干)不同函数内定义的变量即使同名也互不干扰。扰。 (3 3)复合语句中定义的变量只在该复合语句中)复合语句中定义的变量只在该复合语句中有效。有效。 2 2 、 全局变量全局变量 在函数以外定义的变量在函数以外定义的变量, ,也称外部变量。也称外部变量。 全局变量可以为为本文件中其它函数所共用。全局变量可以为为本文件中其它函数所共用。它的作用范围是从定义变量的位置开始到本源它的作用范围是从定义变量的位置开始到本源文件结束。文件结束。

18、int int p=1,q=5;p=1,q=5;float f1(intfloat f1(int a) a) int int b,c; b,c; char c1,c2;char c1,c2;char f2(int x,intchar f2(int x,int y) y) int int i,j; i,j; main()main() int int m,n; m,n; 全局变量c1,c2的作用范围 全局变量p,q的作用范围 全局变量主要用于作为不同函数间数据传全局变量主要用于作为不同函数间数据传递的桥梁。递的桥梁。 例:编写一个函数,求例:编写一个函数,求n n个数中的最大值、个数中的最大值、最

19、小值和平均值。并编写主函数完成:输入最小值和平均值。并编写主函数完成:输入100100个数,调用该函数进行统计,输出结果个数,调用该函数进行统计,输出结果。int int max,min;max,min;float aver(int a,intfloat aver(int a,int n) n) int int i; float s=0; i; float s=0; for(i=0;in;i+) for(i=0;imax)max=ai; if(aimax)max=ai; if(aimin)min=ai; if(aimin)min=ai; s+=ai; s+=ai; return (s/n);

20、main() int x100,i; float av; for(i=0;i100;i+) scanf(“%d”,&xi); av=aver(x,100); printf(“n %d,%d,%f”,max,min,av);用全局变量传递结果分析不用全局变量的情况:分析不用全局变量的情况:float aver(int a,intfloat aver(int a,int n) n) int i; float s=0; int i; float s=0; int int max,min;max,min; for(i=0;in;i+) for(i=0;imax)max=ai; if(aimax)max

21、=ai; if(aimin)min=ai; if(aimin)min=ai; s+=ai; s+=ai; return (s/n); main() int x100,i; float av; int int max,min;max,min; for(i=0;i100;i+) scanf(“%d”,&xi); av=aver(x,100); printf(“n %d,%d,%f”,max,min,av);int int max,min; max,min; float aver(int a,intfloat aver(int a,int n) n) int int i; float s=0; i;

22、 float s=0; for(i=0;in;i+) for(i=0;imax)max=ai; if(aimax)max=ai; if(aimin)min=ai; if(aimin)min=ai; s+=ai; s+=ai; return (s/n); main() int x100,i; float av; int int max,min;max,min; for(i=0;i100;i+) scanf(“%d”,&xi); av=aver(x,100); printf(“n %d,%d,%f”,max,min,av);分析全局变量与局分析全局变量与局部变量同名的情况部变量同名的情况 max

23、min max min 阅读程序,给出运行结果:阅读程序,给出运行结果:int a=4,b=5,c=6; int f(int a,int b) a/=2; c+=b-a; return(a+b+c);main() int a=2,d; d=f(a+2,a+b); printf(“n %d,%d,%d,%d”, a,b,c,d);4526abcabad4741120 8 87 7 变量存储类别变量存储类别 1 1、动态存储方式和静态存储方式、动态存储方式和静态存储方式 静态存储方式静态存储方式:在程序运行期间分配固定存储单:在程序运行期间分配固定存储单元的方式。元的方式。动态存储方式动态存储方式

24、:在程序运行期间根据需要动态分:在程序运行期间根据需要动态分配存储单元的方式。配存储单元的方式。变量变量变量变量局部变量局部变量动态存储方式变量动态存储方式变量全局变量全局变量静态存储方式变量静态存储方式变量空间角度空间角度生存期角度生存期角度 存放在存放在静态存储区静态存储区的变量:的变量:静态存储方式静态存储方式。 存放在存放在动态存储区动态存储区的变量:的变量:动态存储方式动态存储方式。 程序区程序区 静态存储区静态存储区 动态存储区 程序开始运行时分配空间,运行结束时释放主要存放全局变量和静态局部变量根据需要动态分配,动态释放的区域主要存放动态局部变量和现场保护等 用户区用户区 2 2

25、、局部变量的存储方式、局部变量的存储方式 每个局部变量在定义时可以指定其存储方式,每个局部变量在定义时可以指定其存储方式,即对每个局部变量的定义除定义其数据类型外,即对每个局部变量的定义除定义其数据类型外,还应定义其存储方式。定义存储方式用还应定义其存储方式。定义存储方式用autoauto(自动的)(自动的)staticstatic(静态的)。如:(静态的)。如: int f1() int f2() auto int a=1; static int b=1; 缺省时为auto 动态局部变量动态局部变量在函数调用时分配、赋初值,在函数调用时分配、赋初值,调用结束时释放。调用结束时释放。 静态局部

26、变量静态局部变量在第一次调用时分配、赋初在第一次调用时分配、赋初值,调用结束时不释放,其单元及其值仍保留,值,调用结束时不释放,其单元及其值仍保留,下次调用时不重新分配,不重新赋初值。下次调用时不重新分配,不重新赋初值。 在实际应用中,如果希望在函数调用结束在实际应用中,如果希望在函数调用结束后仍保留某个局部变量的值给下次调用时使用,后仍保留某个局部变量的值给下次调用时使用,则可定义该变量为静态的。则可定义该变量为静态的。 例:编写一个函数计算:例:编写一个函数计算: y=y=2x-1 2x-1 第一次计算第一次计算 3x+1 3x+1 第二次计算第二次计算 4x+2 4x+2 其他其他 fl

27、oat f ( float x) main() float y; static int n=1; printf(“%f”,f(2.0);if(n=1)y=2*x-1; printf(“%f”,f(1.0);else if(n=2)y=3*x+1; printf(“%f”,f(3.0);else y=4*x+2; n+;return(y); 3 3 、全局变量的存储方式、全局变量的存储方式全局变量都是静态存储方式,不允许用全局变量都是静态存储方式,不允许用autoauto来来定义全局变量。定义全局变量。可以用可以用staticstatic来定义全局变量。如:来定义全局变量。如:static in

28、t static int x;x; 静态全局变量(内部的)静态全局变量(内部的)int int y;y; 非静态全局变量(外部的)非静态全局变量(外部的) 对于非静态全局变量,其它文件中的函数只对于非静态全局变量,其它文件中的函数只要用要用externextern加以外部说明,就可以访问。加以外部说明,就可以访问。 而对于静态全局变量,只局限在本文件中而对于静态全局变量,只局限在本文件中的所有函数访问,其它文件中的函数即使用的所有函数访问,其它文件中的函数即使用externextern加以外部说明,也不能访问。加以外部说明,也不能访问。 int y; main() y=0; int f1()

29、y=2; extern int y; int f3() y=10; int f4() y=100; static int y; 8 88 8 内部函数和外部函数内部函数和外部函数 用用externextern加以定义的函数称外部函数加以定义的函数称外部函数 。 用用externextern加以定义的函数称外部函数加以定义的函数称外部函数 。 extern int f1() static int f2() 缺省为外部函数。缺省为外部函数。 外部函数可以为其他文件中的函数所调用。外部函数可以为其他文件中的函数所调用。 内部函数只为本文件中的函数所调用(内部函数只为本文件中的函数所调用(保护保护)。)。 main() f3(); 允许允许 int f1() f4(); 不允许不允许extern int f3() f4(); 允许允许 static int f4()

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(c语言程序设计课件:第八章函数.ppt)为本站会员(罗嗣辉)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|