版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第3章函數(shù)3.1函數(shù)的遞歸調(diào)用3.2內(nèi)聯(lián)函數(shù)3.3函數(shù)重載3.4帶默認(rèn)參數(shù)值的函數(shù)3.5變量的存儲類別3.6程序?qū)嵗?.1函數(shù)的遞歸調(diào)用一個函數(shù)在它的函數(shù)體內(nèi),直接或間接地調(diào)用它自身,稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。
直接或間接調(diào)用函數(shù)自身的情況如圖:
第3章函數(shù)f函數(shù)調(diào)用f函數(shù)f1函數(shù)調(diào)用f2函數(shù)f2函數(shù)調(diào)用f1函數(shù)直接調(diào)用間接調(diào)用這兩種遞歸調(diào)用都是無中止地調(diào)用自身,顯然是不正確的。為了防止遞歸調(diào)用無終止地進(jìn)行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。例3.1用遞歸的方法求n!分析:計算n!的公式為:1n=1或0y=n*(n-1)!n>1
可以將求n!轉(zhuǎn)化為求(n-1)!,再繼續(xù)轉(zhuǎn)化為求(n-2)!,到1時應(yīng)停止遞歸#include<iostream>usingnamespacestd;longpower(intn);voidmain(){
intn;
longy;
cout<<"inputaintegernumber:";
cin>>n;
y=power(n);
cout<<n<<"!="
<<y<<endl;}第3章函數(shù)longpower(intn){
longf;
if(n>1)
f=n*power(n-1);
else
f=1;
returnf;}例3.1的遞歸過程分析第3章函數(shù)例3.2Hanoi塔問題
有三根針A、B、C,A針上有n個盤子,盤子大小不等,大的在下,小的在上,如圖所示。要求將這n個盤子從A針移到C針,在移動過程中可以借助B針,每次只能移動一個盤子,并且在移動過程中三根針上的盤子都保持大盤在下,小盤在上。分析:將n個盤子從A針移到C針可以分解為以下三個步驟:(1)將A針上的n-1個盤子借助C針移到B針上;(2)將A針上剩下的一個盤子移到C針上;(3)將B針上的n-1個盤子借助A針移到C針上。第3章函數(shù)ABCn-1個盤子的Hanoi問題例3.2Hanoi塔問題源程序#include<iostream>usingnamespacestd;voidMove(charx,
chary);voidHanoi(intn,charone,chartwo,charthree);voidmain(){
intn;
cout<<"請輸入盤子數(shù):";
cin>>n;
cout<<n<<"個盤子的移動過程為:"<<endl;
Hanoi(n,'A','B','C');}//函數(shù)Move()將一個盤子從x針移到y(tǒng)針voidMove(charx,
chary){
cout<<x<<"-->"<<y<<endl;}第3章函數(shù)例3.2Hanoi塔問題源程序(續(xù))//函數(shù)Hanoi()將n-1個盤子從one針借助two針移到three針voidHanoi(intn,charone,chartwo,charthree){
if(n==1)
Move(one,three);
else
{
Hanoi(n-1,one,three,two);
Move(one,three);
Hanoi(n-1,two,one,three);
}}第3章函數(shù)程序運行結(jié)果:A
CA
BC
BA
CB
AB
CA
C
返回運行演示3.2內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)與一般函數(shù)的區(qū)別在于它不是在調(diào)用時發(fā)生控制轉(zhuǎn)移,而是在編譯時將被調(diào)函數(shù)體嵌入到每一個函數(shù)調(diào)用處,節(jié)省了參數(shù)傳遞、控制轉(zhuǎn)移等開銷。對于一些規(guī)模較小、頻繁調(diào)用的函數(shù)可聲明為內(nèi)聯(lián)函數(shù),能提高程序運行效率。
內(nèi)聯(lián)函數(shù)的定義:
inline
類型說明符函數(shù)名(參數(shù)及類型表){函數(shù)體}
注意:只有簡單的函數(shù)才能成為內(nèi)聯(lián)函數(shù),如函數(shù)體中不能有循環(huán)語句和switch語句等。內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。第3章函數(shù)例3.3使用內(nèi)聯(lián)函數(shù)#include<iostream>usingnamespacestd;inlineintAdd(inta,intb){ intx; x=a+b; returnx;}第3章函數(shù)程序運行結(jié)果:10+20=3010+50=6050+50=100
返回voidmain(){ inta,b,c; a=10; b=20; c=Add(a,b); cout<<a<<"+"<<b<<"="<<c<<endl; c=Add(a,50); cout<<a<<"+50"<<"="<<c<<endl; c=Add(50,50); cout<<"50+50"<<"="<<c<<endl;}
3.3函數(shù)重載
在C++中可以定義多個相同名字的函數(shù),只要它們形參的個數(shù)或類型不完全一致即可,編譯程序根據(jù)實參與形參的類型及個數(shù)自動確定調(diào)用哪一個同名函數(shù),這就是函數(shù)重載,這些同名函數(shù)稱為重載函數(shù)。
例3.4
定義兩個函數(shù),分別求兩個整數(shù)及兩個實數(shù)的最大值。分析:在C語言中,要定義題中的函數(shù),只能使用兩個不同名函數(shù)實現(xiàn),即定義intmax1(intx,inty)doublemax2(doublex,doubley)
在C++中,可通過定義兩個重載函數(shù)實現(xiàn),二者同名,如下:
intmax(intx,inty)doublemax(doublex,doubley)第3章函數(shù)例3.5源程序#include<iostream>usingnamespacestd;intmax(intx,inty);doublemax(doublex,doubley);voidmain(){ inta=10,b=20,c; doublex=200.3,y=400.6,z; c=max(a,b); z=max(x,y); cout<<c<<""<<z<<endl;}
第3章函數(shù)程序運行結(jié)果:intfunctionfloatfunction20,400.6
返回intmax(intx,inty){ cout<<"intfunction"<<endl; if(x>y)returnx; else returny;}doublemax(doublex,doubley){ cout<<"floatfunction"<<endl; if(x>y) returnx; else returny;}
3.4帶默認(rèn)參數(shù)值的函數(shù)3.4.1帶默認(rèn)參數(shù)值的函數(shù)
在函數(shù)的聲明或定義中可以預(yù)先給出默認(rèn)的形參值,函數(shù)調(diào)用時,按從左到右的次序?qū)崊⒑托螀⒔Y(jié)合,如給出對應(yīng)的實參,則采用實參值,否則采用預(yù)先給出的默認(rèn)形參值。
例3.6使用帶默認(rèn)參數(shù)值的函數(shù)求x的n次方(n是正整數(shù))。
第3章函數(shù)#include<iostream>usingnamespacestd;doublepower(doublex=10.0,intn=2);voidmain(){ cout<<power(3,5)<<endl; cout<<power(3)<<endl; cout<<power()<<endl;}
doublepower(doublex,intn){ inti; doubles=1.0; for(i=1;i<=n;i++) s*=x; returns;}
3.4帶默認(rèn)參數(shù)值的函數(shù)3.4.1帶默認(rèn)參數(shù)值的函數(shù)(續(xù))
注意:默認(rèn)形參值必須由右向左的順序定義。如果某個參數(shù)有默認(rèn)值,則其右面的參數(shù)必須都有默認(rèn)值;如果某個參數(shù)沒有默認(rèn)值,則其左面的參數(shù)都不能有默認(rèn)值。例如:
intmax(inta,intb=10,intc=20);//正確intmax(inta,intb=10,intc);//錯誤intmax(inta=5,intb,intc=30);//錯誤在后兩種情況下,調(diào)用語句x=max(20,30);會出錯!注意:在使用帶默認(rèn)參數(shù)值的函數(shù)時,只能在函數(shù)定義或函數(shù)聲明中的一個位置給出默認(rèn)值,不能在兩個位置同時給出。還要保證在函數(shù)調(diào)用之前給出默認(rèn)值。第3章函數(shù)3.4帶默認(rèn)參數(shù)值的函數(shù)3.4.2帶默認(rèn)參數(shù)值函數(shù)產(chǎn)生的二義性
例3.7程序第3章函數(shù)#include<iostream>usingnamespacestd;intadd(intx=5,inty=6);floatadd(intx=5,floaty=10.0);voidmain(){ inta; floatb; a=add(10,20); b=add(10);
cout<<"a="<<a<<endl; cout<<"b="<<b<<endl;}
intadd(intx,inty){returnx+y;}floatadd(intx,floaty){returnx+y;}
b=add(10)語句產(chǎn)生二義性,可以認(rèn)為該語句是調(diào)用第一個函數(shù),也可以是第二個,因此編譯器不能確定調(diào)用的是哪一個函數(shù)。
返回3.5變量的存儲類別3.5.1內(nèi)部變量與外部變量1.
內(nèi)部變量在一個函數(shù)內(nèi)部定義的變量是內(nèi)部變量(也稱為局部變量),它只在該函數(shù)范圍內(nèi)有效。
例如:
第3章函數(shù)voidf1(inta){intb,c;
……} voidmain(){intm,n;
……}a,b,c的有效范圍m,n的有效范圍inti,a;……for(i=0;i<10;i++){intb;……}
b的有效范圍注意:在不同的作用范圍內(nèi)允許聲明同名的變量3.5變量的存儲類別3.5.1內(nèi)部變量與外部變量(續(xù))2.
外部變量在函數(shù)外部定義的變量是外部變量(也稱為全局變量),它不屬于任何一個函數(shù)。它的作用范圍是:從外部變量的定義位置開始,到本文件的結(jié)尾。
例如:
第3章函數(shù)inta,b;
voidf1(){
……} intx,y;voidmain(){……}x,y的有效范圍a,b的有效范圍例3.8使用全局變量和局部變量#include<iostream>usingnamespacestd;inti=1;
//全局變量,文件作用域
voidmain(){
cout<<"全局變量i="<<i<<endl;
//輸出1
inti=5;
//函數(shù)局部變量,塊作用域
{
inti;//塊局部變量,塊作用域
i=7;
cout<<"塊局部變量i="<<i<<endl;
//輸出7
cout<<"全局變量i="<<::i<<endl;//輸出1,::使用全局變量
}
cout<<"函數(shù)局部變量i="<<i<<endl;
//輸出5
cout<<"全局變量i="<<::i<<endl;//輸出1,::使用全局變量
}第3章函數(shù)程序運行結(jié)果:全局變量i=1塊局部變量i=7全局變量i=1函數(shù)局部變量i=5全局變量i=1
3.5變量的存儲類別3.5.2變量的存儲類別變量在內(nèi)存中的存儲方式可以分為兩大類,即靜態(tài)存儲方式與動態(tài)存儲方式。
靜態(tài)存儲方式是指在程序運行期間,分配固定的存儲空間。全局變量和靜態(tài)局部變量是靜態(tài)存儲方式。
動態(tài)存儲方式是在程序執(zhí)行過程中,根據(jù)需要動態(tài)地分配存儲空間。局部變量是動態(tài)存儲方式。
1.
靜態(tài)變量
定義形式:
static
數(shù)據(jù)類型變量名
特點:程序運行過程中變量始終存在,每次調(diào)用函數(shù)結(jié)束的值都被保留下來。僅初始化一次,每次調(diào)用它所在的函數(shù)時,不再重新初始化。若不指定初值,自動指定初值為0。第3章函數(shù)例8.9輸出1~4的階乘#include<iostream>usingnamespacestd;intfact(intn); voidmain(){ inti; for(i=1;i<=4;i++) cout<<i<<"!="<<fact(i)<<endl;}intfact(intn){ staticintf=1; //僅在第一次調(diào)用函數(shù)時執(zhí)行一次 f*=n; returnf;}第3章函數(shù)程序運行結(jié)果:1!=12!=23!=64!=24
3.5變量的存儲類別3.5.2變量的存儲類別(續(xù))2.
自動變量
定義形式:
auto
數(shù)據(jù)類型變量名
特點:定義變量時,若不指定static或auto,則默認(rèn)為自動變量。自動變量是動態(tài)存儲方式。
每次調(diào)用它所在的函數(shù)時,都要重新分配存儲空間,并初始化。函數(shù)調(diào)用結(jié)束,存儲空間就釋放。若不初始化,則初值是不確定的。第3章函數(shù)例3.10靜態(tài)變量與動態(tài)變量的使用#include<iostream>usingnamespacestd;voidother(void);inti=1;//i為全局變量,具有靜態(tài)生存期。
voidmain(void){ staticinta;//a為靜態(tài)局部變量,具有全局壽命,局部可見。
intb=-10;//b,c為動態(tài)局部變量,具有局部生存期。
intc=0; cout<<"---MAIN---\n"; cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl; c=c+8; other(); cout<<"---MAIN---\n"; cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl; i=i+10; other();}
第3章函數(shù)例3.10靜態(tài)變量與動態(tài)變量的使用(續(xù))voidother(void){
//a,b為靜態(tài)局部變量,具有全局壽命,局部可見,
//只第一次進(jìn)入函數(shù)時被初始化。
staticinta=2; staticintb; intc=10;//C為動態(tài)局部變量,每次進(jìn)入函數(shù)時都初始化。
a=a+2; i=i+32; c=c+5; cout<<"---OTHER---\n"; cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl; b=a;}
第3章函數(shù)程序運行結(jié)果:---MAIN---i:1a:0b:-10c:0---OTHER---i:33a:4b:0c:15---MAIN---i:33a:0b:-10c:8---OTHER---i:75a:6b:4c:15例3.11輸出攝氏溫度與華氏溫度對照表分析:編寫一個函數(shù)求出指定攝氏溫度對應(yīng)的華氏溫度值,在主函數(shù)中通過循環(huán)求出攝氏溫度從0~99度對應(yīng)的華氏溫度值,并輸出。轉(zhuǎn)換公式為:
F=9/5*C+32其中F表示華氏溫度,C為攝氏溫度。程序如下:
#include<iostream>#include<iomanip>usingnamespacestd;intConvert(intc){ intf; f=(int)(9.0/5*c+32); returnf;}第3章函數(shù)例3.11(續(xù)一)#voidmain(){ cout<<"|0123456789"<<endl; cout<<"---|-
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《珠寶玉石教程》課件
- 車輛租賃協(xié)議三篇
- 人力資源行業(yè)員工福利顧問工作總結(jié)
- 2003年海南高考語文真題及答案
- 水利行業(yè)的保安工作總結(jié)
- 2023-2024年企業(yè)主要負(fù)責(zé)人安全培訓(xùn)考試題附答案【培優(yōu)】
- 2023年-2024年項目部安全培訓(xùn)考試題【易錯題】
- 1000字的貧困申請書范文5篇
- 開題答辯概覽
- 電灼傷護(hù)理查房
- 調(diào)味料生產(chǎn)工藝流程圖
- 2023北師大版六年級上冊數(shù)學(xué)期末試卷(共8套)
- 企業(yè)的涉稅風(fēng)險
- 武漢大學(xué)抬頭信簽紙
- 新人教版七年級下冊生物每課知識點總結(jié)
- 印刷作業(yè)指導(dǎo)書
- 2022年農(nóng)業(yè)示范基地建設(shè)工作總結(jié)
- 硬筆書法比賽方案精選
- 火力發(fā)電廠山谷型干貯灰場設(shè)計
- 柳宗元毛筆楷書字帖
- 電伴熱帶熱計算表xls
評論
0/150
提交評論