




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第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變量的存儲(chǔ)類別3.6程序?qū)嵗?.1函數(shù)的遞歸調(diào)用一個(gè)函數(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!分析:計(jì)算n!的公式為:1n=1或0y=n*(n-1)!n>1
可以將求n!轉(zhuǎn)化為求(n-1)!,再繼續(xù)轉(zhuǎn)化為求(n-2)!,到1時(shí)應(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個(gè)盤子,盤子大小不等,大的在下,小的在上,如圖所示。要求將這n個(gè)盤子從A針移到C針,在移動(dòng)過程中可以借助B針,每次只能移動(dòng)一個(gè)盤子,并且在移動(dòng)過程中三根針上的盤子都保持大盤在下,小盤在上。分析:將n個(gè)盤子從A針移到C針可以分解為以下三個(gè)步驟:(1)將A針上的n-1個(gè)盤子借助C針移到B針上;(2)將A針上剩下的一個(gè)盤子移到C針上;(3)將B針上的n-1個(gè)盤子借助A針移到C針上。第3章函數(shù)ABCn-1個(gè)盤子的Hanoi問題例3.2Hanoi塔問題源程序#include<iostream>usingnamespacestd;voidMove(charx,
chary);voidHanoi(intn,charone,chartwo,charthree);voidmain(){
intn;
cout<<"請(qǐng)輸入盤子數(shù):";
cin>>n;
cout<<n<<"個(gè)盤子的移動(dòng)過程為:"<<endl;
Hanoi(n,'A','B','C');}//函數(shù)Move()將一個(gè)盤子從x針移到y(tǒng)針voidMove(charx,
chary){
cout<<x<<"-->"<<y<<endl;}第3章函數(shù)例3.2Hanoi塔問題源程序(續(xù))//函數(shù)Hanoi()將n-1個(gè)盤子從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ù)程序運(yùn)行結(jié)果:A
CA
BC
BA
CB
AB
CA
C
返回運(yùn)行演示3.2內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)與一般函數(shù)的區(qū)別在于它不是在調(diào)用時(shí)發(fā)生控制轉(zhuǎn)移,而是在編譯時(shí)將被調(diào)函數(shù)體嵌入到每一個(gè)函數(shù)調(diào)用處,節(jié)省了參數(shù)傳遞、控制轉(zhuǎn)移等開銷。對(duì)于一些規(guī)模較小、頻繁調(diào)用的函數(shù)可聲明為內(nèi)聯(lián)函數(shù),能提高程序運(yùn)行效率。
內(nèi)聯(lián)函數(shù)的定義:
inline
類型說明符函數(shù)名(參數(shù)及類型表){函數(shù)體}
注意:只有簡(jiǎn)單的函數(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ù)程序運(yùn)行結(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++中可以定義多個(gè)相同名字的函數(shù),只要它們形參的個(gè)數(shù)或類型不完全一致即可,編譯程序根據(jù)實(shí)參與形參的類型及個(gè)數(shù)自動(dòng)確定調(diào)用哪一個(gè)同名函數(shù),這就是函數(shù)重載,這些同名函數(shù)稱為重載函數(shù)。
例3.4
定義兩個(gè)函數(shù),分別求兩個(gè)整數(shù)及兩個(gè)實(shí)數(shù)的最大值。分析:在C語言中,要定義題中的函數(shù),只能使用兩個(gè)不同名函數(shù)實(shí)現(xiàn),即定義intmax1(intx,inty)doublemax2(doublex,doubley)
在C++中,可通過定義兩個(gè)重載函數(shù)實(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ù)程序運(yùn)行結(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)用時(shí),按從左到右的次序?qū)?shí)參和形參結(jié)合,如給出對(duì)應(yīng)的實(shí)參,則采用實(shí)參值,否則采用預(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)形參值必須由右向左的順序定義。如果某個(gè)參數(shù)有默認(rèn)值,則其右面的參數(shù)必須都有默認(rèn)值;如果某個(gè)參數(shù)沒有默認(rèn)值,則其左面的參數(shù)都不能有默認(rèn)值。例如:
intmax(inta,intb=10,intc=20);//正確intmax(inta,intb=10,intc);//錯(cuò)誤intmax(inta=5,intb,intc=30);//錯(cuò)誤在后兩種情況下,調(diào)用語句x=max(20,30);會(huì)出錯(cuò)!注意:在使用帶默認(rèn)參數(shù)值的函數(shù)時(shí),只能在函數(shù)定義或函數(shù)聲明中的一個(gè)位置給出默認(rèn)值,不能在兩個(gè)位置同時(shí)給出。還要保證在函數(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)用第一個(gè)函數(shù),也可以是第二個(gè),因此編譯器不能確定調(diào)用的是哪一個(gè)函數(shù)。
返回3.5變量的存儲(chǔ)類別3.5.1內(nèi)部變量與外部變量1.
內(nèi)部變量在一個(gè)函數(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變量的存儲(chǔ)類別3.5.1內(nèi)部變量與外部變量(續(xù))2.
外部變量在函數(shù)外部定義的變量是外部變量(也稱為全局變量),它不屬于任何一個(gè)函數(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ù)程序運(yùn)行結(jié)果:全局變量i=1塊局部變量i=7全局變量i=1函數(shù)局部變量i=5全局變量i=1
3.5變量的存儲(chǔ)類別3.5.2變量的存儲(chǔ)類別變量在內(nèi)存中的存儲(chǔ)方式可以分為兩大類,即靜態(tài)存儲(chǔ)方式與動(dòng)態(tài)存儲(chǔ)方式。
靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間,分配固定的存儲(chǔ)空間。全局變量和靜態(tài)局部變量是靜態(tài)存儲(chǔ)方式。
動(dòng)態(tài)存儲(chǔ)方式是在程序執(zhí)行過程中,根據(jù)需要?jiǎng)討B(tài)地分配存儲(chǔ)空間。局部變量是動(dòng)態(tài)存儲(chǔ)方式。
1.
靜態(tài)變量
定義形式:
static
數(shù)據(jù)類型變量名
特點(diǎn):程序運(yùn)行過程中變量始終存在,每次調(diào)用函數(shù)結(jié)束的值都被保留下來。僅初始化一次,每次調(diào)用它所在的函數(shù)時(shí),不再重新初始化。若不指定初值,自動(dòng)指定初值為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ù)時(shí)執(zhí)行一次 f*=n; returnf;}第3章函數(shù)程序運(yùn)行結(jié)果:1!=12!=23!=64!=24
3.5變量的存儲(chǔ)類別3.5.2變量的存儲(chǔ)類別(續(xù))2.
自動(dòng)變量
定義形式:
auto
數(shù)據(jù)類型變量名
特點(diǎn):定義變量時(shí),若不指定static或auto,則默認(rèn)為自動(dòng)變量。自動(dòng)變量是動(dòng)態(tài)存儲(chǔ)方式。
每次調(diào)用它所在的函數(shù)時(shí),都要重新分配存儲(chǔ)空間,并初始化。函數(shù)調(diào)用結(jié)束,存儲(chǔ)空間就釋放。若不初始化,則初值是不確定的。第3章函數(shù)例3.10靜態(tài)變量與動(dòng)態(tài)變量的使用#include<iostream>usingnamespacestd;voidother(void);inti=1;//i為全局變量,具有靜態(tài)生存期。
voidmain(void){ staticinta;//a為靜態(tài)局部變量,具有全局壽命,局部可見。
intb=-10;//b,c為動(dòng)態(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)變量與動(dòng)態(tài)變量的使用(續(xù))voidother(void){
//a,b為靜態(tài)局部變量,具有全局壽命,局部可見,
//只第一次進(jìn)入函數(shù)時(shí)被初始化。
staticinta=2; staticintb; intc=10;//C為動(dòng)態(tài)局部變量,每次進(jìn)入函數(shù)時(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ù)程序運(yùn)行結(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輸出攝氏溫度與華氏溫度對(duì)照表分析:編寫一個(gè)函數(shù)求出指定攝氏溫度對(duì)應(yīng)的華氏溫度值,在主函數(shù)中通過循環(huán)求出攝氏溫度從0~99度對(duì)應(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中級(jí)經(jīng)濟(jì)師注冊(cè)流程試題及答案
- 二手奢侈品市場(chǎng)2025年鑒定技術(shù)升級(jí)與交易規(guī)范優(yōu)化報(bào)告
- 公共關(guān)系與社會(huì)心理學(xué)的關(guān)系試題及答案
- 深度分析公共關(guān)系學(xué)試題及答案技巧
- 工程經(jīng)濟(jì)成本效益分析試題及答案
- 2024年水利水電工程發(fā)展策略與試題及答案
- 行政管理本科的可持續(xù)發(fā)展路徑試題及答案
- 年產(chǎn)2萬噸活性炭系列產(chǎn)品生產(chǎn)項(xiàng)目規(guī)劃設(shè)計(jì)方案(參考模板)
- 鋰電池電解質(zhì)一體化項(xiàng)目可行性研究報(bào)告(參考范文)
- 行政管理決策科學(xué)的框架試題及答案
- 盤扣支模架工程監(jiān)理細(xì)則
- 轉(zhuǎn)動(dòng)機(jī)械找對(duì)輪找中心(有圖、有公式)課件
- 天然氣管道陰極保護(hù)共66張課件
- 崇尚科學(xué)反邪教主題教育PPT反對(duì)邪教主題教育宣講課件
- 大學(xué)學(xué)院成績(jī)表模板
- 大眾Formel-Q培訓(xùn)材料全解析含案例
- 莫扎特貝多芬肖邦英文簡(jiǎn)介課件
- 廚房知識(shí)考題切配答案
- 消防安全有關(guān)的重點(diǎn)工種人員及消防安全管理
- 北京市46家種豬場(chǎng)地址及聯(lián)系方式
- APG IV 系統(tǒng)(修訂版)
評(píng)論
0/150
提交評(píng)論