您好,欢迎访问三七文档
C++语言程序设计(第4版)第三章函数目录3.1函数的定义与使用3.2内联函数3.3带缺省形参值的函数3.4函数重载3.5使用C++系统函数3.6深度探索3.7小结23.1.1函数定义•函数是面向对象程序设计中,对功能的抽象•函数定义的语法形式类型标识符函数名(形式参数表){语句序列}33.1函数的定义与使用是被初始化的内部变量,寿命和可见性仅限于函数内部若无返回值,写void3.1.1函数定义(续)•形式参数表type1name1,type2name2,...,typennamen•函数的返回值▫由return语句给出,例如:return0▫无返回值的函数(void类型),不必写return语句。43.1函数的定义与使用3.1.2函数的调用•调用前先声明函数:▫若函数定义在调用点之前,则无需另外声明;▫若函数定义在调用点之后,则需要在调用函数前按如下形式声明函数原型:类型标识符被调用函数名(含类型说明的形参表);•调用形式函数名(实参列表)•嵌套调用▫函数可以嵌套调用,但不允许嵌套定义。•递归调用▫函数直接或间接调用自身。53.1函数的定义与使用例3-1编写一个求x的n次方的函数#includeiostreamusingnamespacestd;//计算x的n次方doublepower(doublex,intn){doubleval=1.0;while(n--)val*=x;returnval;}intmain(){cout5tothepower2ispower(5,2)endl;return0;}63.1函数的定义与使用——3.1.2函数的调用例3-2数制转换题目:输入一个8位二进制数,将其转换为十进制数输出。例如:11012=1(23)+1(22)+0(21)+1(20)=1310所以,如果输入1101,则应输出1373.1函数的定义与使用——3.1.2函数的调用#includeiostreamusingnamespacestd;doublepower(doublex,intn);//计算x的n次方intmain(){intvalue=0;coutEnteran8bitbinarynumber;for(inti=7;i=0;i--){charch;cinch;if(ch=='1')value+=static_castint(power(2,i));}coutDecimalvalueisvalueendl;return0;}doublepower(doublex,intn){doubleval=1.0;while(n--)val*=x;returnval;}83.1函数的定义与使用——3.1.2函数的调用运行结果:Enteran8bitbinarynumber01101001Decimalvalueis105例3-2(续)例3-3编写程序求π的值Π的计算公式如下:其中arctan用如下形式的级数计算:直到级数某项绝对值不大于10-15为止;π和x均为double型。93.1函数的定义与使用——3.1.2函数的调用11π16arctan4arctan5239357arctan357xxxxx#includeiostreamusingnamespacestd;doublearctan(doublex){doublesqr=x*x;doublee=x;doubler=0;inti=1;while(e/i1e-15){doublef=e/i;r=(i%4==1)?r+f:r-f;e=e*sqr;i+=2;}returnr;}103.1函数的定义与使用——3.1.2函数的调用例3-3(续)intmain(){doublea=16.0*arctan(1/5.0);doubleb=4.0*arctan(1/239.0);/*注意:因为整数相除结果取整,如果参数写1/5,1/239,结果就都是0*/coutPI=a-bendl;return0;}113.1函数的定义与使用——3.1.2函数的调用运行结果:PI=3.14159例3-3(续)例3-4•寻找并输出11~999之间的数m,它满足m、m2和m3均为回文数。▫回文:各位数字左右对称的整数。例如:11满足上述条件112=121,113=1331。•分析:▫10取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。123.1函数的定义与使用——3.1.2函数的调用#includeiostreamusingnamespacestd;//判断n是否为回文数boolsymm(unsignedn){unsignedi=n;unsignedm=0;while(i0){m=m*10+i%10;i/=10;}returnm==n;}133.1函数的定义与使用——3.1.2函数的调用例3-4(续)intmain(){for(unsignedm=11;m1000;m++)if(symm(m)&&symm(m*m)&&symm(m*m*m)){coutm=m;coutm*m=m*m;coutm*m*m=m*m*mendl;}return0;}143.1函数的定义与使用——3.1.2函数的调用例3-4(续)例3-4(续)运行结果:m=11m*m=121m*m*m=1331m=101m*m=10201m*m*m=1030301m=111m*m=12321m*m*m=1367631153.1函数的定义与使用——3.1.2函数的调用例3-5•计算如下公式,并输出结果:•其中r、s的值由键盘输入。sinx的近似值按如下公式计算,计算精度为10-6:163.1函数的定义与使用——3.1.2函数的调用222222sinsinr1sin()r2rsskrss当当3572111sin(1)1!3!5!7!(21)!nnnxxxxxxn#includeiostream#includecmath/*对C++标准库中数学函数的说明*/usingnamespacestd;constdoubleTINY_VALUE=1e-10;doubletsin(doublex){doubleg=0;doublet=x;intn=1;do{g+=t;n++;t=-t*x*x/(2*n-1)/(2*n-2);}while(fabs(t)=TINY_VALUE);returng;}173.1函数的定义与使用——3.1.2函数的调用例3-5(续)intmain(){doublek,r,s;coutr=;cinr;couts=;cins;if(r*r=s*s)k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s));elsek=tsin(r*s)/2;coutkendl;return0;}183.1函数的定义与使用——3.1.2函数的调用运行结果:r=5s=81.37781例3-5(续)例3-6投骰子的随机游戏每个骰子有六面,点数分别为1、2、3、4、5、6。游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮、第三轮...直到某轮的和数等于点数则取胜,若在此前出现和数为7则为负。由rolldice函数负责模拟投骰子、计算和数并输出和数。193.1函数的定义与使用——3.1.2函数的调用例3.6(续)•rand函数原型:intrand(void);所需头文件:cstdlib功能和返回值:求出并返回一个伪随机数•srand函数原型:voidsrand(unsignedintseed);参数:seed产生随机数的种子。所需头文件:cstdlib功能:为使rand()产生一序列伪随机整数而设置起始点。使用1作为seed参数,可以重新初化rand()。203.1函数的定义与使用——3.1.2函数的调用#includeiostream#includecstdlibusingnamespacestd;//投骰子、计算和数、输出和数introllDice(){intdie1=1+rand()%6;intdie2=1+rand()%6;intsum=die1+die2;coutplayerrolleddie1+die2=sumendl;returnsum;}213.1函数的定义与使用——3.1.2函数的调用例3-6(续)enumGameStatus{WIN,LOSE,PLAYING};intmain(){intsum,myPoint;GameStatusstatus;unsignedseed;coutPleaseenteranunsignedinteger:;cinseed;//输入随机数种子srand(seed);//将种子传递给rand()sum=rollDice();//第一轮投骰子、计算和数223.1函数的定义与使用——3.1.2函数的调用例3-6(续)switch(sum){case7://如果和数为7或11则为胜,状态为WINcase11:status=WIN;break;case2://和数为2、3或12则为负,状态为LOSEcase3:case12:status=LOSE;break;default:/*其它情况,游戏尚无结果,状态为PLAYING,记下点数,为下一轮做准备*/status=PLAYING;myPoint=sum;coutpointismyPointendl;break;}233.1函数的定义与使用——3.1.2函数的调用例3-6(续)while(status==PLAYING){//只要状态仍为PLAYING,就继续进行下一轮sum=rollDice();if(sum==myPoint)//某轮的和数等于点数则取胜status=WIN;elseif(sum==7)//出现和数为7则为负status=LOSE;}//当状态不为PLAYING时上面的循环结束,以下程序段输出游戏结果if(status==WIN)coutplayerwinsendl;elsecoutplayerlosesendl;return0;}243.1函数的定义与使用——3.1.2函数的调用例3-6(续)例3-6(续)运行结果:Pleaseenteranunsignedinteger:23playerrolled6+3=9pointis9playerrolled5+4=9playerwins253.1函数的定义与使用——3.1.2函数的调用嵌套调用263.1函数的定义与使用——3.1.2函数的调用main{}调fun1()结束fun1()调fun2()返回fun2()返回①②③⑦④⑤⑥⑧⑨例3-7输入两个整数,求平方和#includeiostreamusingnamespacestd;intfun2(intm){returnm*m;}intfun1(intx,inty){returnfun2(x)+fun2(y);}273.1函数的定义与使用——3.1.2函数的调用intmain(){inta,b;coutPleaseentertwointegers(aandb):;cinab;coutThesumofsquareofaandb:fun1(a,b)endl;return0;}283.1函数的定义与使用——3.1.2函数的调用运行结果:Pleaseentertwointegers(aandb):34Thesumofsquareofaandb:25例3-7(续)递归调用293.1函数的定义与使用——3
本文标题:C++第3章-函数
链接地址:https://www.777doc.com/doc-5000599 .html