chap3-C++课件-清华大学郑莉.ppt_第1页
chap3-C++课件-清华大学郑莉.ppt_第2页
chap3-C++课件-清华大学郑莉.ppt_第3页
chap3-C++课件-清华大学郑莉.ppt_第4页
chap3-C++课件-清华大学郑莉.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章函数,郑莉董渊张瑞丰编著清华大学出版社,C+语言程序设计(第3版),2,本章主要内容,函数的声明和调用函数间的参数传递内联函数带默认形参值的函数函数重载C+系统函数,3,函数的声明,函数是面向对象程序设计中,对功能的抽象函数声明的语法形式类型标识符函数名(形式参数表)语句序列,函数的声明与使用,是被初始化的内部变量,寿命和可见性仅限于函数内部,若无返回值,写void,4,函数的声明,形式参数表name1,name2,.,namen函数的返回值由return语句给出,例如:return0无返回值的函数(void类型),不必写return语句。,函数的声明与使用,5,函数的调用,调用前先声明函数原型:在调用函数中,或程序文件中所有函数之外,按如下形式说明:类型标识符被调用函数名(含类型说明的形参表);调用形式函数名(实参列表)嵌套调用函数可以嵌套调用,但不允许嵌套定义。递归调用函数直接或间接调用自身。,函数的声明与使用,6,例3-1编写一个求x的n次方的函数,#includeusingnamespacestd;doublepower(doublex,intn);intmain()cout5tothepower2ispower(5,2)ch;if(ch=1)value+=int(power(2,i);coutDecimalvalueisvalueendl;doublepower(doublex,intn)doubleval=1.0;while(n-)val*=x;return(val);,运行结果:Enteran8bitbinarynumber01101001Decimalvalueis105,9,10,例3-3编写程序求的值,其中arctan用如下形式的级数计算:直到级数某项绝对值不大于10-15为止;和x均为double型。,函数的声明与使用,#includeusingnamespacestd;intmain()doublea,b;doublearctan(doublex);/函数原型声明a=16.0*arctan(1/5.0);b=4.0*arctan(1/239.0);/注意:因为整数相除结果取整,/如果参数写1/5,1/239,结果就都是0coutPI=a-bs;if(r*r=s*s)k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s);elsek=tsin(r*s)/2;coutkseed;/输入随机数种子srand(seed);/将种子传递给rand()sum=rolldice();/第一轮投骰子、计算和数,21,switch(sum)case7:/如果和数为7或11则为胜,状态为1case11:gamestatus=1;break;case2:/和数为2、3或12则为负,状态为2case3:case12:gamestatus=2;break;default:/其它情况,游戏尚无结果,状态为0,记下点数,为下一轮做准备gamestatus=0;mypoint=sum;coutpointismypointendl;break;,22,while(gamestatus=0)/只要状态仍为0,就继续进行下一轮sum=rolldice();if(sum=mypoint)/某轮的和数等于点数则取胜,状态置为1gamestatus=1;elseif(sum=7)/出现和数为7则为负,状态置为2gamestatus=2;/当状态不为0时上面的循环结束,以下程序段输出游戏结果if(gamestatus=1)coutplayerwinsn;elsecoutplayerlosesn;,23,rand函数原型:intrand(void);所需头文件:功能和返回值:求出并返回一个伪随机数srand函数原型:voidsrand(unsignedintseed);参数:seed产生随机数的种子。所需头文件:功能:为使rand()产生一序列伪随机整数而设置起始点。使用1作为seed参数,可以重新初化rand()。,24,introlldice(void)/投骰子、计算和数、输出和数intdie1,die2,worksum;die1=1+rand()%6;die2=1+rand()%6;worksum=die1+die2;coutplayerrolleddie1+die2=worksumab;couta、b的平方和:fun1(a,b)endl;,函数的声明与使用,intfun1(intx,inty)intfun2(intm);return(fun2(x)+fun2(y);intfun2(intm)return(m*m);运行结果:34a、b的平方和:25,30,31,递归调用,函数直接或间接地调用自身,称为递归调用。递归过程的两个阶段:递推:4!=43!3!=32!2!=21!1!=10!0!=1未知已知回归:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知已知,函数的声明与使用,32,例3-8求n!,分析:计算n!的公式如下:这是一个递归形式的公式,应该用递归函数实现。,函数的声明与使用,源程序:#includeusingnamespacestd;longfac(intn)longf;if(n0)coutn0,dataerror!n;y=fac(n);coutn!=ynk;coutn)return0;elseif(n=k|k=0)return1;elsereturncomm(n-1,k)+comm(n-1,k-1);,运行结果:1858568,36,37,例3-10汉诺塔问题,有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。,函数的声明与使用,分析:将n个盘子从A针移到C针可以分解为下面三个步骤:将A上n-1个盘子移到B针上(借助C针);把A针上剩下的一个盘子移到C针上;将n-1个盘子从B针移到C针上(借助A针);事实上,上面三个步骤包含两种操作:将多个盘子从一个针移到另一个针上,这是一个递归的过程。hanoi函数实现。将1个盘子从一个针上移到另一针上。用move函数实现。,#includeusingnamespacestd;voidmove(chargetone,charputone)coutputonem;coutthestepstomovingmdiskes:BC-BA-CB-AB-CA-C,41,42,函数的参数传递机制传递参数值,在函数被调用时才分配形参的存储单元。实参可以是常量、变量或表达式。实参类型必须与形参相符。传递时是传递参数值,即单向传递。,函数的声明与使用,43,函数的参数传递机制参数值传递举例,函数的声明与使用,44,例3-11输入两整数交换后输出,#includeusingnamespacestd;voidSwap(inta,intb);intmain()intx(5),y(10);coutx=xy=yendl;Swap(x,y);coutx=xy=yendl;return0;,函数的声明与使用,voidSwap(inta,intb)intt;t=a;a=b;b=t;运行结果:x=5y=10 x=5y=10,45,47,函数的参数传递用引用做形参,引用(声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。一旦一个引用被初始化后,就不能改为指向其它对象。引用可以作为形参voidswap(intvoidSwap(int,函数的声明与使用,运行结果:x=5y=10 x=10y=5,Swap(x,y);,49,50,内联函数声明与使用,声明时使用关键字inline。编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。注意:内联函数体内不能有循环语句和switch语句。内联函数的声明必须出现在内联函数第一次被调用之前。对内联函数不能进行异常接口声明。,内联函数,51,例3-14内联函数应用举例,#includeusingnamespacestd;inlinedoubleCalArea(doubleradius)return3.14*radius*radius;intmain()doubler(3.0);doublearea;area=CalArea(r);coutarean;coutintegerm+n=add(m,n)y;coutc1.realc1.imaginary;coutc2.realc2.imaginary;c3=add(c1,c2);coutcomplexnumber(c1.real,c1.imaginary)+(c2.real,c2.imaginary)=(c3.real,c3.imaginarya;b=a*pi/180;coutsin(a)=si

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论