【教学课件】第七章函数.ppt

上传人:牧羊曲112 文档编号:5660238 上传时间:2023-08-06 格式:PPT 页数:76 大小:607KB
返回 下载 相关 举报
【教学课件】第七章函数.ppt_第1页
第1页 / 共76页
【教学课件】第七章函数.ppt_第2页
第2页 / 共76页
【教学课件】第七章函数.ppt_第3页
第3页 / 共76页
【教学课件】第七章函数.ppt_第4页
第4页 / 共76页
【教学课件】第七章函数.ppt_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《【教学课件】第七章函数.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第七章函数.ppt(76页珍藏版)》请在三一办公上搜索。

1、7.1 函数的概念,#include“string.h”main()char str80=“12345”;,第7章 函数,strcat(str,“6789”);,puts(str);,gets(str);,printf(“%sn”,str);,标准库函数,对于任何应用程序来说都是由若干个程序模块 组成的,而每一个模块常用来实现一个特定的功能。在C语言中就是利用函数来实现模块功能的。,学生成绩管理系统,成绩 录入,成绩 查询,成绩统计,打印成绩单,函数值类型 函数名(形式参数表)形式参数说明;说明语句;执行语句;,int add(x,y)int x,y;int z;z=x+y;return(z)

2、;,7.2 函数的定义,return(表达式);,1、常量 2、变量 3、表达式 4、指针值,int add(x,y)int x,y;int z;z=x+y;return(z);,7.3 函数值的返回,c=add(a,b);,int add(x,y),实际参数,main()int a=100,b=200,c;c=add(a,b);printf(“c=%dn”,c);int add(x,y)int x,y;int z;z=x+y;return(z);,函数名(实参表);,形式参数,7.4 函数的调用,1、调用函数时,函数名必须与调用处的函数名完全一致。,2、实参的个数必须与形参的个数一致。,3、

3、函数必须先定义,后调用。,4、函数可以直接或间接地自己调用自己,称为递归调用。,在调用函数时,一般在主调函数和被调用函数 之间有信息传递这是由函数中的参数来完成的。,7.5 实参与形参的传递方式,Do you Know?,信息传递方式,main()int a=5,b=10,c;c=max(a,b);printf(“c=%dn”,c);,5,x,y,5,10,10,t,10,b,a,c,10,实参与形参各占用不同的内存单元,main()int a=5,b=10,c;printf(“a=%x,b=%xn”,main()int a=100,b=200,c;c=add(a,b);printf(“c=%

4、dn”,c);int add(x,y)int x,y;int z;z=(+x)+(+y);return(z);,101,201,EXAMPLE7-1:,当形参值在函数中 发生变化时,且不影响 调用它的实参值的变化,用途,采用这种数据复制 的参数传递方式,每次 每个参数只能传递一个 数据,缺点,c=add(a,b);,int add(x,y),main()int a5=1,2,3,4,5,i;add(a,5);for(i=0;i5;i+)printf(“%d,”,ai);,add(int b,int n)int j;for(j=0;jn;j+)bj+;return;,2000 2002 2004

5、 2006 2008,a0 a1 a2 a3 a4,b0 b1 b2 b3 b4,2,3,4,5,6,1、实参与形参各占用相同的内存单元,2、可以批量地传递数据,main()int a5=1,2,3,4,5,i;add(a,5);for(i=0;i5;i+)printf(“%d,”,ai);,add(int b,int n)int j;for(j=0;jn;j+)bj+;return;,for(i=0;i5;i+)printf(“%x,”,for(j=0;j5;j+)printf(“%x,”,add(a,5);,int add(b,n)int b,n;,main()int a34=1,3,5,

6、7,2,4,6,8,15,17,34,12;printf(“max=%dn“,max(a);max(int b 4)int i,j,t;t=b00;for(i=0;it)t=bij;return(t);,EXERCISES7-1:,main()int a=100;fun(,200,2000,*p,fun(int*p)*p+=100;return;,EXERCISES7-2:,从上面的分析中,我们可以得出,使用参数传递地址时,当 对形参作出的任何变动,都将影响实参的变化。所以,利用这个 特性,可以在被调用函数中把它的处理结果送入某个参数的存储 空间,函数返回时,通过参数的地址就会把处理结果带回调

7、用函 数。,To understand,请建立一个一维数组并为该数组存入10名学生某科 考试成绩,然后调用一个函数用以计算这10名学生的平 均成绩。,EXERCISES7-3:,main()float s10,ave;int i,n=10;for(i=0;in;i+)scanf(“%f”,float f(float stu,int m)float t,sum=0.0;int i;for(i=0;im;i+)sum+=stui;t=sum/m;return(t);,r=21,main()int x=6,y=7,z=8,r;r=f(x-,y+,x+y),z-);printf(“r=%dn”,r);

8、,f(int a,int b)int c;c=a+b;return(c);,请写出下列程序的运行结果,EXERCISES7-4:,7.6 函数的递归调用,C语言的特点之一,就是允许函数的递归调用。其特 点是在函数内部直接地调用自己。递归函数的结构十分 简练,对于可以使用递归算法实现功能的函数,在C语言 中都可以把它们编写成递归函数 构造递归函数的关键是寻找递归算法和终结条件象数 学中的递推函数,都可以用C语言中的递归函数来实现。,递归算法和终结条件:,n!=1x2x3xxn,=nx(n-1)xx3x2x1,=nx(n-1)!,1!=1,递归算法,递归条件,因此,要想计算出n!,必须计算出(n-

9、1)!,计算出(n-1)!,必须计算出(n-2)!;由此类推,直到推到 1!=1,返回后即可依次计 算出 2!,3!,(n-1)!,n!。,EXAMPLE7-1:,计,算,阶,乘,4!=4X 3!,f(n)=nxf(n-1)f(1)=1,例如,计算 4!,其递归过程是:,3!=3X 2!,2!=2X 1!,1!=1,4!=4X 3!=4X6=24 3!=3X 2!=3X2=6 2!=2X 1!=2 1!=1,递归算法与递归条件:,main()int t;t=fun(4);printf(“%dn”,t);,fun(4),f=4*fun(3),fun(4),f(n)=nxf(n-1)f(1)=1,

10、int fun(int n)int f,t;if(f=1)f=1;else f=n*fun(n-1);return(t);,f=3*fun(2),fun(3),f=2*fun(1),fun(2),f=1,fun(1),f(2)=2*1=2,f(3)=3*2=6,f(4)=4*6=24,t,有5个人坐在一起,问第5个人几岁,他说比第4个人大2岁;问第4个人岁数,他说比第3个人大2岁;问第3个人时,又说比第2个人大2岁;问起第2个人年龄时,又说比第1个人大2岁;最后问第1个人的年龄时,他说是10岁。请问第5个人几岁?,EXERCISES7-5:,age(5)=16+2=18,age(4)=14+2

11、=16,age(3)=12+2=14,age(2)=10+2=12,设 age 表示年龄,则有递归算法和终结条件 如下:,age(5)=age(4)+2,age(4)=age(3)+2,age(3)=age(2)+2,age(2)=age(1)+2,age(1)=10,main()printf(“%d”,age(5);,int age(int n)int c;if(n=1)c=10;else c=age(n-1)+2;return(c);,请编制用于实现下列算法的递归程序:f(n)=12+22+32+42+n2,1、递推公式:f(n)=n2+f(n-1)2、递归终止条件:f(1)=1,HOME

12、WORK7-1:,main()int x=4;float sum;float fac();sum=fac(x);printf(“%dn”,sum);,float fac(int n)float f;if(n=1)f=1;else f=n*n+fac(n-1);return(f);,7.7 变量的使用范围与存储类型,1、变量的数据类型,2、变量的初始化,3、变量的使用范围,4、变量的存储类别,“变量”是指在程序运行过程中其值可以发生变化 的量。通常是用来表示在程序中对数据存储空间的一种 抽象的描述。当我们在学习C 语言中的变量时,必须要 掌握变量的有关属性:,一、变量的使用范围,使用范围,在一个

13、函数内部定义的变量称为局部变量,main()int a,b;fun(a);,int fun(int x)int i,j;,局,部,变,量,(1)主函数中定义的变量也只有在主函数中有效;,(2)不同函数中可以使用相同的变量名,且它们 代表不同的存储单元,互不干扰;,(3)形式参数也是局部变量。其它函数是不能调 用该形参;,(4)在一个函数内部,可以在复合语句中定义变 量,这些变量只能在本复合语句中有效。,To understand:对局部变量的理解,main()int x=1;int x=2;int x=3;printf(“x1=%dn”,x);printf(“x2=%dn”,x);printf

14、(“x3=%dn”,x);,全,局,变,量,全局变量可以为本文件中其它函数所共用;使用范围:从定义变量的位置开始到本源程序文件结束。,char c1,c2;int p=1,q=5;main()int a,b;a=p;b=q;,f1(int x)int i,j,z;z=p+x;,f2(int y)char ch=a,c2=b;c1=ch;ch=c2;,int a=13,b=-8;main()int m;m=max(a,b);printf(“m=%dn”,m);,max(int x,int y)int z;z=xy?x:y;return(z);,13,EXERCISES7-6:,int a=3,b

15、=5;main()int a=8,m;m=max(a,b);printf(“m=%dn”,m);,max(int a,int b)int c;c=ab?a:b;return(c);,EXERCISES7-7:,8,To understand:对全局变量的理解,1、若在同一个源文件中,如有全局变量与局部变量同名时,则在 局部变量的作用范围内,全局变量不起作用。,2、设置全局变量的作用是:增加函数间数据联系的渠道。,float max,min;main()float ave,s5;int i;for(i=0;i5;i+)scanf(“%f”,si);ave=fun(s,5);printf(“max

16、=%f,min=%f,ave=%f n”,max,min,ave);,float fun(int a,int n)int i;float x,sum=0.0;max=min=a0;for(i=0;imax)max=ai;else if(aimin)min=ai;sum+=ai;x=sum/n;return(x);,s0 s1 s2 s3 s4,a0 a1 a2 a3 a4,12,9,20,5,3,20,3,9.8,int d=1;main()int a=3;fun(a);d+=a+;printf(“%dn”,d);,fun(int p)int d=5;d+=p+;printf(“%dn”,d)

17、;return;,8,4,4,4,EXERCISES7-8:,int x,y;main()int a=7,b=5;x=a+b;y=a-b;num();printf(“x=%d,y=%dn”,x,y);,num()int a=15,b=10;int x,y;x=a-b;y=a+b;return;,EXERCISES7-9:,二、变量的存储类别,存储类别,指的是数据在计算机中的存储方式,也可以说数据的存储地点,存储类别,内存存储区,在程序运行期间分配固定的存储空间(如全局变量)。,程序区,数据区,静态数据区,动态数据区,用户区,静态数据区,只有当函数被调用时才开始分配存储空间,在函数执行结束时就释

18、放这些空间。在程序执行过程中,这种分配和释放是动态进行的。(如局部变量)。,动态数据区,关键词 auto,auto int b=1,c=2;,1、局部变量的存储方式,函数中的局部变量通常默认为动态分配 存储空间的,即存储在动态存储区中。对它 们分配和释放空间都是由编译系统自动处理 的,因此这类局部变量也称为 自动变量。,main()int i;for(i=0;i2;i+)fun();,fun()auto int b=1,c=2;b+;c+;printf(“b=%d,c=%dn”,b,c);return;,2,3,b=2,c=3,2,3,b=2,c=3,关键词 static,static int

19、 b=1,c=2;,有时希望函数中的局部变量的值在函数调用 结束后不消失而保留其原值,即其占用的存储单 元不释放,在下一次该函数调用时,该变量已有 值,就是上一次函数调用结束时的值。,main()int i;for(i=0;i2;i+)fun();,2,3,4,3,b=2,c=3,b=3,c=4,main()int a=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);,7,8,9,To understand:“局部变量静态存储说明”,static int a;printf(“a=%dn”,a);,a=0,int a;printf(“a=%dn”,a);,a=672,ma

20、in()int i;for(i=0;i3;i+)fun();,b=1b=1 b=1,fun(int a,int b)static int m,i=2;i+=m+1;m=i+a+b;return(m);,main()int k=4,m=1,p;p=fun(k,m);prinf(“%d,”,p);p=fun(k,m);prinf(“%d”,p);,8,17,1、当需要保留函数上一次调用结束时的值;2、如果初始化后,变量只被引用而不改变其 值,则这时用静态局部变量比较方便,以 每次调用时重新赋值。,To understand:静态变量的用途,main()int i;for(i=1;i=5;i+)pr

21、intf(“%d!=%dn”,i,fac(i);,int fac(int n)static int t=1;t=t*n;return(t);,1!=12!=23!=64!=245!=120,2、全局变量的存储方式,全局变量是在函数的外部定义的,编译时分配在内存的静态存储区。全局变量可以为程序中各函数所引用。,int a=2,b=5;main()int i;printf(“a1=%d,b1=%dn”,a,b);fac();,int fac()printf(“a2=%d,b2=%dn”,a,b);return;,a1=2,b1=5,a2=2,b2=5,int a=2,b=5;main()int i

22、;printf(“a=%d,b=%dn”,a,b);fac();printf(“a=%d,b=%dn”,a,b);,int fac()a+;-b;return;,a=2,b=5,a2=3,b2=4,我们知道一个C 语言程序可以有一个或多个源程 序文件组成。如果程序是由多个源文件组成时,为了 保障某个全局变量能提供多个源文件中的函数调用,则可采全局变量的扩展调用。,3、全局变量的扩展调用,关键词 extern,int x;extern char cc;main()extern fun1(),fun2(),fun3();int aa;aa=3;cc=9;x=5;printf(“1=%d,%d,%d

23、n”,aa,cc,x);fun1();fun2();fun3();printf(“6=%d,%d,%dn”,aa,cc,x);,a1.c,extern int x;static int num=10;fun1()char cc;cc=100;x=x+1;printf(“2=%d,%d,%dn”,x,num);,a2.c,char cc;static int num=200;fun2()extern fun1();extern x;cc=88;printf(“3=%d,%d,%dn”,cc,x,num);fun1();printf(“4=%d,%d,%dn”,cc,x,num);fun3()pr

24、intf(“5=%d,%dn”,cc,num);,a3.c,1=3,9,5,2=100,6,10,3=88,6,200,2=100,7,10,4=88,7,200,5=88,200,6=3,88,7,寄存器存储区,一般情况下,变量(包括静态和动态)的值都是存放在内存储器中的,当程序中用到哪一个变量的值时,则由控制器发出指令将内存中该变量的值送到运算器中进行运算,之后再将运算结果送回内存储器中存放。,运算器,内 存,寄存器,CPU,运算器,关键词 register,register int a,b;,int fac(int n)register int i,f=1;for(i=1;i=n;i+)

25、f=f*i;return(f);,1、只有局部自动变量和形参可以作为寄存器变量。,寄存器变量使用的几点说明,5、局部静态变量不能作为寄存器变量。,register static int a,b,c;,2、对于占用字节数多的变量,如:long、float、double 型变量 不能说明为寄存器型变量。,3、由于寄存器中的数据可以直接访问,因此比其它存储类别的 变量运算速度要快。所以对于反复使用的变量均可作为寄存 器变量。,4、寄存器型变量都是在某个函数中定义的,所以一旦退出该函 数后就会被释放。,自动型,auto,内存动态数据区,CPU 中的通用寄存器,内存静态数据区,静态型,寄存器型,扩展型,

26、register,static,extern,内存静态数据区,存储类别标识表,main()printf(“%dn”,fun(9);,HOMEWORK7-2:,main()printf(“%dn”,fun(9);,p=9-fun(7),p=3-fun(1),p=7-fun(5),p=5-fun(3),p=3,p=3-3=0,p=5-0=5,p=9-2=7,p=7-5=2,请写出下列程序的运行结果,main()printf(“%5d n”,fun(4);,fun(int n)int t;if(n=0)|(n=1)t=3;else t=n*fun(n-1);return(t);,HOMEWORK7-

27、3:,请写出下列程序的运行结果,main()int x,a=2,3,4,5,6,7,8,9;x=f(a,3);printf(“%dn”,x);,f(int b,int n)int i,r=1;for(i=0;i=n;i+)r=r*bi;return(r);,HOMEWORK7-4:,请阅读以下函数并指出该函数的功能,fun(char s,char t)int i=-1;while(+i,si=ti,A)比较串s 和 t 的长度 B)比较串s 和 t 的大小 C)比较串s 和 t 是否相等 D)将串t 赋给串 s,HOMEWORK7-5:,写出下列程序的运行结果,main()fun();fun(

28、);,fun()static int a3=0,1,2;int i;for(i=0;i3;i+)ai+=ai;for(i=0;i3;i+)printf(“%d,”,ai);return;,TEST7-1:,写出下列程序的运行结果,main()incx();incy();incx();incy();incx();incy();,incx()int x=0;printf(“x=%d,”,+x);,incy()static int y=0;printf(“y=%dn”,+y);,TEST7-2:,int w=3;main()int w=10;printf(“%dn”,fun(5)*w);,fun(i

29、nt k)if(k=0)return(w);else return(fun(k-1)*k);,TEST7-3:,写出下列程序的运行结果,main()int x,i;printf(“x1=%dn”,add(4,6);printf(“x2=%dn”,add(3,add(1,2););x=0;for(i=1;i=6;i+)x=add(x,i);printf(“x3=%dn”,x);printf(“x4=%dn”,add(add(add(add(add(1,1),1),1),1),1);printf(“x5=%dn”,add(add(add(add(add(1,1),3),4),5),6);,add(int x,int y)return(x+y);,TEST7-4:,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号