樊媛媛《c语言程序设计》08-函数.ppt

上传人:牧羊曲112 文档编号:5992282 上传时间:2023-09-12 格式:PPT 页数:47 大小:332.61KB
返回 下载 相关 举报
樊媛媛《c语言程序设计》08-函数.ppt_第1页
第1页 / 共47页
樊媛媛《c语言程序设计》08-函数.ppt_第2页
第2页 / 共47页
樊媛媛《c语言程序设计》08-函数.ppt_第3页
第3页 / 共47页
樊媛媛《c语言程序设计》08-函数.ppt_第4页
第4页 / 共47页
樊媛媛《c语言程序设计》08-函数.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《樊媛媛《c语言程序设计》08-函数.ppt》由会员分享,可在线阅读,更多相关《樊媛媛《c语言程序设计》08-函数.ppt(47页珍藏版)》请在三一办公上搜索。

1、第八章 函数 81 概述 C语言的程序除主函数外,还可以有若干个其他函数块状结构。对于较大的程序来说,往往把其中相对独立的算法和功能定义成一个独立的函数,以供需要的地方调用。将一个程序分解成多个函数有如下优点:(1)减少代码的重复现象。(2)便于分工合作。(3)便于阅读。(4)便于独立算法的代码移植。,82 函数的定义和调用 通过例子来说明如何定义和调用函数:对于求两个数中的最大值,有三个步骤:(1)从键盘输入两个数给a和b。(2)求a和b中的最大值。(3)输出结果。把求最大值的算法部分定义成一个独立的函数:,函数类型 函数名 函数参数(形参)int max(int x,int y)main(

2、)int z;int a,b,c;if(xy)z=x;scanf(“%d%d”,eg8-01.c x y z a b c,3,5,说明:(1)程序由两个函数组成,它们逻辑上相互独立(功能、变量)。(2)程序的执行总是从主函数开始,主函数总是被执行一次,其他函数只有在被调用时才获得控制。(3)函数调用有两个作用:转移控制权和传递参数。(4)return的作用也有两个:交回控制权和返回结果。(5)实参可以是常量、变量或表达式,但类型要一致。,定义一个函数除考虑算法外就是:如何设计函数的参数,通过何种途径交回结果。例:求自然数1100中的素数之和。eg8-02.C?prime(?)main()int

3、 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!+7!+4!的值。eg8-03.c?fac(?)int i,s=1;for(i=1;i=n;i+)s*=i;return(s);main()printf(“n%d”,fac(5)+fac(7)+fac(4);,int n,int,main()int s,fac();对被调函数声明 s=fac(5)+fac(7)+fac(

4、4);printf(“n%d”,s);int fac(int n)int i;int s=1;for(i=1;i=n;i+)s*=i;return(s);eg8-03-1.c不需声明的情况:int char 主调函数在后(P165),若被调用的函数是库函数,则应用#include命令将所调用函数的有关信息包含进来,如:例:eg8-04.C#include“math.h”main()float x,y;scanf(%f”,83 函数的嵌套调用 C语言的函数定义虽然相互平行、相互独立的,但可以嵌套调用,形如:主函数 函数A 函数B,例:求多项式 S=i!+i!+i!的值。eg8-05.Cfloat

5、 fac(int n)?sum(?)int i;float s=0;for(i=?)s+=fac(i);return(s);main()printf(“%f”,sum(1,5)+sum(7,11)+sum(15,20);,1,5,7,11,15,20,int a,int b,float,i=a;i=b;i+,84 函数的递归调用 在函数调用的过程中,出现直接或间接地调用该函数本身。如:f1()f2()f3()f1();f3();f2();直接 间接 递归调用 递归调用,在实际应用中,有些问题既可用递归实现,也可不用递归(如求n!);也有些问题非有递归不可(如汉诺塔问题);不少问题使用递归显得很

6、方便。用递归方法求n!:递推公式:要给出结束递归的条件 1 当n=0或n=1时 n!=n(n-1)!当n1时,float fac(int n)main()float f;float f;if(n=0|n=1)f=1;f=fac(4);else f=?printf(“n%f”,f);return(f);eg8-06.c递归调用的执行过程:,n*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=

7、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),例hanoi(汉诺)塔问题十九世纪未,欧洲珍奇商店出现一种汉诺塔游戏,并有推销材料,说是古代印度布拉玛庙里的僧侣们当时正在玩这种游戏,如果游戏结束,世界未日即来临。一、规则及分析:n个盘子从一根针移到另一根针,每次只能移动一个盘子,不允许大盘在小盘上面。共有三根针,n个盘子由A移到C,需移动的次数是2n-1,若64个盘子移动的次数为:264-1=

8、18,446,744,073,709,551,600一年的秒数是:365 x 24 x 60 x 60=31536000=58494217355年即:5849亿年,从能源角度推算,太阳系寿命只有150亿年,A,B,C,二、方法与步骤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第三步进一步分

9、解:3.1 B上一个盘子从BA3.2 B上一个盘子从BC3.3 A上一个盘子从AC,A,B,C,结论:13步都是把n-1个盘子从一根针移到另一根针上,方法一样,只是针的名称不同而已,为使之一般化,将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移到

10、three;move(x,y)表示将一个盘子从x移到y。main n=3 n=2 n=1 m=3 hanoi(3,A,B,C)hanoi(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)m

11、ove(A,C),eg8-07.c 用递归的方法解决汉诺塔程序如下:void move(char x,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”,运行:input numbe

12、r of diskes:3 the step to moving 3 diskes:A C A B C B A C B A B C A C,85 数组作为函数的参数 当要传递的参数较少时,用简单变量作为函数的参数是方便的,但当要传递的参数是批量时,需要用数组作为函数的参数。,例:编写函数,求100个数的平均数。eg8-08-1.Cfloat aver(int a100)int i;float s=0;for(i=0;i100;i+)s+=ai;return(s/100);main()int x100;float avg;输入x;avg=aver(x);,对应的实参也应为数组型参数组的长度可省略

13、,通用函数考虑:eg8-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);,x,a,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(“n%d,%d”,a,b);printf(“n%d,%d”,a,b);eg8-09.C

14、a b a b,3,5,以下程序的运行结果是?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.C,例:排序。void sort(int a,int n)int i,j,t;for(i=0;iaj)t=ai;ai=aj;aj=t;main()int x5,i;for(i=0;i5;i+)scanf(“%d”,eg8-11.C,x,a,例:方阵转置(二维数组情况)。eg8-12-1.Cat(int x33

15、)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);行数不等情况?通用函数的处理?,通用函数,按一维数组处理:eg8-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);,86 局部变量和全局变量 1、局部变量 在函数内定义的变量称局部变量。局部变量只在该函数内使用。float f1(int x)int f2()

16、main()int i,j;int a,b,c;int m,n;int i,j;,说明:(1)任何函数(包括主函数)内定义的变量都是局部变量。(2)不同函数内定义的变量即使同名也互不干扰。(3)复合语句中定义的变量只在该复合语句中有效。,2、全局变量 在函数以外定义的变量,也称外部变量。全局变量可以为为本文件中其它函数所共用。它的作用范围是从定义变量的位置开始到本源文件结束。,int p=1,q=5;float f1(int a)int b,c;char c1,c2;char f2(int x,int y)int i,j;main()int m,n;,全局变量c1,c2的作用范围,全局变量p,

17、q的作用范围,全局变量主要用于作为不同函数间数据传递的桥梁。例:编写一个函数,求n个数中的最大值、最小值和平均值。并编写主函数完成:输入100个数,调用该函数进行统计,输出结果。,int max,min;float aver(int x,int n)int i;float s=0;min=x0;max=x0;for(i=0;imax)max=xi;if(ximin)min=xi;s+=xi;return(s/n);,用全局变量传递结果eg8-13-1.C,main()int a100,i;float avg;for(i=0;i100;i+)scanf(“%d”,分析不用全局变量的情况:eg8-

18、13-2.Cfloat aver(int x,int n)int i;float s=0;int min=x0,max=x0;for(i=0;imax)max=xi;if(ximin)min=xi;s+=xi;return(s/n);main()int a100,i;float avg;int max,min;for(i=0;i100;i+)scanf(“%d”,int max,min;float aver(int x,int n)int i;float s=0;min=x0;max=x0;for(i=0;imax)max=xi;if(ximin)min=xi;s+=xi;return(s/n

19、);main()int x100,i;float avg;int max,min;for(i=0;i100;i+)scanf(“%d”,分析全局变量与局部变量同名的情况eg8-13-3.C,max,min,max,min,强龙不压地头蛇!,阅读程序,给出运行结果:eg8-14.Cint 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);,4,5,2,6,a,b,c,a,b,a,d,4,7,2,11,20,87 变量

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

21、型外,还应定义其存储方式。定义存储方式用auto(自动的)static(静态的)。如:int f1()int f2()auto int a=1;static int b=1;缺省时为auto,动态局部变量在函数调用时分配、赋初值,调用结束时释放。静态局部变量在第一次调用时分配、赋初值,调用结束时不释放,其单元及其值仍保留,下次调用时不重新分配,不重新赋初值。在实际应用中,如果希望在函数调用结束后仍保留某个局部变量的值给下次调用时使用,则可定义该变量为静态的。,例:编写一个函数计算:,y=,2x-1 第一次计算,3x+1 第二次计算,4x+2 其他,float f(float x)main()f

22、loat 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);eg8-15.C,3、全局变量的存储方式全局变量都是静态存储方式,不允许用auto来定义全局变量。可以用static来定义全局变量。如:static int x;静态全局变量(内部的)int y;非静态全局变量(外部的),对于非静态全局变量,其它文件中的函数只要用extern加以外部说明,就可以访问。而对于静态全局变量

23、,只局限在本文件中的所有函数访问,其它文件中的函数即使用extern加以外部说明,也不能访问。,int y;main()y=0;int f1()y=2;,extern int y;int f3()y=10;int f4()y=100;,static int y;,88 内部函数和外部函数 用extern加以定义的函数称外部函数。用extern加以定义的函数称外部函数。extern int f1()static int f2()缺省为外部函数。外部函数可以为其他文件中的函数所调用。内部函数只为本文件中的函数所调用(保护)。,main()f3();允许 int f1()f4();不允许,extern int f3()f4();允许 static int f4(),

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号