chap3-C++课件-清华大学郑莉.ppt

上传人:wj 文档编号:5879808 上传时间:2023-05-09 格式:PPT 页数:66 大小:223KB
下载 相关 举报
chap3-C++课件-清华大学郑莉.ppt_第1页
第1页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第2页
第2页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第3页
第3页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第4页
第4页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第5页
第5页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第6页
第6页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第7页
第7页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第8页
第8页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第9页
第9页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第10页
第10页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第11页
第11页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第12页
第12页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第13页
第13页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第14页
第14页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第15页
第15页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第16页
第16页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第17页
第17页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第18页
第18页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第19页
第19页 / 共66页
chap3-C++课件-清华大学郑莉.ppt_第20页
第20页 / 共66页
亲,该文档总共66页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

chap3-C++课件-清华大学郑莉.ppt

《chap3-C++课件-清华大学郑莉.ppt》由会员分享,可在线阅读,更多相关《chap3-C++课件-清华大学郑莉.ppt(66页珍藏版)》请在冰点文库上搜索。

chap3-C++课件-清华大学郑莉.ppt

第三章函数,郑莉董渊张瑞丰编著清华大学出版社,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)endl;doublepower(doublex,intn)doubleval=1.0;while(n-)val=val*x;return(val);,函数的声明与使用,7,运行结果:

5tothepower2is25,例3-1编写一个求x的n次方的函数,函数的声明与使用,8,例3-2数制转换,题目:

输入一个8位二进制数,将其转换为十进制数输出。

例如:

11012=1(23)+1(22)+0(21)+1(20)=1310所以,如果输入1101,则应输出13,函数的声明与使用,#includeusingnamespacestd;doublepower(doublex,intn);intmain()inti;intvalue=0;charch;cout=0;i-)cinch;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-bendl;,11,doublearctan(doublex)inti;doubler,e,f,sqr;sqr=x*x;r=0;e=x;i=1;while(e/i1e-15)f=e/i;r=(i%4=1)?

r+f:

r-f;e=e*sqr;i+=2;returnr;,运行结果:

PI=3.14159,12,13,例3-4,寻找并输出11999之间的数m,它满足m、m2和m3均为回文数。

回文:

各位数字左右对称的整数。

例如:

11满足上述条件112=121,113=1331。

分析:

10取余的方法,从最低位开始,依次取出该数的各位数字。

按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。

函数的声明与使用,#includeusingnamespacestd;intmain()boolsymm(longn);longm;for(m=11;m1000;m+)if(symm(m),14,boolsymm(longn)longi,m;i=n;m=0;while(i)m=m*10+i%10;i=i/10;return(m=n);,15,运行结果:

m=11m*m=121m*m*m=1331m=101m*m=10201m*m*m=1030301m=111m*m=12321m*m*m=1367631,16,17,例3-5,计算如下公式,并输出结果:

其中r、s的值由键盘输入。

SINx的近似值按如下公式计算,计算精度为10-6:

函数的声明与使用,#include#includeusingnamespacestd;intmain()doublek,r,s;doubletsin(doublex);coutr;couts;if(r*r=s*s)k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s);elsek=tsin(r*s)/2;coutkendl;,18,doubletsin(doublex)doublep=0.000001,g=0,t=x;intn=1;dog=g+t;n+;t=-t*x*x/(2*n-1)/(2*n-2);while(fabs(t)=p);returng;,运行结果:

r=5s=81.37781,19,20,例3-6投骰子的随机游戏,游戏规则是:

每个骰子有六面,点数分别为1、2、3、4、5、6。

游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。

每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮、第三轮.直到某轮的和数等于点数则取胜,若在此前出现和数为7则为负。

由rolldice函数负责模拟投骰子、计算和数并输出和数。

函数的声明与使用,#include#includeusingnamespacestd;introlldice(void);intmain()intgamestatus,sum,mypoint;unsignedseed;coutseed;/输入随机数种子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=worksumendl;returnworksum;,25,运行结果2:

Pleaseenteranunsignedinteger:

23playerrolled6+3=9pointis9playerrolled5+4=9playerwins,26,27,函数调用的执行过程,函数的声明与使用,28,嵌套调用,函数的声明与使用,main调fun1()结束,fun1()调fun2()返回,fun2()返回,29,例3-6输入两个整数,求平方和。

#includeusingnamespacestd;intmain()inta,b;intfun1(intx,inty);cinab;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!

endl;elseif(n=0)f=1;elsef=fac(n-1)*n;return(f);,33,intmain()longfac(intn);intn;longy;coutn;y=fac(n);coutn!

=yendl;运行结果:

Enterapositiveinteger:

88!

=40320,34,35,例3-9,用递归法计算从n个人中选择k个人组成一个委员会的不同组合数。

分析:

由n个人里选k个人的组合数=由n-1个人里选k个人的组合数+由n-1个人里选k-1个人的组合数当n=k或k=0时,组合数为1,函数的声明与使用,#includeusingnamespacestd;intmain()intn,k;intcomm(intn,intk);cinnk;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)coutputoneendl;voidhanoi(intn,charone,chartwo,charthree)voidmove(chargetone,charputone);if(n=1)move(one,three);elsehanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);,39,intmain()voidhanoi(intn,charone,chartwo,charthree);intm;coutm;coutthestepstomovingmdiskes:

endl;hanoi(m,A,B,C);,40,运行结果:

Enterthenumberofdiskes:

3thestepstomoving3diskes:

A-CA-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=10x=5y=10,45,47,函数的参数传递用引用做形参,引用(声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。

一旦一个引用被初始化后,就不能改为指向其它对象。

引用可以作为形参voidswap(int&a,int&b).,函数的声明与使用,48,例3-12输入两个整数交换后输出,#includeusingnamespacestd;voidSwap(int,函数的声明与使用,运行结果:

x=5y=10x=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);coutareaendl;return0;,内联函数,52,默认形参值的作用,函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。

例如:

intadd(intx=5,inty=6)returnx+y;,intmain()add(10,20);/10+20add(10);/10+6add();/5+6,带默认形参值的函数,53,默认形参值的说明次序,默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。

因为调用时实参取代形参是从左向右的顺序。

例:

intadd(intx,inty=5,intz=6);/正确intadd(intx=1,inty=5,intz);/错误intadd(intx=1,inty,intz=6);/错误,带默认形参值的函数,54,默认形参值与函数的调用位置,调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。

例:

intadd(intx=5,inty=6);intmain()add();/调用在实现前intadd(intx,inty)returnx+y;,intadd(intx=5,inty=6)returnx+y;intmain()add();/调用在实现后,带默认形参值的函数,55,默认形参值的作用域,在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不同的默认形参。

例:

intadd(intx=1,inty=2);intmain()intadd(intx=3,inty=4);add();/使用局部默认形参值(实现3+4)voidfun(void).add();/使用全局默认形参值(实现1+2),带默认形参值的函数,56,重载函数的声明,C+允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。

方便使用,便于记忆。

例:

函数重载,57,注意事项,不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。

这样不好:

函数重载,重载函数的形参必须不同:

个数不同或类型不同。

编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。

58,例3-16重载函数应用举例,编写三个名为add的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。

#includeusingnamespacestd;structcomplexdoublereal;doubleimaginary;,函数重载,intmain()intm,n;doublex,y;complexc1,c2,c3;intadd(intm,intn);doubleadd(doublex,doubley);complexadd(complexc1,complexc2);coutmn;coutintegerm+n=add(m,n)endl;,59,coutxy;coutc1.realc1.imaginary;coutc2.realc2.imaginary;c3=add(c1,c2);coutcomplexnumber(c1.real,c1.imaginary)+(c2.real,c2.imaginary)=(c3.real,c3.imaginary)n;,60,intadd(intm,intn)returnm+n;doubleadd(doublex,doubley)returnx+y;complexadd(complexc1,complexc2)complexc;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;returnc;,61,运行结果:

Entertwointeger:

35integer3+5=8Entertworealnumber:

2.35.8realnumber2.3+5.8=8.1Enterthefirstcomplexnumber:

12.345.6Enterthesecondcomplexnumber:

56.767.8complexnumber(12.3,45.6)+(56.7,67.8)=(69,113.4),62,63,C+系统函数,C+的系统库中提供了几百个函数可供程序员使用。

例如:

求平方根函数(sprt)、求绝对值函数(abs)等。

使用系统函数时要包含相应的头文件。

例如:

math.h或cmath,使用C+系统函数,64,例3-17系统函数应用举例,题目:

从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。

分析:

系统函数中提供了求正弦值、余弦值和正切值的函数:

sin()、cos()、tan(),函数的说明在头文件math.h中。

使用C+系统函数,#include#includeusingnamespacestd;constdoublepi(3.14159265);intmain()doublea,b;cina;b=a*pi/180;coutsin(a)=sin(b)endl;coutcos(a)=cos(b)endl;couttan(a)=tan(b)endl;,运行结果:

30sin(30)=0.5cos(30)=0.866025tan(30)=0.57735,65,66,查找系统函数的使用说明,查编译系统的库函数手册查联机帮助VC+6.0联机帮助的使用方法:

help/Contents-(“活动子集”栏)VisualC+Documentation-VisualC+Documentation-UsingVisualC+-VisualC+ProgrammersGuide-Run-TimeLibraryReference-RunTimeRoutinesbyCategory-RunTimeRoutinesbyCategory,使用C+系统函数,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2