樊媛媛c语言程序设计08函数_第1页
樊媛媛c语言程序设计08函数_第2页
樊媛媛c语言程序设计08函数_第3页
樊媛媛c语言程序设计08函数_第4页
樊媛媛c语言程序设计08函数_第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,int y) int max(int x,int y) m

3、ain()main() int z; int z; int a,b,c; int a,b,c; if(xy)z=x; if(xy)z=x; scanf(“%d%d”,&a,&b);scanf(“%d%d”,&a,&b); else z=y; else z=y; c=max(a,b);c=max(a,b); return(z); return(z); printf(“%d”,c);printf(“%d”,c); eg8-01.c x y z a b c35说明:说明:(1 1)程序由两个函数组成,它们逻辑上相互独程序由两个函数组成,它们逻辑上相互独立(功能、变量)

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

5、径交回结果。计函数的参数,通过何种途径交回结果。 例:求自然数例:求自然数1 1100100中的素数之和。中的素数之和。eg8-02.ceg8-02.c ? 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!的值。!的值。eg8-03.ceg8-03.c ? ? fac( fac(

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

7、printf(“n%d”,s); printf(“n%d”,s); int fac(int n)int fac(int n) int i; int s=1; int i; int s=1; for(i=1;i=n;i+) s for(i=1;i=n;i+) s* *=i;=i; return(s); return(s); eg8-03-1.ceg8-03-1.c不需声明的情况:不需声明的情况:int char int char 主调函数在后主调函数在后(p165)(p165) 若被调用的函数是库函数,则应用若被调用的函数是库函数,则应用#include#include命令将所调用函数的有关信息

8、包含进来,如:命令将所调用函数的有关信息包含进来,如:例:例:eg8-04.ceg8-04.c #include “math.h”#include “math.h” main()main() float x,y; float x,y; scanf(%f”,&x); scanf(%f”,&x); y=sin(x); y=sin(x); printf(“%f”,y); printf(“%f”,y); 8 83 3 函数的嵌套调用函数的嵌套调用 c c语言的函数定义虽然相互平行、相互独立的,语言的函数定义虽然相互平行、相互独立的,但可以嵌套调用,形如:但可以嵌套调用,形如: 主函数主

9、函数 函数函数a a 函数函数b b例:求多项式例:求多项式 s= s= i!+ i!+ i i!+ + i i!的值。的值。 eg8-05.ceg8-05.cfloat fac(int n) float fac(int n) ? sum( ? ) ? sum( ? ) int i; float s=0; int i; float s=0; for( i=? ) s+= for( i=? ) s+=fac(i)fac(i); ; return(s); return(s); main()main() printf(“%f”,sum(1,5)+sum(7,11)+sum(15,20); print

10、f(“%f”,sum(1,5)+sum(7,11)+sum(15,20); 157111520int a, int bint a, int bfloatfloati=a;i=b;i+i=a;i1n1时时 float fac(int n) float fac(int 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=fac(4);f=fac(4); else f= else f= ? ? printf(“n%f”,f);printf(“n%f”,f); return(f

11、); return(f); eg8-06.ceg8-06.c递归调用的执行过程:递归调用的执行过程: n n* *fac(n-1);fac(n-1); 主函数 函数fac 函数fac 函数fac 函数fac问题:4个return的执行顺序?后进先出! f=fac(4); 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

12、*fac(n-1);return(f) 例hanoi (汉诺)塔问题十九世纪未,欧洲珍奇商店出现一种汉诺塔游戏,并有推销材料,说是古代印度布拉玛庙里的僧侣们当时正在玩这种游戏,如果游戏结束,世界未日即来临。一、规则及分析:n个盘子从一根针移到另一根针,每次只能移动一个盘子,不允许大盘在小盘上面。共有三根针,n个盘子由a移到c,需移动的次数是2n -1, 若64个盘子移动的次数为:264 - 1=18, 446, 744, 073, 709, 551, 600一年的秒数是:365 x 24 x 60 x 60=315360001844674407370951160031536000=584942

13、17355年即:5849亿年, 从能源角度推算, 太阳系寿命只有150亿年abc二、方法与步骤1.将a上n-1个盘子借助c移到b2.把a上剩下一个盘子送到c3.将n-1个盘子从b借助a移到c三、实例:将a上3个盘子移到c步骤:1.a上两个盘子借助c移到b 2.a上最后一个盘子移到c 3.b上两个盘子借助a移到c第一步进一步分解:1.1 a上一个盘子从ac1.2 a上一个盘子从ab1.3 c上一个盘子从cb第二步进一步分解: a上最后一个盘子从ac第三步进一步分解:3.1 b上一个盘子从ba3.2 b上一个盘子从bc3.3 a上一个盘子从acabc结论:13步都是把n-1个盘子从一根针移到另一根

14、针上,方法一样,只是针的名称不同而已,为使之一般化,将13步表示为:将one 针上的n-1个盘子借助 two针,移到three 针,只是对应关系不同。第一步对应关系:one a two c three b第三步对应关系:one b two a three c把上面三个步骤分成两类操作:1.将 n - 1个盘子从一根针移到另一根针上(n 1)2.将 1个盘子从一根针移到另一根针上hanoi(n,one,two,three)表示将n个盘子从one借助two移到three;move(x,y)表示将一个盘子从x移到y。 main n=3 n=2 n=1 m=3 hanoi(3,a,b,c) hanoi

15、(2,a,c,b) hanoi(1,a,b,c) hanoi(3,a,b,c) hanoi(2,a,c,b) hanoi(1,a,b,c) move(a,c) move(a,c) move(a,b) hanoi(1,c,a,b) hanoi(1,c,a,b) move(c,a) hanoi(2,b,a,c) hanoi(2,b,a,c) hanoi(1,b,c,a) hanoi(1,b,c,a) move(b,b) move(b,c) hanoi(1,a,b,c) hanoi(1,a,b,c) move(a,c)eg8-07.c 用递归的方法解决汉诺塔程序如下:void move(char x

16、, char y)printf(“%c%c n”, x,y); void hanoi(n, one, two, three)char one, two, three; int n;if(n = 1) move(one,three); else hanoi(n-1, one, three, two); move(one, three); hanoi(n-1, two, one, three); main( )int m; printf(“input the number of diskes:”); scanf(“%d”,&m); printf(“the step to moving %3

17、d diskes: n”,m); hanoi(m, a, b, c );运行:input number of diskes: 3 the step to moving 3 diskes: a c a b c b a c b a b c a c 8 85 5 数组作为函数的参数数组作为函数的参数 当要传递的参数较少时,用简单变量作为当要传递的参数较少时,用简单变量作为函数的参数是方便的函数的参数是方便的, ,但当要传递的参数是批量但当要传递的参数是批量时,需要时,需要用数组作为函数的参数。用数组作为函数的参数。 例:编写函数,求例:编写函数,求100100个数的平均数。个数的平均数。eg8-08

18、-1.ceg8-08-1.cfloat aver(int a100)float aver(int a100) int i; float s=0; int 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 avg; int x100; float avg; 输入输入x x; avg=aver(x); avg=aver(x); 对应的实参也应为数组对应的实参也应为数组型参数组的长度可省略型参数组的长度可省

19、略通用函数考虑:通用函数考虑: eg8-08-2.ceg8-08-2.c float aver(int a,int n) main() int i; float s=0; int x100,n=100; for(i=0;in;i+) float avg; s+=ai; 输入输入x return(s/n); avg=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=a; a=b; b=t; printf(

20、“n%d,%d”,a,b); printf(“n%d,%d”,a,b); eg8-09.ceg8-09.c 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,7eg8-10.ceg8-10.c例:排序。例:排序。void sort(int a, int n) int i,j,t; for(i=0;in-1;i+) for

21、(j=i+1;jaj)t=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); eg8-11.ceg8-11.cxa例:方阵转置(二维数组情况)。例:方阵转置(二维数组情况)。 eg8-12-1.ceg8-12-1.cat(int x33) x a int i,j,t; for(i=0;i3;i+) for(j=i+1;j3;j+) t=xij; xij=xji; xji=t;int a33; at(a); 行数不等情况?通用

22、函数的处理?行数不等情况?通用函数的处理? 通用函数,按一维数组处理:通用函数,按一维数组处理: eg8-12-2.ceg8-12-2.cat(int x,int n)/n为行列数为行列数 int i,j,t; for(i=0;in;i+) for(j=i+1;in;i+) t=xi*n+j; xi*n+j=xj*n+i; xj*n+i=t; int a33; at(a,3); 8 86 6 局部变量和全局变量局部变量和全局变量 1 1、局部变量、局部变量 在函数内定义的变量称局部变量。在函数内定义的变量称局部变量。 局部变量只在该函数内使用。局部变量只在该函数内使用。 float f1(in

23、t x) int f2() main() int i,j; int a,b,c; int m,n; int i,j; int i,j; 说明:说明:(1 1)任何函数(包括主函数)内定义的变量都)任何函数(包括主函数)内定义的变量都是局部变量。是局部变量。(2 2)不同函数内定义的变量即使同名也互不干)不同函数内定义的变量即使同名也互不干扰。扰。 (3 3)复合语句中定义的变量只在该复合语句中)复合语句中定义的变量只在该复合语句中有效。有效。 2 2 、 全局变量全局变量 在函数以外定义的变量在函数以外定义的变量, ,也称外部变量。也称外部变量。 全局变量可以为为本文件中其它函数所共用。全局变

24、量可以为为本文件中其它函数所共用。它的作用范围是从定义变量的位置开始到本源它的作用范围是从定义变量的位置开始到本源文件结束。文件结束。 int p=1,q=5;int p=1,q=5;float f1(int a)float f1(int a) int b,c; int b,c; char c1,c2;char c1,c2;char f2(int x,int y)char f2(int x,int y) int i,j; int i,j; main()main() int m,n; int m,n; 全局变量c1,c2的作用范围 全局变量p,q的作用范围 全局变量主要用于作为不同函数间数据传全

25、局变量主要用于作为不同函数间数据传递的桥梁。递的桥梁。 例:编写一个函数,求例:编写一个函数,求n n个数中的最大值、个数中的最大值、最小值和平均值。并编写主函数完成:输入最小值和平均值。并编写主函数完成:输入100100个数,调用该函数进行统计,输出结果个数,调用该函数进行统计,输出结果。int max,min;int max,min;float aver(int x,int n)float aver(int x,int n) int i; float s=0; int i; float s=0; min=x0;max=x0; min=x0;max=x0; for(i=0;in;i+) fo

26、r(i=0;imax)max=xi; if(ximax)max=xi; if(ximin)min=xi; if(ximin)min=xi; s+=xi; s+=xi; return (s/n); 用全局变量传递结果eg8-13-1.ceg8-13-1.cmain() int a100,i; float avg; for(i=0;i100;i+) scanf(“%d”,&ai); avg=aver(a,100); printf(“n%d,%d,%f”,max,min,avg);分析不用全局变量的情况:分析不用全局变量的情况: eg8-13-2.ceg8-13-2.cfloat aver(

27、int x,int n)float aver(int x,int n) int i; float s=0; int i; float s=0; int int min=x0,max=x0min=x0,max=x0; ; for(i=0;in;i+) for(i=0;imax)max=xi; if(ximax)max=xi; if(ximin)min=xi; if(ximin)min=xi; s+=xi; s+=xi; return (s/n); main() int a100,i; float avg; int max,min;int max,min; for(i=0;i100;i+) sca

28、nf(“%d”,&ai); avg=aver(a,100); printf(“n %d,%d,%f”,max,min,avg);int max,min; int max,min; float aver(int x,int n)float aver(int x,int n) int i; float s=0; int i; float s=0; min=x0;max=x0; min=x0;max=x0; for(i=0;in;i+) for(i=0;imax)max=xi; if(ximax)max=xi; if(ximin)min=xi; if(ximin)min=xi; s+=xi;

29、 s+=xi; return (s/n); main() int x100,i; float avg; int max,min;int max,min; for(i=0;i100;i+) scanf(“%d”,&xi); avg=aver(x,100); printf(“n %d,%d,%f”,max,min,avg);分析全局变量与局分析全局变量与局部变量同名的情况部变量同名的情况eg8-13-3.ceg8-13-3.c max min max min 强龙不压地头蛇!强龙不压地头蛇!阅读程序,给出运行结果:阅读程序,给出运行结果: eg8-14.ceg8-14.cint a=4,b

30、=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);4526abcabad4721120 8 87 7 变量存储类别变量存储类别 1 1、动态存储方式和静态存储方式、动态存储方式和静态存储方式 静态存储方式静态存储方式:在程序运行期间分配固定存储单:在程序运行期间分配固定存储单元的方式。元的方式。动态存储方式动态存储方式:在程序运行期间根据需要动态分:在程序运行期间根据需要动态分配存储单元的方式。配存储单元的

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

32、变量在定义时可以指定其存储方式,即对每个局部变量的定义除定义其数据类型外,即对每个局部变量的定义除定义其数据类型外,还应定义其存储方式。定义存储方式用还应定义其存储方式。定义存储方式用autoauto(自动的)(自动的)staticstatic(静态的)。如:(静态的)。如: int f1() int f2() auto int a=1; static int b=1; 缺省时为auto 动态局部变量动态局部变量在函数调用时分配、赋初值,在函数调用时分配、赋初值,调用结束时释放。调用结束时释放。 静态局部变量静态局部变量在第一次调用时分配、赋初在第一次调用时分配、赋初值,调用结束时不释放,其单元及其值仍保留,值,调用结束时不释放,其单元及其值仍保留,下次调用时不重新分配,不重新赋初值。下次调用时不重新分配,不重新赋初值。 在实际应用中,如果希望在函数调用结束在实际应用中,如果希望在函数调用结束后仍保留某个局部变量的值给下次调用时使用,后仍保留某个局部变量的值给下次调用时使用,则可定义该变量为静态的。则可定义该变量为静态的。 例

温馨提示

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

评论

0/150

提交评论