(最新整理)C++語(yǔ)言程序設(shè)計(jì)三課件_第1頁(yè)
(最新整理)C++語(yǔ)言程序設(shè)計(jì)三課件_第2頁(yè)
(最新整理)C++語(yǔ)言程序設(shè)計(jì)三課件_第3頁(yè)
(最新整理)C++語(yǔ)言程序設(shè)計(jì)三課件_第4頁(yè)
(最新整理)C++語(yǔ)言程序設(shè)計(jì)三課件_第5頁(yè)
已閱讀5頁(yè),還剩143頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

(最新整理)C++語(yǔ)言程序設(shè)計(jì)(清華大學(xué)鄭莉)三2021/7/261(最新整理)C++語(yǔ)言程序設(shè)計(jì)(清華大學(xué)鄭莉)三2021/7第三章函數(shù)清華大學(xué)鄭莉C++語(yǔ)言程序設(shè)計(jì)2021/7/262第三章函數(shù)清華大學(xué)鄭莉C++語(yǔ)言程序設(shè)計(jì)2021本章主要內(nèi)容函數(shù)的定義和調(diào)用函數(shù)間的參數(shù)傳遞內(nèi)聯(lián)函數(shù)帶默認(rèn)形參值的函數(shù)函數(shù)重載C++系統(tǒng)函數(shù)深度探索2021/7/263本章主要內(nèi)容函數(shù)的定義和調(diào)用2021/7/263函數(shù)的定義函數(shù)是面向?qū)ο蟪绦蛟O(shè)計(jì)中,對(duì)功能的抽象函數(shù)定義的語(yǔ)法形式類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表){

語(yǔ)句序列}函數(shù)的聲明與使用是被初始化的內(nèi)部變量,壽命和可見(jiàn)性僅限于函數(shù)內(nèi)部若無(wú)返回值,寫void2021/7/264函數(shù)的定義函數(shù)是面向?qū)ο蟪绦蛟O(shè)計(jì)中,對(duì)功能的抽象函數(shù)的聲明與函數(shù)的定義形式參數(shù)表<type1>name1,<type2>name2,...,<typen>namen函數(shù)的返回值由return語(yǔ)句給出,例如:

return0無(wú)返回值的函數(shù)(void類型),不必寫return語(yǔ)句。函數(shù)的聲明與使用2021/7/265函數(shù)的定義形式參數(shù)表函數(shù)的聲明與使用2021/7/265函數(shù)的調(diào)用調(diào)用前先聲明函數(shù):若函數(shù)定義在調(diào)用點(diǎn)之前,則無(wú)需另外聲明;若函數(shù)定義在調(diào)用點(diǎn)之后,則需要在調(diào)用函數(shù)前按如下形式聲明函數(shù)原型:

類型標(biāo)識(shí)符被調(diào)用函數(shù)名(含類型說(shuō)明的形參表);調(diào)用形式

函數(shù)名(實(shí)參列表)嵌套調(diào)用函數(shù)可以嵌套調(diào)用,但不允許嵌套定義。遞歸調(diào)用函數(shù)直接或間接調(diào)用自身。函數(shù)的聲明與使用2021/7/266函數(shù)的調(diào)用調(diào)用前先聲明函數(shù):函數(shù)的聲明與使用2021/7/2例3-1編寫一個(gè)求x的n次方的函數(shù)#include<iostream>usingnamespacestd;//計(jì)算x的n次方doublepower(doublex,intn){ doubleval=1.0; while(n--)val*=x; returnval;}intmain(){ cout<<"5tothepower2is"

<<power(5,2)<<endl; return0;}函數(shù)的聲明與使用2021/7/267例3-1編寫一個(gè)求x的n次方的函數(shù)#include<ios運(yùn)行結(jié)果:5tothepower2is25例3-1編寫一個(gè)求x的n次方的函數(shù)函數(shù)的聲明與使用2021/7/268例3-1編寫一個(gè)求x的n次方的函數(shù)函數(shù)的聲明與使用2021/例3-2數(shù)制轉(zhuǎn)換題目:輸入一個(gè)8位二進(jìn)制數(shù),將其轉(zhuǎn)換為十進(jìn)制數(shù)輸出。例如:11012=1(23)+1(22)+0(21)+1(20)=1310

所以,如果輸入1101,則應(yīng)輸出13函數(shù)的聲明與使用2021/7/269例3-2數(shù)制轉(zhuǎn)換題目:函數(shù)的聲明與使用2021/7/26#include<iostream>usingnamespacestd;//計(jì)算x的n次方doublepower(doublex,intn);intmain(){ intvalue=0; cout<<"Enteran8bitbinarynumber"; for(inti=7;i>=0;i--){ charch; cin>>ch; if(ch=='1') value+=static_cast<int>(power(2,i)); } cout<<"Decimalvalueis"<<value<<endl; return0;}doublepower(doublex,intn){ doubleval=1.0; while(n--) val*=x; returnval;}運(yùn)行結(jié)果:Enteran8bitbinarynumber01101001Decimalvalueis105102021/7/2610#include<iostream>運(yùn)行結(jié)果:102021例3-3編寫程序求π的值其中arctan用如下形式的級(jí)數(shù)計(jì)算:直到級(jí)數(shù)某項(xiàng)絕對(duì)值不大于10-15為止;π和x均為double型。函數(shù)的聲明與使用2021/7/2611例3-3編寫程序求π的值函數(shù)的聲明與使用2021/7/261#include<iostream>usingnamespacestd;doublearctan(doublex){ doublesqr=x*x; doublee=x; doubler=0; inti=1; while(e/i>1e-15){ doublef=e/i; r=(i%4==1)?r+f:r-f; e=e*sqr; i+=2; } returnr;}122021/7/2612#include<iostream>122021/7/26intmain(){ doublea=16.0*arctan(1/5.0); doubleb=4.0*arctan(1/239.0); //注意:因?yàn)檎麛?shù)相除結(jié)果取整,如果參數(shù)寫1/5,1/239,結(jié)果就都是0 cout<<"PI="<<a-b<<endl; return0;}運(yùn)行結(jié)果:PI=37/2613運(yùn)行結(jié)果:132021/7/2613例3-4尋找并輸出11~999之間的數(shù)m,它滿足m、m2和m3均為回文數(shù)。回文:各位數(shù)字左右對(duì)稱的整數(shù)。

例如:11滿足上述條件

112=121,113=1331。分析:10取余的方法,從最低位開(kāi)始,依次取出該數(shù)的各位數(shù)字。按反序重新構(gòu)成新的數(shù),比較與原數(shù)是否相等,若相等,則原數(shù)為回文。函數(shù)的聲明與使用2021/7/2614例3-4尋找并輸出11~999之間的數(shù)m,它滿足m、m2和m#include<iostream>usingnamespacestd;//判斷n是否為回文數(shù)boolsymm(unsignedn){unsignedi=n; unsignedm=0; while(i>0){ m=m*10+i%10; i/=10;}returnm==n;}152021/7/2615#include<iostream>152021/7/26intmain(){ for(unsignedm=11;m<1000;m++) if(symm(m)&&symm(m*m)&& symm(m*m*m)){ cout<<"m="<<m; cout<<"m*m="<<m*m; cout<<"m*m*m=" <<m*m*m<<endl; } return0;}162021/7/2616162021/7/2616運(yùn)行結(jié)果:m=11m*m=121m*m*m=1331m=101m*m=10201m*m*m=1030301m=111m*m=12321m*m*m=1367631172021/7/2617運(yùn)行結(jié)果:172021/7/2617例3-5計(jì)算如下公式,并輸出結(jié)果:其中r、s的值由鍵盤輸入。sinx的近似值按如下公式計(jì)算,計(jì)算精度為10-6:函數(shù)的聲明與使用2021/7/2618例3-5計(jì)算如下公式,并輸出結(jié)果:函數(shù)的聲明與使用2021/#include<iostream>#include<cmath>//對(duì)C++標(biāo)準(zhǔn)庫(kù)中數(shù)學(xué)函數(shù)的說(shuō)明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;}

192021/7/2619#include<iostream>192021/7/26intmain(){ doublek,r,s; cout<<"r="; cin>>r; cout<<"s="; cin>>s; if(r*r<=s*s) k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s)); else k=tsin(r*s)/2; cout<<k<<endl; return0;}運(yùn)行結(jié)果:r=5s=81.37781202021/7/2620intmain(){運(yùn)行結(jié)果:202021/7/2620例3-6投骰子的隨機(jī)游戲每個(gè)骰子有六面,點(diǎn)數(shù)分別為1、2、3、4、5、6。游戲者在程序開(kāi)始時(shí)輸入一個(gè)無(wú)符號(hào)整數(shù),作為產(chǎn)生隨機(jī)數(shù)的種子。每輪投兩次骰子,第一輪如果和數(shù)為7或11則為勝,游戲結(jié)束;和數(shù)為2、3或12則為負(fù),游戲結(jié)束;和數(shù)為其它值則將此值作為自己的點(diǎn)數(shù),繼續(xù)第二輪、第三輪...直到某輪的和數(shù)等于點(diǎn)數(shù)則取勝,若在此前出現(xiàn)和數(shù)為7則為負(fù)。由rolldice函數(shù)負(fù)責(zé)模擬投骰子、計(jì)算和數(shù)并輸出和數(shù)。函數(shù)的聲明與使用2021/7/2621例3-6投骰子的隨機(jī)游戲每個(gè)骰子有六面,點(diǎn)數(shù)分別為1、2、3rand函數(shù)原型:intrand(void);所需頭文件:<cstdlib>功能和返回值:求出并返回一個(gè)偽隨機(jī)數(shù)srand函數(shù)原型:voidsrand(unsignedintseed);參數(shù):seed產(chǎn)生隨機(jī)數(shù)的種子。所需頭文件:<cstdlib>功能:為使rand()產(chǎn)生一序列偽隨機(jī)整數(shù)而設(shè)置起始點(diǎn)。使用1作為seed參數(shù),可以重新初化rand()。222021/7/2622rand222021/7/2622#include<iostream>#include<cstdlib>usingnamespacestd;

//投骰子、計(jì)算和數(shù)、輸出和數(shù)introllDice(){ intdie1=1+rand()%6; intdie2=1+rand()%6; intsum=die1+die2; cout<<"playerrolled"<<die1<<"+"<<die2<<"="<<sum<<endl; returnsum;}232021/7/2623#include<iostream>232021/7/26enumGameStatus{WIN,LOSE,PLAYING};

intmain(){ intsum,myPoint; GameStatusstatus;

unsignedseed; cout<<"Pleaseenteranunsignedinteger:"; cin>>seed;//輸入隨機(jī)數(shù)種子

srand(seed);//將種子傳遞給rand()

sum=rollDice();//第一輪投骰子、計(jì)算和數(shù)242021/7/2624242021/7/2624 switch(sum){ case7://如果和數(shù)為7或11則為勝,狀態(tài)為WIN case11: status=WIN; break; case2://和數(shù)為2、3或12則為負(fù),狀態(tài)為L(zhǎng)OSE case3: case12: status=LOSE; break; default://其它情況,游戲尚無(wú)結(jié)果,狀態(tài)為PLAYING,記下點(diǎn)數(shù),為下一輪做準(zhǔn)備

status=PLAYING; myPoint=sum; cout<<"pointis"<<myPoint<<endl; break; }252021/7/2625 switch(sum){252021/7/2625 while(status==PLAYING){//只要狀態(tài)仍為PLAYING,就繼續(xù)進(jìn)行下一輪

sum=rollDice(); if(sum==myPoint)//某輪的和數(shù)等于點(diǎn)數(shù)則取勝 status=WIN; elseif(sum==7)//出現(xiàn)和數(shù)為7則為負(fù) status=LOSE; } //當(dāng)狀態(tài)不為PLAYING時(shí)上面的循環(huán)結(jié)束,以下程序段輸出游戲結(jié)果

if(status==WIN) cout<<"playerwins"<<endl; else cout<<"playerloses"<<endl; return0;}262021/7/2626 while(status==PLAYING){/運(yùn)行結(jié)果2:Pleaseenteranunsignedinteger:23playerrolled6+3=9pointis9playerrolled5+4=9playerwins272021/7/2627運(yùn)行結(jié)果2:272021/7/2627嵌套調(diào)用函數(shù)的聲明與使用main{}調(diào)fun1()結(jié)束fun1()調(diào)fun2()返回fun2()返回①②③⑦④⑤⑥⑧⑨2021/7/2628嵌套調(diào)用函數(shù)的聲明與使用main{}fun1()fun2()例3-6輸入兩個(gè)整數(shù),求平方和。#include<iostream>usingnamespacestd;intfun2(intm){ returnm*m;}

intfun1(intx,inty){ returnfun2(x)+fun2(y);}函數(shù)的聲明與使用2021/7/2629例3-6輸入兩個(gè)整數(shù),求平方和。#include<iosintmain(){ inta,b; cout<<"Pleaseentertwointegers(aandb):"; cin>>a>>b; cout<<"Thesumofsquareofaandb:"<<fun1(a,b)<<endl; return0;}運(yùn)行結(jié)果:Pleaseentertwointegers(aandb):34Thesumofsquareofaandb:25302021/7/2630intmain(){302021/7/2630遞歸調(diào)用函數(shù)直接或間接地調(diào)用自身,稱為遞歸調(diào)用。遞歸過(guò)程的兩個(gè)階段:遞推:

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未知已知函數(shù)的聲明與使用2021/7/2631遞歸調(diào)用函數(shù)直接或間接地調(diào)用自身,稱為遞歸調(diào)用。函數(shù)的聲明與例3-8求n!分析:計(jì)算n!的公式如下:這是一個(gè)遞歸形式的公式,應(yīng)該用遞歸函數(shù)實(shí)現(xiàn)。函數(shù)的聲明與使用2021/7/2632例3-8求n!分析:計(jì)算n!的公式如下:函數(shù)的聲明與使用源程序:#include<iostream>usingnamespacestd;unsignedfac(intn){ unsignedf; if(n==0) f=1;else f=fac(n-1)*n;returnf;}332021/7/2633源程序:332021/7/2633intmain(){ unsignedn; cout<<"Enterapositiveinteger:"; cin>>n; unsignedy=fac(n); cout<<n<<"!="<<y<<endl; return0;}運(yùn)行結(jié)果:Enterapositiveinteger:88!=40320342021/7/2634intmain(){342021/7/2634例3-9用遞歸法計(jì)算從n個(gè)人中選擇k個(gè)人組成一個(gè)委員會(huì)的不同組合數(shù)。分析:由n個(gè)人里選k個(gè)人的組合數(shù)

=由n-1個(gè)人里選k個(gè)人的組合數(shù)

+由n-1個(gè)人里選k-1個(gè)人的組合數(shù)當(dāng)n=k或k=0時(shí),組合數(shù)為1函數(shù)的聲明與使用2021/7/2635例3-9用遞歸法計(jì)算從n個(gè)人中選擇k個(gè)人組成一個(gè)委員會(huì)的不同#include<iostream>usingnamespacestd;intcomm(intn,intk){ if(k>n) return0; elseif(n==k||k==0) return1; else returncomm(n-1,k)+comm(n-1,k-1);}intmain(){ intn,k; cout<<"Pleaseentertwointegersnandk:"; cin>>n>>k; cout<<"C(n,k)="<<comm(n,k)<<endl; return0;}運(yùn)行結(jié)果:1858568362021/7/2636#include<iostream>運(yùn)行結(jié)果:362021例3-10漢諾塔問(wèn)題有三根針A、B、C。A針上有N個(gè)盤子,大的在下,小的在上,要求把這N個(gè)盤子從A針移到C針,在移動(dòng)過(guò)程中可以借助B針,每次只允許移動(dòng)一個(gè)盤,且在移動(dòng)過(guò)程中在三根針上都保持大盤在下,小盤在上。函數(shù)的聲明與使用ABC2021/7/2637例3-10漢諾塔問(wèn)題有三根針A、B、C。A針上有N個(gè)盤子,大分析:將n個(gè)盤子從A針移到C針可以分解為下面三個(gè)步驟:①將A上n-1個(gè)盤子移到B針上(借助C針);②把A針上剩下的一個(gè)盤子移到C針上;③將n-1個(gè)盤子從B針移到C針上(借助A針);事實(shí)上,上面三個(gè)步驟包含兩種操作:①將多個(gè)盤子從一個(gè)針移到另一個(gè)針上,這是一個(gè)遞歸的過(guò)程。hanoi函數(shù)實(shí)現(xiàn)。②將1個(gè)盤子從一個(gè)針上移到另一針上。

用move函數(shù)實(shí)現(xiàn)。382021/7/2638分析:382021/7/2638#include<iostream>usingnamespacestd;//把src針的最上面一個(gè)盤子移動(dòng)到dest針上voidmove(charsrc,chardest){ cout<<src<<"-->"<<dest<<endl;}//把n個(gè)盤子從src針移動(dòng)到dest針,以medium針作為中介voidhanoi(intn,charsrc,charmedium,chardest){ if(n==1) move(src,dest); else{ hanoi(n-1,src,dest,medium); move(src,dest); hanoi(n-1,medium,src,dest); }}392021/7/2639#include<iostream>392021/7/26intmain(){ intm; cout<<"Enterthenumberofdiskes:"; cin>>m; cout<<"thestepstomoving"<<m<<"diskes:"<<endl; hanoi(m,'A','B','C'); return0;}402021/7/2640intmain(){402021/7/2640運(yùn)行結(jié)果:Enterthenumberofdiskes:3thestepstomoving3diskes:A-->CA-->BC-->BA-->CB-->AB-->CA-->C412021/7/2641運(yùn)行結(jié)果:412021/7/2641函數(shù)的參數(shù)傳遞機(jī)制

——傳遞參數(shù)值在函數(shù)被調(diào)用時(shí)才分配形參的存儲(chǔ)單元。實(shí)參可以是常量、變量或表達(dá)式。實(shí)參類型必須與形參相符。傳遞時(shí)是傳遞參數(shù)值,即單向傳遞。函數(shù)的聲明與使用2021/7/2642函數(shù)的參數(shù)傳遞機(jī)制

——傳遞參數(shù)值在函數(shù)被調(diào)用函數(shù)的參數(shù)傳遞機(jī)制

——參數(shù)值傳遞舉例XN被調(diào)函數(shù):主調(diào)函數(shù):32.5AD=power(A,3)2.53doublepower(doubleX,intN)函數(shù)的聲明與使用2021/7/2643函數(shù)的參數(shù)傳遞機(jī)制

——參數(shù)值傳遞舉例XN被調(diào)函數(shù):主調(diào)例3-11輸入兩個(gè)整數(shù)交換后輸出#include<iostream>usingnamespacestd;voidswap(inta,intb){ intt=a; a=b; b=t;}函數(shù)的聲明與使用2021/7/2644例3-11輸入兩個(gè)整數(shù)交換后輸出#include<iostintmain(){ intx=5,y=10; cout<<"x="<<x<<"y="<<y<<endl;

swap(x,y); cout<<"x="<<x<<"y="<<y<<endl; return0;}運(yùn)行結(jié)果: x=5y=10 x=5y=10452021/7/2645intmain(){452021/7/2645a=b;5x10y5a10b執(zhí)行主函數(shù)中的函數(shù)調(diào)用swap(x,y);t=a;5x10y5a10b5tb=t;5x10y10a5b5t5x10y10a10b5t在swap子函數(shù)中返回主函數(shù)以后5x10y46462021/7/2646a=b;5x10y5a10b執(zhí)行主函數(shù)中的函函數(shù)的參數(shù)傳遞

——用引用做形參引用(&)是標(biāo)識(shí)符的別名,例如:inti,j;

int&ri=i;

//建立一個(gè)int型的引用ri,并將其

//初始化為變量i的一個(gè)別名

j=10;

ri=j;//相當(dāng)于i=j;聲明一個(gè)引用時(shí),必須同時(shí)對(duì)它進(jìn)行初始化,使它指向一個(gè)已存在的對(duì)象。一旦一個(gè)引用被初始化后,就不能改為指向其它對(duì)象。引用可以作為形參

voidswap(int&a,int&b){...}函數(shù)的聲明與使用2021/7/2647函數(shù)的參數(shù)傳遞

——用引用做形參引用(&)是標(biāo)識(shí)符的別例3-12輸入兩個(gè)整數(shù)交換后輸出#include<iostream>usingnamespacestd;voidswap(int&a,int&b){ intt=a; a=b; b=t;}intmain(){ intx=5,y=10; cout<<"x="<<x<<"y="<<y<<endl;

swap(x,y); cout<<"x="<<x<<"y="<<y<<endl; return0;}函數(shù)的聲明與使用運(yùn)行結(jié)果:x=5y=10x=10y=52021/7/2648例3-12輸入兩個(gè)整數(shù)交換后輸出#include<iostt=a;x5t5x的引用axy510y的引用x的引用aby的引用x的引用abx10y10a=bb=t;y5t5y的引用bxy105swap(x,y);492021/7/2649t=a;x5t5x的引用axy510y的引用x的引用a內(nèi)聯(lián)函數(shù)聲明與使用聲明時(shí)使用關(guān)鍵字inline。編譯時(shí)在調(diào)用處用函數(shù)體進(jìn)行替換,節(jié)省了參數(shù)傳遞、控制轉(zhuǎn)移等開(kāi)銷。注意:內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán)語(yǔ)句和switch語(yǔ)句。內(nèi)聯(lián)函數(shù)的聲明必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。對(duì)內(nèi)聯(lián)函數(shù)不能進(jìn)行異常接口聲明。內(nèi)聯(lián)函數(shù)2021/7/2650內(nèi)聯(lián)函數(shù)聲明與使用聲明時(shí)使用關(guān)鍵字inline。內(nèi)聯(lián)函數(shù)2例3-14內(nèi)聯(lián)函數(shù)應(yīng)用舉例#include<iostream>usingnamespacestd;constdoublePI=3.14159265358979;inlinedoublecalArea(doubleradius){ returnPI*radius*radius;}intmain(){ doubler=3.0;

doublearea =calArea(r); cout<<area<<endl; return0;}內(nèi)聯(lián)函數(shù)2021/7/2651例3-14內(nèi)聯(lián)函數(shù)應(yīng)用舉例#include<iostre缺省形參值的作用函數(shù)在聲明時(shí)可以預(yù)先給出缺省的形參值,調(diào)用時(shí)如給出實(shí)參,則采用實(shí)參值,否則采用預(yù)先給出的缺省形參值。例如:intadd(intx=5,inty=6){ returnx+y;}intmain(){ add(10,20);//10+20 add(10);//10+6 add();//5+6}帶缺省形參值的函數(shù)2021/7/2652缺省形參值的作用函數(shù)在聲明時(shí)可以預(yù)先給出缺省的形參值,調(diào)用時(shí)缺省形參值的說(shuō)明次序有缺省參數(shù)的形參必須在形參列表的最后,也就是說(shuō)缺省形參值的右面不能有無(wú)缺省值的參數(shù)。因?yàn)檎{(diào)用時(shí)實(shí)參與形參的結(jié)合是從左向右的順序。例:intadd(intx,inty=5,intz=6);//正確intadd(intx=1,inty=5,intz);//錯(cuò)誤intadd(intx=1,inty,intz=6);//錯(cuò)誤帶缺省形參值的函數(shù)2021/7/2653缺省形參值的說(shuō)明次序有缺省參數(shù)的形參必須在形參列表的最后,也缺省形參值與函數(shù)的調(diào)用位置如果一個(gè)函數(shù)有原型聲明,且原型聲明在定義之前,則缺省形參值必須在函數(shù)原型聲明中給出;而如果只有函數(shù)的定義,或函數(shù)定義在前,則缺省形參值需在函數(shù)定義中給出。例:intadd(intx=5,inty=6);//原型聲明在前intmain(){add();}intadd(intx,inty){//此處不能再指定缺省值returnx+y;}intadd(intx=5,inty=6){//只有定義,沒(méi)有原型聲明returnx+y;}intmain(){add();}帶缺省形參值的函數(shù)2021/7/2654缺省形參值與函數(shù)的調(diào)用位置如果一個(gè)函數(shù)有原型聲明,且原型聲明重載函數(shù)的聲明C++允許功能相近的函數(shù)在相同的作用域內(nèi)以相同函數(shù)名聲明,從而形成重載。方便使用,便于記憶。例:形參類型不同intadd(intx,inty);floatadd(floatx,floaty);形參個(gè)數(shù)不同intadd(intx,inty);intadd(intx,inty,intz);

函數(shù)重載2021/7/2655重載函數(shù)的聲明C++允許功能相近的函數(shù)在相同的作用域內(nèi)以相同注意事項(xiàng)不要將不同功能的函數(shù)聲明為重載函數(shù),以免出現(xiàn)調(diào)用結(jié)果的誤解、混淆。這樣不好:intadd(intx,inty);intadd(inta,intb);編譯器不以形參名來(lái)區(qū)分intadd(intx,inty);voidadd(intx,inty);編譯器不以返回值來(lái)區(qū)分intadd(intx,inty){returnx+y;}floatadd(floatx,floaty){returnx-y;}

函數(shù)重載重載函數(shù)的形參必須不同:個(gè)數(shù)不同或類型不同。編譯程序?qū)⒏鶕?jù)實(shí)參和形參的類型及個(gè)數(shù)的最佳匹配來(lái)選擇調(diào)用哪一個(gè)函數(shù)。2021/7/2656注意事項(xiàng)不要將不同功能的函數(shù)聲明為重載函數(shù),以免出現(xiàn)調(diào)用結(jié)果例3-16重載函數(shù)應(yīng)用舉例編寫兩個(gè)名為sumOfSquare的重載函數(shù),分別求兩整數(shù)的平方和及兩實(shí)數(shù)的平方和。#include<iostream>usingnamespacestd;intsumOfSquare(inta,intb){ returna*a+b*b;}doublesumOfSquare(doublea,doubleb){ returna*a+b*b;}

函數(shù)重載2021/7/2657例3-16重載函數(shù)應(yīng)用舉例編寫兩個(gè)名為sumOfSquareintmain(){ intm,n; cout<<"Entertwointeger:"; cin>>m>>n; cout<<"Theirsumofsquare:"<<sumOfSquare(m,n)<<endl; doublex,y; cout<<"Entertworealnumber:"; cin>>x>>y; cout<<"Theirsumofsquare:"<<sumOfSquare(x,y)<<endl; return0;}582021/7/2658intmain(){582021/7/2658運(yùn)行結(jié)果:Entertwointeger:35Theirsumofsquare:34Entertworealnumber:2.35.8Theirsumofsquare:38.93592021/7/2659運(yùn)行結(jié)果:592021/7/2659C++系統(tǒng)函數(shù)C++的系統(tǒng)庫(kù)中提供了幾百個(gè)函數(shù)可供程序員使用。例如:求平方根函數(shù)(sprt)、求絕對(duì)值函數(shù)(abs)等。使用系統(tǒng)函數(shù)時(shí)要包含相應(yīng)的頭文件。例如:cmath或math.h使用C++系統(tǒng)函數(shù)2021/7/2660C++系統(tǒng)函數(shù)C++的系統(tǒng)庫(kù)中提供了幾百個(gè)函數(shù)可供程序員使用例3-17系統(tǒng)函數(shù)應(yīng)用舉例題目:從鍵盤輸入一個(gè)角度值,求出該角度的正弦值、余弦值和正切值。分析:系統(tǒng)函數(shù)中提供了求正弦值、余弦值和正切值的函數(shù):sin()、cos()、tan(),函數(shù)的說(shuō)明在頭文件cmath中。使用C++系統(tǒng)函數(shù)2021/7/2661例3-17系統(tǒng)函數(shù)應(yīng)用舉例題目:使用C++系統(tǒng)函數(shù)2021/#include<iostream>#include<cmath>usingnamespacestd;constdoublePI=3.14159265358979;intmain(){ doubleangle; cout<<"Pleaseenteranangle:"; cin>>angle; //輸入角度值

doubleradian=angle*PI/180; //轉(zhuǎn)化為弧度值

cout<<"sin("<<angle<<")="<<sin(radian)<<endl; cout<<"cos("<<angle<<")="<<cos(radian)<<endl; cout<<"tan("<<angle<<")="<<tan(radian)<<endl; return0;}運(yùn)行結(jié)果:30sin(30)=0.5cos(30)=0.866025tan(30)=0.57735622021/7/2662#include<iostream>運(yùn)行結(jié)果:622021標(biāo)準(zhǔn)函數(shù)與非標(biāo)準(zhǔn)函數(shù)標(biāo)準(zhǔn)C++函數(shù)C++標(biāo)準(zhǔn)中規(guī)定的函數(shù);各種編譯環(huán)境普遍支持,因此用標(biāo)準(zhǔn)函數(shù)的程序移植性好;很多標(biāo)準(zhǔn)C++函數(shù)繼承自標(biāo)準(zhǔn)C,頭文件以c開(kāi)頭:cmath,cstdlib,cstdio,ctime……非標(biāo)準(zhǔn)C++函數(shù)與特定操作系統(tǒng)或編譯環(huán)境相關(guān);在處理和操作系統(tǒng)相關(guān)事務(wù)時(shí)常常需要調(diào)用。使用C++系統(tǒng)函數(shù)2021/7/2663標(biāo)準(zhǔn)函數(shù)與非標(biāo)準(zhǔn)函數(shù)標(biāo)準(zhǔn)C++函數(shù)使用C++系統(tǒng)函數(shù)2021查找系統(tǒng)函數(shù)的使用說(shuō)明查編譯系統(tǒng)的庫(kù)函數(shù)手冊(cè)查聯(lián)機(jī)幫助——VisualC++.NET2008聯(lián)機(jī)幫助的使用方法:進(jìn)入MSDNLibraryforVisualStudio2008DevelopmentToolsandLanguages->VisualStudio

->VisualC++

->Reference

->LibrariesReference->Run-TimeLibrary

->Run-TimeRoutinesbyCategory使用C++系統(tǒng)函數(shù)2021/7/2664查找系統(tǒng)函數(shù)的使用說(shuō)明查編譯系統(tǒng)的庫(kù)函數(shù)手冊(cè)使用C++系統(tǒng)函形參和局部變量的存儲(chǔ)為什么不能為形參和局部變量分配固定地址?他們僅在函數(shù)調(diào)用時(shí)生效,函數(shù)返回后即失效,分配固定地址造成空間浪費(fèi)更重要的是,發(fā)生遞歸調(diào)用時(shí),多次調(diào)用間的形參和局部變量應(yīng)彼此獨(dú)立需要棧式存儲(chǔ)深度探索2021/7/2665形參和局部變量的存儲(chǔ)為什么不能為形參和局部變量分配固定地址?棧棧是一種容納數(shù)據(jù)的容器數(shù)據(jù)只能從棧的一端存入(壓入棧)數(shù)據(jù)只能從棧的同一端取出(彈出棧)深度探索an┆a2a1壓入棧彈出棧棧頂棧底2021/7/2666棧棧是一種容納數(shù)據(jù)的容器深度探索an壓入棧彈出棧棧頂棧運(yùn)行棧運(yùn)行棧是一段區(qū)域的內(nèi)存空間運(yùn)行棧分為一個(gè)一個(gè)棧幀每個(gè)棧幀對(duì)應(yīng)一次函數(shù)調(diào)用棧幀中包括:本次函數(shù)調(diào)用的形參值控制信息局部變量值一些臨時(shí)數(shù)據(jù)函數(shù)調(diào)用時(shí),會(huì)一個(gè)棧幀被壓入運(yùn)行棧返回時(shí),會(huì)有一個(gè)棧幀被彈出深度探索2021/7/2667運(yùn)行棧運(yùn)行棧是一段區(qū)域的內(nèi)存空間深度探索2021/7/運(yùn)行棧示意圖unsignedfac(unsignedn){unsignedf;if(n==0)f=1;elsef=fac(n-1)*n;returnf;}intmain(){unsignedn;cin>>n;unsignedy=fac(n);……}n:0f:?n:1y:?n:1f:1main()fac(1)fac(0)棧頂深度探索2021/7/2668運(yùn)行棧示意圖unsignedfac(unsignedn)函數(shù)調(diào)用的執(zhí)行過(guò)程棧指針esp:指向運(yùn)行棧棧頂幀指針ebp:定位形參和局部變量傳遞參數(shù):調(diào)用前把實(shí)參壓入堆棧函數(shù)調(diào)用時(shí)的幾步關(guān)鍵操作call指令:將下一條指令地址(返回地址)壓入運(yùn)行棧,轉(zhuǎn)到函數(shù)入口地址被調(diào)函數(shù)入口處:將當(dāng)前ebp壓入運(yùn)行棧,用ebp保存esp,調(diào)整esp為局部變量留出空間被調(diào)函數(shù)出口處:用ebp恢復(fù)esp,從運(yùn)行棧中彈出ebp原值ret指令:將返回地址從運(yùn)行棧彈出,轉(zhuǎn)到返回地址深度探索2021/7/2669函數(shù)調(diào)用的執(zhí)行過(guò)程棧指針esp:指向運(yùn)行棧棧頂深度探索運(yùn)行棧的數(shù)據(jù)分布unsignedfac(unsignedn){unsignedf;if(n==0)f=1;elsef=fac(n-1)*n;returnf;}局部變量febp原值返回地址參數(shù)n調(diào)用fib(n-1)的參數(shù)nespebpfib的棧幀形參和局部變量定位:ebp–8:形參nebp+4:局部變量f深度探索2021/7/2670運(yùn)行棧的數(shù)據(jù)分布unsignedfac(unsigned函數(shù)聲明的意義以錯(cuò)誤方式調(diào)用函數(shù)的危險(xiǎn)性函數(shù)的原型信息(參數(shù)個(gè)數(shù)和類型、返回值類型)在編譯后即不存在;如果不要求聲明函數(shù),以錯(cuò)誤的方式(錯(cuò)誤的參數(shù)數(shù)量或類型)調(diào)用函數(shù),會(huì)產(chǎn)生不可預(yù)期的結(jié)果,但很多情況下不會(huì)給出錯(cuò)誤提示。函數(shù)原型是主調(diào)函數(shù)與被調(diào)函數(shù)間的協(xié)議運(yùn)行結(jié)果錯(cuò)誤vs編譯錯(cuò)誤一個(gè)錯(cuò)誤,與其被淹沒(méi)在運(yùn)行中,不如暴露在編譯時(shí)。深度探索2021/7/2671函數(shù)聲明的意義以錯(cuò)誤方式調(diào)用函數(shù)的危險(xiǎn)性深度探索202C語(yǔ)言的反例C語(yǔ)言允許只聲明函數(shù)名和返回類型,而不聲明參數(shù)類型不聲明函數(shù),直接調(diào)用后果:隱蔽錯(cuò)誤如果給出add()的完整聲明,則會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換。聲明帶來(lái)了類型安全doubleadd();intmain(){ doubles=add(1,2); …. return0;}doubleadd(doublea,doubleb){ returna+b;}不完整的函數(shù)聲明錯(cuò)誤的調(diào)用,壓入運(yùn)行棧的是整數(shù)!2021/7/2672C語(yǔ)言的反例C語(yǔ)言允許doubleadd();不完整的函數(shù)小結(jié)與復(fù)習(xí)建議主要內(nèi)容函數(shù)的聲明和調(diào)用、函數(shù)間的參數(shù)傳遞、內(nèi)聯(lián)函數(shù)、帶默認(rèn)形參值的函數(shù)、函數(shù)重載、C++系統(tǒng)函數(shù)達(dá)到的目標(biāo)學(xué)會(huì)將一段功能相對(duì)獨(dú)立的程序?qū)懗梢粋€(gè)函數(shù),為下一章學(xué)習(xí)類和對(duì)象打好必要的基礎(chǔ)。實(shí)驗(yàn)任務(wù)實(shí)驗(yàn)三2021/7/2673小結(jié)與復(fù)習(xí)建議主要內(nèi)容2021/7/26732021/7/26742021/7/2674(最新整理)C++語(yǔ)言程序設(shè)計(jì)(清華大學(xué)鄭莉)三2021/7/2675(最新整理)C++語(yǔ)言程序設(shè)計(jì)(清華大學(xué)鄭莉)三2021/7第三章函數(shù)清華大學(xué)鄭莉C++語(yǔ)言程序設(shè)計(jì)2021/7/2676第三章函數(shù)清華大學(xué)鄭莉C++語(yǔ)言程序設(shè)計(jì)2021本章主要內(nèi)容函數(shù)的定義和調(diào)用函數(shù)間的參數(shù)傳遞內(nèi)聯(lián)函數(shù)帶默認(rèn)形參值的函數(shù)函數(shù)重載C++系統(tǒng)函數(shù)深度探索2021/7/2677本章主要內(nèi)容函數(shù)的定義和調(diào)用2021/7/263函數(shù)的定義函數(shù)是面向?qū)ο蟪绦蛟O(shè)計(jì)中,對(duì)功能的抽象函數(shù)定義的語(yǔ)法形式類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表){

語(yǔ)句序列}函數(shù)的聲明與使用是被初始化的內(nèi)部變量,壽命和可見(jiàn)性僅限于函數(shù)內(nèi)部若無(wú)返回值,寫void2021/7/2678函數(shù)的定義函數(shù)是面向?qū)ο蟪绦蛟O(shè)計(jì)中,對(duì)功能的抽象函數(shù)的聲明與函數(shù)的定義形式參數(shù)表<type1>name1,<type2>name2,...,<typen>namen函數(shù)的返回值由return語(yǔ)句給出,例如:

return0無(wú)返回值的函數(shù)(void類型),不必寫return語(yǔ)句。函數(shù)的聲明與使用2021/7/2679函數(shù)的定義形式參數(shù)表函數(shù)的聲明與使用2021/7/265函數(shù)的調(diào)用調(diào)用前先聲明函數(shù):若函數(shù)定義在調(diào)用點(diǎn)之前,則無(wú)需另外聲明;若函數(shù)定義在調(diào)用點(diǎn)之后,則需要在調(diào)用函數(shù)前按如下形式聲明函數(shù)原型:

類型標(biāo)識(shí)符被調(diào)用函數(shù)名(含類型說(shuō)明的形參表);調(diào)用形式

函數(shù)名(實(shí)參列表)嵌套調(diào)用函數(shù)可以嵌套調(diào)用,但不允許嵌套定義。遞歸調(diào)用函數(shù)直接或間接調(diào)用自身。函數(shù)的聲明與使用2021/7/2680函數(shù)的調(diào)用調(diào)用前先聲明函數(shù):函數(shù)的聲明與使用2021/7/2例3-1編寫一個(gè)求x的n次方的函數(shù)#include<iostream>usingnamespacestd;//計(jì)算x的n次方doublepower(doublex,intn){ doubleval=1.0; while(n--)val*=x; returnval;}intmain(){ cout<<"5tothepower2is"

<<power(5,2)<<endl; return0;}函數(shù)的聲明與使用2021/7/2681例3-1編寫一個(gè)求x的n次方的函數(shù)#include<ios運(yùn)行結(jié)果:5tothepower2is25例3-1編寫一個(gè)求x的n次方的函數(shù)函數(shù)的聲明與使用2021/7/2682例3-1編寫一個(gè)求x的n次方的函數(shù)函數(shù)的聲明與使用2021/例3-2數(shù)制轉(zhuǎn)換題目:輸入一個(gè)8位二進(jìn)制數(shù),將其轉(zhuǎn)換為十進(jìn)制數(shù)輸出。例如:11012=1(23)+1(22)+0(21)+1(20)=1310

所以,如果輸入1101,則應(yīng)輸出13函數(shù)的聲明與使用2021/7/2683例3-2數(shù)制轉(zhuǎn)換題目:函數(shù)的聲明與使用2021/7/26#include<iostream>usingnamespacestd;//計(jì)算x的n次方doublepower(doublex,intn);intmain(){ intvalue=0; cout<<"Enteran8bitbinarynumber"; for(inti=7;i>=0;i--){ charch; cin>>ch; if(ch=='1') value+=static_cast<int>(power(2,i)); } cout<<"Decimalvalueis"<<value<<endl; return0;}doublepower(doublex,intn){ doubleval=1.0; while(n--) val*=x; returnval;}運(yùn)行結(jié)果:Enteran8bitbinarynumber01101001Decimalvalueis105842021/7/2684#include<iostream>運(yùn)行結(jié)果:102021例3-3編寫程序求π的值其中arctan用如下形式的級(jí)數(shù)計(jì)算:直到級(jí)數(shù)某項(xiàng)絕對(duì)值不大于10-15為止;π和x均為double型。函數(shù)的聲明與使用2021/7/2685例3-3編寫程序求π的值函數(shù)的聲明與使用2021/7/261#include<iostream>usingnamespacestd;doublearctan(doublex){ doublesqr=x*x; doublee=x; doubler=0; inti=1; while(e/i>1e-15){ doublef=e/i; r=(i%4==1)?r+f:r-f; e=e*sqr; i+=2; } returnr;}862021/7/2686#include<iostream>122021/7/26intmain(){ doublea=16.0*arctan(1/5.0); doubleb=4.0*arctan(1/239.0); //注意:因?yàn)檎麛?shù)相除結(jié)果取整,如果參數(shù)寫1/5,1/239,結(jié)果就都是0 cout<<"PI="<<a-b<<endl; return0;}運(yùn)行結(jié)果:PI=37/2687運(yùn)行結(jié)果:132021/7/2613例3-4尋找并輸出11~999之間的數(shù)m,它滿足m、m2和m3均為回文數(shù)。回文:各位數(shù)字左右對(duì)稱的整數(shù)。

例如:11滿足上述條件

112=121,113=1331。分析:10取余的方法,從最低位開(kāi)始,依次取出該數(shù)的各位數(shù)字。按反序重新構(gòu)成新的數(shù),比較與原數(shù)是否相等,若相等,則原數(shù)為回文。函數(shù)的聲明與使用2021/7/2688例3-4尋找并輸出11~999之間的數(shù)m,它滿足m、m2和m#include<iostream>usingnamespacestd;//判斷n是否為回文數(shù)boolsymm(unsignedn){unsignedi=n; unsignedm=0; while(i>0){ m=m*10+i%10; i/=10;}returnm==n;}892021/7/2689#include<iostream>152021/7/26intmain(){ for(unsignedm=11;m<1000;m++) if(symm(m)&&symm(m*m)&& symm(m*m*m)){ cout<<"m="<<m; cout<<"m*m="<<m*m; cout<<"m*m*m=" <<m*m*m<<endl; } return0;}902021/7/2690162021/7/2616運(yùn)行結(jié)果:m=11m*m=121m*m*m=1331m=101m*m=10201m*m*m=1030301m=111m*m=12321m*m*m=1367631912021/7/2691運(yùn)行結(jié)果:172021/7/2617例3-5計(jì)算如下公式,并輸出結(jié)果:其中r、s的值由鍵盤輸入。sinx的近似值按如下公式計(jì)算,計(jì)算精度為10-6:函數(shù)的聲明與使用2021/7/2692例3-5計(jì)算如下公式,并輸出結(jié)果:函數(shù)的聲明與使用2021/#include<iostream>#include<cmath>//對(duì)C++標(biāo)準(zhǔn)庫(kù)中數(shù)學(xué)函數(shù)的說(shuō)明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;}

932021/7/2693#include<iostream>192021/7/26intmain(){ doublek,r,s; cout<<"r="; cin>>r; cout<<"s="; cin>>s; if(r*r<=s*s) k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s)); else k=tsin(r*s)/2; cout<<k<<endl; return0;}運(yùn)行結(jié)果:r=5s=81.37781942021/7/2694intmain(){運(yùn)行結(jié)果:202021/7/2620例3-6投骰子的隨機(jī)游戲每個(gè)骰子有六面,點(diǎn)數(shù)分別為1、2、3、4、5、6。游戲者在程序開(kāi)始時(shí)輸入一個(gè)無(wú)符號(hào)整數(shù),作為產(chǎn)生隨機(jī)數(shù)的種子。每輪投兩次骰子,第一輪如果和數(shù)為7或11則為勝,游戲結(jié)束;和數(shù)為2、3或12則為負(fù),游戲結(jié)束;和數(shù)為其它值則將此值作為自己的點(diǎn)數(shù),繼續(xù)第二輪、第三輪...直到某輪的和數(shù)等于點(diǎn)數(shù)則取勝,若在此前出現(xiàn)和數(shù)為7則為負(fù)。由rolldice函數(shù)負(fù)責(zé)模擬投骰子、計(jì)算和數(shù)并輸出和數(shù)。函數(shù)的聲明與使用2021/7/2695例3-6投骰子的隨機(jī)游戲每個(gè)骰子有六面,點(diǎn)數(shù)分別為1、2、3rand函數(shù)原型:intrand(void);所需頭文件:<cstdlib>功能和返回值:求出并返回一個(gè)偽隨機(jī)數(shù)srand函數(shù)原型:voidsrand(unsignedintseed);參數(shù):seed產(chǎn)生隨機(jī)數(shù)的種子。所需頭文件:<cstdlib>功能:為使rand()產(chǎn)生一序列偽隨機(jī)整數(shù)而設(shè)置起始點(diǎn)。使用1作為seed參數(shù),可以重新初化rand()。962021/7/2696rand222021/7/2622#include<iostream>#include<cstdlib>usingnamespacestd;

//投骰子、計(jì)算和數(shù)、輸出和數(shù)introllDice(){ intdie1=1+rand()%6; intdie2=1+rand()%6; intsum=die1+die2; cout<<"playerrolled"<<die1<<"+"<<die2<<"="<<sum<<endl; returnsum;}972021/7/2697#include<iostream>232021/7/26enumGameStatus{WIN,LOSE,PLAYING};

intmain(){ intsum,myPoint; GameStatusstatus;

unsignedseed; cout<<"Pleaseenteranunsignedinteger:"; cin>>seed;//輸入隨機(jī)數(shù)種子

srand(seed);//將種子傳遞給rand()

sum=rollDice();//第一輪投骰子、計(jì)算和數(shù)982021/7/2698242021/7/2624 switch(sum){ case7://如果和數(shù)為7或11則為勝,狀態(tài)為WIN case11: status=WIN; break; case2://和數(shù)為2、3或12則為負(fù),狀態(tài)為L(zhǎng)OSE case3: case12: status=LOSE; break; default://其它情況,游戲尚無(wú)結(jié)果,狀態(tài)為PLAYING,記下點(diǎn)數(shù),為下一輪做準(zhǔn)備

status=PLAYING; myPoint=sum; cout<<"pointis"<<myPoint<<endl; break; }992021/7/2699 switch(sum){252021/7/2625 while(status==PLAYING){//只要狀態(tài)仍為PLAYING,就繼續(xù)進(jìn)行下一輪

sum=rollDice(); if(sum==myPoint)//某輪的和數(shù)等于點(diǎn)數(shù)則取勝 status=WIN; elseif(sum==7)//出現(xiàn)和數(shù)為7則為負(fù) status=LOSE; } //當(dāng)狀態(tài)不為PLAYING時(shí)上面的循環(huán)結(jié)束,以下程序段輸出游戲結(jié)果

if(status==WIN) cout<<"playerwins"<<endl; else cout<<"playerloses"<<endl; return0;}1002021/7/26100 while(status==PLAYING){/運(yùn)行結(jié)果2:Pleaseenteranunsignedinteger:23playerrolled6+3=9pointis9playerrolled5+4=9playerwins1012021/7/26101運(yùn)行結(jié)果2:272021/7/2627嵌套調(diào)用函數(shù)的聲明與使用main{}調(diào)fun1()結(jié)束fun1()調(diào)fun2()返回fun2()返回①②③⑦④⑤⑥⑧⑨2021/7/26102嵌套調(diào)用函數(shù)的聲明與使用main{}fun1()fun2()例3-6輸入兩個(gè)整數(shù),求平方和。#include<iostream>usingnamespacestd;intfun2(intm){ returnm*m;}

intfun1(intx,inty){ returnfun2(x)+fun2(y);}函數(shù)的聲明與使用2021/7/26103例3-6輸入兩個(gè)整數(shù),求平方和。#include<iosintmain(){ inta,b; cout<<"Pleaseentertwointegers(aandb):"; cin>>a>>b; cout<<"Thesumofsquareofaandb:"<<fun1(a,b)<<endl; return0;}運(yùn)行結(jié)果:Pleaseentertwointegers(aandb):34Thesumofsquareofaandb:251042021/7/26104intmain(){302021/7/2630遞歸調(diào)用函數(shù)直接或間接地調(diào)用自身,稱為遞歸調(diào)用。遞歸過(guò)程的兩個(gè)階段:遞推:

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未知已知函數(shù)的聲明與使用2021/7/26105遞歸調(diào)用函數(shù)直接或間接地調(diào)用自身,稱為遞歸調(diào)用。函數(shù)的聲明與例3-8求n!分析:計(jì)算n!的公式如下:這是一個(gè)遞歸形式的公式,應(yīng)該用遞歸函數(shù)實(shí)現(xiàn)。函數(shù)的聲明與使用2021/7/26106例3-8求n!分析:計(jì)算n!的公式如下:函數(shù)的聲明與使用源程序:#include<iostream>usingnamespacestd;unsignedfac(intn){ unsignedf; if(n==0) f=1;else f=fac(n-1)*n;returnf;}1072021/7/26107源程序:332021/7/2633intmain(){ unsignedn; cout<<"Enterapositiveinteger:"; cin>>n; unsignedy=fac(n); cout<<n<<"!="<<y<<endl; return0;}運(yùn)行結(jié)果:Enterapositiveinteger:88!=403201082021/7/26108intmain(){342021/7/2634例3-9用遞歸法計(jì)算從n個(gè)人中選擇k個(gè)人組成一個(gè)委員會(huì)的不同組合數(shù)。分析:由n個(gè)人里選k個(gè)人的組合數(shù)

=由n-1個(gè)人里選k個(gè)人的組合數(shù)

+由n-1個(gè)人里選k-1個(gè)人的組合數(shù)當(dāng)n=k或k=0時(shí),組合數(shù)為1函數(shù)的聲明與使用2021/7/26109例3-9用遞歸法計(jì)算從n個(gè)人中選擇k個(gè)人組成一個(gè)委員會(huì)的不同#include<iostream>usingnamespacestd;intcomm(intn,intk){ if(k>n) return0; elseif(n==k||k==0) return1; else returncomm(n-1,k)+comm(n-1,k-1);}intmain(){ intn,k; cout<<"Pleaseentertwointegersnandk:"; cin>>n>>k; cout<<"C(n,k)="<<comm(n,k)<<endl; return0;}運(yùn)行結(jié)果:18585681102021/7/26110#include<iostream>運(yùn)行結(jié)果:362021例3-10漢諾塔問(wèn)題有三根針A、B、C。A針上有N個(gè)盤子,大的在下,小的在上,要求把這N個(gè)盤子從A針移到C針,在移動(dòng)過(guò)程中可以借助B針,每次只允許移動(dòng)一個(gè)盤,且在移動(dòng)過(guò)程中在三根針上都保持大盤在下,小盤在上。函數(shù)的聲明與使用ABC2021/7/26111例3-10漢諾塔問(wèn)題有三根針A、B、C。A針上有N個(gè)盤子,大分析:將n個(gè)盤子從A針移到C針可以分解為下面三個(gè)步驟:①將A上n-1個(gè)盤子移到B針上(借助C針);②把A針上剩下的一個(gè)盤子移到C針上;③將n-1個(gè)盤子從B針移到C針上(借助A針);事實(shí)上,上面三個(gè)步驟包含兩種操作:①將多個(gè)盤子從一個(gè)針移到另一個(gè)針上,這是一個(gè)遞歸的過(guò)程。hanoi函數(shù)實(shí)現(xiàn)。②將1個(gè)盤子從一個(gè)針上移到另一針上。

用move函數(shù)實(shí)現(xiàn)。1122021/7/26112分析:382021/7/2638#include<iostream>usingnamespacestd;//把src針的最上面一個(gè)盤子移動(dòng)到dest針上voidmove(charsrc,chardest){ cout<<src<<"-->"<<dest<<endl;}//把n個(gè)盤子從src針移動(dòng)到dest針,以medium針作為中介voidhanoi(intn,charsrc,charmedium,chardest){ if(n==1) move(src,dest); else{ hanoi(n-1,src,dest,medium); move(src,dest); hanoi(n-1,medium,src,dest); }}1132021/7/26113#include<iostream>392021/7/26intmain(){ intm; cout<<"Enterthenumberofdiskes:"; cin>>m; cout<<"thestepstomoving"<<m<<"dis

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論