C语言程序设计PPt第三章函数课件

PPT
  • 阅读 54 次
  • 下载 0 次
  • 页数 66 页
  • 大小 225.035 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C语言程序设计PPt第三章函数课件
可在后台配置第一页与第二页中间广告代码
C语言程序设计PPt第三章函数课件
可在后台配置第二页与第三页中间广告代码
C语言程序设计PPt第三章函数课件
可在后台配置第三页与第四页中间广告代码
C语言程序设计PPt第三章函数课件
C语言程序设计PPt第三章函数课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 66
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】C语言程序设计PPt第三章函数课件.ppt,共(66)页,225.035 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44481.html

以下为本文档部分文字说明:

第三章函数C++语言程序设计C++语言程序设计2本章主要内容函数的定义、声明和调用函数间的参数传递内联函数带默认形参值的函数函数重载C++系统函数C++语言程序设计3函数的定义函数是面向对象程序设计中,对功能的抽象函数定义的语法形式类型标识符函数名(形式参数表){语

句序列}函数的声明与使用是被初始化的内部变量,寿命和可见性仅限于函数内部若无返回值,写voiddoublepower(doublex,intn){doubleval=1.0;while(n--)val=v

al*x;return(val);}C++语言程序设计4函数的调用调用前先声明函数原型:–在调用函数中,或程序文件中所有函数之外,按如下形式说明:类型标识符被调用函数名(含类型说明的形参表);调用形式函数名(实参

列表)嵌套调用–函数可以嵌套调用,但不允许嵌套定义。–递归调用–函数直接或间接调用自身。函数的声明与使用C++语言程序设计5例3-1编写一个求x的n次方的函数#include<iostream.h>doubl

epower(doublex,intn);intmain(){cout<<"5tothepower2is"<<power(5,2)<<endl;}doublepower(doublex,intn){doubleval=1.0;while(n--)val=val*x;retu

rn(val);}函数的声明与使用C++语言程序设计6运行结果:5tothepower2is25例3-1编写一个求x的n次方的函数函数的声明与使用C++语言程序设计7例3-2数制转换题目:输入一个8位二进制数,将其转换为十进制数输出

。例如:011010012=0(27)+1(26)+1(25)+0(24)+1(23)+0(22)+0(21)+1(20)=10510所以,如果输入01101001,则应输出105函数的声明与使用#include

<iostream.h>doublepower(doublex,intn);//声明函数原型powerintmain(){inti;intvalue=0;charch;cout<<"Enteran8bitbinarynumber";for(i=7;i>=0;i--){ci

n>>ch;if(ch=='1')value+=int(power(2,i));//调用函数power}cout<<"Decimalvalueis"<<value<<endl;}doublepower(doublex,intn)//声明函数power{dou

bleval=1.0;while(n--)val*=x;return(val);}运行结果:Enteran8bitbinarynumber01101001Decimalvalueis1058C++语言程序设计9例3-3编写程序求π的值其

中arctan用如下形式的级数计算:直到级数某项绝对值不大于10-15为止;π和x均为double型。函数的声明与使用2391arctan451arctan16π753)arctan

(753xxxxx#include<iostream.h>intmain(){doublea,b;doublearctan(doublex);//函数原型声明a=16.0*arctan(1/5.0);b=4.0*arctan(1/239.0);//注意:因为整数相除结果取整,//如果

参数写1/5,1/239,结果就都是0cout<<"PI="<<a-b<<endl;}10doublearctan(doublex){inti;doubler,e,f,sqr;sqr=x*x;r=0;e=x;i=1;while(

e/i>1e-15){f=e/i;r=(i%4==1)?r+f:r-f;e=e*sqr;i+=2;}returnr;}运行结果:PI=3.1415911C++语言程序设计12例3-4寻找并输出11~999之间的数m,它满足m、m2和m3均为回文数。–回文:各位数字左右对称的整数。

例如:11满足上述条件112=121,113=1331。分析:–10取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。-----参见例2-6函数的声明与使用#i

nclude<iostream.h>intmain(){boolsymm(longn);longm;for(m=11;m<1000;m++)if(symm(m)&&symm(m*m)&&symm(m*m*m))cout<<"m="<<m<<"

m*m="<<m*m<<"m*m*m="<<m*m*m<<endl;}13boolsymm(longn){longi,m;i=n;m=0;while(i)//等价于while(i!=0){m=m*10+

i%10;//对求出的每一位累加i=i/10;}return(m==n);}14运行结果:m=11m*m=121m*m*m=1331m=101m*m=10201m*m*m=1030301m=111m*m=12321

m*m*m=136763115C++语言程序设计16例3-5计算如下公式,并输出结果:其中r、s的值由键盘输入。sinx的近似值按如下公式计算,计算精度为10-6:函数的声明与使用222222

r)sin(21r)(sin)(sinssrssrk当当1121753)!12()1(!7!5!3!1sinnnnnxxxxxx#include<iostream.h>#include<cmath.

h>intmain(){doublek,r,s;doubletsin(doublex);cout<<"r=";cin>>r;cout<<"s=";cin>>s;if(r*r<=s*s)k=sqrt(tsin

(r)*tsin(r)+tsin(s)*tsin(s));elsek=tsin(r*s)/2;cout<<k<<endl;}17doubletsin(doublex){doublep=0.000001,g=0,t=x;in

tn=1;do{g=g+t;n++;t=-t*x*x/(2*n-1)/(2*n-2);}while(fabs(t)>=p);returng;}运行结果:r=5s=81.37781181121753)!12()1(!7!5!3!1sinnnn

nxxxxxxg:存放累加和t:存放任一项当前项=(-1)*前一项*X*X/(2*n-1)/(2*n-2)C++语言程序设计19例3-6投骰子的随机游戏每个骰子有六面,点数分别为1、2、3、4、5、6。游戏

者在程序开始时输入一个无符号整数,作为产生随机数的种子。每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮、第三轮...直到某轮的和数等于点数则取胜,若在此前

出现和数为7则为负。由rolldice函数负责模拟投骰子、计算和数并输出和数。函数的声明与使用#include<iostream.h>#include<cstdlib.h>introlldice(void

);intmain(){intgamestatus,sum,mypoint;unsignedseed;cout<<"Pleaseenteranunsignedinteger:";cin>>seed;//输入随机数种子srand(seed);//

将种子传递给rand()sum=rolldice();//第一轮投骰子、计算和数20switch(sum){case7://如果和数为7或11则为胜,状态为1case11:gamestatus=1;break;case2://和数为2、3或12则为负,状态为2case3:case

12:gamestatus=2;break;default://其他情况,游戏尚无结果,状态为0,记下点数,为下一轮做准备gamestatus=0;mypoint=sum;cout<<"pointis"<<mypoint<<endl

;break;}21while(gamestatus==0)//只要状态仍为0,就继续进行下一轮{sum=rolldice();if(sum==mypoint)//某轮的和数等于点数则取胜,状态置为1gamestatus=1elseif(sum==7)//出现和数为7则

为负,状态置为2gamestatus=2;}//当状态不为0时上面的循环结束,以下程序段输出游戏结果if(gamestatus==1)cout<<"playerwins\n";elsecout<<"playerloses\n

";}22rand函数原型:intrand(void);所需头文件:<cstdlib>功能和返回值:求出并返回一个伪随机数srand函数原型:voidsrand(unsignedintseed);参数:seed产生随机

数的种子。所需头文件:<cstdlib>功能:为使rand()产生一序列伪随机整数而设置起始点。使用1作为seed参数,可以重新初化rand()。23introlldice(void){//投骰子、计算和数、输出和数intdie1,die2,worksum;die1=1+rand()%6

;die2=1+rand()%6;worksum=die1+die2;cout<<"playerrolled"<<die1<<'+'<<die2<<'='<<worksum<<endl;returnwor

ksum;}24运行结果2:Pleaseenteranunsignedinteger:23playerrolled6+3=9pointis9playerrolled5+4=9playerwins25C++语言程序设计26函

数调用的执行过程函数的声明与使用main()调fun()结束fun()返回①②④⑥⑦保存:返回地址当前现场③恢复:主调程序现场返回地址⑤C++语言程序设计27嵌套调用函数的声明与使用main{}调fun1()结束fun1()调fun2()返回fun2()返回①②③⑦④⑤⑥⑧

⑨C++语言程序设计28例3-6输入两个整数,求平方和。#include<iostream.h>intmain(){inta,b;intfun1(intx,inty);cin>>a>>b;cout<<"a、b的平方和

:"<<fun1(a,b)<<endl;}函数的声明与使用intfun1(intx,inty){intfun2(intm);return(fun2(x)+fun2(y));}intfun2(intm){return(m*m);}运行结果:34a、b的平方和:2529C++语言

程序设计30递归调用函数直接或间接地调用自身,称为递归调用。递归过程的两个阶段:–递推:4!=4×3!→3!=3×2!→2!=2×1!→1!=1×0!→0!=1未知已知–回归:4!=4×3!=24←3!=3×2!=6←2!=2×1!=2←1!=1×0!=1←0!=1未

知已知函数的声明与使用C++语言程序设计31例3-8求n!分析:计算n!的公式如下:这是一个递归形式的公式,应该用递归函数实现。函数的声明与使用)0()!1()0(1!nnnnn源程序:#include<iostream.h>longfac(int

n){longf;if(n<0)cout<<"n<0,dataerror!"<<endl;elseif(n==0)f=1;elsef=fac(n-1)*n;return(f);}32intmain(){longfac(intn);intn;longy;c

out<<"Enterapositiveinteger:";cin>>n;y=fac(n);cout<<n<<"!="<<y<<endl;}运行结果:Enterapositiveinteger:88!=4032033C++语言程序设计34例3-9用递归法计算从n个人中选择k个人

组成一个委员会的不同组合数。分析:由n个人里选k个人的组合数=由n-1个人里选k个人的组合数+由n-1个人里选k-1个人的组合数当n==k或k==0时,组合数为1函数的声明与使用#include<iostream.h>intmain(){intn,k;intcomm(intn,int

k);cin>>n>>k;cout<<comm(n,k)<<endl;}intcomm(intn,intk){if(k>n)return0;elseif(n==k||k==0)return1;elsereturncomm(n-1,k)+comm(n-1,k-1);}运行结果:18

5856835C++语言程序设计36例3-10汉诺塔问题有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。函数的声明与使用ABC分

析:将n个盘子从A针移到C针可以分解为下面三个步骤:①将A上n-1个盘子移到B针上(借助C针);②把A针上剩下的一个盘子移到C针上;③将n-1个盘子从B针移到C针上(借助A针);事实上,上面三个步骤包含两种操作:①将多个盘子从一个针移到另一个针

上,这是一个递归的过程。hanoi函数实现。②将1个盘子从一个针上移到另一针上。用move函数实现。37#include<iostream.h>voidmove(chargetone,charputone){cout<<

getone<<"-->"<<putone<<endl;}voidhanoi(intn,charone,chartwo,charthree){voidmove(chargetone,charputone);if(n==1)move(one,three);else{hanoi(n-1,o

ne,three,two);move(one,three);hanoi(n-1,two,one,three);}}38intmain(){voidhanoi(intn,charone,chartwo,ch

arthree);intm;cout<<"Enterthenumberofdiskes:";cin>>m;cout<<"thestepstomoving"<<m<<"diskes:"<<endl;hanoi(m,'A

','B','C');}39运行结果:Enterthenumberofdiskes:3thestepstomoving3diskes:A-->CA-->BC-->BA-->CB-->AB-->CA-->C40C++语言程序设计41函数的参

数传递机制——传递参数值在函数被调用时才分配形参的存储单元。实参可以是常量、变量或表达式。实参类型必须与形参相符。传递时是传递参数值,即单向传递。函数的声明与使用C++语言程序设计42函数的参数传递机制——参数值传递举例XN被调函数:主调函数:32.5AD=power(A,3)2.53d

oublepower(doubleX,intN)函数的声明与使用C++语言程序设计43例3-11输入两个整数交换后输出#include<iostream.h>voidSwap(inta,intb);intmain(){i

ntx(5),y(10);cout<<"x="<<x<<"y="<<y<<endl;Swap(x,y);cout<<"x="<<x<<"y="<<y<<endl;return0;}函数的声明与使用voidSwap(inta,intb){intt;t=a;a=b;b=t;}运行结果:

x=5y=10x=5y=1044a=b;5x10y5a10b执行主函数中的函数调用Swap(x,y);t=a;5x10y5a10b5tb=t;5x10y10a5b5t5x10y10a10b5t在Swap子函数

中返回主函数以后5x10y4545C++语言程序设计46函数的参数传递——用引用做形参引用(&)是标识符的别名,例如:inti,j;int&ri=i;//建立一个int型的引用ri,并将其//初始化为变量i的一个

别名j=10;ri=j;//相当于i=j;声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。一旦一个引用被初始化后,就不能改为指向其它对象。引用可以作为形参voidswap(int&a,int&b){...}函数的声明与使

用C++语言程序设计47例3-12输入两个整数交换后输出#include<iostream.h>voidSwap(int&a,int&b);intmain(){intx(5),y(10);cout<<"x="<<x<<"y="<<y<<endl;Swap(x,y);cout<<"x="<<x<<

"y="<<y<<endl;return0;}voidSwap(int&a,int&b){intt;t=a;a=b;b=t;}函数的声明与使用运行结果:x=5y=10x=10y=5t=a;x5t5x的别名axy510y的别名x的别名aby的别名x的别

名abx10y10a=bb=t;y5t5y的地址bxy105Swap(x,y);48C++语言程序设计49内联函数声明与使用声明时使用关键字inline。编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。注意:–内联函数

体内不能有循环语句和switch语句。–内联函数的声明必须出现在内联函数第一次被调用之前。–对内联函数不能进行异常接口声明。内联函数C++语言程序设计50例3-14内联函数应用举例#include<iostream.h>inlinedou

bleCalArea(doubleradius){return3.14*radius*radius;}intmain(){doubler(3.0);doublearea;area=CalArea(r);cout<<area<<endl;re

turn0;}内联函数C++语言程序设计51默认形参值的作用函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。例如:intadd(intx=5,inty=

6){returnx+y;}intmain(){add(10,20);//10+20add(10);//10+6add();//5+6}带默认形参值的函数C++语言程序设计52默认形参值的说明次序默认形参值必须从右向左顺序声明,并且在默认形参值

的右面不能有非默认形参值的参数。因为调用时实参取代形参是从左向右的顺序。例:intadd(intx,inty=5,intz=6);//正确intadd(intx=1,inty=5,intz);//错误intadd(intx=

1,inty,intz=6);//错误带默认形参值的函数C++语言程序设计53默认形参值与函数的调用位置调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。例:intadd(intx=5,int

y=6);intmain(){add();//调用在实现前}intadd(intx,inty){returnx+y;}intadd(intx=5,inty=6){returnx+y;}intmain(){add();/

/调用在实现后}带默认形参值的函数C++语言程序设计54默认形参值的作用域在相同的作用域内,默认形参值的说明应保持惟一,但如果在不同的作用域内,允许说明不同的默认形参。例:intadd(intx=1,inty

=2);intmain(){intadd(intx=3,inty=4);add();//使用局部默认形参值(实现3+4)}voidfun(){...add();//使用全局默认形参值(实现1+2)}带默认形参值的函数C++语言程序设计55重载函数的声明C++允许功能相近的函数在相同的作用域内

以相同函数名声明,从而形成重载。方便使用,便于记忆。例:形参类型不同intadd(intx,inty);floatadd(floatx,floaty);形参个数不同intadd(intx,inty);intad

d(intx,inty,intz);函数重载C++语言程序设计56注意事项–不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:intadd(intx,inty);intadd(inta,

intb);编译器不以形参名来区分intadd(intx,inty);voidadd(intx,inty);编译器不以返回值来区分intadd(intx,inty){returnx+y;}floata

dd(floatx,floaty){returnx-y;}函数重载–重载函数的形参必须不同:个数不同或类型不同。–编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。C++语言程序设计57例3-16重载函数应用举例编写

三个名为add的重载函数,分别实现两整数相加、两实数相加和两个复数相加的功能。#include<iostream.h>structcomplex{doublereal;doubleimaginary;};函数重载intmai

n(){intm,n;doublex,y;complexc1,c2,c3;intadd(intm,intn);doubleadd(doublex,doubley);complexadd(complexc1,complexc2);cout<<"E

ntertwointeger:";cin>>m>>n;cout<<"integer<<m<<'+'<<n<<"="<<add(m,n)<<endl;58cout<<"Entertworealnumber:";cin>>x>>y;cout<<

"realnumber"<<x<<'+'<<y<<"="<<add(x,y)<<endl;cout<<"Enterthefirstcomplexnumber:";cin>>c1.real>>c1.imaginary;cout<<"Ente

rthesecondcomplexnumber:";cin>>c2.real>>c2.imaginary;c3=add(c1,c2);cout<<"complexnumber("<<c1.real<<','<<

c1.imaginary<<")+("<<c2.real<<','<<c2.imaginary<<")=("<<c3.real<<','<<c3.imaginary<<")\n";}59intadd(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;}60运行结果:Entertwointeger:35integer3+5=8Entertworealnumber:2.35.8realnumber2.3+5.8=8.1Enterthefirstcomplexnumb

er:12.345.6Enterthesecondcomplexnumber:56.767.8complexnumber(12.3,45.6)+(56.7,67.8)=(69,113.4)61C++语言程序设计62C++系统函数C++的

系统库中提供了几百个函数可供程序员使用。例如:求平方根函数(sprt)、求绝对值函数(abs)等。使用系统函数时要包含相应的头文件。例如:math.h或cmath使用C++系统函数C++语言程序设计63例

3-17系统函数应用举例题目:从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值。分析:系统函数中提供了求正弦值、余弦值和正切值的函数:sin()、cos()、tan(),函数的说明在头文件math.h和cmath中。使用C++系统函数#include<i

ostream.h>#include<math.h>constdoublepi(3.14159265);intmain(){doublea,b;cin>>a;b=a*pi/180;cout<<"sin("<<a<<")="

<<sin(b)<<endl;cout<<"cos("<<a<<")="<<cos(b)<<endl;cout<<"tan("<<a<<")="<<tan(b)<<endl;}运行结果:30sin(30)=0

.5cos(30)=0.866025tan(30)=0.5773564C++语言程序设计65查找系统函数的使用说明查编译系统的库函数手册查联机帮助——VC++6.0联机帮助的使用方法:help/Contents->(“活动子集”栏)VisualC++Documentation->V

isualC++Documentation->UsingVisualC++->VisualC++Programmer'sGuide->Run-TimeLibraryReference->RunTimeRoutinesbyCategory->RunTimeRoutinesb

yCategory使用C++系统函数C++语言程序设计66小结与复习建议主要内容–函数的声明和调用、函数间的参数传递、内联函数、带默认形参值的函数、函数重载、C++系统函数达到的目标–学会将一段功能相对独立的程序写成一个函数,为下一章学习类和对象打好必

要的基础。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?