chapter 3 Function

上传人:xia****ai 文档编号:243155563 上传时间:2024-09-17 格式:PPT 页数:48 大小:673KB
返回 下载 相关 举报
chapter 3 Function_第1页
第1页 / 共48页
chapter 3 Function_第2页
第2页 / 共48页
chapter 3 Function_第3页
第3页 / 共48页
点击查看更多>>
资源描述
C+ Language Programming,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+ Language Programming,*,单击此处编辑母版标题样式,Chapter 3,Function,合 肥 学 院 计 科 系,项 响 琴,E-mail:,xxq2003,Index,函数的定义与调用,内联函数和重载函数,终止程序执行,函数定义形式,返回类型 函数名,(,参数声明,),声明部分,语句,/*,不论有无形参,,“,(),”,不可丢*,/,3.1,函数的定义,(Definition),9/17/2024,3,C+ Language Programming,FD,:,int,max,(int,x,int,y),int,z;,z = xy?x:y;,return z;,int,min,(int,x,int,y),return xb) max=,a;else,max=b;,if(c,max) max=c;,9/17/2024,5,C+ Language Programming,把函数名定为:,maxnum,,返回类型为,float,的。则完整的函数定义为:,float,maxnum(float,a,float b,float c),float max;,if(a,b) max=,a;else,max=b;,if(c,max) max=c;,return max;,若将函数设成无返回值,则可以写成:,9/17/2024,6,C+ Language Programming,若将函数设成无返回值,则可以写成:,void,maxnum(float,a,float b,float c),float max;,max=ab?a:b;,max=maxc?max:c;,cout,max,endl,;,return ;,9/17/2024,7,C+ Language Programming,例,3.2,计算圆柱体积,输入圆柱,体,的高和半径,求圆柱体积,,,volume=,*r,2,*h,。,要求定义函数,cylinder (r, h ),计算圆柱体的体积。,9/17/2024,8,C+ Language Programming,/*,定义求圆柱体积的函数 *,/,double cylinder (double r, double h),double result;,result =3.1415926 * r * r * h; /*,计算体积 *,/,return result;,/*,返回结果 *,/,例,3.2,计算圆柱体积,9/17/2024,9,C+ Language Programming,/*,计算圆柱体积 *,/,#include ,void main( ),double height, radius, volume;,cout,radiusheight;,/*,调用函数,返回值赋给,volume */,volume =,cylinder (radius, height ),;,cout,Volume =“volume,endl,;,return 0;,Enter radius and height:,3.0 10,Volume = 282.743,Calling a,Funtion,9/17/2024,10,C+ Language Programming,3.2 Calling a Function,3.2.1,Calling a Function,3.2.2,Recursion,9/17/2024,11,C+ Language Programming,3.2.1 Calling a Function,一般形式,函数名,(,实参列表,),说明,即使没有实参,,(),也不能省略,多个实参之间用逗号分隔,实参与形参按顺序一一对应,类型应匹配,9/17/2024,12,C+ Language Programming,/*,计算圆柱体积 *,/-,前例,#include ,void main( ),double height, radius, volume;,cout,radiusheight;,/*,调用函数,返回值赋给,volume */,volume =,cylinder (radius, height ),;,cout,Volume =“volume,endl,;,return 0;,9/17/2024,13,C+ Language Programming,函数的调用过程,上例中,main,函数调用,maxnum,函数的过程 :,main,函数,调用,maxnum,函数,maxnum,函数,子函数结束,main,函数结束,9/17/2024,14,C+ Language Programming,参数,函数,定义,时的参数被称为,形式参数,(简称,形参,),double cylinder (double,r, double,h,),;,函数,调用,时的参数被称为,实际参数,(简称,实参,),volume = cylinder (,radius,height,);,实参,形参,在参数传递过程中,实参把值复制给形参。,形参和实参,一一对应,:数量一致,类型一致,顺序一致,形参,:变量,用于接受实参传递过来的值,实参,:常量、变量或表达式,单向传递,9/17/2024,15,C+ Language Programming,参数传递,void,swap(int,x,int,y),int,t;,t=x, x=y, y=t;,void main(),int,a=1, b=4;,swap(a, b);,cout,ab0),这是一个递归形式的公式,应该用递归函数实现。,9/17/2024,22,C+ Language Programming,例,3.5,有,5,个人坐在一起,问第,5,个人多少岁?他说比第,4,个人大,2,岁。问第,4,个人岁数,他说比第,3,个人大,2,岁。问第,3,个人,又说比第,2,个人大,2,岁。问第,2,个人,说比第,1,个人大,2,岁。最后问第,1,个人,他说是,10,岁。请问第,5,个人多大。显然,这是一个递归问题。要求第,5,个人的年龄,就必须先知道第,4,个人的年龄,而第,4,个人的年龄也不知道,要求第,4,个人的年龄必须先知道第,3,个人的年龄,而第,3,个人的年龄又取决于第,2,个人的年龄,第,2,个人的年龄取决于第,1,个人的年龄。而且每一个人的年龄都比其前,1,个人的年龄大,2,。,9/17/2024,23,C+ Language Programming,例,3.5,即,: age,(,5,),age,(,4,),2,age,(,4,),age,(,3,),2,age,(,3,),age,(,2,),2,age,(,2,),age,(,1,),2,age,(,1,),10,可以用式子表述如下:,10,(,n,1,),age,(,n,),age,(,n,1,),2,(,n,1,),可以看到,当,n,1,时,求第,n,个人的年龄的公式是相同的。因此可以用一个函数表示上述关系,.,9/17/2024,24,C+ Language Programming,求第,5,个人年龄的过程,9/17/2024,25,C+ Language Programming,例,3.5,可以用一个函数来描述上述,递归,过程:,age,(,int,n,),/*,求年龄的递归函数*,/,int,c,;,/* c,用作存放函数的返回值的变量*,/,if,(,n,1,),c,10,;,else c,age,(,n,1,),2,;,return,(,c,);,main,(),printf,(,d,,,age,(,5,);,9/17/2024,26,C+ Language Programming,例,3.5,main,函数中只有一个语句。整个问题的求解全靠一个,age,(,5,)函数调用来解决。函数调用过程如图所示。,9/17/2024,27,C+ Language Programming,例,3.6,汉诺塔,(Hanoi),问题,有三根针,A,、,B,、,C,。,A,针上有,N,个盘子,大的在下,小的在上,要求把这,N,个盘子从,A,针移到,C,针,在移动过程中可以借助,B,针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。,A,B,C,9/17/2024,28,C+ Language Programming,将,n,个盘子从,A,针移到,C,针可以分解为下面三个步骤:,将,A,上,n-1,个盘子移到,B,针上(借助,C,针),;,把,A,针上剩下的一个盘子移到,C,针上,;,将,n-1,个盘子从,B,针移到,C,针上(借助,A,针),;,事实上,上面三个步骤包含两种操作:,将多个盘子从一个针移到另一个针上,这是一个递归 的过程。,hanoi,函数实现。,将,1,个盘子从一个针上移到另一针上。用,move,函数实现。,Hanoi,塔问题,分析:,9/17/2024,29,C+ Language Programming,Hanoi,塔问题分析,:,假设,A,针上有,3,个盘子移到,C,针上,1,、,将,A,针上,2,个盘子移到,B,针上,/,将,one,针上,n-1,个移到,three,针,(,1,)将,A,上,1,个盘子移到,C,上,/,借助,two,(,2,)将,A,上,1,个盘子移到,B,上,/oneA,twoC,threeB,(,3,)将,C,上,1,个盘子移到,B,上,2,、,将,A,针上,1,个盘子移到,C,针上,3,、,将,B,针上,2,个盘子移到,C,针上,/,将,one,针上,n-1,个移到针,three,(,1,)将,B,上,1,个盘子移到,A,上,/,借助,two,(,2,)将,B,上,1,个盘子移到,C,上,/,oneB,twoA,threeC,(,3,)将,A,上,1,个盘子移到,C,上,综合一下,移动的步骤:,AC,,,AB,,,CB,,,AC,,,BA,,,BC,,,AC,程序代码略,9/17/2024,30,C+ Language Programming,DIY:,1,、编写一个主函数,输入一个整数,调用前写的判断素数的子函数,输出是否素数的信息。,2,、编写一个主函数,输入一字符串,调用前写求字符串长度的函数,输出字符串长度。,9/17/2024,31,C+ Language Programming,3.3,带有默认形参值的函数,函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。,例如:,int,add(int,x=5,int y=6), return x+y;,void main(void), add(10,20); /10+20,add(10); /10+6,add(); /5+6,9/17/2024,32,C+ Language Programming,默认形参值的说明次序,默认形参值必须,从右向左,顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。,调用时实参取代形参是,从左向右,的顺序,且不允许某个参数省略后,再给其后的参数指定参数值。,例:,int,add(int,x,int,y=5,int z=6); /,正确,int,add(int,x=1,int y,=5,int z); /,错误,int,add(int,x,=1,int,y,int,z=6); /,错误,调用,:add(,23,4); /,错误,9/17/2024,33,C+ Language Programming,默认形参值与函数的调用位置,调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;,当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。,例:,int,add(int,x,=5,int y,=6,);,void main(void), add(); /,调用在实现前,int,add(int,x,int,y), return x+y; ,int,add(int,x,=5,int y,=6,), return x+y; ,void main(void), add(); /,调用在实现后,9/17/2024,34,C+ Language Programming,默认形参值的作用域,在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不同的默认形参。,例:,int,add(int,x=1,int y=2);,void main(void),int,add(int,x=3,int y=4);,add(); /,使用局部默认形参值(实现,3+4,),void fun(void), .add(); /,使用全局默认形参值(实现,1+2,),9/17/2024,35,C+ Language Programming,3.4,内 联 函 数,声明时使用关键字,inline,编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销,.,注意,内联函数体内不能有循环语句和,switch,语句。,内联函数在调用之前必须进行完整的定义。,C+,编译器,在程序运行时,不再进行该函数调用。,9/17/2024,36,C+ Language Programming,例:,内联函数应用,#include,inline,double,CalArea,(double,radius),return 3.14*radius*radius;,int,main(), double r(3.0),,,area;,area=,CalArea,(r,);,cout,area,endl,;,return 0;,9/17/2024,37,C+ Language Programming,3.5,重载函数,(多态性),C+,允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。,例:,形参类型不同,int,add(int,x,int,y);,float add(float x, float y);,形参个数不同,int,add(int,x,int,y);,int,add(int,x,int,y,int,z);,9/17/2024,38,C+ Language Programming,注意事项,不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:,(,1,),int,add(int,x,int,y);,int,add(int,a,int,b);,编译器不以形参名来区分,(,2,),int,add(int,x,int,y);,void,add(int,x,int,y);,编译器不以返回值来区分,int,add(int,x,int,y), return x,+,y; ,float add(float x,float y), return x,-,y; ,重载函数的形参必须不同,:,个数,不同或,类型,不同。,编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。,9/17/2024,39,C+ Language Programming,重载函数几点说明,1,、函数的重载与带默认值的函数一起使用时,有可能引起二义性,如:,void,Drawcircle(int,r=0;int x=0;int y=0);,void,Drawcircle(int,r);,当调用,Drawcircle(20);,时,编译程序无法确定使用哪一个函数。,2,、在函数调用时,若给出的实参与形参类型不相符,编译器会自动做类型转换。,如:,void,fun(int,x); void,fun(float,x);,调用如下:,int,c=fun(5.56);,?,9/17/2024,40,C+ Language Programming,例:重载函数应用举例,编写三个名为,add,的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。,#include,struct,complex,double real;,double imaginary;,;,9/17/2024,41,C+ Language Programming,int,add,(int,m,int,n), return m+n; ,double,add,(double x, double y), return x+y; ,complex,add,(complex c1, complex c2),complex c;,c.real=c1.real+c2.real;,c.imaginary=c1.imaginary+c2.imaginary;,return c;,42,9/17/2024,42,C+ Language Programming,void main(void),int,m, n; double x, y;,complex c1, c2, c3;,cout,mn;,cout,integer m+n=,add,(m,n),endl,;,cout,xy;,cout,real number x+y= ,add,(x,y,),endl,;,9/17/2024,43,C+ Language Programming,cout,c1.realc1.imaginary;,cout,c2.realc2.imaginary;,c3=,add,(c1,c2);,cout,complex number ( c1.real , c1.imaginary )+(c2.real,c2.imaginary)=(c3.real,c3.imaginaryab;,if(b,=0) ,cout,“error”,endl,;,abort();,else,cout,a/b,endl,;,9/17/2024,46,C+ Language Programming,3.6,终止程序执行,三、,exit(),函数,四、,assert(),函数,9/17/2024,47,C+ Language Programming,The End,9/17/2024,48,C+ Language Programming,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!