实验四函数一、目的和要求1.了解函数的定义方法,理解函数的调用;2.初步掌握函数的递归、嵌套调用;3.了解函数调用的实参与形参的传递,以及参数默认值的设置。4.学习并了解重载函数、内联函数的基本概念。二、实验设备及分组1.WindowsXP操作系统;2.VisualC++6.0语言环境;3.每人一台PC机。三、内容和步骤(一)验证实验程序1.编写一个函数,用递归的方法求1+2+3+4+…+n的值。在主函数中进行输入输出。解:#includeiostream.hintfun(intn){intz;if(n=0)z=0;elsez=n+fun(n-1);return(z);}intmain(void){intx,sum;cout请输入X的值endl;cinx;sum=fun(x);cout求和结果为:sumendl;return0;}运行结果:请输入X的值10求和结果为:552.编写程序,输入m和n(nm),求mnc的值。分析:已知)!(!!mnmncmn根据公式,只要自定义一个函数计算阶乘,即可通过函数调用求出mnc的值。解:阶乘函数定义如下:doublefact(intk){intp=1;if((k==0)||(k==1))returnp;else{for(inti=1;i=k;i++)p=p*i;returnp;}}一个完整的参考程序如下:#includeiostream.hdoublefact(int);intmain(){intm,n;doublec;coutpleaseinputendl;l1:coutn=;cinn;coutm=;cinm;if(nm){coutnmustbiggerthanm!,pleasereinput:endl;gotol1;}c=fact(n)/(fact(m)*fact(n-m));coutc=cendl;//Breturn0;}doublefact(intk){intp=1;if((k==0)||(k==1))returnp;else{for(inti=1;i=k;i++)p=p*i;returnp;}}思考:分别输入n=0,1,3,m=0,1,2测试程序。试用静态存储变量设计阶乘函数。3.编写程序,求两个自然数m和n的最大公约数和最小公倍数。分析:最大公约数就是能同时整除m和n的最大正整数,可用欧几里德算法(也称辗转相除法)求解。应用欧几里德算法计算两个数的最大公约数的方法是:求两个数(m、n)相除的余数r(r=m/nmn),当余数不为零时,m取n的值,n取r的值,再求两个数相除的余数,反复进行直到余数为零,除数n是最大公约数。最小公倍数=m×n/最大公约数。解:#includeiostream.hintfun1(intc,intd){intr;r=c%d;while(r!=0){c=d;d=r;r=c%d;}returnd;}intmain(){intm,n,e,d;coutmn=;cinmn;e=fun1(m,n);d=m*n/e;cout最大公约数为:eendl;cout最小公倍数为:dendl;return0;}思考:输入两个数m=36,n=24观察程序运行结果。用递归调用的方法实现程序编写,参考程序如下:#includeiostream.hintfun1(intc,intd){intr;r=c%d;if(r!=0){c=d;d=r;fun1(c,d);}returnd;}intmain(){intm,n,e,d;coutmn=;cinmn;e=fun1(m,n);d=m*n/e;cout最大公约数为:eendl;cout最小公倍数为:dendl;return0;}编写计算三个数最大公约数的程序。4.分别输入整数半径和实数半径,使用函数重载计算圆的面积。分析:由于参数只有一个圆的半径,所以只能对不同类型的参数实现重载。解:程序如下#includeiostream.h#definePI3.14intarea(int);floatarea(float);intmain(){intr1;cout输入一个整型半径r=:;cinr1;coutarea=area(r1)endl;floatr2;cout输入一个实型半径r=:;cinr2;coutarea=area(r2)endl;return0;}intarea(intx){returnPI*x*x;}floatarea(floatx){returnPI*x*x;}思考:编写重载函数实现对两个整型数、三个整型数、两个实型数、三个实型数等求最小值。5.使用内联函数计算长方形的面积。分析:C++编译器在调用遇到内联函数的地方,会用函数体中的代码替换函数。解:一个完整的内联函数参考程序如下:#includeiostream.hfloats(floatx,floaty);intmain(){floata,b;coutInputtwofloata,b=;cinab;couts=s(a,b)endl;return0;}inlinefloats(floatx,floaty){returnx*y;}思考:将程序中的内联函数进行代码替换,并上机运行,观察结果。(二)完成实验项目1.编写函数求:n117161514131212.用函数调用方法打印九九表乘法。3.以下函数是用递归方法计算x的n阶勒让德多项式的值。已有调用语句“p(n,x);”,编写poly函数。递归公式如下:4.已知xxxf)cos()(x的初始值为3.14159/4,用牛顿法求解方程0)(xf的近似解,要求精确到。)(xf的牛顿法为:1)sin()cos(1nnnnnxxxxx四、课后作业1.已知5个学生4门课的成绩,要求主函数分调用各函数实现:(1)找出每门课成绩最高的学生序号;(2)找出课程有不及格的学生的序号及其各门课的全部成绩;(3)求每门课程的平均分数,并输出;(4)将学生按总分高低排序。2.设计函数Fri(intM,intn),功能是将M个人围成一圈,编号为1—M,从第1号开始报数,报到n的倍数的人离开,一直数下去,直到最后只剩下1人。求此人的编号。3.撰写实验报告。如果你上机完成得很快,请接着做如下作业:1、编写一个程序,从键盘输入圆的半径值,调用函数求解圆的面积和周长。2、编写一个用户自定义函数,该函数有一个整数参数,函数的功能是:判断这个整数是否素数,函数的返回值为判断结果。编写一个程序,从键盘输入任意1个整数,调用用户自定义函数来判断这个整数是否素数。3、孪生素数是指两个相差为2的素数。例如3和5,5和7,11和13等。编写程序输出m对(m由键盘输入)孪生素数。要求设计函数prime用于判断某整数是否素数。4、编写一个用户自定义函数,该函数的功能是:输出一个用*号绘制的实心正方形。正方形的边长用整数side指定。编写一个程序,从键盘输入任意1个整数,调用用户自定义函数输出指定边长的正方形图形。如果要用#号绘制图形,程序应该如何修改?5、编写一个用户自定义函数,该函数有一个整数参数,函数的功能是:判断这个整数是否素数,函数的返回值为判断结果。编写一个程序,求3到100之间的所有素数。