c语言程序设计王勇函数.pptx
三三.C.C 函数的调用函数的调用上一页下一页暂 停重 放系统返 回休息1.1.函数调用的形式函数调用的形式int max(int x,int y);void main()int a1,a2,a;scanf(%d,%d”,&a1,&a2);a=max(a1,a2);printf(“最大值:%d”,a);int max(int x,int y)int z;if(xy)z=x;else z=y;return z;2.2.对被调函数的说明对被调函数的说明 同变量一样,函数的调用也应该遵同变量一样,函数的调用也应该遵循循“先说明,后使用先说明,后使用”的原则。函数的原则。函数的说明形式就是写出函数的函数头,的说明形式就是写出函数的函数头,在其后加上一个分号。在其后加上一个分号。(A A)函数名(参数表);函数名(参数表);(B B)变量变量=函数表达式函数表达式 ;说明格式()说明格式()调用练习3.3.说明位置说明位置:使用之前使用之前第1页/共14页上一页下一页暂 停重 放系统返 回休息四、四、C C函数的传值调用函数的传值调用 一般情况下,调用函数时,主调函数与被调函数之间有数据传一般情况下,调用函数时,主调函数与被调函数之间有数据传递关系。主调函数向被调函数传递数据是通过形式传数,而被调递关系。主调函数向被调函数传递数据是通过形式传数,而被调函数向主调函数传递数据是通过函数向主调函数传递数据是通过returnreturn语句实现的。语句实现的。传值调用的方式是:传值调用的方式是:1.形参与实参各占一个独立的存储空间。相互之间互不影响。2.形参的存储空间是在函数调用时才分配的。调用时,系统为形参开辟一个临时空间,然后将实参的值对应地传递给形参,这时形参就得到了实参的值。3.函数返回时,临时存储单元被撤销。4.函数中对形参变量的操作不会影响到调用函数中的实参变量,即形参的值不能传回给实参。这种传值方法称为传值调用。下面我们通过调试一个程序说明这种传值方式:调试调试练习练习第2页/共14页上一页下一页暂 停重 放系统返 回休息五、五、C C函数的函数的地址传送地址传送调用调用 传值调用方式传值调用方式,函数只有一个入口函数只有一个入口实参传值给形参,一个出实参传值给形参,一个出口口函数返回值。函数受外界的影响减小到最低限度,从而保函数返回值。函数受外界的影响减小到最低限度,从而保证了函数的独立性。但这种传值方式只能通过证了函数的独立性。但这种传值方式只能通过returnreturn语句返回语句返回一个函数值。若想从被调函数获得多个数据,应该怎么办呢?一个函数值。若想从被调函数获得多个数据,应该怎么办呢?地址传送方式地址传送方式1.1.什么是地址传送什么是地址传送 所谓地址传送是从主调函数向被调函数传递数据时,不是所谓地址传送是从主调函数向被调函数传递数据时,不是将实型数据的值传递给形式参数,而是把变量的地址传给形将实型数据的值传递给形式参数,而是把变量的地址传给形式参数,使形式参数与实际参数共处同一个存储单元。这样式参数,使形式参数与实际参数共处同一个存储单元。这样该存储单元中的任何变化既会影响形式参数,又会影响实际该存储单元中的任何变化既会影响形式参数,又会影响实际参数。参数。第3页/共14页上一页下一页暂 停重 放返 回休息2.2.地址传送的描述(以数组的传递为例)地址传送的描述(以数组的传递为例)main()int a3=8,9,10;printf(“na0=%d,a1=%d,a2=%d”,a0,a1,a2);dy(a);printf(“na0=%d,a1=%d,a2=%d”,a0,a1,a2);void dy(int x3)x0=4;x1=5;x2=6;a0a1a2x0 x1x28910456屏幕显示:a0=8,a1=9,a2=10a0=4,a1=5,a2=6ax第4页/共14页上一页下一页暂 停重 放系统返 回休息六、函数的嵌套调用六、函数的嵌套调用 C C函数不允许嵌套定义,但允许嵌套调用。函数不允许嵌套定义,但允许嵌套调用。函数的嵌套调用是指在调用一个函数的过程中,该函数又调用另一函数的嵌套调用是指在调用一个函数的过程中,该函数又调用另一个函数。个函数。123456789第5页/共14页上一页下一页暂 停重 放系统返 回休息七、函数的递归调用七、函数的递归调用 函数的递归调用是指一个函数在程序运行过程中直接或函数的递归调用是指一个函数在程序运行过程中直接或间接地调用自己。间接地调用自己。直接递归直接递归间接递归间接递归 递归调用的优点是使程序简洁、紧凑。但是,我们在使用递归调递归调用的优点是使程序简洁、紧凑。但是,我们在使用递归调用时,一定要注意避免无穷递归,这就需要设定一个条件,只有在满用时,一定要注意避免无穷递归,这就需要设定一个条件,只有在满足条件时才进行递归调用,否则不再继续。足条件时才进行递归调用,否则不再继续。第6页/共14页上一页下一页暂 停重 放系统返 回休息八、程序举例八、程序举例 判断一个数是不是素数判断一个数是不是素数 分析:素数即除其本身及分析:素数即除其本身及1 1以外不能被其他数整除的数以外不能被其他数整除的数 用用2 2n-1n-1的数依次除的数依次除n n,如果有一个能整除就不是素数,如果有一个能整除就不是素数 实际上,只要实际上,只要2 2 就可以了就可以了 int isprime(int a)isprime(int a)int i;int i;for(i=2;i=sqrt(a);i+)for(i=2;i=sqrt(a);i+)if(a%i=0)return 0;if(a%i=0)return 0;return 1;return 1;第7页/共14页上一页下一页暂 停重 放系统返 回休息 验证任意一个偶数是两个素数的和验证任意一个偶数是两个素数的和 分析:设这个数为分析:设这个数为x x 将它分成两个数将它分成两个数 i,x-ii,x-i除的数除的数 i i从从1 1变化到变化到i/2i/2,逐一验证即可,逐一验证即可void even(int x)int i;for(i=2;i=x/2;i+)if(isprime(i)if(isprime(x-i)printf(“%d,%d”,i,x-i);int isprime(int a)isprime(int a)int i;int i;for(i=2;i=sqrt(a);i+)for(i=2;i=sqrt(a);i+)if(a%i=0)return 0;if(a%i=0)return 0;return 1;return 1;第8页/共14页上一页下一页暂 停重 放系统返 回休息 分析:可用循环求累加和分析:可用循环求累加和 其中其中x x由由0 0变化到变化到n,n,以次加以次加1 1#define f(x)=((x)*(x)+1)或f(int x)return x*x+1;sum(int x)int x,s=0);for(x=0;x=n;x+)s+=f(x);return s;求求第9页/共14页上一页下一页暂 停重 放系统返 回休息 例如梯形法求半径为例如梯形法求半径为r r的圆面积的圆面积其中h为每一步的步长,h=(b-a)/n n为分的段数#define f(x)=(r*r-x*x)sum(int x)int x,s=0);for(x=0;x=a&ch=z)ch=ch-32;return ch;main()char c;while(c=getchar()!=)c=myupper;putchar(c);第11页/共14页上一页下一页暂 停重 放系统返 回休息 编写函数统计输入字符的个数,要求按编写函数统计输入字符的个数,要求按ZZ结束结束分析:函数值类型:整型或长整型 结束方法 遇Zint count()int n=0;while(getchar()!=EOF)n+;return ch;main()int n;n=count();printf(“%d”,n);第12页/共14页上一页下一页暂 停重 放系统返 回休息 编写函数统计输入输入文本中单词的个数编写函数统计输入输入文本中单词的个数分析:单词以空格、换行符、跳格符分开 但并非遇到这几个符号就是一个单词(有可能连续多个)countword()int c,nw,state;int c,nw,state;state=0;nw=0;state=0;nw=0;while(c=getchar()!=EOF)while(c=getchar()!=EOF)if(c=if(c=|c=|c=nn|c=|c=tt)state=0;state=0;else if(state=0)else if(state=0)state=1;nw+;state=1;nw+;return nw;return nw;main()int n;n=countword();printf(“%d”,n);第13页/共14页感谢您的观看!第14页/共14页