实验8 函数嵌套调用及函数重载与带默认参数值的函数
【实验目的】
1: 掌握函数嵌套的概念及嵌套中的相互调用关系。
2:理解并掌握函数递归调用的方法,学会用递归调用的方法解决实际问题。 3:了解内联函数,函数重载及带默认参数值的函数用法。
二、实验内容-上机调试理解
例1.编写函数求代数式1+2+3+4+5的值。
分析:本题采用函数嵌套来解决,在主函数中调用了sum求和函数,在sum函数中又调用了power函数求幂。
源程序:
#include
int sum(int); //函数原型声明,因为函数先被主函数main中调用使用,后定义其功能。 int power(int); void main() {
int n;
1
2
3
4
5
n=5;
cout< int sum(int x) //函数定义,功能是求各数字的幂和,这里x为形参 { int i,s=0; for(i=1;i<=x;i++) s+=power(i); //循环5次,每次调用power()函数,这里i为power函数形参对应的实参,传值调用 } int power(int y) //函数定义,功能是求各数字的幂,这里y为形参 { int i,p=1; for(i=1;i<=y;i++) p*=y; return p; //将每次的函数值返回到sum()函数 return s; //将最后累加求和的结果值作为函数值返回到main()主调函数 } 例2.分别用用递归算法和非递归算法实现1!+2!+3!+?+n! 非递归算法-源程序: 分析:求阶乘的函数需要一个整型形参,函数类型为double,由于在主函数中要求1!+2!+?+n!,因此要循环调用该函数求累加和。 #include double fa(int n); //函数原型说明 void main() { int n; cin>>n; double s=0.0; for(int i=1;i<=n;i++) s+=fa(i); //在循环体多次中调用fa()函数,这里i为实参,传值调用 } double fa(int n) //函数定义,功能是求每个数的阶乘 { double m=1; for(int i=1;i<=n;i++) m*=i; cout< return m; }//将函数值返回主函数调用处 递归算法-源程序: 知识点: 递归函数又叫自调用函数,其特点是在函数体内部直接或间接地自己调用自己。 利用函数的递归调用,可将一个复杂问题分解为一个相对简单且可直接求解的子问题;然后将这个子问题的结果逐层进行回代求值,最终求得原来复杂问题的解。包括两个阶段: (1)递推阶段:将原问题不断分解成为新问题,逐渐从未知方向向已知方向推测,最终达到已知的条件,即递归结束条件。如: if (n==1) return 1; (2)回归阶段:从已知条件出发,逐一求值回归,最后达到递推开始处,结束回归阶段。 如: return fac(n-1)*n; 使用这种算法会使程序简洁明了,可读性好。这种算法也会增加运行中的时间和空间的开销,因为它需要足够的内存存放中间结果。建议在内存小速度慢的机器上不使用这种方法。 例3.编写两个名为add的重载函数,分别实现两个整数相加和和两实数相加的功能。 知识点: 所谓函数重载,就是赋予同一函数名但多个含义。具体地说,C++中允许在相同的作用域内,为了编程方便,以相同的名称定义几个不同函数的实现,只是处理对象(参数)不同。 定义重载函数时,要求同名函数的参数表必须有差异,而对返回值的类型没有要求。 重载函数的参数表差异可以是:要么参数的个数不同;要么至少有一个参数的类型不同。编译器便知道在什么情况下该调用哪个函数。 源程序: #include int add(int,int); //函数原型说明 double add(double,double); void main() { int m,n; double x,y; cin>>m>>n; cout<<”两整数和:”<>x>>y; cout<<”两实数和:”< int add(int m,int n) //定义函数add(),实现整数求和 {return m+n;} //返回主函数调用处 double add(double x,double y) //定义函数add(),实现实数求和 {return x+y;} //将函数值返回主函数调用处 例4.带默认形参值的函数应用. 知识点: C++语言允许在函数原型/定义说明中给参数设置默认值,这样做可省略与形参默认值相同的实参值,会使书写更简炼,给程序带来安全。 使用原则:(1)当有实参则不用默认值(2)当某个参数有默认值,其后的参数必须有默认值 说明:下列程序的功能是计算长方体的体积。函数v是计算体积的函数,有三个形参,len,width,height,其中width,height带有默认值。在主函数中分别以不同形式调用v函数。 源程序: #include int v(int len,int width=2,int height=3); void main() { } int v(int len,int width,int height) //定义函数v(),实现计算体积 { cout<<'\\t'< return len*width*height; //将函数值返回主函数调用处 int x=8,y=10,z=12; cout< } 例5.内联函数应用. 知识点: 内联函数是指:编译时将所调用的函数代码直接嵌入到主函数中,而不是将流程转出去。这样就可以节省调用时参数传递、系统栈的保护与恢复等开销,提高程序的执行效率。 用法:在函数声明前加inline关键字 inline 返回值类型 函数名(形参表) { 函数体 } (1)内联函数体<=5行,不允许出现循环和开关语句,不允许出现递归,不能含有静态数据和数组申明; (2)定义必须出现在第一次被调用前; (3)不能进行异常接口申明; (4)适合被频繁调用的小函数