算法與數(shù)據(jù)結(jié)構(gòu):lecture 2 函數(shù)_第1頁
算法與數(shù)據(jù)結(jié)構(gòu):lecture 2 函數(shù)_第2頁
算法與數(shù)據(jù)結(jié)構(gòu):lecture 2 函數(shù)_第3頁
算法與數(shù)據(jù)結(jié)構(gòu):lecture 2 函數(shù)_第4頁
算法與數(shù)據(jù)結(jié)構(gòu):lecture 2 函數(shù)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、函 數(shù)#include using namespace std;void printstar(void) for(int i=0; i30; i+) cout*;coutendl;void print_message(void) cout Welcome to C+!endl;int main( )printstar( );print_message( );printstar( );return 0;P89 例4.1定義函數(shù)的一般形式無參函數(shù)類型標(biāo)識符 函數(shù)名(void) 聲明部分 語句 有參函數(shù)類型標(biāo)識符 函數(shù)名(形式參數(shù)表) 聲明部分 語句 形式參數(shù)和實(shí)際參數(shù)形式參數(shù):在定義函數(shù)時函數(shù)名后

2、面括號中的變量名稱只有在發(fā)生函數(shù)調(diào)用時,形參才被分配內(nèi)存單元,以便接收從實(shí)參傳來的數(shù)據(jù)。調(diào)用結(jié)束后,形參所占的內(nèi)存單元將被釋放。實(shí)際參數(shù):在主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面括號中的參數(shù)(可以是一個表達(dá)式)實(shí)參與形參的類型應(yīng)相同或賦值兼容。實(shí)參對形參的數(shù)據(jù)傳遞是“值傳遞”#include using namespace std;int max(int x,int y) int z;z=xy?x:y;return(z);int main( )int a,b,c;coutab;c = max(a,b);coutmax=cendl;return 0;P91 例4.2(1)如果在max函數(shù)中改變x和

3、y的值,main中的a和b會不會相應(yīng)改變?(2)如何輸出較小的數(shù)?函數(shù)的調(diào)用函數(shù)調(diào)用的一般格式:函數(shù)名(實(shí)參表列)對實(shí)參的求值順序并不是確定的,通常是按自右至左的順序求值的。函數(shù)調(diào)用的方式函數(shù)語句函數(shù)表達(dá)式函數(shù)參數(shù)函數(shù)的調(diào)用(2)一個函數(shù)中調(diào)用另一個函數(shù)需要具備的條件被調(diào)函數(shù)必須已經(jīng)存在(庫函數(shù)或自定義的函數(shù))使用庫函數(shù)時,應(yīng)該在本文件開頭用#include命令將有關(guān)頭文件“包含”進(jìn)來。使用自定義函數(shù)時,如果該函數(shù)與主調(diào)函數(shù)在同一個程序單位中,且位置在主調(diào)函數(shù)之后,則必須在調(diào)用此函數(shù)前對其作聲明函數(shù)聲明:在函數(shù)尚未定義的情況下,事先將該函數(shù)的有關(guān)信息通知編譯系統(tǒng),使編譯能正常進(jìn)行。函數(shù)的定義和

4、聲明不是同一回事。#include using namespace std;int main( )float add(float x, float y);float a,b,c;coutplease enter a,b:ab;c=add(a,b);coutsum=cendl;return 0;float add(float x, float y)return x+y;P95 例4.3(1)add的聲明語句還可以放在哪里?(2)怎么做就可以去掉add的聲明語句?(3)如果求兩數(shù)的差,怎么改?內(nèi)置函數(shù)在編譯時,將函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中在內(nèi)置函數(shù)首行的左端加上inline可以在聲明函數(shù)和定義

5、函數(shù)時,同時寫上inline;也可以只在其中一處聲明inline,只要在調(diào)用前將inline的信息告知編譯系統(tǒng)即可使用內(nèi)置函數(shù)可以節(jié)省運(yùn)行時間,但卻增加了目標(biāo)程序的長度inline聲明只是建議性的,而不是指令性的規(guī)模較小而又被頻繁調(diào)用的簡單函數(shù),才適合于聲明為inline函數(shù)#include using namespace std;inline int max(int, int, int);int main( )int i=10, j=20, k=30;coutmax=max(i,j,k)a) a=b;if(ca) a=c;return a;P103 例4.7函數(shù)的重載C+允許用同一函數(shù)名定義

6、多個函數(shù),這些函數(shù)的參數(shù)個數(shù)或類型應(yīng)該有所不同。C語言要求每個函數(shù)有唯一的名字,但有時,這會令人生厭: int abs(int); long labs(long); double fabs(double).調(diào)用時,系統(tǒng)根據(jù)實(shí)參的類型和個數(shù)找到與之匹配的函數(shù),然后調(diào)用該函數(shù)。匹配時,不考慮返回值的類型匹配重載函數(shù)的順序:尋找一個嚴(yán)格的匹配通過內(nèi)部轉(zhuǎn)換尋求一個匹配通過用戶定義的轉(zhuǎn)換尋求一個匹配#include using namespace std;int main( ) int max(int, int , int);int max(int, int);int a=8, b= -12, c=27

7、;coutmax(a,b,c)=max(a,b,c)endl;coutmax(a,b)=max(a,b)b)return a; elsereturn b;int max(int a, int b, int c)return max(a, max(b,c);P106 例4.9max(19.5,17.3,26.4) max(a,A)#include using namespace std;void print(double x)couta double, value=xendl;void print(int x) coutan integer, value=xendl;void print(cha

8、r x) couta char, value=xendl;int main( )print(37.0);print(95);print(a);return 0;(1)如果刪去了print(int)函數(shù)定義,會出現(xiàn)什么情況?(2)如果刪去了print(char)函數(shù)定義,會出現(xiàn)什么情況?函數(shù)模板一種通用函數(shù),不具體指定函數(shù)類型和形參類型,而用一個虛擬的類型來代表。函數(shù)體相同的函數(shù)均可用一個模板來定義。在函數(shù)調(diào)用時,系統(tǒng)將根據(jù)實(shí)參的類型來取代模板中的虛擬類型,從而實(shí)現(xiàn)不同的函數(shù)功能。定義函數(shù)模板的一般形式: template 通用函數(shù)定義 template 通用函數(shù)定義#include #incl

9、udeusing namespace std;template void print(T a)couttypeid(a).name( ) aendl;int main( )print(97.5);print(36);print(a);return 0;#include using namespace std;template T max(T a, T b, T c) if(ba) a=b;if(ca) a=c;return a;int main( ) int i1=185, i2=-76, i3=567, i;double d1=56.87, d2=90.23, d3=-3214.78, d;

10、long g1=67854, g2=-912456, g3=673456, g;i = max(i1,i2,i3);d = max(d1,d2, d3);g = max(g1,g2, g3);coutitdtgendl;return 0;P107 例4.10template T max(T a, T b, T c)if(ba) a=b;if(ca) a=c;return a;template T max(T a, T b)return ab?a:b;template T max(T a, T b, T c) return max(a, max(b,c);有默認(rèn)參數(shù)的函數(shù)可以給形參一個默認(rèn)值,這

11、樣形參就不一定要從實(shí)參取值了。由于實(shí)參與形參的結(jié)合是從左至右進(jìn)行的,因此指定默認(rèn)值的參數(shù)必須放在形參列表中的右端。在函數(shù)調(diào)用前,應(yīng)當(dāng)將默認(rèn)值信息提供給編譯系統(tǒng)如果函數(shù)定義在調(diào)用之前,則應(yīng)在定義中給出默認(rèn)值。如果定義在調(diào)用之后,則在函數(shù)聲明中給出默認(rèn)值,此時函數(shù)定義時可不給出默認(rèn)值(即使給出,也會被忽略)慎重給重載函數(shù)的參數(shù)設(shè)置默認(rèn)值。當(dāng)出現(xiàn)二義性時,編譯會出錯。#include using namespace std;int sum(int a)return a; int sum(int a, int b, int c=19)return a+b+c; int main()int a=17,

12、b=10, c=22;int m, n, d;m=sum(a);n=sum(a,b);d=sum(a,b,c);coutm=mt n=nt d=dendl;return 0;能不能再定義一個函數(shù)sum(int, int)?P109 例4.11函數(shù)的嵌套調(diào)用C+不允許對函數(shù)作嵌套定義一個函數(shù)中不能完整地包含另一個函數(shù)每一個函數(shù)的定義都是互相平行和獨(dú)立的C+允許嵌套調(diào)用函數(shù)在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)逆歸調(diào)用:一個函數(shù)直接或間接地調(diào)用本身包括逆歸調(diào)用的函數(shù)稱為逆歸函數(shù)P102 例4.6#include using namespace std;long fac(int);int main

13、( ) int n;long y;coutn;y = fac(n);coutn!=yendl;return 0;long fac(int n) if(n0) coutn0, data error!n; return -1; if(n=0)return 1; else return n*fac(n-1);P127 練習(xí)9#include using namespace std;void hanoi(int *a, int count, char TA, char TB, char TC);int main( )const int N=64;int aN;for(int i=0; iN; i+)

14、ai = i+1;hanoi(a, N, A, B, C);return 0;void hanoi(int *a, int count, char TA, char TB, char TC) if(count =0) return;hanoi(a, count-1, TA, TC, TB);coutMove acount-1 from TA to TCendl;hanoi(a, count-1, TB, TA, TC);變量的存儲類別靜態(tài)存儲方式:在程序運(yùn)行期間,系統(tǒng)對變量分配固定的存儲空間全局變量存放在靜態(tài)存儲區(qū)中動態(tài)存儲方式:在程序運(yùn)行期間,系統(tǒng)對變量動態(tài)地分配空間函數(shù)形式參數(shù)函數(shù)中的自動

15、變量函數(shù)調(diào)用時的現(xiàn)場保護(hù)和返回地址變量的存儲類別(2)自動變量:用關(guān)鍵字auto聲明的存儲類別,動態(tài)地分配存儲空間。默認(rèn)存儲類別,auto可省略。靜態(tài)局部變量:用關(guān)鍵字static聲明的存儲類別,靜態(tài)地分配存儲空間。當(dāng)函數(shù)調(diào)用結(jié)束時,不釋放存儲單元,因此在下次函數(shù)調(diào)用時,保留上次調(diào)用結(jié)束時的值。寄存器變量:用關(guān)鍵字register聲明的存儲類別。外部變量:用關(guān)鍵字extern聲明的存儲類別,用來擴(kuò)展全局變量的作用域。P115 例4.12#include using namespace std;int f(int);int main()int a=2, i;for(i=0; i3; i+)coutf(a) ;coutendl;return 0;int f(int a)int b=0;static int c=3;return a+(+b)+(+c);將int b=0;改為static int b=0;輸出是什么?P118 例4.14#include using namespace std;int max(int, int);int main()extern int a,b;coutmax(a,b)y?x:y;預(yù)處理命令預(yù)處理命令不是C+語言本身的組成部分,不能直接對它們進(jìn)行編譯,應(yīng)在編譯前,

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論