版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章函數(shù)與程序結(jié)構(gòu)(A)主要內(nèi)容引用類型(5.6)函數(shù)創(chuàng)建(5.2)函數(shù)調(diào)用(5.3)函數(shù)原型(5.8)內(nèi)聯(lián)函數(shù)(5.16)重載函數(shù)(5.7)默認(rèn)參數(shù)的函數(shù)(5.9)函數(shù)的嵌套調(diào)用函數(shù)的遞歸調(diào)用(8.1-8.4,8.6-8.7)小結(jié)與作業(yè)2課件制作5.1引用類型引用是一種新的變量類型,它的作用是為一個(gè)變量起一個(gè)別名,是C++對(duì)C的一個(gè)重要擴(kuò)充引用運(yùn)算符&引用語(yǔ)法格式:目標(biāo)類型&引用名字;引用作為目標(biāo)的別名而使用,對(duì)引用的改動(dòng)就是對(duì)目標(biāo)的改動(dòng)引用只有聲明,沒(méi)有定義inta;//定義a是整型變量int&b=a;//聲明b是a的引用以上語(yǔ)句聲明了b是a的引用,即b是a的別名3課件制作5.1引用類型引用在聲明時(shí)必須被初始化,即聲明它代表哪一個(gè)變量,否則產(chǎn)生編譯錯(cuò)誤聲明變量b為引用類型,并不需要另外開(kāi)辟內(nèi)存單元來(lái)存放b的值;b和a占內(nèi)存中的同一個(gè)存儲(chǔ)單元,它們具有同一地址;聲明b是a的引用,可以理解為:使變量b具有變量a的地址4課件制作5.1引用類型//引用和變量的關(guān)系。#include<iostream>#include<iomanip>usingnamespacestd;intmain(){
inta=10;
int&b=a;//聲明b是a的引用
a=a*a;//a的值變化了,b的值也應(yīng)一起變化
cout<<a<<setw(6)<<b<<endl;b=b/5;//b的值變化了,a的值也應(yīng)一起變化
cout<<b<<setw(6)<<a<<endl;return0;}運(yùn)行記錄如下:
100 100(a和b的值都是100)20 20(a和b的值都是20)5課件制作5.1引用類型#include<iostream>usingnamespacestd;intmain(){
int
intOne;
int&rInt=intOne;
intOne=5;
cout<<"intOne:"<<intOne<<endl;
cout<<"rInt:"<<rInt<<endl;
cout<<"&intOne:"<<&intOne<<endl;
cout<<"&rInt:"<<&rInt<<endl<<endl;
int
intTwo=8;
rInt=intTwo;//將intTwo的值賦值給rInt
cout<<"rInt:"<<rInt<<endl;
cout<<"intOne:"<<intOne<<endl;
cout<<"intTwo:"<<intTwo<<endl<<endl;
cout<<"&intOne:"<<&intOne<<endl;
cout<<"&intTwo:"<<&intTwo<<endl;
cout<<"&rInt:"<<&rInt<<endl;return0;}6課件制作5.1引用類型引用的限制若一個(gè)變量聲明為T類型的引用時(shí),它必須用T類型的變量或?qū)ο?,或能夠轉(zhuǎn)換為T類型的對(duì)象進(jìn)行初始化若引用類型T的初始值不是一個(gè)左值,則將建立一個(gè)T類型的目標(biāo)并用初始值初始化,那個(gè)目標(biāo)的地址變成引用的地址不允許對(duì)void類型進(jìn)行引用double&rDl=1;doubletmp;tmp=double(1);double&rDl=tmp;7課件制作5.2函數(shù)創(chuàng)建一個(gè)函數(shù)就是一個(gè)語(yǔ)句的集合,這些語(yǔ)句組合在一起完成一項(xiàng)操作C++程序就是由一些列函數(shù)組成,這些函數(shù)分為系統(tǒng)函數(shù)和自定義函數(shù)函數(shù)語(yǔ)法形式returnValueType
functionName(listofparameters){//Functionbody}8課件制作5.2函數(shù)創(chuàng)建int
fnMax(intnum1,intnum2){
intresult;if(num1>num2)result=num1;elseresult=num2;returnresult;}函數(shù)頭函數(shù)體返回值類型函數(shù)名形式參數(shù)參數(shù)列表返回值#include<iostream>usingnamespacestd;intmain(){
intret;
intn1=8,n2=9;
ret=fnMax(n1,n2);
cout<<"Themaxof"<<n1<<"and"<<n2<<"is"<<ret<<endl;return0;}函數(shù)調(diào)用實(shí)際參數(shù)9課件制作5.2函數(shù)創(chuàng)建函數(shù)頭指明了返回值類型、函數(shù)名和函數(shù)參數(shù)一個(gè)函數(shù)可以返回一個(gè)值,也可以只執(zhí)行指定的操作而不返回值有返回值的函數(shù)必須用returnValueType指定函數(shù)返回值的數(shù)據(jù)類型,該類函數(shù)稱為返回值函數(shù)無(wú)返回值的函數(shù)返回值類型部分應(yīng)使用關(guān)鍵字void,該類函數(shù)稱為void函數(shù)函數(shù)頭中定義的變量稱為形式參數(shù),簡(jiǎn)稱形參。被傳遞的值稱為實(shí)際參數(shù),簡(jiǎn)稱實(shí)參參數(shù)列表指明了函數(shù)的參數(shù)類型、次序和數(shù)量參數(shù)是可選的,即一個(gè)函數(shù)可以沒(méi)有參數(shù)函數(shù)體包含一個(gè)語(yǔ)句集合,定義了函數(shù)做什么10課件制作5.2函數(shù)創(chuàng)建創(chuàng)建無(wú)參函數(shù)定義無(wú)參函數(shù)的一般形式為類型標(biāo)識(shí)符
函數(shù)名([void]){
聲明部分;語(yǔ)句;
}類型標(biāo)識(shí)符用來(lái)指定函數(shù)的類型,即函數(shù)帶回來(lái)的值的類型。//定義fnPrintMessage函數(shù)void
fnPrintMessage(void){
cout<<"WelcometoC++!"<<endl;//輸出一行文字}11課件制作5.2函數(shù)創(chuàng)建創(chuàng)建有參函數(shù)定義有參函數(shù)的一般形式為:類型標(biāo)識(shí)符
函數(shù)名(形式參數(shù)列表){
聲明部分;
語(yǔ)句;}//函數(shù)首部,函數(shù)值為整型,有兩個(gè)整型形參int
fnMax(intx,inty){
intz;//函數(shù)體中的聲明部分
z=x>y?x:y;//將x和y中的大者的值賦給整型變量zreturn(z);//將z的值作為函數(shù)值返回調(diào)用點(diǎn)}C++要求在定義函數(shù)時(shí)必須指定函數(shù)的類型。12課件制作5.2函數(shù)創(chuàng)建函數(shù)返回值返回值應(yīng)屬于某一個(gè)確定的類型,在定義函數(shù)時(shí)必須指定函數(shù)返回值的類型函數(shù)的返回值有兩種類型:void
類型函數(shù)(無(wú)返回值)可以有return,也可以不寫return語(yǔ)句,函數(shù)體的右花括號(hào)有返回的功能return;只返回程序執(zhí)行的控制權(quán)有返回值:return(表達(dá)式);
return具有返回值類型的變量或常量;return語(yǔ)句后面的括號(hào)可以要,也可以不要:return(x);或returnx;return后面的值也可以是一個(gè)表達(dá)式,如returnx+y-fabs(c);函數(shù)中可以有多個(gè)return語(yǔ)句,大多出現(xiàn)在if語(yǔ)句中,但只能返回一個(gè)值13課件制作5.2函數(shù)創(chuàng)建函數(shù)返回值如果函數(shù)值的類型和return語(yǔ)句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn),即函數(shù)類型決定返回值的類型;對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類型轉(zhuǎn)換函數(shù)的返回值是通過(guò)函數(shù)中的return語(yǔ)句獲得的,return語(yǔ)句將被調(diào)用函數(shù)中的一個(gè)確定值帶回主調(diào)函數(shù)中去14課件制作5.3函數(shù)調(diào)用函數(shù)調(diào)用的方式函數(shù)語(yǔ)句把函數(shù)調(diào)用單獨(dú)作為一個(gè)語(yǔ)句,并不要求函數(shù)帶回一個(gè)值,只是要求函數(shù)完成一定的操作,如fnPrintMessage();函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算,如c=2*fnMax(a,b);函數(shù)參數(shù)函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參,如
m=fnMax(a,fnMax(b,c));
fnMax(b,c)是函數(shù)調(diào)用,其值作為外層fnMax
函數(shù)調(diào)用的一個(gè)實(shí)參15課件制作5.3函數(shù)調(diào)用#include<iostream>usingnamespacestd;//求兩個(gè)數(shù)的極值int
fnMax(intnum1,intnum2){
intresult;if(num1>num2)result=num1;elseresult=num2;returnresult;}//定義fnPrintMessage函數(shù)void
fnPrintMessage(){
//輸出一行文字
cout<<"WelcometoC++!"<<endl;}intmain(){//函數(shù)調(diào)用
fnPrintMessage();
intret;
intn1=8,n2=9,n3=10,n4=5;
//函數(shù)調(diào)用
ret=fnMax(n1,n2);
cout<<"Themaxof"<<n1<<"and"<<n2<<"is"<<ret<<endl;//函數(shù)調(diào)用
ret=fnMax(n1,fnMax(n3,n4));
cout<<"Themaxof"<<n1<<","<n3<<"and"<<n3<<"is"<<ret<<endl;return0;}16課件制作5.3函數(shù)調(diào)用函數(shù)調(diào)用的執(zhí)行當(dāng)一個(gè)程序調(diào)用一個(gè)函數(shù)時(shí),程序控制流轉(zhuǎn)向到被調(diào)用的函數(shù)當(dāng)被調(diào)用函數(shù)的return語(yǔ)句執(zhí)行之后或者當(dāng)?shù)竭_(dá)函數(shù)結(jié)尾大括號(hào)時(shí),它將控制權(quán)交還給調(diào)用者main()調(diào)fun()結(jié)束fun()返回①②④⑥⑦保存:返回地址當(dāng)前現(xiàn)場(chǎng)③恢復(fù):主調(diào)程序現(xiàn)場(chǎng)返回地址⑤17課件制作5.3函數(shù)調(diào)用18課件制作iisnow5函數(shù)調(diào)用執(zhí)行過(guò)程5.3函數(shù)調(diào)用19課件制作jisnow2函數(shù)調(diào)用執(zhí)行過(guò)程5.3函數(shù)調(diào)用20課件制作invokemax(i,j)5.3函數(shù)調(diào)用函數(shù)調(diào)用執(zhí)行過(guò)程21課件制作invokemax(i,j)Passthevalueofitonum1Passthevalueofjtonum25.3函數(shù)調(diào)用函數(shù)調(diào)用執(zhí)行過(guò)程22課件制作declarevariableresult5.3函數(shù)調(diào)用函數(shù)調(diào)用執(zhí)行過(guò)程23課件制作(num1>num2)istruesincenum1is5andnum2is25.3函數(shù)調(diào)用函數(shù)調(diào)用執(zhí)行過(guò)程24課件制作resultisnow55.3函數(shù)調(diào)用函數(shù)調(diào)用執(zhí)行過(guò)程25課件制作returnresult,whichis55.3函數(shù)調(diào)用函數(shù)調(diào)用執(zhí)行過(guò)程26課件制作returnmax(i,j)andassignthereturnvaluetok5.3函數(shù)調(diào)用函數(shù)調(diào)用執(zhí)行過(guò)程27課件制作Executetheprintstatement5.3函數(shù)調(diào)用函數(shù)調(diào)用執(zhí)行過(guò)程28課件制作函數(shù)調(diào)用堆棧變化5.3函數(shù)調(diào)用29課件制作iisdeclaredandinitialized5.3函數(shù)調(diào)用30課件制作jisdeclaredandinitialized5.3函數(shù)調(diào)用31課件制作Declarek5.3函數(shù)調(diào)用32課件制作Invokemax(i,j)5.3函數(shù)調(diào)用33課件制作passthevaluesofiandjtonum1andnum25.3函數(shù)調(diào)用34課件制作(num1>num2)istrue5.3函數(shù)調(diào)用35課件制作Assignnum1toresult5.3函數(shù)調(diào)用36課件制作Returnresultandassignittok5.3函數(shù)調(diào)用37課件制作Executeprintstatement5.3函數(shù)調(diào)用38課件制作5.3函數(shù)調(diào)用函數(shù)調(diào)用時(shí)的參數(shù)要求如果是調(diào)用無(wú)參函數(shù),則“實(shí)參表列”可以沒(méi)有,但括號(hào)不能省略實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)匹配(相同或賦值兼容)如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開(kāi)實(shí)參與形參按順序?qū)?yīng),一對(duì)一地傳遞數(shù)據(jù)39課件制作5.3函數(shù)調(diào)用#include<iostream>usingnamespacestd;//定義fnMax函數(shù)int
fnMax(intnum1,intnum2){
intresult;if(num1>num2)result=num1;elseresult=num2;returnresult;}//定義fnPrintMessage函數(shù)voidfnPrintMessage(){
cout<<"WelcometoC++!"<<endl;//輸出一行文字}intmain(){
//調(diào)用無(wú)參、無(wú)返回值函數(shù)
fnPrintMessage();
intret;
intn1=8,n2=9;
//調(diào)用有參、有返回值函數(shù)
ret=fnMax(n1,n2);
cout<<"Themaxof"<<n1<<"and"<<n2<<"is"<<ret<<endl;return0;}40課件制作5.3函數(shù)調(diào)用函數(shù)調(diào)用時(shí)形參與實(shí)參的關(guān)系在定義函數(shù)時(shí),必須在函數(shù)首部指定形參的類型在定義函數(shù)時(shí)指定的形參,在未進(jìn)行函數(shù)調(diào)用時(shí)并不占內(nèi)存中的存儲(chǔ)單元;在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)max中的形參會(huì)被分配內(nèi)存單元,以便接收從實(shí)參傳來(lái)的數(shù)據(jù);在調(diào)用結(jié)束后,形參所占的內(nèi)存單元自動(dòng)被釋放實(shí)參單元與形參內(nèi)存單元是不同的單元;調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值41課件制作5.3函數(shù)調(diào)用函數(shù)調(diào)用時(shí)形參與實(shí)參的關(guān)系實(shí)參與形參的類型應(yīng)相同或賦值兼容,如果實(shí)參類型與形參類型不同,則按不同類型數(shù)值的賦值規(guī)則進(jìn)行轉(zhuǎn)換實(shí)參可以是常量、變量或表達(dá)式,如max(3,a+b),但要求a和b有確定的值,以便在調(diào)用函數(shù)時(shí)將實(shí)參的值賦給形參實(shí)參變量對(duì)形參變量的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只由實(shí)參傳給形參,而不能由形參傳回來(lái)給實(shí)參42課件制作5.3函數(shù)調(diào)用函數(shù)調(diào)用時(shí)參數(shù)的處理按值方式傳遞參數(shù)實(shí)參的值復(fù)制給形參無(wú)論函數(shù)中形參的值如何改變,參數(shù)變量的值都不會(huì)受影響#include<iostream>usingnamespacestd;voidincrement(intn){n++;
cout<<"ninsidethefunctionis"<<n<<endl;}intmain(){
intx=1;
cout<<"Beforethecall,xis"<<x<<endl;
increment(x);
cout<<"afterthecall,xis"<<x<<endl;return0;}43課件制作5.3函數(shù)調(diào)用#include<iostream>usingnamespacestd;/**Swaptwovariables*/voidswap(intn1,intn2){
cout<<"\tInsidetheswapfunction"<<endl;
cout<<"\t\tBeforeswappingn1is"<<n1<<",n2is"<<n2<<endl;//Swapn1withn2
inttemp=n1;n1=n2;n2=temp;
cout<<"\t\tAfterswappingn1is"<<n1<<",n2is"<<n2<<endl;}44課件制作5.3函數(shù)調(diào)用intmain(){//Declareandinitializevariables
intnum1=1;
intnum2=2;
cout<<"Beforeinvokingtheswapfunction,num1is"<<num1<<"andnum2is"<<num2<<endl;//Invoketheswapfunctiontoattempttoswaptwovariablesswap(num1,num2);
cout<<"Afterinvokingtheswapfunction,num1is"<<num1<<"andnum2is"<<num2<<endl;return0;}45課件制作5.3函數(shù)調(diào)用函數(shù)調(diào)用時(shí)參數(shù)的處理按引用方式傳遞參數(shù)將函數(shù)的形參聲明為引用變量形式,調(diào)用時(shí)傳遞一個(gè)常規(guī)變量當(dāng)改變引用變量(形參)的值時(shí),原變量的值也會(huì)改變按引用方式傳遞參數(shù)時(shí),形參和實(shí)參的類型必須相同;否則有些編譯器產(chǎn)生語(yǔ)法錯(cuò)誤,有些進(jìn)行的是值傳遞46課件制作5.3函數(shù)調(diào)用/**Swaptwovariables*/voidswap(int&n1,int&n2){
cout<<"\tInsidetheswapfunction"<<endl;
cout<<"\t\tBeforeswappingn1is"<<n1<<"n2is"<<n2<<endl;//Swapn1withn2
inttemp=n1;n1=n2;n2=temp;
cout<<"\t\tAfterswappingn1is"<<n1<<"n2is"<<n2<<endl;}47課件制作5.3函數(shù)調(diào)用#include<iostream>usingnamespacestd;voidfn(double&p){p++;}intmain(){doublef=1;
inti=1;
fn(f);
fn(i);//cannotconvertparameter1from'int'to'double&‘fn(1.0);//cannotconvertparameter1from'constdouble'to'double&'
cout<<"fis"<<f<<endl;
cout<<"iis"<<i<<endl;
return0;}按引用方式傳遞參數(shù)時(shí),形參和實(shí)參的類型必須相同;否則有些編譯器產(chǎn)生語(yǔ)法錯(cuò)誤,有些進(jìn)行的是值傳遞48課件制作5.4函數(shù)原型在調(diào)用一個(gè)函數(shù)之前,必須在程序中聲明它將函數(shù)創(chuàng)建放在所有函數(shù)調(diào)用之前在函數(shù)調(diào)用之前聲明一個(gè)函數(shù)原型一個(gè)函數(shù)原型就是一個(gè)沒(méi)有函數(shù)實(shí)現(xiàn)(函數(shù)體)的單純的函數(shù)頭,函數(shù)的實(shí)現(xiàn)在后續(xù)的程序中給出如果使用用戶自己定義函數(shù),而該函數(shù)與調(diào)用它的函數(shù)(即主調(diào)函數(shù))在同一個(gè)程序單位中,且位置如果在主調(diào)函數(shù)之后,則必須在調(diào)用此函數(shù)之前對(duì)被調(diào)用的函數(shù)作聲明,即函數(shù)原型49課件制作5.4函數(shù)原型//定義fnMax函數(shù)int
fnMax(intnum1,intnum2){
intresult;if(num1>num2)result=num1;elseresult=num2;returnresult;}//定義fnPrintMessage函數(shù)voidfnPrintMessage(){//輸出一行文字
cout<<"WelcometoC++!"<<endl;}#include<iostream>usingnamespacestd;//函數(shù)原型聲明voidfnPrintMessage();int
fnMax(intnum1,intnum2);intmain(){//調(diào)用無(wú)參、無(wú)返回值函數(shù)
fnPrintMessage();
intret;
intn1=8,n2=9;//調(diào)用有參、有返回值函數(shù)
ret=fnMax(n1,n2);
cout<<"Themaxof"<<n1<<"and"<<n2<<"is"<<ret<<endl;return0;}50課件制作5.4函數(shù)原型函數(shù)原型的一般形式為函數(shù)類型函數(shù)名(參數(shù)類型1參數(shù)名1,參數(shù)類型2參數(shù)名2…);函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2…);應(yīng)當(dāng)保證函數(shù)原型與函數(shù)首部寫法上的一致,即函數(shù)類型、函數(shù)名、參數(shù)個(gè)數(shù)、參數(shù)類型和參數(shù)順序必須相同在函數(shù)調(diào)用時(shí)函數(shù)名、實(shí)參類型和實(shí)參個(gè)數(shù)應(yīng)與函數(shù)原型一致在函數(shù)聲明中可以不寫形參名,而只寫形參的類型,如
int
fnGetMax(int,int);51課件制作5.4函數(shù)原型例:對(duì)被調(diào)用的函數(shù)作聲明#include<iostream>usingnamespacestd;intmain(){
floatadd(floatx,floaty);//對(duì)add函數(shù)作聲明
floata,b,c;
cout<<"pleaseentera,b:";
cin>>a>>b;c=add(a,b);
cout<<"sum="<<c<<endl;return0;}//定義add函數(shù)floatadd(floatx,floaty){floatz;
z=x+y;return(z);}//運(yùn)行情況如下:pleaseentera,b:123.68456.45↙sum=580.13在函數(shù)聲明中,函數(shù)原型也可以不寫形參名,而只寫形參的類型floatadd(float,float);52課件制作5.4函數(shù)原型
下列函數(shù)原型聲明哪些是否正確?錯(cuò)誤的錯(cuò)在何處?
int
add(intx,inty);
int
add(intx,inty)
int
add(int
x,y);
int
add(intx;inty);正確錯(cuò)誤:缺少;錯(cuò)誤:形參y缺少類型
錯(cuò)誤:形參x,y之間應(yīng)為,
53課件制作5.5內(nèi)聯(lián)函數(shù)函數(shù)調(diào)用時(shí)需要一定的時(shí)間和空間的開(kāi)銷內(nèi)聯(lián)函數(shù):C++提供的一種提高程序執(zhí)行效率的方法,即在編譯時(shí)將所調(diào)用函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中,而不是將流程轉(zhuǎn)出去,這種嵌入到主調(diào)函數(shù)中的函數(shù)稱為內(nèi)聯(lián)函數(shù)(inlinefunction),又稱內(nèi)嵌函數(shù),在有些書中把它譯成內(nèi)置函數(shù)54課件制作5.5內(nèi)聯(lián)函數(shù)指定內(nèi)聯(lián)函數(shù)的方法:在函數(shù)首行的左端加關(guān)鍵字inlineinline
int
max(int,int,int);//聲明函數(shù),注意左端有inline#include<iostream>usingnamespacestd;//聲明函數(shù),注意左端有inlineinlineint
fnMax(int,int,int);intmain(){
inti=10,j=20,k=30,m;m=fnMax(i,j,k);
cout<<"max="<<m<<endl;return0;}//定義max為內(nèi)聯(lián)函數(shù)//求a,b,c中的最大者inlineint
fnMax(inta,int
b,intc){
intmax=a;if(b>max)max=b;if(c>max)max=c;returnmax;}#include<iostream>usingnamespacestd;intmain(){
inti=10,j=20,k=30,m;
m=i;if(j>max)m=j;if(k>max)m=k;
cout<<"max="<<m<<endl;return0;}在編譯時(shí)將所調(diào)用函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中,而不是將流程轉(zhuǎn)出去55課件制作5.5內(nèi)聯(lián)函數(shù)使用內(nèi)聯(lián)函數(shù)可以節(jié)省運(yùn)行時(shí)間,但卻增加了目標(biāo)程序的長(zhǎng)度,一般只將規(guī)模很小(一般為5個(gè)語(yǔ)句以下)而使用頻繁的函數(shù)(如定時(shí)采集數(shù)據(jù)的函數(shù))聲明為內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)中不能包括復(fù)雜的控制語(yǔ)句,如循環(huán)語(yǔ)句和switch語(yǔ)句對(duì)函數(shù)作inline聲明,只是程序設(shè)計(jì)者對(duì)編譯系統(tǒng)提出的一個(gè)建議,也就是說(shuō)它是建議性的,而不是指令性的,編譯系統(tǒng)會(huì)根據(jù)具體情況決定是否這樣做歸納起來(lái),只有那些規(guī)模較小而又被頻繁調(diào)用的簡(jiǎn)單函數(shù),才適合于聲明為inline函數(shù)。56課件制作5.6函數(shù)重載用同一函數(shù)名定義參數(shù)個(gè)數(shù)和參數(shù)類型不同多個(gè)函數(shù)稱為函數(shù)的重載(functionoverloading),即對(duì)一個(gè)函數(shù)名重新賦予它新的含義,使一個(gè)函數(shù)名可以多用函數(shù)重載的原因:使程序更為清晰易讀,完成相近任務(wù)的函數(shù)應(yīng)該設(shè)定為相同的名字int
fnMax
(inta,intb,intc);//求3個(gè)整數(shù)中的最大者floatfnMax(floata,floatb,floatc);//求3個(gè)單精度數(shù)中最大者int
fnMax(inta,intb);//求2個(gè)整數(shù)中的最大者int
fnMaxInt(int
a,intb,intc);//求3個(gè)整數(shù)中的最大者floatfnMaxFloat
(floata,floatb,floatc);//求3個(gè)單精度數(shù)中最大者int
fnMaxInt2(inta,intb);//求2個(gè)整數(shù)中的最大者57課件制作5.6函數(shù)重載#include<iostream>usingnamespacestd;/**Returnthemaxbetweentwointvalues*/int
max(intnum1,intnum2){if(num1>num2)returnnum1;elsereturnnum2;}/**Findthemaxbetweentwodoublevalues*/doublemax(doublenum1,doublenum2){if(num1>num2)returnnum1;elsereturnnum2;}58課件制作5.6函數(shù)重載/**Returnthemaxamongthreedoublevalues*/doublemax(doublenum1,doublenum2,doublenum3){returnmax(max(num1,num2),num3);}intmain(){//Invokethemaxfunctionwithintparameters
cout<<"Themaximumbetween3and4is"<<max(3,4)<<endl;//Invokethemaxfunctionwiththedoubleparameters
cout<<"Themaximumbetween3.0and5.4is"<<max(3.0,5.4)<<endl;//Invokethemaxfunctionwiththreedoubleparameters
cout<<"Themaximumbetween3.0,5.4,and10.14is"<<max(3.0,5.4,10.14)<<endl;return0;}59課件制作5.6函數(shù)重載函數(shù)重載的要求重載函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類型或參數(shù)順序三者中必須至少有一種不同,函數(shù)返回值類型可以相同也可以不同重載函數(shù)的參數(shù)個(gè)數(shù)不同重載函數(shù)參數(shù)類型不同重載函數(shù)參數(shù)順序不同返回值類型不同不是函數(shù)重載的依據(jù)在使用重載函數(shù)時(shí),同名函數(shù)的功能應(yīng)當(dāng)相同或相近,不要用同一函數(shù)名去實(shí)現(xiàn)完全不相干的功能,可讀性不好,容意誤解60課件制作5.6函數(shù)重載重載函數(shù)的調(diào)用規(guī)則對(duì)一個(gè)實(shí)際的函數(shù)調(diào)用,首先尋找一個(gè)參數(shù)完全匹配的函數(shù),若找到就調(diào)用它其次,試低一級(jí)的對(duì)函數(shù)的重載方法,例如通過(guò)類型轉(zhuǎn)換可產(chǎn)生參數(shù)匹配等,若找到就調(diào)用它函數(shù)重載的二義性對(duì)一個(gè)函數(shù)調(diào)用可能有兩個(gè)或更多的與之匹配的函數(shù)定義,編譯器無(wú)法確定哪個(gè)匹配更為精確二義調(diào)用會(huì)產(chǎn)生編譯錯(cuò)誤max(2,2.5);←doublemax(doublenum1,doublenum2);61課件制作5.6函數(shù)重載#include<iostream>usingnamespacestd;doublemaxNum(intnum1,doublenum2){if(num1>num2)returnnum1;elsereturnnum2;}doublemaxNum(doublenum1,intnum2){if(num1>num2)returnnum1;elsereturnnum2;}intmain(){
cout<<maxNum(1,2)<<endl;return0;}我該調(diào)用哪個(gè)函數(shù)呢?62課件制作5.7默認(rèn)參數(shù)的函數(shù)一般情況下,在函數(shù)調(diào)用時(shí)形參從實(shí)參那里取得值,實(shí)參的個(gè)數(shù)應(yīng)與形參相同多次用同樣的實(shí)參調(diào)用同一函數(shù)時(shí),C++支持給形參一個(gè)默認(rèn)值而不必每次再?gòu)膶?shí)參取值,該方法比較靈活,可以簡(jiǎn)化編程,提高運(yùn)行效率floatfnGetArea(floatr=6.5);//函數(shù)聲明調(diào)用時(shí)則可以不必給出實(shí)參的值,如:fnGetArea();//相當(dāng)于fnGetArea(6.5);如果不想使形參取此默認(rèn)值,則可以通過(guò)實(shí)參另行給出,如:fnGetArea(7.5);//形參得到的值為7.5,而不是6.563課件制作5.7默認(rèn)參數(shù)的函數(shù)求如下級(jí)數(shù)的部分和,精度為#include<iostream>#include<cmath>usingnamespacestd;doubles(doublex,doubleeps=1e-6){
intn=1;doubles=0.0,t=1.0;while(fabs(t)>=eps){s=s+t;t=t*x/n;n++;}returns;}intmain(){
cout<<"s1="<<s(2.0)<<endl;
cout<<"s2="<<s(3.0)<<endl;
cout<<"s3="<<s(1.0,1e-5)<<endl;return0;}參數(shù)eps取1e-5參數(shù)eps取默認(rèn)值1e-664課件制作5.7默認(rèn)參數(shù)的函數(shù)如果有多個(gè)形參,可以使每個(gè)形參有一個(gè)默認(rèn)值,也可以只對(duì)一部分形參指定默認(rèn)值,另一部分形參不指定默認(rèn)值實(shí)參與形參的結(jié)合是從左至右順序進(jìn)行的,指定默認(rèn)值的參數(shù)必須放在形參表列中的最右端,否則出錯(cuò)voidf1(floata,intc,intb=0,chard='a');//正確voidf2(floata,intb=0,intc,chard='a');//錯(cuò)誤如果調(diào)用上面的f1函數(shù),可以采取下面的形式:f1(3.5,5,3,'x')//形參的值全部從實(shí)參得到f1(3.5,5,3)//最后一個(gè)形參的值取默認(rèn)值'a'f1(3.5,5)//最后兩個(gè)形參的值取默認(rèn)值,b=0,d='a'65課件制作5.7默認(rèn)參數(shù)的函數(shù)在調(diào)用有默認(rèn)參數(shù)的函數(shù)時(shí),實(shí)參的個(gè)數(shù)可以與形參的個(gè)數(shù)不同,實(shí)參未給定的,從形參的默認(rèn)值得到值在使用帶有默認(rèn)參數(shù)的函數(shù)時(shí)要注意如果函數(shù)的定義在函數(shù)調(diào)用之前,則應(yīng)在函數(shù)定義中給出默認(rèn)值;如果函數(shù)的定義在函數(shù)調(diào)用之后,則在函數(shù)調(diào)用之前需要有函數(shù)聲明,此時(shí)必須在函數(shù)聲明中給出默認(rèn)值,在函數(shù)定義時(shí)可以不給出默認(rèn)值一個(gè)函數(shù)不能既作為重載函數(shù),又作為有默認(rèn)參數(shù)的函數(shù)。當(dāng)調(diào)用函數(shù)時(shí)如果少寫一個(gè)參數(shù),系統(tǒng)無(wú)法判定是利用重載函數(shù)還是利用默認(rèn)參數(shù)的函數(shù),出現(xiàn)二義性,系統(tǒng)無(wú)法執(zhí)行。66課件制作5.8函數(shù)的嵌套調(diào)用C++可以嵌套調(diào)用函數(shù),即在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù)C++不允許對(duì)函數(shù)作嵌套定義,即在一個(gè)函數(shù)中不能完整地包含另一個(gè)函數(shù)。在一個(gè)程序中每一個(gè)函數(shù)的定義都是互相平行和獨(dú)立的67課件制作5.8函數(shù)的嵌套調(diào)用輸入兩個(gè)整數(shù),求平方和#include<iostream>usingnamespacestd;intmain(){
intfun1(intx,inty);
int
a,b;
cin>>a>>b;
cout<<"a、b的平方和:"<<fun1(a,b)<<endl;return0;}intfun1(intx,inty){
intfun2(intm);return(fun2(x)+fun2(y));}intfun2(intm){return(m*m);}//運(yùn)行結(jié)果:
34a、b的平方和:25函數(shù)fun1中調(diào)用函數(shù)fun268課件制作5.9函數(shù)的遞歸調(diào)用實(shí)例:有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲?他說(shuō)比第4個(gè)人大兩歲;問(wèn)第4個(gè)人歲數(shù),他說(shuō)比第3個(gè)人大兩歲;問(wèn)第3個(gè)人,又說(shuō)比第2個(gè)人大兩歲;問(wèn)第2個(gè)人,說(shuō)比第1個(gè)人大兩歲;最后問(wèn)第1個(gè)人,他說(shuō)是10歲。請(qǐng)問(wèn)第5個(gè)人多大?每一個(gè)人的年齡都比其前1個(gè)人的年齡大兩歲。即age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10可以用式子表述如下:age(n)=10(n=1)age(n)=age(n-1)+2(n>1)69課件制作5.9函數(shù)的遞歸調(diào)用可以看到,當(dāng)n>1時(shí),求第n個(gè)人的年齡的公式是相同的,因此可以用一個(gè)函數(shù)表示上述關(guān)系70課件制作5.9函數(shù)的遞歸調(diào)用在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸(recursive)調(diào)用,C++允許函數(shù)的遞歸調(diào)用//求年齡的遞歸函數(shù)int
fnAge(intn){
intc;//用c作為存放年齡的變量
if(n==1)//當(dāng)n=1時(shí),年齡為10c=10;else//當(dāng)n>1時(shí),此人年齡是他前一個(gè)人的年齡加2c=fnAge(n-1)+2;returnc;//將年齡值帶回主函數(shù)}71課件制作5.9函數(shù)的遞歸調(diào)用#include<iostream>usingnamespacestd;int
fnAge(int);//函數(shù)聲明intmain()//主函數(shù)
{
cout<<fnAge(5)<<endl;return0;}//求年齡的遞歸函數(shù)int
fnAge(intn){
intc;//用c作為存放年齡的變量
if(n==1)//當(dāng)n=1時(shí),年齡為10c=10;else//當(dāng)n>1時(shí),此人年齡是他前一個(gè)人的年齡加2c=fnAge(n-1)+2;returnc;//將年齡值帶回主函數(shù)}運(yùn)行結(jié)果如下:18age(5)
age(4)+2
age(3)+2
age(2)+2
age(1)+21072課件制作5.9函數(shù)的遞歸調(diào)用程序中不應(yīng)出現(xiàn)無(wú)終止的遞歸調(diào)用,而只應(yīng)出現(xiàn)有限次數(shù)的、有終止的遞歸調(diào)用;通常用if語(yǔ)句來(lái)控制,只有在某一條件成立時(shí)才繼續(xù)執(zhí)行遞歸調(diào)用,否則就不再繼續(xù)73課件制作5.9函數(shù)的遞歸調(diào)用
CH5:用遞歸方法求n!求n!可以用遞推方法,即從1開(kāi)始,乘2,再乘3……一直乘到n;也可以用遞歸方法,即5!=5×4!,而4!=4×3!,…,1!=1,可用下面的遞歸公式表示://Returnthefactorialforaspecifiedindexint
factorial(intn){if(n==1)//Basecasereturn1;elsereturnn*factorial(n-1);//Recursivecall}//Returnthefactorialforaspecifiedindexint
factorial(intn){
int
i,fac=1;
for(i=1;i<=n,i++)
fac=fac*i;returnfac;}74課件制作5.9函數(shù)的遞歸調(diào)用#include<iostream>usingnamespacestd;intmain(){//Prompttheusertoenteraninteger
cout<<"Pleaseenteranon-negativeinteger:";
intn;
cin>>n;//Displayfactorial
cout<<"Factorialof"<<n<<"is"<<factorial(n);return0;}//運(yùn)行情況如下:pleaseinputaninteger:10↙
10!=362880075課件制作factorial(3)factorial(0)=1;factorial(n)=n*factorial(n-1);ComputingFactorial5.9函數(shù)的遞歸調(diào)用76課件制作factorial(3)=3*factorial(2)
ComputingFactorialfactorial(0)=1;factorial(n)=n*factorial(n-1);5.9函數(shù)的遞歸調(diào)用77課件制作factorial(3)=3*factorial(2)=3*(2*factorial(1))5.9函數(shù)的遞歸調(diào)用factorial(0)=1;factorial(n)=n*factorial(n-1);ComputingFactorial78課件制作factorial(3)=3*factorial(2)=3*(2*factorial(1))=3*(2*(1*factorial(0)))
factorial(0)=1;factorial(n)=n*factorial(n-1);5.9函數(shù)的遞歸調(diào)用ComputingFactorial79課件制作factorial(3)=3*factorial(2)=3*(2*factorial(1))=3*(2*(1*factorial(0)))=3*(2*(1*1)))
factorial(0)=1;factorial(n)=n*factorial(n-1);5.9函數(shù)的遞歸調(diào)用ComputingFactorial80課件制作factorial(3)=3*factorial(2)=3*(2*factorial(1))=3*(2*(1*factorial(0)))=3*(2*(1*1)))=3*(2*1)factorial(0)=1;factorial(n)=n*factorial(n-1);5.9函數(shù)的遞歸調(diào)用ComputingFactorial81課件制作factorial(3)=3*factorial(2)=3*(2*factorial(1))=3*(2*(1*factorial(0)))=3*(2*(1*1)))=3*(2*1)=3*2factorial(0)=1;factorial(n)=n*factorial(n-1);5.9函數(shù)的遞歸調(diào)用ComputingFactorial82課件制作factorial(3)=3*factorial(2)=3*(2*factorial(1))=3*(2*(1*factorial(0)))=3*(2*(1*1)))=3*(2*1)=3*2=6factorial(0)=1;factorial(n)=n*factorial(n-1);5.9函數(shù)的遞歸調(diào)用ComputingFactorial83課件制作Executesfactorial(4)TraceRecursivefactorial5.9函數(shù)的遞歸調(diào)用factorial(4)mainmethodStack84課件制作Executesfactorial(3)TraceRecursivefactorial5.9函數(shù)的遞歸調(diào)用
factorial(4)
return4*factorial(3)
Step0:executesfactorial(4)
85課件制作5.9函數(shù)的遞歸調(diào)用TraceRecursivefactorial
Executesfactorial(2)factorial(4)
return4*factorial(3)
return3*factorial(2)
Step0:executesfactorial(4)
Step1:executes
factorial(3)
86課件制作Executesfactorial(1)5.9函數(shù)的遞歸調(diào)用TraceRecursivefactorial87課件制作Executesfactorial(0)5.9函數(shù)的遞歸調(diào)用TraceRecursivefactorial88課件制作returns15.9函數(shù)的遞歸調(diào)用TraceRecursivefactorial89課件制作returnsfactorial(0)5.9函數(shù)的遞歸調(diào)用TraceRecursivefactorial90課件制作returnsfactorial(1)5.9函數(shù)的遞歸調(diào)用TraceRecursivefactorial91課件制作returnsfactorial(2)5.9函數(shù)的遞歸調(diào)用TraceRecursivefactorial92課件制作returnsfactorial(3)5.9函數(shù)的遞歸調(diào)用TraceRecursivefactorial93課件制作returnsfactorial(4)5.9函數(shù)的遞歸調(diào)用TraceRecursivefactorial94課件制作factorial(4)StackTrace5.9函數(shù)的遞歸調(diào)用95課件制作5.9函數(shù)的遞歸調(diào)用CH5_11漢諾塔問(wèn)題:傳說(shuō)索羅門廟里有一個(gè)塔臺(tái),臺(tái)上有3根標(biāo)號(hào)為A,B,C的用鉆石做成的柱子,在A柱子上放著64個(gè)金盤,每一個(gè)都比下面的略小一些,把A柱子上的金盤子全部移到C柱上的那一天就是世界末日。移動(dòng)的條件是:一次只能移動(dòng)一個(gè)金盤,移動(dòng)過(guò)程中大金盤不能放在小金盤上面。廟里的僧人一直在移個(gè)不停,因?yàn)槿康囊苿?dòng)是264-1次,如果每秒移動(dòng)一次的話需要500億年ABC12396課件制作5.9函數(shù)的遞歸調(diào)用Hanoi塔問(wèn)題的規(guī)格化描述有n個(gè)盤子,標(biāo)號(hào)分別為1,2,3,…,n;有3個(gè)塔,標(biāo)記為A,B,C任何時(shí)候,都不允許較大的盤子放在較小的盤子之上初始時(shí),所有盤子都在A塔上每個(gè)步驟只能移動(dòng)一個(gè)盤子,且只能移動(dòng)某個(gè)塔上最上面的盤子97課件制作5.9函數(shù)的遞歸調(diào)用Hanoi塔問(wèn)題的解n==1A→Bn>1將上面n-1個(gè)盤子執(zhí)行A→C,B作為輔助將最下面n號(hào)盤子執(zhí)行A→B將n-1個(gè)盤子執(zhí)行C→B,A作為輔助98課件制作5.9函數(shù)的遞歸調(diào)用#include<iostream>usingnamespacestd;/*ThefunctionforfindingthesolutiontomovendisksfromfromTowertotoTowerwithauxTower*/voidmoveDisks(intn,charfromTower,chartoTower,charauxTower){if(n==1)//Stoppingcondition
cout<<"Movedisk"<<n<<"from"<<fromTower<<"to"<<toTower<<endl;else{
moveDisks(n-1,fromTower,auxTower,toTower);
cout<<"Movedisk"<<n<<"from"<<fromTower<<"to"<<toTower<<endl;
moveDisks(n-1,auxTower,toTower,fromTower);}}99課件制作5.9函數(shù)的遞歸調(diào)用intmain(){//Readnumberofdisks,n
cout<<"Enternumberofdisks:";
intn;
cin>>n;//Findthesolutionrecursively
cout<<"Themovesare:"<<endl;
moveDisks(n,'A','B','C');return0;}100課件制作5.9函數(shù)的遞歸調(diào)用101課件制作5.9函數(shù)的遞歸調(diào)用遞歸函數(shù)的特性函數(shù)都使用if-els
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 妊娠期外陰陰道炎的復(fù)發(fā)預(yù)防策略與效果評(píng)價(jià)的系統(tǒng)綜述
- 病理學(xué)考試題褲及答案
- 妊娠ITP合并自身免疫病的診療策略
- 女職工職業(yè)相關(guān)婦科疾病預(yù)防策略
- 多重耐藥菌感染的防控策略與實(shí)踐
- 多藥耐藥腫瘤的質(zhì)子治療精準(zhǔn)調(diào)控策略
- 化工制圖技術(shù)考試及答案
- 2025年高職室內(nèi)藝術(shù)設(shè)計(jì)(室內(nèi)軟裝設(shè)計(jì))試題及答案
- 2025年大學(xué)大三(高級(jí)財(cái)務(wù)會(huì)計(jì))外幣業(yè)務(wù)處理綜合測(cè)試試題及答案
- 2025年大學(xué)生態(tài)學(xué)(水土保持生態(tài)學(xué))試題及答案
- 物資、百貨、五金采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 2024年安防電子市場(chǎng)洞察報(bào)告
- 3D打印技術(shù)合同
- 期末專題復(fù)習(xí):09-語(yǔ)法、對(duì)聯(lián)課件 統(tǒng)編版語(yǔ)文七年級(jí)上冊(cè)
- 棒壘球課教案(完美版)
- 注塑拌料作業(yè)指引 配料作業(yè)指導(dǎo)書全套
- Jira工具操作手冊(cè)
- DL/T 5097-2014 火力發(fā)電廠貯灰場(chǎng)巖土工程勘測(cè)技術(shù)規(guī)程
- 能源費(fèi)用托管型合同能源管理項(xiàng)目
- 地基釬探記錄(示范表格)
- 山西焦煤集團(tuán)正仁煤業(yè)有限公司礦產(chǎn)資源開(kāi)發(fā)利用、地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
評(píng)論
0/150
提交評(píng)論