chap3-C++课件-清华大学郑莉PPT文件格式下载.ppt
- 文档编号:7754040
- 上传时间:2023-05-09
- 格式:PPT
- 页数:66
- 大小:223KB
chap3-C++课件-清华大学郑莉PPT文件格式下载.ppt
《chap3-C++课件-清华大学郑莉PPT文件格式下载.ppt》由会员分享,可在线阅读,更多相关《chap3-C++课件-清华大学郑莉PPT文件格式下载.ppt(66页珍藏版)》请在冰点文库上搜索。
,函数的声明与使用,#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;
default:
/其它情况,游戏尚无结果,状态为0,记下点数,为下一轮做准备gamestatus=0;
mypoint=sum;
coutpointismypointendl;
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未知已知回归:
=243!
=62!
=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函数实现。
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:
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);
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;
内联函数,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;
/调用在实现后,带默认形参值的函数,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);
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+系统函数,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- chap3 C+ 课件 清华大学