您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > (精版)第四章利用函数实现指定功能
第四章利用函数实现指定功能4.1概述函数是程序代码的一个自包含单元,用于完成某一特定的任务。C++是由函数构成的,函数是C++的基本模块。在c++面向对象程序设计中,主函数以外的函数大多是被封装在类中的。主函数或其他函数可以通过类对象调用类中的函数。几点说明1、一个程序必须有且只有一个main()函数,C++从main()函数开始执行。2、C++语言中,所有函数都是平行独立的,无主次、相互包含之分。函数可以嵌套调用,不可嵌套定义。3、库函数是C++编译系统已预定义的函数库函数有很多个,当用户使用任一库函数时,在程序中必须包含相应的头文件。如#includeiostream等4.2函数定义的一般形式一、无参函数主调函数并不将数据传给被调函数。类型说明函数名(void){函数体}无参函数主要用于完成某一操作。参数(多个)函数值(唯一)函数体不传递参数voidmain(void){printstar();print_message();printstar();}voidprintstar(void){cout“***********\n”;}voidprint_message(void){cout“Howdoyoudo!\n”;}两个被调函数主要用于完成打印操作。输出:***********Howdoyoudo!***********二、有参函数主调函数和被调函数之间有数据传递。主调函数可以将参数传递给被调函数,被调函数中的结果也可以带回主调函数。类型说明函数名(形式参数列表说明){函数体}intmax(intx,inty){intz;z=(xy)?x:y;returnz;}voidmain(void){inta,b,c;cinab;c=max(a,b);cout“Themaxis”cendl;}ab23c3xy23z34.3关于函数参数和函数的值1、形参是被调函数中的变量;实参是主调函数赋给被调函数的特定值。在调用时实参必须是一个确定的值。2、形参与实参类型相同,一一对应。3、形参必须要定义类型,因为在定义被调函数时,不知道具体要操作什么数,而定义的是要操作什么类型的数。4、实参对形参变量的传递是“值传递”,即单向传递。在内存中实参、形参分占不同的单元。5、形参只作用于被调函数,可以在别的函数中使用相同的变量名。5a8b实参xy形参58voidfun(inta,intb){a=a*10;b=b+a;couta‘\t’bendl;}voidmain(void){inta=2,b=3;fun(a,b);couta‘\t’bendl;}ab23ab2320232023236、函数的返回值通过return语句获得。函数只能有唯一的返回值。7、函数返回值的类型就是函数的类型。intmax(floata,floatb)//函数值为整型函数返回值的类型,也是函数的类型8、一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用。intadd(inta,intb){return(a+b);}intmax(inta,intb){if(xy)returnx;elsereturny;}若函数体内没有return语句,就一直执行到函数体的末尾,然后返回到主调函数的调用处。先计算,后返回可以有多个return语句floatmax(floatx,floaty){floatz;z=(xy)?x:y;returnz;}voidmain(void){floata,b,c;cinab;c=max(a+b,a*b);cout“Themaxis”cendl;}被调函数先定义定义之后再调用形参必须说明参数类型实参传递的是一个具体的值,不必说明参数类型举例函数的调用例4.3voidmain(void){intx=2,y=3,z=0;voidadd(int,int,int);cout“(1)x=“x“y=“y“z=“zendl;add(x,y,z);cout(“(3)x=“x“y=“y“z=“zendl;}voidadd(intx,inty,intz){z=x+y;x=x*x;y=y*y;cout(“(2)x=“x“y=“y“z=“zendl;}2x3y0zxyz230495(1)x=2y=3z=0(2)x=4y=9z=5(3)x=2y=3z=01、计算100~200之间的素数,用函数prime()判断一个数是否是素数,若是该函数返回1,否则返回0。举例voidmain(void){for(inti=100;i=200;i++)if(prime(i)==1)couti‘\t’;}intprime(intx){for(inti=2;ix/2;i++)if(x%i==0)return0;return1;}2、计算输入两个数的最大公约数voidmain(void){intx,y;cinxy;coutgys(x,y)endl;}intgys(inta,intb){intr;if(ab){r=a;a=b;b=r;}while(r=a%b){a=b;b=r;}returnb;}4.4函数的嵌套调用C++语言中(含C语言),所有函数都是平行独立的,无主次、相互包含之分。函数可以嵌套调用,不可嵌套定义。kkkknnkf....321),(intpower(intm,intn)//m^n{inti,product=m;for(i=1;in;i++)product=product*m;returnproduct;}intsum_of_power(intk,intn)//n^k的累加和{inti,sum=0;for(i=1;i=n;i++)sum+=power(i,k);returnsum;}voidmain(void){intk,m;cinkm;coutf(k,m)=sum_of_power(k,m)endl;//m^k的累加和}嵌套调用嵌套调用平行定义平行定义举例c4-4或教材例题4.44.5函数的递归调用在调用一个函数的过程中直接或间接地调用函数本身,称为函数的递归调用。例4.5有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。问第1个人多少岁,他说是10岁。请问第5个人多大?age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(n)=10n=1age(n-1)+2n1intage(intn){intc;c=age(n-1)+2;returnc;}voidmain(void){intage(int);coutage(5)endl;}intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}必须有递归结束条件虽然算法一致,但n不同,c不同,在内存中每一层函数变量所在的内存单元均不相同。必须有递归终止条件。例4.6用递归方法求n!n!=1n=0,1n*(n-1)!n1floatfac(intn){floaty;if((n==0)||(n==1)y=1;elsey=n*fac(n-1);returny;}voidmain(void){floaty;intn;cout“Inputn:\n”;cinn;coutn“!=”fac(n)endl;}fac(5)n=5y=5*fac(4)fac(4)n=4y=4*fac(3)fac(3)n=3y=3*fac(2)fac(2)n=2y=2*fac(1)fac(1)n=1y=1returnyreturnyy=2returnyy=6returnyy=24returnyy=1204.6有关作用域和存储类作用域是指程序中所说明的标识符在哪一个区间内有效,即在哪一个区间内可以使用或引用该标识符。在C++中,作用域共分为五类:块作用域、文件作用域、函数原型作用域、函数作用域和类的作用域。一、块作用域我们把用花括号括起来的一部分程序称为一个块。在块内说明的标识符,只能在该块内引用floatf1(inta){intb,c;.....}floatf2(intx,inty){inti,j;.....}voidmain(void){intm,n;.....}x,y,i,j有效a,b,c有效m,n有效注意:具有块作用域的标识符在其作用域内,将屏蔽其作用块包含本块的同名标识符,即变量名相同,局部更优先。voidmain(void){inta=2,b=3,c=5;couta‘\t’b‘\t’cendl;{inta,b=2;a=b+c;couta‘\t’b‘\t’cendl;}c=a-b;couta‘\t’b‘\t’cendl;}a2b3c5235725ab27-123-1二、文件作用域全局变量的作用域称为文件作用域,即在整个文件中都是可以访问的。其缺省的作用范围是:从定义全局变量的位置开始到该源程序文件结束。当在块作用域内的变量与全局变量同名时,局部变量优先。p,q有效intp=1,q=5;floatf1(inta){intb,c;.....}charc1,c2;main(){intm,n;.....}a,b,c有效m,n有效c1,c2有效全局变量局部变量全局变量增加了函数间数据联系的渠道4intmin;intmax(intx,inty){intz;min=(xy)?x:y;z=(xy)?x:y;returnz;}voidmain(void){inta,b,c;cinab;c=max(a,b);cout“Themaxis”cendl;cout“Theminis”minendl;}全局变量abc414xy1min0z41函数值为4Themaxis4Theminis1min在main()和max()中均有效,在内存中有唯一的存储空间。在块作用域内可通过作用域运算符“::”来引用与局部变量同名的全局变量。#includeiostream.hinti=100;voidmain(void){inti,j=50;i=18;//访问局部变量i::i=::i+4;//访问全部变量ij=::i+i;//访问全部变量i和局部变量jcout”::i=”::i’\n’;cout”i=”i’\n’;cout”j=”j’\n’;}::i=104i=18j=122三、函数原型作用域在函数原型的参数表中说明的标识符所具有的作用域称为函数原型作用域,它从其说明处开始,到函数原型说明的结束处结束。floattt(intx,floaty);//函数tt的原型说明四、存储类(存储期)外存内存程序程序区静态存储区动态存储区存放程序代码存放变量需要区分变量的存储类型作用域全局变量局部变量生存期动态存储变量静态存储变量静态存储:在文件运行期间有固定的存储空间,直到文件运行结束。动态存储:在程序运行期间根据需要分配存储空间,函数结束后立即释放空间。若一个函数在程序中被调用两次,则每次分配的单元有可能不同。程序区静态存储区动态存储区全局变量静态局部变量动态局部变量intfun(inta){intc;staticintb=3;c=a+b++;returnc;}voidmain(void){intx=2,y;y=fun(x);coutyendl;y=fun(x+3);coutyendl;}x2ya2b3c5455a5只赋一次初值c9599输出:变量b是静态局部变量,在内存一
本文标题:(精版)第四章利用函数实现指定功能
链接地址:https://www.777doc.com/doc-310294 .html