首页 第7章 函数

第7章 函数

举报
开通vip

第7章 函数第7章函数青岛理工大学琴岛学院计算机系C语言程序设计库函数函数的定义和返回值函数的调用函数的说明调用函数和被调用函数之间的数据传递函数的递归调用主要内容:C语言提供了丰富的库函数,如数学函数(sin().sqrt())、输入输出函数、字符和字符串处理函数等。可直接调用这些函数,不必重新自己编写。调用库函数时,要有include命令行如:#include“stdio.h”#include<math.h>(注意:命令行后无”;”)对库函数的一般调用形式:函数名...

第7章  函数
第7章函数青岛理工大学琴岛学院计算机系C语言程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 库函数函数的定义和返回值函数的调用函数的说明调用函数和被调用函数之间的数据传递函数的递归调用主要内容:C语言提供了丰富的库函数,如数学函数(sin().sqrt())、输入输出函数、字符和字符串处理函数等。可直接调用这些函数,不必重新自己编写。调用库函数时,要有include命令行如:#include“stdio.h”#include<math.h>(注意:命令行后无”;”)对库函数的一般调用形式:函数名(参数 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf )7.1库函数(详见附录8)调用库函数的两种形式:出现在表达式中:作为独立的语句:例:求y=x2.5+1.3,可以调用pow函数来实现y=pow(x,2.5)+1.3for(printf(“:”);scanf(“%d”,&x),t=x;printf(“:”));printf(”******\n”);使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件7.2.1函数定义一般格式:合法标识符函数体例有参函数intmax(intx,inty){intz;z=x>y?x:y;return(z);}例无参函数printstar(){printf(“**********\n”);}或printstar(void){printf(“**********\n”);}7.2函数的定义与返回值缺省int型无返回值void类型名形式参数1,类型名,形式参数2……例求双精度之和doubleadd(doublea,doubleb){doubles;s=a+b;returns;}注意:函数名和形式参数都是用户命名的标识符。在同一程序中,函数名必须唯一。同一函数中,形式参数名必须唯一,但可以和其他函数的变量同名。不能在函数的内部定义函数函数没有返回值时函数为void类型,不写返回类型时默认为int型。定义的函数可以没有形参,函数体也可以没有任何操作,但函数名后的()不能省函数的返回值是通过return语句返回的功能:终止函数的运行,返回调用该函数的地方,若有返回值,将返回值带回。return语句格式:return表达式;return(表达式);return;7.2.2函数的返回值return语句中的表达式类型一般应和函数的类型一致,如果不一致,系统自动将表达式类型转换。return语句中不含表达式时,作用只是返回到调用函数函数可以没有return语句,程序一直进行到最后的“}”然后返回到调用函数。一个函数内,可以在多处出现return语句,在函数体的不同部位退出函数,但无论有多少,return只能执行一次说明:printstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}输出:**********10voidprintstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}编译错误!【例1】函数带回不确定值.main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}【例2】函数返回值类型转换运行情况如下:输入:1.8,2.9输出结果:Maxis2floatc;%f运行情况如下:输入:1.8,2.9输出结果:Maxis2.000000main(){intmax(float,float)floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);z=x;returnz;}函数名(实在参数表)7.3函数的调用函数调用的一般形式:调用方式函数语句:例printstar();函数表达式:例m=add(3.0,4.0);if(y=0,i=1;i<=5;i++)y=add(y,i);if(add(x,y)>0)……函数参数:例printf(“%d”,max(a,b));m=max(a,max(b,c));形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}函数的形式参数与实际参数【例】比较两个数并输出大者关于形参和实参的说明:①当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。所以这种变量只在函数体内部起作用②实参可以是常量、变量或表达式,但要求它们有确定的值。③实参与形参类型要一致,字符型与整型可以兼容,若形参与实参类型不一致,自动按赋值兼容的 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 转换④实参与形参的个数必须相等。在函数调用时,实参的值赋给与之相对应的形参。关于函数调用的要求:调用函数时,函数名必须与所调用的函数名字完全一致。函数必须先定义后调用(函数的返回值类型为int或char时除外):如doubleadd(doublea,doubleb){……}main(){doubley,p,q;……y=add(p,q);……}7.4函数的说明当把函数(返回值是非int和char类型)的定义放在调用之后时,要在调用之前对函数进行说明(函数原型说明)。函数说明的一般形式函数类型函数名(参数类型1,参数类型2,…)函数类型函数名(参数类型1参数名1,…)如:doubleadd(double,double)doubleadd(doublep,doubleq)说明:函数说明可以是一条独立的说明语句,也可以在普通变量的说明中,如:doubleadd(double,double);doublex,y,add(double,double);说明时的参数名是虚设的,可以是任何的用户标识符,可以和程序中的任意用户标识符同名,也不必与函数的形参名一致。函数类型必须与函数返回值相同函数说明与函数定义不同,函数说明是告诉编译系统函数类型、参数个数及类型,以便进行有效的类型检验下列情况下,可不作函数说明若函数返值是char或int型,系统自动按int型处理被调用函数定义出现在主调函数之前函数说明的位置1.在函数内部:只能在本函数内调用函数2.在函数外部:从说明开始直至函数定义,所有的位置都可调用函数【例】函数说明举例7.5调用函数和被调用函数之间的数据传递三种方式:1.实参形参2.return语句把函数值返回调用函数。3.通过全局变量(不提倡使用)【例7.2】判断执行结果#include<stdio.h>voidtry(int,int,int);main(){intx=2,y=3,z=0;printf(“(1)x=%dy=%dz=%d\n”,x,y,z);try(x,y,z);printf(“(4)x=%dy=%dz=%d\n”,x,y,z);}voidtry(intx,inty,intz){printf(“(2)x=%dy=%dz=%d\n”,x,y,z);z=x+y;x=x*x;y=y*y;printf(“(3)x=%dy=%dz=%d\n”,x,y,z);}举例:上例中数据传递的过程:mainxyztryxyztryxyz230程序的运行结果:(1)x=2y=3z=0(2)x=2y=3z=0(3)x=4y=9z=5(4)x=2y=3z=0【例7.3】判断执行结果#include<stdio.h>voidswap(int,int);main(){intx=10,y=20;printf(“(1)x=%dy=%d\n”,x,y);swap(x,y);printf(“(4)x=%dy=%d\n”,x,y);}voidswap(inta,intb){intt;printf(“(2)a=%db=%d\n”,a,b);t=a;a=b;b=t;printf(“(3)a=%db=%d\n”,a,b);}程序的运行结果:(1)x=10y=20(2)a=10b=20(3)a=20b=10(4)x=10y=37.6程序举例【例7.4】编写程序isprime(inta),用来判断a是否为素数,若是素数,函数返回整数1,否则返回0#include<stdio.h>intisprime(int);main(){intx;printf(“Enteraintegernumber:”);scanf(“%d”,&x);if(isprime(x))printf(“%disprime\n”,x);elseprintf(“%disnotprime\n”,x);}intisprime(inta){inti;for(i=2;i<=a/2;i++)if(a%i==0)return0;return1;}【例7.5】验证任意偶数为两个素数之和,并输出这两个素数思路:将验证的数放在x中,可依次从x中减去i,i从2变化到x/2算法:1.i←22.判断i是否为素数,若是执行3,若不是,执行53.判断x-i是否为素数,如是执行4,若不是,执行54.输出结果,返回调用函数5.使i增16.重复执行2,直到i>x/2#include<stdio.h>intisprime(int);Voideven(int);main(){inta;printf(“Enteraevennumber:”);scanf(“%d”,&a);if(a%2==0)even(a);elseprintf(“The%disn’tevennumber\n”,a);}viodeven(intx){inti;for(i=2;i<=a/2;i++)if(isprime(i))if(isprime(x-i)){printf(“%d=%d+%d\n”,x,I,x-i);return;}}intisprime(inta){……}例7.6编写函数sum(intn),用以求,和数作为函数值返回f(x)=x2+1#include<stdio.h>intsum(int);intf(int);main(){inta,b;printf(“Enteraintegernumber:”);scanf(“%d”,&a);b=sum(a);printf(“a=%dsum=%d\n”,a,b);}intsum(intn){intx,s=0;for(x=0;x<=n;x++)s+=f(x);returns;}intf(intx){returnx*x+1;}【例7.9】编写函数统计输入字符的个数,用@字符结束输入,在主函数中调用此函数,输出结果#include<stdio.h>longcountch();main(){longn,b;n=countch();printf(“n=%ld\n”,n);}longcountch(){longcn;for(cn=0;getchar()!=‘@’;cn++);returncn;}8.5函数的嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数main函数{……调用函数A;……}函数A{……调用函数B;……}函数B{………………}【例】函数的嵌套调用main(){intn=3;printf("%d\n",sub1(n));}sub1(intn){inti,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序输出结果:98.6函数的递归调用(第11.3章)递归调用:在函数的执行过程中直接或者间接的调用函数本身。F函数调用F函数F1函数调用F2函数F2函数调用F1函数直接递归间接递归说明C编译系统对递归函数的调用次数没有限制注意防止出现无终止的递归调用,要有使程序趋向于结束的条件【例11.3】编一递归函数求n!。思路:以求4的阶乘为例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。递归结束条件:当n=0时,n!=1。递归公式:递归调用过程递推main()fact(4)fact(3)fact(2)fact(1){{{{{……………y=fact(4);f=4*fact(3);f=3*fact(2);f=2*fact(1);f=1;……………return24return6return2return1}}}}}回归程序如下:#include<stdio.h>intfac(intn){intt;if(n==0||n==1)t=1;elset=fac(n-1)*n;return(t);}main(){intm,y;printf("Inputaintegernumber:");scanf("%d",&m);if(m<0)printf(“dataerror!");else{y=fac(m);printf("%d!=%d",m,y);}}运行情况如下:Inputaintegernumber:44!=24例:求年龄的问题5个人坐在一起,问多大,他说比第四个人大2岁,第四个人说比第三个人大2岁,第三个人又说比第二个人大2岁,第二个又说比第一个人大2岁,最后第一人说他10岁。请问第五个人多大?分析:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10函数的执行过程递推回归age(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}main(){printf(“%d”,age(5));}例:汉诺塔的问题一个古典的数学问题,在古代的梵塔中有三个座A、B、C,A座上有64个盘子,大小不等。大的在下,小的在上,有一个老和尚想将这64个盘子移到C座上,要求:每次只允许一个盘子,并且要始终保持大的在下,小的在上。分析:将n个盘子从A座移动到C座的步骤:将A上n-1个盘子借助C座移动到B座上将A座上剩下的一个盘子移动C上将n-1个盘子从B座借助A座移动到C上上述的三个步骤可以分成两类操作:将n-1个盘子从一个座移动到另外一个座上hanoi()函数实现将一个盘子从一个座移动到另一个座上move()函数实现voidmove(charx,chary){printf("%c->%c\n",x,y);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}main(){intm;printf("pleaseinputthenumberofthediskes:");scanf("%d",&m);printf("thestepofmovethediskes:");hanoi(m,'A','B','C');}
本文档为【第7章 函数】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_693555
暂无简介~
格式:ppt
大小:354KB
软件:PowerPoint
页数:0
分类:互联网
上传时间:2018-03-10
浏览量:24