版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
高級語言程序設(shè)計C++張海威南開大學信息技術(shù)科學學院第5章函數(shù)與重載函數(shù)的說明與使用1函數(shù)的嵌套與遞歸2函數(shù)與運算符重載3函數(shù)與C++程序結(jié)構(gòu)42Database&InformationSystemLab函數(shù)的使用與說明【例5.1】求三次方程的根。計算三次方程x3+px+q=0的一個實根的公式為Database&InformationSystemLab3xr=將計算公式分解為如下步驟令實數(shù)xr=A+B令實數(shù)A,B分別為實數(shù)R,S的立方根令R=-q/2+a,S=-q/2-a令a=sqrt((q/2)*(q/2)+(q/3)*(q/3)*(q/3))函數(shù)的使用與說明程序設(shè)計步驟輸入方程的參數(shù)p和q,輸出方程計算變量a的值計算變量R和變量S的值計算變量A和變量B的值分別對R和S求三次方根求y的三次方根的迭代公式計算Xr的值Database&InformationSystemLab4函數(shù)的使用與說明程序代碼Database&InformationSystemLab5#include<iostream>//program5-1#include<cmath>//usefunctionsqrtusingnamespace
std;voidmain(void){
floatp,q,xr; cout<<″Inputparameters:p=″;
cin>>P;
cout<<″Inputparameters:q=″; cin>>q;
cout<<"TheEquationis:"; cout<<"x3+"<<p<<"x+"<<q<<"=0"<<endl;
floata=sqrt((q/2)*(q/2)+(q/3)*(q/3)*(q/3));
float
R,S,A,B;
constfloat
eps=1e-6;//設(shè)置精確度
R=-q/2+a;
S=-q/2-a;函數(shù)的使用和說明Database&InformationSystemLab6
float
root,croot=R;
do{
root=croot;
croot=(2*root+R/(root*root))/3;
}while(fabs(croot-root)>eps);
A=croot;
croot=S;
do{
root=croot;
croot=(2*root+S/(root*root))/3;
}while(fabs(croot-root)>eps);
B=croot; xr
=A+B; cout<<endl<<″Therealrootoftheequationis″<<xr;}函數(shù)的使用和說明程序分析程序中包含兩段類似的代碼,完成相同的功能:Database&InformationSystemLab7float
root,croot=R;do{ root=croot;
croot=(2*root+R/(root*root))/3;}while(fabs(croot-root)>eps);A=croot;croot=S;do{
root=croot;
croot=(2*root+S/(root*root))/3;}while(fabs(croot-root)>eps);B=croot;函數(shù)的使用和說明函數(shù)的引入程序中功能相同,結(jié)構(gòu)相似的代碼段可以用函數(shù)進行描述程序的功能相對獨立,用來解決某個問題具有明顯的入口和出口入口:參數(shù)出口:返回值Database&InformationSystemLab8函數(shù)的使用和說明Database&InformationSystemLab9函數(shù)的使用和說明聲明函數(shù)cuberoot參數(shù)為待求根的變量函數(shù)cuberoot的定義如下:Database&InformationSystemLab10floatcuberoot(floatx){//精確到小數(shù)點后6位
floatroot,croot;
constfloateps=1e-6; croot=x;
do{
root=croot;
croot=(2*root+x/(root*root))/3;
}while(fabs(croot-root)>eps);
returncroot;}函數(shù)的使用和說明函數(shù)的作用實現(xiàn)程序功能的模塊化實現(xiàn)程序結(jié)構(gòu)的簡化實現(xiàn)程序代碼的重用函數(shù)的應(yīng)用場景包含多處功能相同的代碼處理數(shù)據(jù)的類型、處理過程相同或相似代碼段具有代表性或特殊含義Database&InformationSystemLab11函數(shù)的使用和說明用函數(shù)的思想實現(xiàn)最簡單的C++程序Database&InformationSystemLab12#inlcude<iostream>usingnamespacestd;voidprintString();//函數(shù)原型intmain(){printString();//調(diào)用函數(shù)printString
return0;}voidpirntString(){//函數(shù)定義cout<<“Hello!”<<endl;
return;//函數(shù)返回}函數(shù)的說明與使用函數(shù)的使用步驟先說明,后調(diào)用程序中必須包含函數(shù)的說明及定義函數(shù)的說明方式函數(shù)原型函數(shù)定義可以出現(xiàn)在程序的任何合適的地方函數(shù)定義函數(shù)定義必須出現(xiàn)在調(diào)用函數(shù)之前Database&InformationSystemLab13從函數(shù)形式劃分,可分為無參函數(shù)與有參函數(shù)兩類從使用角度劃分,可將函數(shù)分為:系統(tǒng)預(yù)定義的標準庫函數(shù)(如,sin,abs等),以及由用戶自定義的函數(shù)函數(shù)分類方法14Database&InformationSystemLab函數(shù)的說明與使用函數(shù)的說明與使用標準庫函數(shù)程序中可直接使用(調(diào)用)系統(tǒng)預(yù)定義的標準庫函數(shù),但要求在調(diào)用前使用編譯預(yù)處理指令include將對應(yīng)的頭文件包含進來用戶自定義函數(shù)由用戶自定義的函數(shù)與系統(tǒng)預(yù)定義的標準庫函數(shù)的不同點在于,自定義函數(shù)的函數(shù)名、參數(shù)個數(shù)、函數(shù)返回值類型以及函數(shù)所實現(xiàn)的功能等都完全由用戶程序來規(guī)定(指定)Database&InformationSystemLab15函數(shù)的說明與使用標準庫函數(shù)標準輸入輸出流標準文件流標準字符串類標準數(shù)學函數(shù)Database&InformationSystemLab16函數(shù)的說明與使用用戶自定義函數(shù)普通函數(shù)內(nèi)聯(lián)函數(shù)類的成員函數(shù)類的友元函數(shù)虛函數(shù)……Database&InformationSystemLab17函數(shù)的說明與使用無參函數(shù)調(diào)用它們時不需要提供實際參數(shù)函數(shù)原型的一般形式<返回值類型><函數(shù)名>();函數(shù)定義的一般形式<返回值類型><函數(shù)名>(){<函數(shù)體>}通常用來實現(xiàn)某種特定的功能不需要進行數(shù)據(jù)的傳遞處理的數(shù)據(jù)通常與主調(diào)函數(shù)無關(guān)Database&InformationSystemLab18函數(shù)的說明與使用無參函數(shù)【例5.2】定義一個函數(shù),實現(xiàn)打印10個“*”的功能Database&InformationSystemLab19voidprintStar(){
for(inti=0;i<10;i++) cout<<“*”;cout<<endl;}
函數(shù)的說明與使用有參函數(shù)(有參數(shù)的用戶自定義函數(shù))進行調(diào)用時,必須提供所需個數(shù)的且具有相匹配數(shù)據(jù)類型的實際參數(shù)定義的一般形式<函數(shù)類型><函數(shù)名>(<以逗號分割的形參類型及名字表>){<函數(shù)體>}通過調(diào)用處提供的不同實參值來計算出其對應(yīng)的函數(shù)值、或?qū)崿F(xiàn)某種與傳遞過來的那些不同值有關(guān)的某種功能。Database&InformationSystemLab20函數(shù)的說明與使用有參函數(shù)【例5.3】定義一個函數(shù),控制輸出“*”的個數(shù)Database&InformationSystemLab21voidprintStar(intk){
for(inti=0;i<k;i++) cout<<“*”;cout<<endl;}
函數(shù)的使用調(diào)用說明與定義參數(shù)重載返回內(nèi)聯(lián)函數(shù)22Database&InformationSystemLab函數(shù)的說明與使用函數(shù)的說明與使用Database&InformationSystemLab23函數(shù)的說明與使用函數(shù)的說明和定義在C++程序中,函數(shù)有兩種說明方式函數(shù)原型在調(diào)用函數(shù)之前說明函數(shù)原型函數(shù)定義在調(diào)用函數(shù)之前對函數(shù)進行定義Database&InformationSystemLab24函數(shù)的說明與使用函數(shù)原型也稱為函數(shù)聲明用來指明函數(shù)的名稱、參數(shù)以及返回值類型函數(shù)原型格式為:[<屬性說明>]<返回值類型><函數(shù)名>([<參數(shù)表>]);例如intadd(inta,intb);inlinevoidswap(float&s,float&t);voidprint(char*);Database&InformationSystemLab25函數(shù)的說明與使用函數(shù)原型屬性說明:可缺省,一般可以是下面的關(guān)鍵字之一inline:表示該函數(shù)為內(nèi)聯(lián)函數(shù)static:表示該函數(shù)為靜態(tài)函數(shù)virtual:表示該函數(shù)為虛函數(shù)friend:表示該函數(shù)為某類(class)的友元函數(shù)返回值類型函數(shù)處理得到的結(jié)果的類型函數(shù)名標識符Database&InformationSystemLab26函數(shù)的說明與使用函數(shù)原型參數(shù)表空參數(shù)表voidprintroot();void型參數(shù)voidprintroot(void);<數(shù)據(jù)類型>[<參數(shù)>][,<數(shù)據(jù)類型>[<參數(shù)>]]*
floatcuberoot(float);floatcuberoot(floatx);Database&InformationSystemLab27函數(shù)的說明與使用函數(shù)定義函數(shù)定義與函數(shù)原型的主要區(qū)別是它還包括函數(shù)體,其格式為[<屬性說明>]<返回值類型><函數(shù)名>([<參數(shù)表>]){<函數(shù)體>}函數(shù)體復(fù)合語句即程序塊,由完成函數(shù)功能所需的全部語句構(gòu)成Database&InformationSystemLab28函數(shù)的說明與使用函數(shù)的說明和定義“函數(shù)原型”的說明方式“函數(shù)定義”的說明方式Database&InformationSystemLab29#include……usingnamespacestd;voidprintStar(int);//函數(shù)原型intmain(){printStar(10);}//調(diào)用函數(shù)voidprintStar(intk){}//函數(shù)定義#include……usingnamespacestd;voidprintStar(intk){}//函數(shù)定義intmain(){printStar(10);}//調(diào)用函數(shù)函數(shù)的說明與使用函數(shù)的說明和定義兩種說明方式的區(qū)別函數(shù)原型的參數(shù)表中,參數(shù)名可以省略;函數(shù)定義的參數(shù)表中,必須給出參數(shù)名(省略參數(shù)名為無名參數(shù))函數(shù)原型的函數(shù)體,可以出現(xiàn)在函數(shù)調(diào)用之后;函數(shù)定義的函數(shù)體,必須出現(xiàn)在調(diào)用之前函數(shù)原型的參數(shù)表后面加分號“;”,函數(shù)定義的參數(shù)表后面是函數(shù)體,即花括號“{”函數(shù)定義不能出現(xiàn)在任何函數(shù)體中,函數(shù)原型可以出現(xiàn)在其它函數(shù)體中Database&InformationSystemLab30函數(shù)的說明與使用函數(shù)的調(diào)用函數(shù)調(diào)用是已定義函數(shù)的一次實際運行,與某類型的一個變量和后文中某類的一個對象類似,函數(shù)調(diào)用是函數(shù)定義的一個“實例”在C++程序中,除main函數(shù)外,其它任一函數(shù)的執(zhí)行都是通過在main函數(shù)中直接或間接地調(diào)用該函數(shù)而引發(fā)的。調(diào)用一個函數(shù)就是去執(zhí)行該函數(shù)之函數(shù)體的過程Database&InformationSystemLab31函數(shù)的說明與使用函數(shù)的調(diào)用函數(shù)調(diào)用過程Database&InformationSystemLab32函數(shù)的說明與使用函數(shù)的調(diào)用函數(shù)調(diào)用的執(zhí)行順序根據(jù)調(diào)用語句中的函數(shù)名在整個程序中搜索同名函數(shù)定義;對實參數(shù)的參數(shù)個數(shù),類型,順序進行核對,判定是否與函數(shù)定義中的形參表對應(yīng)一致根據(jù)參數(shù)的類型(值參數(shù)或引用參數(shù))進行值參數(shù)的值傳遞或引用參數(shù)的換名運行函數(shù)體代碼返回調(diào)用點,并返回所要求的函數(shù)值Database&InformationSystemLab33函數(shù)的說明與使用函數(shù)的調(diào)用無參函數(shù)調(diào)用格式<函數(shù)名>()例如:printStar();
有參函數(shù)調(diào)用格式<函數(shù)名>(<以逗號分割的實參表>)例如:printStar(26);Database&InformationSystemLab34函數(shù)的說明與使用函數(shù)的返回函數(shù)的返回表示函數(shù)執(zhí)行結(jié)束,將執(zhí)行結(jié)果(無論是否有具體的數(shù)據(jù))返回到調(diào)用函數(shù)的地方函數(shù)返回時完成的任務(wù)把運行控制從函數(shù)體返回到函數(shù)調(diào)用點根據(jù)返回值要求,返回所需要的數(shù)據(jù)值返回值類型void數(shù)值型引用類型Database&InformationSystemLab35函數(shù)的說明與使用函數(shù)的返回返回值類型空型(void)如果函數(shù)無值返回,應(yīng)說明為void類型。未作類型說明的函數(shù),系統(tǒng)認為是int類型函數(shù),應(yīng)返回一整型值值型:返回一個具有類型的值,包括int、float、char、bool等當函數(shù)要返回的值不止一個時,情況比較復(fù)雜,一般它可以以結(jié)構(gòu)或類的形式,也可以以結(jié)構(gòu),數(shù)組或?qū)ο笾羔橆愋头绞綄崿F(xiàn),這樣的實例在后面的章節(jié)可以見到引用類型:詳見第6章Database&InformationSystemLab36函數(shù)的說明與使用函數(shù)的返回函數(shù)返回用return語句表示return語句有如下幾種寫法return;//函數(shù)返回值類型為空(void)return<表達式>;//與函數(shù)返回值的類型一致return
(<表達式>);//與前一種寫法等價Database&InformationSystemLab37第一種格式的return用于立即從被調(diào)函數(shù)中返回,當函數(shù)類型為void時,應(yīng)使用這種格式的返回語句。當函數(shù)類型為非void型時,應(yīng)使用第二或第三種格式的return語句,此兩種格式的語句效果完全相同(可將第二種格式看成是第三種格式的省略形式),系統(tǒng)此時都將計算出表達式的值,并“攜帶”該值立即從被調(diào)函數(shù)中返回函數(shù)的說明與使用函數(shù)應(yīng)用舉例【例5.4】設(shè)f(x)=(x*x+x+1)/2-5.5求z=(f(2.5)+2*f(6))/f(4.3),并顯示結(jié)果z。對任意輸入的一個實數(shù)a,求出f(a)并顯示分析:輸入(參數(shù)):x輸出(返回):函數(shù)的運算結(jié)果函數(shù)原型:doublef(double);Database&InformationSystemLab38函數(shù)的說明與使用函數(shù)應(yīng)用舉例【例5.4】函數(shù)定義
doublef(doublex){
doubley; y=(x*x+x+1)/2-5.5;
returny;
//對非void類型的函數(shù),必須有一個//return語句,由它返回函數(shù)值
}
Database&InformationSystemLab39函數(shù)的說明與使用函數(shù)應(yīng)用舉例【例5.4】程序#include<iostream>usingnamespacestd;doublef(double);intmain(){
doublez,a; z=(f(2.5)+2*f(6))/f(4.3);//調(diào)用自定義函數(shù)f cout<<"z="<<z<<endl; cout<<"Inputa="; //提示用戶輸入
cin>>a; cout<<"f(a)="<<f(a)<<endl;//算出f(a)并輸出
return0;} doublef(doublex){……}//函數(shù)f的定義Database&InformationSystemLab40函數(shù)的說明與使用函數(shù)應(yīng)用舉例【例5.4】程序(不帶函數(shù)原型)#include<iostream>usingnamespacestd;doublef(doublex){……}//函數(shù)f的定義intmain(){
doublez,a; z=(f(2.5)+2*f(6))/f(4.3);//調(diào)用自定義函數(shù)f cout<<"z="<<z<<endl; cout<<"Inputa="; //提示用戶輸入
cin>>a; cout<<"f(a)="<<f(a)<<endl;//算出f(a)并輸出
return0;} Database&InformationSystemLab41函數(shù)的說明與使用函數(shù)應(yīng)用舉例【例5.4】點評f()函數(shù)體內(nèi)的3行也可用如下的一行來代替
return((x*x+x+1)/2-5.5);return句括號內(nèi)表達式的值,即為整個函數(shù)的返回值。return句也可使用另一格式,即可以不括起表達式:
return(x*x+x+1)/2-5.5;//OK!Database&InformationSystemLab42①
f=(x*x+x+1)/2-5.5;
不可給函數(shù)名f賦值。②
return(f);
返回值類型應(yīng)該是double,而非指針類型(函數(shù)名相當于一個指針)。③
f(x)=(x*x+x+1)/2-5.5;
賦值號左端非變量(也即f(x)非左值)。
函數(shù)的說明與使用函數(shù)的參數(shù)C++語言的函數(shù)分為無參函數(shù)和有參函數(shù)函數(shù)的參數(shù)無參數(shù)一個參數(shù)多個參數(shù)函數(shù)參數(shù)表的寫法一般寫法省略參數(shù)名(無名參數(shù))參數(shù)賦初值Database&InformationSystemLab43函數(shù)的說明與使用函數(shù)的參數(shù)形參和實參函數(shù)說明中的參數(shù)稱為形式參數(shù)(形參),函數(shù)調(diào)用中的參數(shù)稱為實際參數(shù)(實參)實參表在參數(shù)個數(shù)、參數(shù)順序、以及參數(shù)類型等方面要與被調(diào)函數(shù)的形參表之間有一個一一對應(yīng)的相互匹配關(guān)系編譯器將根據(jù)參數(shù)的順序,來逐一實現(xiàn)實參與對應(yīng)形參的“結(jié)合”,而后執(zhí)行一遍函數(shù)體(而完成本次的函數(shù)調(diào)用)Database&InformationSystemLab44函數(shù)的說明與使用函數(shù)的參數(shù)無名參數(shù)函數(shù)定義中,只有類型,沒有名稱的參數(shù) intf(inta,intb){returna+b*b;} intf(inta,intb,int){returna*a+b;}兩個不同的函數(shù)同名,但由于第二個函數(shù)包含一無名參數(shù),使得在調(diào)用時能夠被區(qū)分,f(x,y)是第一個函數(shù)的調(diào)用,f(x,y,0)是第二個函數(shù)的調(diào)用Database&InformationSystemLab45函數(shù)的說明與使用函數(shù)的參數(shù)可缺省參數(shù)(參數(shù)的默認值)允許在函數(shù)定義處為其中最后面的連續(xù)若干個參數(shù)設(shè)置默認值(也稱缺省值)若調(diào)用處缺省了某個或某些實參的情況下,系統(tǒng)將自動使用那些在函數(shù)定義處給定的參數(shù)默認值例如,在定義函數(shù)func時為其最后三個參數(shù)設(shè)置默認值:Database&InformationSystemLab46#include<iostream>usingnamespacestd;voidfunc(inta=11,intb=22,intc=33){
//為參數(shù)a、b、c設(shè)置了默認值11、22與33
cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;}函數(shù)的說明與使用Database&InformationSystemLab47intmain(){func();//調(diào)用時缺省了3個實參,將使用 //定義處給定的那3個相對應(yīng)的參數(shù)默認值
func(55);//調(diào)用時缺省了后2個實參,將使用 //定義處給定的那后2個對應(yīng)參數(shù)默認值
func(77,99);//調(diào)用時缺省了最后1個實參,將使用 //定義處給定的那最后1個參數(shù)默認值
func(8,88,888);//調(diào)用時沒缺省任一個實參, //系統(tǒng)將不使用定義處給定的任一個參數(shù)默認值 return0;}函數(shù)的說明與使用運行結(jié)果:a=11,b=22,c=33a=55,b=22,c=33a=77,b=99,c=33a=8,b=88,c=888Database&InformationSystemLab48函數(shù)的說明與使用函數(shù)的參數(shù)可缺省參數(shù)(參數(shù)的默認值)只能為函數(shù)最后面的連續(xù)若干個參數(shù)設(shè)置默認值,且在調(diào)用處也只能缺省后面的連續(xù)若干個實參例如:Database&InformationSystemLab49voidfunc(inta,intb=2,intc=3);
//OK!voidfunc(inta=1,intb,intc=3);
//ERROR!
對第一個函數(shù)說明,采用如下的調(diào)用語句:
func(1,22,333);
//OK!調(diào)用時給出所有實參
func();
//ERROR!參數(shù)a沒有默認值
func(10,20);
//OK!參數(shù)c默認為3
func(5,,9);//ERROR!調(diào)用處也只能缺省后面的連續(xù)若干個實參
函數(shù)的說明與使用函數(shù)調(diào)用過程中參數(shù)的傳遞一般傳遞過程(賦值傳遞)發(fā)生函數(shù)調(diào)用,轉(zhuǎn)到函數(shù)體執(zhí)行根據(jù)函數(shù)的形參,分配內(nèi)存空間將實參賦值給形參,即為形參分配的存儲空間賦值,此時實參在函數(shù)體內(nèi)失效,形參有效函數(shù)執(zhí)行完畢,返回到主調(diào)函數(shù),形參所占的空間自動回收,形參失效Database&InformationSystemLab50函數(shù)的說明與使用函數(shù)調(diào)用過程中參數(shù)的傳遞按地址傳遞過程發(fā)生函數(shù)調(diào)用,轉(zhuǎn)到函數(shù)體執(zhí)行根據(jù)代表地址的參數(shù),在以該參數(shù)為首地址的空間中進行各種處理函數(shù)執(zhí)行完畢,無論是否有返回值,函數(shù)體對內(nèi)存空間進行的修改將保留,對主調(diào)函數(shù)仍然有效Database&InformationSystemLab51函數(shù)的說明與使用函數(shù)的參數(shù)能夠作為函數(shù)參數(shù)的數(shù)據(jù)類型基本類型及其派生類型賦值參數(shù)傳遞數(shù)組、指針、引用等導出類型、按地址傳遞參數(shù)類類型、結(jié)構(gòu)類型、聯(lián)合類型等用戶定義類型賦值參數(shù)傳遞按地址參數(shù)傳遞Database&InformationSystemLab52函數(shù)的說明與使用函數(shù)的參數(shù)一維數(shù)組作為函數(shù)的參數(shù),數(shù)組大小可以指定,也可以不指定,但是多維數(shù)組除了第一維之外,其它維的大小必須指定函數(shù)原型intsearchArray(int[],int);intsearchArray(int[10],int);函數(shù)定義intsearchArray(inta[],intb){//寫為a[10]也可以
returna[b];}Database&InformationSystemLab53函數(shù)的說明與使用函數(shù)的參數(shù)多維數(shù)組(以二維數(shù)組為例)作為函數(shù)的參數(shù),參數(shù)表的數(shù)組參數(shù)可以寫為inta[][10]inta[10][10]
但不可以寫為:inta[][];inta[20][];一維數(shù)組以及多維數(shù)組的第一維大小,形參、實參可以不對應(yīng)實參為a[10],形參可以定義為x[6]Database&InformationSystemLab54函數(shù)的說明與使用函數(shù)的參數(shù)數(shù)組作為函數(shù)參數(shù),是將實參數(shù)組的首地址傳遞給形參,而不是將數(shù)組的所有元素傳遞給形參在函數(shù)體中,根據(jù)形參數(shù)組首地址和下標指示的偏移量訪問數(shù)組元素能夠表示地址的數(shù)據(jù)類型數(shù)組首地址(第一個元素的地址)指針引用Database&InformationSystemLab55函數(shù)的說明與使用函數(shù)的參數(shù)【例5.5】一維數(shù)組作參數(shù)舉例:設(shè)計函數(shù),實現(xiàn)兩個字符數(shù)組的連接。Database&InformationSystemLab56#include<iostream>usingnamespacestd;voidstrcat(chars[],charct[]){
inti=0,j=0;
while(s[i]!=0)i++;
while(ct[j]!=0)s[i++]=ct[j++];s[i]='\0';}函數(shù)的說明與使用函數(shù)的參數(shù)【例5.5】主函數(shù)部分Database&InformationSystemLab57intmain(void){
chara[40]="李明";
charb[20]="是東南大學學生";strcat(a,b);//實參為數(shù)組名cout<<a<<endl;//打印字符數(shù)組a
return0;}函數(shù)的說明與使用函數(shù)的參數(shù)【例5.6】多維數(shù)組做函數(shù)參數(shù)舉例:設(shè)計函數(shù),實現(xiàn)矩陣的轉(zhuǎn)置和矩陣乘法,并在主函數(shù)中驗證用二維數(shù)組存儲矩陣由于數(shù)組作為參數(shù),傳遞的是數(shù)組的首地址,因此,在函數(shù)中對作為形參的數(shù)組進行的操作,能夠直接反映到實參數(shù)組中Database&InformationSystemLab58函數(shù)的說明與使用【例5.6】函數(shù)原型及主函數(shù)Database&InformationSystemLab59#include<iostream>usingnamespacestd;voidinverse(int[3][6],int[6][3]);//轉(zhuǎn)置矩陣voidmulti(int[6][3],int[3][4],int[6][4]);//矩陣乘法voidoutput(int[6][4]);//矩陣輸出intmain(){
intmiddle[6][3],result[6][4];
intmatrix1[3][6]={8,10,12,23,1,3,5,7,9,2,4,6, 34,45,56,2,4,6};
intmatrix2[3][4]={3,2,1,0,-1,-2,9,8,7,6,5,4};inverse(matrix1,middle);//實參為數(shù)組名multi(middle,matrix2,result);output(result);
return0;}函數(shù)的說明與使用【例5.6】轉(zhuǎn)置和乘法函數(shù)定義Database&InformationSystemLab60void
inverse(intmatrix1[3][6],intmiddle[6][3]){//轉(zhuǎn)置
int
i,j;
for
(i=0;i<3;i++)
for(j=0;j<6;j++)
middle[j][i]=matrix1[i][j];
return;}void
multi(intmiddle[6][3],intmatrix2[3][4],intresult[6][4]){
int
i,j,k;
//矩陣乘法
for
(i=0;i<6;i++){
for
(j=0;j<4;j++){
result[i][j]=0;
for
(k=0;k<3;k++) result[i][j]+=middle[i][k]*matrix2[k][j];}}
return;}函數(shù)的說明與使用【例5.6】矩陣輸出函數(shù)定義Database&InformationSystemLab61voidoutput(intresult[6][4]){//矩陣輸出
cout<<"result"<<'\n';
inti,j;
for(i=0;i<6;i++){
for(j=0;j<4;j++)cout<<setw(4)<<result[i][j]<<"";cout<<'\n';}
return;}函數(shù)的說明與使用函數(shù)的參數(shù)變量的引用作為函數(shù)的形式參數(shù)賦值形參:未被說明為引用(&)的參數(shù)賦值形參和實參直觀上是一致的,實際是不同的在內(nèi)存中的地址不同引用形參——變量的引用為變量起“別名”在作為形參的變量前加符號“&”與變量的內(nèi)存地址相同需要在函數(shù)中改變實參值并將變化反映到主調(diào)函數(shù)的時候,用作為實參的變量引用是一種方法還可以用指針做形參操作變量地址Database&InformationSystemLab62函數(shù)的說明與使用函數(shù)的參數(shù)賦值形參賦值形參的函數(shù)調(diào)用過程和參數(shù)傳遞機制在執(zhí)行函數(shù)調(diào)用時,在檢查函數(shù)名及參數(shù)表之后,為賦值參數(shù)分配內(nèi)存計算各對應(yīng)的實參表達式,并把計算的值賦給剛剛創(chuàng)建的參數(shù)變量開始函數(shù)體的運行。凡是賦值形參,在函數(shù)的每次調(diào)用時,都必須為每一個賦值形參創(chuàng)建一個新的參數(shù)變量。Database&InformationSystemLab63函數(shù)的說明與使用函數(shù)的參數(shù)賦值形參實參表達式:函數(shù)調(diào)用語句中,與賦值形參相對應(yīng)的實參可以是指定類型的常量、變量或表達式。在執(zhí)行函數(shù)調(diào)用時應(yīng)把該表達式的值計算出來,作為初值賦給剛剛為賦值形參創(chuàng)建的參數(shù)變量。這是賦值調(diào)用方式名稱的由來。為賦值形參創(chuàng)建的參數(shù)變量是局限于函數(shù)體運行的局部變量,它作為該形參的一個實例,參加函數(shù)體程序塊的這次運行,一旦運行完畢,這個參數(shù)變量就被撤消Database&InformationSystemLab64函數(shù)的說明與使用函數(shù)的參數(shù)實參表達式作參數(shù)例如,函數(shù)原型:intadd(inta,intb);調(diào)用函數(shù)時,可以采用如下方式:……intmain(){
intx=5; intc=add(1,4*x+2);//實參為表達式 ……}Database&InformationSystemLab65函數(shù)的使用和說明函數(shù)的參數(shù)【例5.7】編寫函數(shù),實現(xiàn)兩個整數(shù)的交換輸入兩個整數(shù)輸出初始值交換輸出交換后的值Database&InformationSystemLab66voidswap(intx,inty){
inttemp=x;x=y;y=temp;}函數(shù)的說明和使用【例5.7】主函數(shù)部分#inlcude<iostream>usingnamespacestd;voidswap(intx,inty){.....}intmain(){
inta,b; cin>>a>>b; cout<<“a=“<<a<<“b=“<<b<<endl; swap(a,b); cout<<“a=“<<a<<“b=“<<b<<endl;
return0;}Database&InformationSystemLab67函數(shù)的說明與使用【例5.7】分析程序運行結(jié)果顯示,a和b的值沒有進行交換!主函數(shù)運行時,為變量a和b分配存儲空間調(diào)用函數(shù)swap時,為變量x和y分配存儲空間函數(shù)體中交換了x和y存儲單元的值a和b所在存儲單元的值沒有交換輸出的仍然是a和b所在存儲單元的值Database&InformationSystemLab68函數(shù)的說明與使用函數(shù)的參數(shù)引用形參函數(shù)定義的參數(shù)表中,名字前加上符號&的參數(shù)為引用形參。例如voidswap(int&a,int&b);引用形參在調(diào)用過程中的參數(shù)傳遞機制函數(shù)的調(diào)用語句中對應(yīng)于引用形參的實參必須是同一類型的變量,非變量的表達式則不允許。參數(shù)傳遞的內(nèi)容不是實參的值,而是地址,其實際的效果是令對應(yīng)的引用形參在調(diào)用過程中,作為一個變量名指向作為實參的這個變量,在引用調(diào)用過程中并不創(chuàng)建新的參數(shù)變量。這一點有別于賦值調(diào)用Database&InformationSystemLab69函數(shù)的說明與使用函數(shù)的參數(shù)引用形參引用形參在調(diào)用過程中的參數(shù)傳遞機制在函數(shù)體程序塊的運行中,引用形參的每次出現(xiàn),由于它現(xiàn)在已經(jīng)是指向?qū)崊⒆兞?,因此相當于全用實參變量所代替。即起到了所謂的“換名”的作用。在函數(shù)體程序運行結(jié)束,控制轉(zhuǎn)回調(diào)用點時,該引用形參與實參變量的對應(yīng)關(guān)系也就終止了。但是在調(diào)用過程中對于這個實參變量的所有處理和操作的結(jié)果,卻保留下來。這一點也是區(qū)別于賦值調(diào)用的
Database&InformationSystemLab70函數(shù)的說明與使用函數(shù)的參數(shù)引用形參設(shè)計函數(shù)在下面兩種情形時,建議采用引用參數(shù)需要改變某些變量的值(上述函數(shù)swap就是一例)對于占內(nèi)存較多的數(shù)據(jù)參數(shù),為了不另建新的參數(shù)變量以節(jié)省內(nèi)存為了保證實參不在函數(shù)中被修改,可在形參說明中加上const說明,例如:
complexadd(constcomplex&
a,constcomplex&
b);而對于賦值形參,則無此必要。Database&InformationSystemLab71函數(shù)的說明與使用函數(shù)的參數(shù)賦值調(diào)用所調(diào)用的函數(shù)參數(shù)為賦值參數(shù)引用調(diào)用所調(diào)用的函數(shù)參數(shù)為引用參數(shù)舉例 voidprintStar(intk,intn);
//它所用的兩個參數(shù)均為賦值參數(shù)
voidswap(int&x,int&y);
//它所用的兩個參數(shù)均為引用參數(shù)
intmyFunc(inta,float&b);
//它所用的第一個參數(shù)為賦值參數(shù),另一個為引用參數(shù)Database&InformationSystemLab72函數(shù)的說明與使用函數(shù)的參數(shù)【例5.7】中的交換函數(shù),采用引用作為參數(shù) voidswap(int&x,int&y){
inttemp=x;x=y;y=temp; }引用參數(shù)&x和&y是實參的別名,函數(shù)中對引用形參的操作實際上就是對實參的操作
Database&InformationSystemLab73函數(shù)的說明與使用函數(shù)的參數(shù)引用調(diào)用方式,實際上傳遞的是參數(shù)的地址(實參的地址),函數(shù)體中對形參的操作實際上是對實參地址的操作希望在函數(shù)中修改實參值并反映到主調(diào)函數(shù)中的時候,采用引用調(diào)用方式指針、數(shù)組等能夠表示地址的數(shù)據(jù)類型作為形參,,可以起到與引用形參相同的作用【例5.5】和【例5.6】是數(shù)組作為參數(shù),在函數(shù)體中修改數(shù)組并反映到主調(diào)函數(shù)的例子Database&InformationSystemLab74函數(shù)的說明與使用函數(shù)的參數(shù)從賦值或引用參數(shù)的角度看函數(shù)的調(diào)用過程判斷形參是賦值參數(shù)還是引用參數(shù)將對應(yīng)實參表達式的值賦給賦值形參(若參數(shù)為賦值參數(shù)的話);用實參變量替換相應(yīng)的形參(若參數(shù)為引用參數(shù)的話);按各形參的“當前值”(或已被“賦值”,或已被“換名”)去執(zhí)行一遍函數(shù)體并返回調(diào)用處Database&InformationSystemLab75函數(shù)的說明與使用函數(shù)的參數(shù)賦值調(diào)用和引用調(diào)用傳值方式的區(qū)別通過賦值參數(shù)來傳值的方式是一種“單向傳值”方式,它只可向被調(diào)函數(shù)的形參“傳入”值,而不可通過該形參“傳出”值
通過引用參數(shù)來傳值的方式是一種“雙向傳值”方式,它不僅可向被調(diào)函數(shù)的形參“傳入”值,而且還可通過該形參“傳出”值Database&InformationSystemLab76函數(shù)的說明與使用函數(shù)的參數(shù)【例5.8】賦值調(diào)用和引用調(diào)用舉例#include<iostream>usingnamespacestd;voidswap(int&a,int&b,intc,intd);//函數(shù)原型//前兩個為引用參數(shù),可“雙向傳值”//后兩個為賦值參數(shù)Database&InformationSystemLab77函數(shù)的說明與使用intmain(){ inti=1,j=2,k=77,n=88;
cout<<“---Inmain,beforcallingf1---"<<endl; cout<<"i,j,k,n="<<i<<""<<j<<""<<k<<""<<n<<endl<<endl; swap(i,j,k,n);
//注意,調(diào)用后實參變量i、j的值進行了改變 //而k與n的值并不改變
cout<<"---Inmain,aftercallingf1---"<<endl; cout<<"i,j,k,n="<<i<<""<<j<<""<<k<<""<<n<<endl;}Database&InformationSystemLab78函數(shù)的說明與使用voidswap(int&a,int&b,intc,intd)
{
/*前兩個為引用參數(shù),后兩個為賦值參數(shù)。對引用參數(shù)而言,調(diào)用時,將用對應(yīng)實參變量來替換它們。即是說,被調(diào)函數(shù)中對形參值的使用與改變,就是對主調(diào)函數(shù)中調(diào)用語句處所對應(yīng)實參變量值的直接使用與改變(“雙向傳值”)*/
cout<<"---Enterf1---"<<endl; cout<<"a,b,c,d="<<a<<""<<b<<""<<c<<""<<d<<endl<<endl; inttmp;
tmp=a;a=b;b=tmp; //交換a與b的值
tmp=c;c=d;d=tmp; //交換c與d的值
cout<<"---Intheendoff1---"<<endl; cout<<"a,b,c,d="<<a<<""<<b<<""<<c<<""<<d<<endl<<endl;}Database&InformationSystemLab79函數(shù)的說明與使用程序運行結(jié)果---Inmain,beforcallingf1---i,j,k,n=127788
---Enterf1---a,b,c,d=127788
---Intheendoff1---a,b,c,d=218877
---Inmain,aftercallingf1---i,j,k,n=217788Database&InformationSystemLab80函數(shù)的說明與使用函數(shù)的重載(后面具體講解)多個函數(shù)使用相同的函數(shù)名函數(shù)重載必須滿足下列條件之一參數(shù)表中對應(yīng)的參數(shù)類型不同參數(shù)表中參數(shù)個數(shù)不同參數(shù)表中不同類型參數(shù)的次序不同例如,三個同名函數(shù)可以聲明為:printStar();printStar(int);printStar(int,int);Database&InformationSystemLab81函數(shù)的說明與使用內(nèi)聯(lián)函數(shù)可在一般的函數(shù)說明前冠以關(guān)鍵字inline,稱這樣的函數(shù)為內(nèi)聯(lián)函數(shù)。說明方式:
inline<函數(shù)類型><函數(shù)名>(<形參表>)
{ <函數(shù)體> }Database&InformationSystemLab82函數(shù)的說明與使用內(nèi)聯(lián)函數(shù)在編譯過程中,凡內(nèi)聯(lián)函數(shù),系統(tǒng)均把它的執(zhí)行代碼插入到該函數(shù)的每個調(diào)用點處(以取代那一函數(shù)調(diào)用),從而使程序執(zhí)行過程中,每次對該函數(shù)調(diào)用時不需控制轉(zhuǎn)移,可節(jié)省執(zhí)行時間由于每個調(diào)用點處均出現(xiàn)那一函數(shù)的執(zhí)行代碼拷貝,相對來說使用內(nèi)聯(lián)函數(shù)后會擴大其代碼空間Database&InformationSystemLab83函數(shù)的說明與使用內(nèi)聯(lián)函數(shù)舉例#include<iostream.h>inlineintmax(intx,inty){//內(nèi)聯(lián)函數(shù)max
return(x>y?x:y);}voidmain(){
inta,b; cout<<"Inputa,b:"; cin>>a>>b; cout<<"max(a,b)="<<max(a,b)<<endl;
//對內(nèi)聯(lián)函數(shù)max的調(diào)用}Database&InformationSystemLab84函數(shù)的說明與使用內(nèi)聯(lián)函數(shù)說明內(nèi)聯(lián)函數(shù)的函數(shù)體一般講不宜過大,以1--5行為宜。凡在類體中定義的成員函數(shù)(見第7章)均隱含為內(nèi)聯(lián)函數(shù)Database&InformationSystemLab85函數(shù)的說明與使用函數(shù)使用的其它問題(后面具體講解)函數(shù)的生存期與作用域函數(shù)中變量的生存期與作用域參數(shù)函數(shù)體內(nèi)的局部變量函數(shù)體內(nèi)的全局變量函數(shù)的存儲屬性外部存儲屬性靜態(tài)存儲屬性函數(shù)間的數(shù)據(jù)傳遞方式Database&InformationSystemLab86函數(shù)的說明與使用函數(shù)使用舉例【例5.9】三色冰淇淋程序由冰激凌商提出的問題:有28種顏色的原料,可以組合成多少種3色冰激凌問題歸結(jié)為計算排列數(shù)與組合數(shù)。本示例計算排列數(shù)A(elements,selections)及組合數(shù)C(elements,selections)。如:
A(3,2)=6,C(3,2)=3; A(28,3)=19656,C(28,3)=3276。Database&InformationSystemLab87函數(shù)的說明與使用【例5.9】分析求排列數(shù)的公式A(ele,sel):A(ele,sel)=ele!/(ele-sel)!求組合數(shù)的公式C(ele,sel):C(ele,sel)=A(ele,sel)/sel!設(shè)計階乘函數(shù),求上述各階乘的值并可以實現(xiàn)排列數(shù)和組合數(shù)的求值Database&InformationSystemLab88函數(shù)的說明與使用【例5.9】計算階乘的函數(shù)定義longfactorial(intnumber){
longvalue=1;
while(number>1){ value*=number; number--; }
returnvalue;}Database&InformationSystemLab89函數(shù)的說明與使用【例5.9】主程序部分#include<iostream>usingnamespacestd;longfactorial(intnumber);//函數(shù)原型intmain(){ inti,selections,elements;
//計算A(elements,selections) //以及C(elements,selections)
cout<<"Numberofselections:"; cin>>selections;//輸入整數(shù)selections cout<<"Outofhowmanyelements:"; cin>>elements;//輸入整數(shù)elements doubleanswer=elements; intele=elements;Database&InformationSystemLab90函數(shù)的說明與使用
answer=factorial(elements)/factorial(elements-selects); cout<<“A(”<<elements<<“,”<<selections<<“)=”<<answer<<endl;//輸出排列數(shù)A(ele,sel)之結(jié)果
//組合數(shù)C的求法:
answer/=factorial(selections); cout<<"C("<<elements<<","<<selections<<")="<<answer<<endl;//輸出組合數(shù)C(ele,sel)之結(jié)果
return0;}
Database&InformationSystemLab91第5章函數(shù)與重載函數(shù)的說明與使用1函數(shù)的嵌套與遞歸2函數(shù)與運算符重載3函數(shù)與C++程序結(jié)構(gòu)492Database&InformationSystemLab函數(shù)的嵌套與遞歸函數(shù)的嵌套一個函數(shù)的函數(shù)體中包含一個或多個函數(shù)調(diào)用語句,即稱為函數(shù)嵌套嵌套的含義是,如果函數(shù)A要調(diào)用函數(shù)B,也就是說,函數(shù)A的定義要依賴于函數(shù)B的定義。因此函數(shù)B的定義或函數(shù)B的原型必須出現(xiàn)在函數(shù)A的定義語句之前。另一方面,函數(shù)A調(diào)用函數(shù)B,在調(diào)用A的過程中,即執(zhí)行A的函數(shù)體過程中,調(diào)用B,也就是中途把程序控制轉(zhuǎn)到B的函數(shù)體,在執(zhí)行結(jié)束后再返回到A的函數(shù)體中Database&InformationSystemLab93函數(shù)的嵌套與遞歸函數(shù)的嵌套示意圖Database&InformationSystemLab94函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用所占用的內(nèi)存空間(如賦值參數(shù)的創(chuàng)建等等)用堆棧(stack)的方式管理。一般這種堆棧所分配的空間是有限的,因此函數(shù)互相嵌套的層數(shù)也是有限的,依編譯系統(tǒng)不同,其允許的嵌套層數(shù)也可能不同Database&InformationSystemLab95函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)Database&InformationSystemLab96函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)主函數(shù)運行時,棧區(qū)的情況Database&InformationSystemLab97函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)Database&InformationSystemLab98函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)發(fā)生函數(shù)調(diào)用時(調(diào)用a函數(shù)),“保護”主函數(shù)當前的運行狀態(tài),記錄被調(diào)函數(shù)的返回地址Database&InformationSystemLab99函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)Database&InformationSystemLab100函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)運行a函數(shù),記錄a函數(shù)的參數(shù)和局部變量的值Database&InformationSystemLab101函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)Database&InformationSystemLab102函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)調(diào)用b函數(shù),保護a函數(shù)的當前狀態(tài),記錄b函數(shù)的返回地址Database&InformationSystemLab103函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)Database&InformationSystemLab104函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)運行b函數(shù),記錄b函數(shù)的參數(shù)和局部變量的值Database&InformationSystemLab105函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)Database&InformationSystemLab106函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)b函數(shù)運行結(jié)束并返回,b函數(shù)的變量和參數(shù)失效,變量和參數(shù)由棧區(qū)“彈出”,根據(jù)b函數(shù)的返回地址返回,讀取a函數(shù)的運行狀態(tài)繼續(xù)運行a函數(shù)Database&InformationSystemLab107函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)Database&InformationSystemLab108函數(shù)的嵌套與遞歸函數(shù)的嵌套函數(shù)嵌套調(diào)用過程中的棧結(jié)構(gòu)a函數(shù)運行結(jié)束并返回,a函數(shù)的變量和參數(shù)失效,變量和參數(shù)由棧區(qū)“彈出”,根據(jù)a函數(shù)的返回地址返回,讀取主函數(shù)的運行狀態(tài)繼續(xù)運行主函數(shù)Database&InformationSystemLab109函數(shù)的嵌套與遞歸函數(shù)的嵌套【例5.10】編寫程序,用冒泡排序的算法對數(shù)組中的元素按照由小到大的順序進行排序輸入數(shù)組調(diào)用排序函數(shù)進行排序參數(shù):待排序的數(shù)組返回:空由于參數(shù)為數(shù)組,即數(shù)組的首地址,函數(shù)體中處理數(shù)組的地址,因此,對數(shù)組的修改可以直接反映到主調(diào)函數(shù)中輸出排序后的數(shù)組Database&InformationSystemLab110函數(shù)的嵌套與遞歸【例5.10】函數(shù)bubSort代碼voidbubSort(inta[],intn){
for(inti=0;i<n;i++){
for(intj=n-1;j>i;j--){
if(a[j]<a[j-1]){ swap(a[j],a[j-1]); } } }}Database&InformationSystemLab111函數(shù)的嵌套與遞歸【例5.10】函數(shù)swap代碼voidswap(int&x,int&y){ inttemp=x; x=y; y=temp;}Database&InformationSystemLab112函數(shù)的嵌套與遞歸【例5.10】主程序代碼#include<iostream>#include<stdlib>#include<time>#include<iomanip>usingnamespacestd;constintn=100;intmain(){
intb[n]; srand((unsigned)time(NULL));
for(inti=0;i<n;i++) b[i]=rand();Database&InformationSystemLab113函數(shù)的嵌套與遞歸 bubSort(b,n);
for(i=0;i<n;i++){ cout<<setw(5)<<b[i];
if(i%10==0) cout<<endl; }
return0;}/*設(shè)計函數(shù),分別按產(chǎn)生順序和排序后的順序輸出隨機數(shù),輸出寬度為5,每輸出10個數(shù)換行*/Database&InformationSystemLab114函數(shù)的嵌套與遞歸函數(shù)的遞歸C++允許函數(shù)自己調(diào)用自己(如A函數(shù)可以調(diào)用A函數(shù)本身,稱為直接遞歸)。也允許A函數(shù)調(diào)用B函數(shù),而后B函數(shù)又調(diào)用A函數(shù)(從而形成間接遞歸)。但不論使用哪種遞歸,程序員都應(yīng)保障遞歸函數(shù)在執(zhí)行若干次后能夠“退出”遞歸(不再進行遞歸調(diào)用,也即能夠?qū)崿F(xiàn)遞歸出口)Database&InformationSystemLab115函數(shù)的嵌套與遞歸函數(shù)的遞歸遞歸函數(shù)的執(zhí)行分為“遞推”和“回歸”兩個過程,這兩個過程由遞歸終止條件控制,即逐層遞推,直至遞歸終止條件,然后逐層回歸。每次調(diào)用發(fā)生時都首先判斷遞歸終止條件。Database&InformationSystemLab116函數(shù)的嵌套與遞歸函數(shù)的遞歸遞歸調(diào)用同普通的函數(shù)調(diào)用一樣,每當調(diào)用發(fā)生時,在棧中分配單元保存返回地址以及參數(shù)和局部變量;而與普通的函數(shù)調(diào)用不同的是,由于遞推的過程是一個逐層調(diào)用的過程,因此存在一個逐層連續(xù)的參數(shù)入棧過程,直至遇到遞歸終止條件時,才開始回歸,這時才逐層釋放棧空間,返回到上一層,直至最后返回到主調(diào)函數(shù)Database&InformationSystemLab117函數(shù)的嵌套與遞歸函數(shù)的遞歸【例5.11】計算年齡【例5.12】求階乘,三色冰淇淋程序【例5.13】反序輸出問題【例5.14】輸入一個整數(shù),將數(shù)字反序輸出【例5.15】漢諾塔問題【例5.16】讀程序,寫結(jié)果Database&InformationSystemLab118函數(shù)的嵌套與遞歸函數(shù)的遞歸【例5.11】有5個人坐在一起,問第5個人多少歲?他說,比第4個人大兩歲。問第4個人多少歲?他說,比第3個人大兩歲。問第3個人多少歲?他說,比第2個人大兩歲。問第2個人多少歲?他說,比第1個人大兩歲。問第1個人多少歲?他說是十歲。請問,第5個人多大?欲求第5個人的年齡,就必須先知道第4個人的年齡,欲求第4個人的年齡,就必須先知道第3個人的年齡,欲求第3個人的年齡,就必須先知道第2個人的年齡,欲求第2個人的年齡,就必須先知道第1個人的年齡,而且每個人的年齡都比前一個人大兩歲Database&InformationSystemLab119函數(shù)的嵌套與遞歸【例5.11】分析5個人的年齡可以分別表示為age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10通項式為:age(1)=10age(n)=age(n-1)+2Database&InformationSystemLab120函數(shù)的嵌套與遞歸【例5.11】遞歸過程圖示Database&InformationSystemLab121函數(shù)的嵌套與遞歸【例5.11】求年齡的遞歸函數(shù)age()定義intage(intn){
intperson_age;
if(n==1) person_age=10;
else person_age=age(n-1)+2;
returnperson_age;}Database&InformationSystemLab122函數(shù)的嵌套與遞歸【例5.11】主程序部分#include<iostream>usingnamespacestd;intmain(){ cout<<“第5個人的年齡為:”<<age(5)<<“歲”; cout<<endl;
return0;}Database&InformationSystemLab123函數(shù)的嵌套與遞歸函數(shù)的遞歸【例5.12】用遞歸函數(shù)求整數(shù)n的階乘1!=1n!=n*(n-1)!遞歸函數(shù)定義longfac(intn){
if((n==1)||(n==0))
return1;
else
returnn*fac(n-1);}Database&InformationSystemLab124函數(shù)的嵌套與遞歸函數(shù)的遞歸【例5.13】反序輸出:從鍵盤輸入10個int型數(shù),而后按輸入的相反順序輸出它們。例如:輸入:12345678910
輸出:10987654321Database&InformationSystemLab125函數(shù)的嵌套與遞歸【例5.13】分析遞推過程將輸入的10個數(shù),由第10個推到第1個回歸過程由第1個數(shù)開始輸出后項依賴于前項的“輸出”,而不是像以前程序那樣依賴前一項的值Database&InformationSystemLab126函數(shù)的嵌套與遞歸【例5.13】遞歸過程圖示Database&InformationSystemLab127函數(shù)的嵌套與遞歸【例5.13】遞歸函數(shù)定義voidinv(intn){
inti; cin>>i;//輸入整數(shù)
if(n==1) cout<<“Theresult:”<<endl;
else inv(n-1); cout<<i<<““;//輸出整數(shù),每次遞歸調(diào)用返 //回之后都要執(zhí)行}Database&InformationSystemLab128函數(shù)的嵌套與遞歸【例5.13】主程序部分#include<iostream>usingnamespacestd;intmain(){ cout<<“Input10integers:”<<endl; inv(10); cout<<endl;
return0;}Database&InformationSystemLab129函數(shù)的嵌套與遞歸函數(shù)的遞歸【例5.14】反序輸出一個正整數(shù)的各位數(shù)值,如輸入231,應(yīng)輸出132遞歸函數(shù)定義如下: voidconv(intn){
if(n<10){ cout<<n;
return; }//遞歸出口 cout<<n%10; conve(n/10);//遞歸 }Database&InformationSystemLab130函數(shù)的嵌套與遞歸【例5.14】遞歸過程圖示Database&InformationSystemLab131函數(shù)的嵌套與遞歸【例5.14】用非遞歸函數(shù)實現(xiàn)intconv(intn){
if(n<0) cout<<“Pleaseinputapositivenumber!”;
else{
do{ cout<<n%10;
n=/10;
}while(n!=0); }}Database&InformationSystemLab132函數(shù)的嵌套與遞歸【例5.14】主程序部分#include<iostream>usingnamespacestd;voidmain(void){
intt;
cout<<”Inputapositivenumber:”;
cin>>t;
cout<<endl;
conv(t);
return0;}Database&InformationSystemLab133函數(shù)的嵌套與遞歸函數(shù)的遞歸【例5.15】古印度的著名智力測驗問題:有三個立柱A、B、C,在A柱上穿有大小不等的圓盤64個,較大的圓盤在下,較小者在上。要求借助于B柱將A柱上的64個圓盤移到C柱,規(guī)則為:(1)每次只能把一個柱上最上面的圓盤移至另一個柱的最上面;(2)每個柱上總保持較大的圓盤在下,較小者在上。編制程序,實現(xiàn)將任意n個圓盤從A柱借助于B柱移到C柱,并顯示出全部移動過程Database&InformationSystemLab134函數(shù)的嵌套與遞歸【例5.15】分析總?cè)蝿?wù)(圓盤數(shù)為n的任務(wù)):把A柱上的n個圓盤,借助
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計泰勒的著作
- 迷宮問題 課程設(shè)計
- 2024年中國肱骨固定套市場調(diào)查研究報告
- 2024至2030年中國高密度聚乙烯樹脂行業(yè)投資前景及策略咨詢研究報告
- 課程設(shè)計自動旋蓋機設(shè)計
- 課程設(shè)計師面試技巧
- 2024年易清灰針刺呢項目可行性研究報告
- 電子監(jiān)控類平臺課程設(shè)計
- 2024年H型扳手項目可行性研究報告
- 中國銅合金產(chǎn)業(yè)經(jīng)營狀況及供需趨勢預(yù)測研究報告(2024-2030版)
- 期中測試卷-2024-2025學年統(tǒng)編版語文二年級上冊
- 2024年新高考Ⅰ卷、Ⅱ卷、甲卷詩歌鑒賞試題講評課件
- 10以內(nèi)口算題每頁50道
- 健康科普宣教課件
- 《巴蜀文化簡論》PPT課件.ppt
- 物業(yè)公司消防維保質(zhì)量檢查內(nèi)容及考核評分表
- 電動自行車火災(zāi)的勘查檢驗技術(shù)及案例分析
- 螺栓檢測報告
- 腐蝕測量及技術(shù)
- 氯化鈉與氯化銨分離解析
- 關(guān)注青少年心理健康孩子的人格培養(yǎng)與家庭教育
評論
0/150
提交評論