C++程序設(shè)計課件:第3章 函數(shù)_第1頁
C++程序設(shè)計課件:第3章 函數(shù)_第2頁
C++程序設(shè)計課件:第3章 函數(shù)_第3頁
C++程序設(shè)計課件:第3章 函數(shù)_第4頁
C++程序設(shè)計課件:第3章 函數(shù)_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第3章 函數(shù) C+程序設(shè)計網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室2本章內(nèi)容在結(jié)構(gòu)化程序設(shè)計中,函數(shù)是將任務(wù)進(jìn)行模塊劃分的基本單位。一個函數(shù)實現(xiàn)一項功能。在面向?qū)ο蟪绦蛟O(shè)計中,函數(shù)是對數(shù)據(jù)的一項操作,也是實現(xiàn)一項功能。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室33.5 作用域與標(biāo)識符的可見性 3.4 函數(shù)調(diào)用機(jī)制 3.3 全局變量和局部變量 3.2 函數(shù)的參數(shù)傳遞,返回值及函數(shù)聲明 3.9 頭文件與多文件結(jié)構(gòu) 3.6 存儲類型與標(biāo)識符的生命期 3.8 函數(shù)的一些高級議題 3.7 函數(shù)的遞歸調(diào)用 本章內(nèi)容3.1 函數(shù)的定義與調(diào)用9/20/2022網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室43.1 函數(shù)的定義與調(diào)用3.1.1 函數(shù)概述3.1.2 函

2、數(shù)定義3.1.3 函數(shù)調(diào)用網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室5函數(shù)是C+程序的基本組成模塊。通過函數(shù),可以把一個復(fù)雜任務(wù)分解成為若干個易于解決的小任務(wù)。充分體現(xiàn)逐步細(xì)化的設(shè)計思想。組成C+程序的若干函數(shù)中,有一個稱為main()(Winmain())函數(shù),是程序執(zhí)行的入口,它可以調(diào)用其他函數(shù),但不可以被調(diào)用。而其他一般函數(shù)既可以調(diào)用也可以被調(diào)用。函數(shù)概念的引入:入口函數(shù):3.1.1 函數(shù)概述網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室6圖3.1 函數(shù)調(diào)用層次關(guān)系main ( )fun2( )fun1( )fun3( )funa( )funb( )func( )3.1.1 函數(shù)概述程序執(zhí)行的入口網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室7 庫

3、函數(shù)和自定義函數(shù):庫函數(shù)或標(biāo)準(zhǔn)函數(shù),是由編譯系統(tǒng)預(yù)定義的,如一些常用的數(shù)學(xué)計算函數(shù)、字符串處理函數(shù)、圖形處理函數(shù)、標(biāo)準(zhǔn)輸入輸出函數(shù)等。庫函數(shù)都按功能分類,集中說明在不同的頭文件中。用戶只需在自己的程序中包含某個頭文件,就可直接使用該文件中定義的函數(shù)。用戶根據(jù)需要將某個具有相對獨立功能的程序定義為函數(shù),稱自定義函數(shù)。3.1.1 函數(shù)概述網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室8函數(shù)頭函數(shù)體數(shù)據(jù)類型 函數(shù)名(形式參數(shù)表) 語句序列 定義函數(shù)返回值的數(shù)據(jù)類型。若無返回值,void函數(shù)返回值由 return 語句給出3.1.2 函數(shù)的定義函數(shù)運行時需要的數(shù)據(jù),由主調(diào)函數(shù)提供。若無,void或者省略函數(shù)體可以為空,稱為

4、空函數(shù)。 網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室93.1.2 函數(shù)的定義 無參函數(shù)/打印一個表頭void TableHead ( ) cout*endl; cout* example *endl; cout*endl;函數(shù)頭函數(shù)的數(shù)據(jù)類型定義了返回值的數(shù)據(jù)類型int input ( ) /輸入滿足要求的數(shù)據(jù) int n; cout輸入一個大于5的整數(shù):n; while(n=b ? a : b); 有參函數(shù)的參數(shù)表中列出所有形式參數(shù)的類型和參數(shù)名稱。各參數(shù)即使類型相同也必須分別加以說明。 形式參數(shù)簡稱形參,只能是變量名,不允許是常量或表達(dá)式。 /延時一段時間void delay(long n) int i;

5、for (i=0; in; i+); 數(shù)據(jù)類型 函數(shù)名 ( 參數(shù)類型1形式參數(shù)1, 參數(shù)類型2形式參數(shù)2, )函數(shù)體有參函數(shù)3.1.2 函數(shù)的定義網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室12問題:定義函數(shù)時究竟哪些變量應(yīng)當(dāng)作為函數(shù)的參數(shù)?哪些應(yīng)當(dāng)定義在函數(shù)體內(nèi)?原則:函數(shù)在使用時被看成“黑匣子”,除了輸入輸出外,其他部分可不必關(guān)心。 函數(shù)頭即用來反映函數(shù)的使用接口,明確了“黑匣子”的輸入輸出部分,輸出就是函數(shù)的返回值,輸入就是參數(shù)。 只有那些在函數(shù)功能上起自變量作用的變量才必須作為參數(shù)定義在參數(shù)表中;函數(shù)體中具體描述“如何做”,因此除參數(shù)之外的為實現(xiàn)算法所需用的變量應(yīng)當(dāng)定義在函數(shù)體內(nèi)。 C+中不允許函數(shù)的嵌套

6、定義,即不允許在一個函數(shù)中定義另一個函數(shù)。提示網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室133.1.3 函數(shù)的調(diào)用函數(shù)調(diào)用所謂函數(shù)調(diào)用,就是使程序轉(zhuǎn)去執(zhí)行函數(shù)體。 無參函數(shù)的調(diào)用格式: 函數(shù)名( ) 有參函數(shù)的調(diào)用格式: 函數(shù)名(實際參數(shù)表)實際參數(shù)簡稱實參,用來將實際參數(shù)的值傳遞給形參,因此可以是常量、具有值的變量或表達(dá)式。在C+中,除了主函數(shù)外,其他任何函數(shù)都不能單獨作為程序運行。任何函數(shù)功能的實現(xiàn)都是通過被主函數(shù)直接或間接調(diào)用進(jìn)行的。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室14【例3.1】 輸入兩個實數(shù),輸出其中較大的數(shù)。其中求兩個實數(shù)中的較大數(shù)用函數(shù)完成。main( )函數(shù)調(diào)用max(2.5,4.7 )函數(shù)max(2.

7、5,4.7 )return 4.7 主程序后續(xù)語句程序如下:#include using namespace std;float max(float a, float b) return(a=b ? a : b);int main()float x, y;cout輸入兩個實數(shù):xy;coutx和y中較大數(shù)為max(x, y)endl;return 0;9/20/2022網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室153.2 函數(shù)的參數(shù)傳遞、返回值及函數(shù)聲明3.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用 3.2.2 函數(shù)返回值 3.2.3 函數(shù)聲明網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室16 3.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用 傳值調(diào)用和

8、引用調(diào)用:按照參數(shù)形式的不同,C+有兩種調(diào)用方式:傳值調(diào)用和引用調(diào)用。傳值調(diào)用傳遞的是實參的值,本章介紹傳值調(diào)用網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室17 3.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用 傳值調(diào)用:將實參的值復(fù)制給形參,在函數(shù)中參加運算的是形參,而實參不會發(fā)生任何改變。傳值調(diào)用起了一種隔離作用。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室18【例3.2】 實參和形參對應(yīng)關(guān)系的示例。調(diào)用power(4.6,3 )函數(shù)power(4.6,3 )return 97.336 主程序后續(xù)語句n = 3x = 4.6c = afloat power(float x, int n) /求x的n次冪 float p=1; while(n

9、-) p*=x; return p; int main() int n=3; float x=4.6; char c=a; coutpower(x,n)=power(x,n)endl; coutpower(c,n)=power(c,n)endl; coutpower(n,x)=power(n,x)endl; return 0;網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室19【例3.2】 實參和形參對應(yīng)關(guān)系的示例。調(diào)用power(a,3 )函數(shù)power(97,3 )return912673 主程序后續(xù)語句n = 3x = 4.6c = afloat power(float x, int n) /求x的n次冪 fl

10、oat p=1; while(n-) p*=x; return p; int main() int n=3; float x=4.6; char c=a; coutpower(x,n)=power(x,n)endl; coutpower(c,n)=power(c,n)endl; coutpower(n,x)=power(n,x)endl; return 0;網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室20【例3.2】 實參和形參對應(yīng)關(guān)系的示例。調(diào)用power(3,4.6 )函數(shù)power(3,4 )return81主程序后續(xù)語句n = 3x = 4.6c = afloat power(float x, int n

11、) /求x的n次冪 float p=1; while(n-) p*=x; return p; int main() int n=3; float x=4.6; char c=a; coutpower(x,n)=power(x,n)endl; coutpower(c,n)=power(c,n)endl; coutpower(n,x)=power(n,x)endl; return 0;網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室213.2.2 函數(shù)返回值 return語句的作用: 返回函數(shù)值 不再執(zhí)行后續(xù)語句,程序控制返回調(diào)用點 一個函數(shù)體內(nèi)可以有多個return 語句 表達(dá)式返回值的類型與函數(shù)類型不相同時,自動強(qiáng)制

12、轉(zhuǎn)換成函數(shù)的類型return語句的格式:return 表達(dá)式;【例3.3】設(shè)計函數(shù),根據(jù)三角形的三邊長求面積。如果不能構(gòu)成三角形,給出提示信息。分析:函數(shù)為計算三角形面積,一般三角形返回面積值,若不能構(gòu)成三角形則返回-1。設(shè)計一個主函數(shù)完成函數(shù)測試。根據(jù)返回值情況輸出相應(yīng)結(jié)果。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室22【例3.3】程序:float TriangleArea(float a, float b, float c) if (a+b=c)|(a+c=b)|(b+c=a) return -1; float s; s=(a+b+c)/2; return sqrt(s*(s-a)*(s-b)*(s-c)

13、;int main() float a, b, c, area; cout輸入三角形三邊a,b,c:abc; area = TriangleArea(a, b, c); if(area = -1) cout(a,b, c)不能構(gòu)成三角形!endl; else cout三角形(a,b,c)面積為areaendl; return 0;#include #include using namespace std;網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室23討論: -函數(shù)可以有返回值,也可以沒有返回值。對于沒有返回值的函數(shù),功能只是完成一定操作,應(yīng)將返回值類型定義為void ,函數(shù)體內(nèi)可以沒有return語句,當(dāng)需要在

14、程序指定位置退出時,可以在該處放置一個:return ;3.2.2結(jié)束3.2.2 函數(shù)返回值網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室24【例3.3】程序:#include #include using namespace std;output(a, b, c, TriangleArea(a, b, c);float TriangleArea(float a, float b, float c) if (a+b=c)|(a+c=b)|(b+c=a) return -1; float s; s=(a+b+c)/2; return sqrt(s*(s-a)*(s-b)*(s-c) ;void output(floa

15、t a, float b, float c, float area) if(area = -1) cout(a,b, c)不能構(gòu)成三角形!endl; return; cout三角形(a,b,c)面積為:areaendl; return;int main() float a, b, c, area; cout輸入三角形三邊a,b,c:abc; area = TriangleArea(a, b, c); output(a, b, c, area); return 0;網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室253.2.3 函數(shù)聲明語法上對程序文件中函數(shù)的排列次序要求滿足先定義后使用。對于函數(shù),只要在調(diào)用之前作函數(shù)

16、聲明(Function Declaration),則函數(shù)定義放在任何位置程序都能正確編譯運行。 函數(shù)聲明的引入:函數(shù)聲明的格式: 函數(shù)聲明是一條以分號結(jié)束的語句: 數(shù)據(jù)類型 函數(shù)名(形式參數(shù)表); 網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室26例如【例3.3】中求三角形面積的函數(shù)聲明為:float TriangleArea(float a, float b, float c);或float TriangleArea(float, float, float);但下面的函數(shù)原型是錯誤的:int TriangleArea(float, float, float);/錯誤,返回值類型不同float TriangleAr

17、ea(int, int, int); /錯誤,參數(shù)類型不同float TriangleArea(float, float);/錯誤,參數(shù)個數(shù)不同float TriangleArea(float a, float b, float c) if (a+b=c)|(a+c=b)|(b+cchoice; if (choice=4) continue; if (choice = 0) break; switch(choice) case 1: account_report(); break; case 2: engineering_report(); break; case 3: marketing_r

18、eport(); break; while(1); return 0;#include using namespace std;網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室28void menu_print() cout系統(tǒng)功能:endl; cout1 財務(wù)報表endl; cout2 工程報表endl; cout3 市場報表endl; cout0 退出endl; cout選擇業(yè)務(wù)序號:; void account_report() /生成財務(wù)報表 cout生成財務(wù)報表endlendl;void engineering_report()/生成工程報表 cout生成工程報表endlendl;void marketin

19、g_report()/生成市場報表; cout生成市場報表endlendl;網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室293.2.3 函數(shù)聲明【例3.4】 輸出所有滿足下列條件的正整數(shù)m:10m1000且m、m2、m3均為回文數(shù)。分析:回文指左右對稱的序列。如121、353等就是回文數(shù)。判斷整數(shù)是否回文數(shù)用函數(shù)實現(xiàn),其思想是將該數(shù)各位拆開后反向組成新的整數(shù),如果該整數(shù)與原數(shù)相等則為回文數(shù)。m m*m m*m*m11 121 1331101 10201 1030301111 12321 1367631 運行結(jié)果:網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室30bool palindrome(int); /函數(shù)聲明int main()

20、 int m; coutsetw(10)msetw(20)m*m setw(20)m*m*mendl; for(m=11; m1000; m+) if(palindrome(m)&palindrome(m*m)&palindrome(m*m*m) coutsetw(10)msetw(20)m*m setw(20)m*m*m0); for(j=0; ji; j+) n=n*10 + digitj; return (n=m);#include #include using namespace std;9/20/2022網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室313.3 全局變量和局部變量3.3.1 變量的存儲機(jī)制

21、與C+的內(nèi)存布局 3.3.2 全局變量 3.3.3 局部變量網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室323.3.1 變量的存儲機(jī)制與C+的內(nèi)存布局自由存儲區(qū) (動態(tài)數(shù)據(jù)) 操作系統(tǒng)為一個C+程序的運行所分配的內(nèi)存分為四個區(qū)域:棧區(qū)(函數(shù)局部數(shù)據(jù))全局?jǐn)?shù)據(jù)區(qū)(全局變量、靜態(tài)變量)代碼區(qū)(程序代碼)(main函數(shù)局部數(shù)據(jù))網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室333.3.1 變量的存儲機(jī)制與C+的內(nèi)存布局自由存儲區(qū) (動態(tài)數(shù)據(jù)) 操作系統(tǒng)為一個C+程序的運行所分配的內(nèi)存分為四個區(qū)域:棧區(qū)(函數(shù)局部數(shù)據(jù))全局?jǐn)?shù)據(jù)區(qū)(全局、靜態(tài)變量)代碼區(qū)(程序代碼)(main函數(shù)局部數(shù)據(jù))存放程序代碼,即程序中各個函數(shù)的代碼塊存放全局?jǐn)?shù)據(jù)和靜態(tài)

22、數(shù)據(jù);分配該區(qū)時內(nèi)存全部清零,變量的所有字節(jié)等效初始化為全存放局部變量,如函數(shù)中的變量等;分配棧區(qū)時不處理內(nèi)存,即變量取隨機(jī)值存放與指針相關(guān)的動態(tài)數(shù)據(jù);分配自由存儲區(qū)時也不處理內(nèi)存,變量也取隨機(jī)值。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室34 3.3.2 全局變量 在所有函數(shù)之外定義的變量稱為全局變量。全局變量存放在全局?jǐn)?shù)據(jù)區(qū),因編譯器自動將該區(qū)清為全0,如果用戶在定義時不顯式給出初始化值,則等效初始化為全0 。全局變量可定義在程序開頭,也可定義在中間位置,該全局變量在定義處之后的任何位置都是可以訪問的。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室35打印200調(diào)用func( )函數(shù)func( )200*2=400打印400n=

23、100n=100*2=200【例3.5】 多個函數(shù)使用全局變量的例子。int n=100;void func() n*=2; int main() n*=2; coutnendl; func(); coutnendl; return 0;網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室363.3.3 局部變量 定義在函數(shù)內(nèi)或塊內(nèi)的變量稱為局部變量。程序中使用的絕大多數(shù)變量都是局部變量。局部變量在程序運行到它所在的塊時建立在棧中,該塊執(zhí)行完畢局部變量占有的空間即被釋放。故亦稱為自動變量。局部變量在定義時可加修飾詞auto,但通常省略。局部變量在定義時若未初始化,其值為隨機(jī)數(shù)。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室37打印main()

24、中的t=3.5調(diào)用fun( )函數(shù)fun( )打印fun()中的t=5 打印main()中的t=3.5t = 3.5t = 5【例3.6】 使用局部變量的例子。void fun() auto int t=5; / fun()中的局部變量,auto可省略 coutfun()中的t=tendl;int main() float t=3.5; /main()函數(shù)中的局部變量 coutmain()中的t=tendl; fun(); coutmain()中的t=tendl; return 0;9/20/2022網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室383.4 函數(shù)調(diào)用機(jī)制局部變量占用的內(nèi)存是在程序執(zhí)行過程中“動態(tài)”地

25、建立和釋放的這種“動態(tài)”是通過棧由系統(tǒng)自動管理進(jìn)行的。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室39局部變量占用的內(nèi)存是在程序執(zhí)行過程中“動態(tài)”地建立和釋放的。這種“動態(tài)”是通過棧由系統(tǒng)自動管理進(jìn)行的。函數(shù)調(diào)用機(jī)制 函數(shù)調(diào)用過程:(1)建立??臻g;(2)保護(hù)現(xiàn)場:主調(diào)函數(shù)運行狀態(tài)和返回地址入棧; (3)為被調(diào)函數(shù)中的局部變量分配空間,完成參數(shù)傳遞; (4)執(zhí)行被調(diào)函數(shù)函數(shù)體; (5)釋放被調(diào)函數(shù)中局部變量占用的??臻g;(6)恢復(fù)現(xiàn)場:取主調(diào)函數(shù)運行狀態(tài)及返回地址,釋放??臻g; (7)繼續(xù)主調(diào)函數(shù)后續(xù)語句。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室40void fun1(int, int);void fun2(float);int

26、 main() int x=1, y=2; fun1(x, y); return 0;void fun1(int a, int b) float x=3; fun2(x);void fun2(float y) int x; x棧頂棧底y3fun2()fun1()運行狀態(tài)及返回地址x3a1b2fun1()main()運行狀態(tài)及返回地址y2x1main()操作系統(tǒng)運行狀態(tài)及返回地址3.4 函數(shù)調(diào)用機(jī)制 此圖例說明在程序執(zhí)行過程中怎樣通過?!皠討B(tài)”地建立和釋放局部變量占用的內(nèi)存的注意函數(shù)參數(shù)的壓棧順序9/20/2022網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室413.5 作用域與標(biāo)識符的可見性作用域:指標(biāo)識符能夠被使

27、用的范圍。只有在作用域內(nèi)標(biāo)識符才可以被訪問(稱為可見)。作用域分為局部域和文件域(全局域),其中局部域包括塊域和函數(shù)聲明域。任何標(biāo)識符作用域的起始點均為標(biāo)識符說明處。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室42 塊指一對大括號括起來的程序段。塊中定義的標(biāo)識符,作用域在塊內(nèi)。復(fù)合語句是一個塊。復(fù)合語句中定義的標(biāo)識符,作用域僅在該復(fù)合語句中。函數(shù)也是一個塊。函數(shù)中定義的標(biāo)識符,包括形參和函數(shù)體中定義的局部變量,作用域都在該函數(shù)內(nèi),也稱作函數(shù)域。塊的引入:塊 域網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室43 b = 5a = 335a=3 b=5a=5 b=3【例3.7】 輸入兩數(shù),按從大到小的順序保存,并輸出結(jié)果。結(jié)果棧 t =

28、3 int main() int a, b; /具有函數(shù)域 cout輸入兩整數(shù):ab; cout“a=atb=b=a)int t; /具有塊域 t=a; a=b; b=t; /交換a,b的值 couta=atb=bendl; return 0;上述程序若在最后一個cout語句處增加:couttendl;則編譯時會提示錯誤,因為變量t的作用域只在if語句中,其它地方不可見。塊 域網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室44由VC+運行,結(jié)果如下:輸入兩整數(shù):3 5調(diào)用前:實參a=3,b=5調(diào)用中交換前:形參a=3,b=5交換后:形參a=5,b=3調(diào)用后:實參a=3,b=5 交換失敗操作系統(tǒng)運行狀態(tài)及返回地址ma

29、in()3a5bmain()運行狀態(tài)及返回地址swap()3a5b3t35 3.5.1 塊域局部變量具有局部作用域,使得程序在不同塊中可以使用同名變量。這些同名變量各自在自己的作用域中可見,在其它地方不可見【例3.8】設(shè)計函數(shù)完成兩數(shù)交換,用主函數(shù)進(jìn)行測試。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室 200 3001100 500 600100 500 200 300200+300=500【例3.9】 顯示同名變量可見性。#include using namespace std;int n=100;int main() int i=200, j=300; coutntitjendl; /內(nèi)部塊 int i=50

30、0, j=600,n; n=i+j; coutntitjendl; /輸出局部變量n cout:nendl;/輸出全局變量n n=i+j;/修改全局變量 coutntitjendl; return 0; 對于塊中嵌套其它塊的情況,如果嵌套塊中有同名局部變量,服從局部優(yōu)先原則。 在塊內(nèi)可以通過域運算符“:”訪問同名的全局變量。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室46 函數(shù)聲明不是定義函數(shù),在作函數(shù)聲明時,其中的形參作用域只在聲明中,即作用域結(jié)束于右括號。正是由于形參不能被程序的其他地方引用,所以通常只要聲明形參個數(shù)和類型,形參名可省略。3.5.2 函數(shù)聲明域 網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室473.5.3 文件域文

31、件域也稱全局域。定義在所有函數(shù)之外的標(biāo)識符作用域為從定義處到整個源文件結(jié)束,即文件域。文件中定義的全局變量和函數(shù)的作用域為文件域。9/20/2022網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室483.6 存儲類型與標(biāo)識符的生命期 3.6.1 存儲類型3.6.2 生命期網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室493.6 存儲類型與標(biāo)識符的生命期 存儲類型決定標(biāo)識符的存儲區(qū)域,即編譯系統(tǒng)在不同區(qū)域為不同存儲類型的標(biāo)識符分配空間。由于存儲區(qū)域不同,標(biāo)識符的生命期也不同。所謂生命期,指的是標(biāo)識符從獲得空間到空間釋放之間的期間,標(biāo)識符只有在生存期中、并且在其自己的作用域中才能被訪問。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室50用auto和register

32、修飾的稱為自動存儲類型用static修飾的稱為靜態(tài)存儲類型用extern修飾的稱為外部存儲類型。3.6.1 存儲類型 存儲類型的說明符autoregisterstaticextern網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室51自動存儲類型自動變量為用auto說明的變量,通常auto缺省。局部變量都是自動變量,生命期開始于塊的執(zhí)行,結(jié)束于塊的結(jié)束,其原因是自動變量的空間分配在棧中,塊開始執(zhí)行時系統(tǒng)自動分配空間,塊執(zhí)行結(jié)束時系統(tǒng)自動釋放空間。故自動變量的生命期和作用域是一致的。3.6.1 存儲類型 網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室523.6.1 存儲類型 靜態(tài)存儲類型static說明的變量稱為靜態(tài)變量。根據(jù)定義位置不同區(qū)

33、別局部靜態(tài)變量和全局靜態(tài)變量,也稱內(nèi)部靜態(tài)變量和外部靜態(tài)變量。靜態(tài)變量存儲在全局?jǐn)?shù)據(jù)區(qū),如果程序未顯式給出初始化值,則等效初始化為全0。靜態(tài)變量占有的空間要到整個程序執(zhí)行結(jié)束才釋放,故靜態(tài)變量具有整個程序執(zhí)行期間的生命期。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室53局部靜態(tài)變量是定義在塊中的靜態(tài)變量,編譯系統(tǒng)在全局?jǐn)?shù)據(jù)區(qū)為其開辟空間并保存數(shù)據(jù),如果顯式給出初始化值,則在該塊第一次執(zhí)行時完成,且只進(jìn)行一次。【例3.10】 自動變量與局部靜態(tài)變量的區(qū)別3.6.1 存儲類型 網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室54【例3.10】 自動變量與局部靜態(tài)變量的區(qū)別 int st() static int t=100; /局部靜態(tài)變量

34、 t+; return t;int at() int t=100; /自動變量 t+; return t;int main() int i; for(i=0;i3;i+) coutat()t; coutendl; for(i=0;i5;i+) coutst()t; coutendl; return 0; i= 0 t= 100121011011013.6.1 存儲類型 網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室55i = 0t =10012101102103【例3.10】 自動變量與局部靜態(tài)變量的區(qū)別 int st() static int t=100; /局部靜態(tài)變量 t+; return t;int at(

35、) int t=100; /自動變量 t+; return t;int main() int i; for(i=0;i3;i+) coutat()t; coutendl; for(i=0;i3;i+) coutst()t; coutendl; return 0;3.6.1 存儲類型 網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室563.6.2 生命期靜態(tài)生命期靜態(tài)生命期指的是標(biāo)識符從程序開始運行時就存在,具有存儲空間,到程序運行結(jié)束時消亡,釋放存儲空間。具有靜態(tài)生命期的標(biāo)識符存放在全局?jǐn)?shù)據(jù)區(qū),如全局變量、靜態(tài)全局變量、靜態(tài)局部變量。具有靜態(tài)生命期的標(biāo)識符在未被用戶初始化的情況下,系統(tǒng)會等效將其初始化為全0。網(wǎng)絡(luò)與計

36、算中心基礎(chǔ)教研室57 3.6.2 生命期 局部生命期在塊中定義的標(biāo)識符具有局部生命期,其生命期開始于該標(biāo)識符定義處,結(jié)束于塊的結(jié)束處。具有局部生命期的標(biāo)識符存放在棧區(qū)。具有局部生命期的標(biāo)識符如果未被初始化,其內(nèi)容是隨機(jī)的。具有局部生命期的標(biāo)識符必定具有局部作用域;但反之不然,靜態(tài)局部變量具有局部作用域,但卻具有靜態(tài)生命期。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室583.6.2 生命期動態(tài)生命期具有動態(tài)生命期的標(biāo)識符存放在自由存儲區(qū),由特定的函數(shù)調(diào)用或運算來創(chuàng)建和釋放如用new運算符(或調(diào)用malloc函數(shù))為變量分配存儲空間時,變量的生命期開始而用delete運算符(或調(diào)用free函數(shù))釋放空間或程序結(jié)束時,

37、變量生命期結(jié)束9/20/2022網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室593.7 函數(shù)的遞歸調(diào)用 自己調(diào)用自己網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室60可以看出是用階乘定義階乘,這種自己定義自己的方法稱為遞歸定義。遞歸的引入 遞歸是一種描述問題的方法,或稱算法。遞歸的思想可以簡單地描述為“自己調(diào)用自己”。例如用如下方法定義階乘:網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室61遞歸定義的階乘函數(shù):fac(int n) int y; if (n=0 | n=1) y=1; else y=n*fac(n-1); return y;只要設(shè)計主函數(shù)調(diào)用階乘函數(shù),即可實現(xiàn)計算階乘。遞歸的引入遞歸函數(shù)必須定義遞歸終止條件,避免無窮遞歸。網(wǎng)絡(luò)與計算中心基礎(chǔ)

38、教研室62 n=4cout4;y=4*fac(3);fac(4)=cout2;y=2*fac(1); n=2cout1;y=1;cout1;return 1; n=1 n=3cout3;y=3*fac(2);cout24;return 24;cout6;return 6;cout2;return 2;24遞歸的引入【例3.12】 求4!#include int fac(int n) int y; coutnt; if(n=0|n=1) y=1; else y=n*fac(n-1); coutyt; return y;int main() coutn4!=fac(4)endl; return o

39、;網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室63遞歸過程分析遞歸函數(shù)的執(zhí)行分為“遞推”和“回歸”兩個過程這兩個過程由遞歸終止條件控制,即逐層遞推,直至遞歸終止條件,然后逐層回歸。每次調(diào)用發(fā)生時都首先判斷遞歸終止條件現(xiàn)場與返回地址第一層fac(4)域4n4*624y現(xiàn)場與返回地址第二層fac(3)域3n3*26y現(xiàn)場與返回地址第三層fac(2)域2n2*12y現(xiàn)場與返回地址第四層fac(1)域ny11存fac(1)返回值存fac(2)返回值存fac(3)返回值126fac(4)返回值=24main()域存fac(4)返回值249/20/2022網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室643.8 函數(shù)的重載、內(nèi)聯(lián)及默認(rèn)參數(shù) 3.8

40、.1 函數(shù)重載 3.8.2 默認(rèn)參數(shù)3.8.3 內(nèi)聯(lián)函數(shù)網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室653.8.1 函數(shù)重載 3.8.1 函數(shù)重載 重載的引入C+中,如果需要定義幾個功能相似,而參數(shù)類型不同的函數(shù),那么這樣的幾個函數(shù)可以使用相同的函數(shù)名,這就是函數(shù)重載例:求和函數(shù)對應(yīng)不同的參數(shù)類型可以定義如下幾個重載函數(shù):int sum(int a, int b)double sum(double a, double b)float sum(float a, float b, float c)網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室66因此在定義重載函數(shù)時必須保證參數(shù)類型不同,僅僅返回值類型不同是不行的。3.8.1 函數(shù)重載 重

41、載匹配規(guī)則(1)如果有嚴(yán)格匹配的函數(shù),就調(diào)用該函數(shù);(2)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù);(3)通過用戶定義的轉(zhuǎn)換尋求匹配。網(wǎng)絡(luò)與計算中心基礎(chǔ)教研室673.8.1 函數(shù)重載 3+5=調(diào)用sum(3,5 )函數(shù)sum(3,5 )return 8 2.2+5.6=調(diào)用sum(2.2,5.6 )函數(shù)double sum(2.2,5.6 )return 7.8 3.5+4+8=調(diào)用sum(3.5, 4, 8 )函數(shù)float sum(3.5, 4.0, 8.0 )return 15.5 結(jié)束87.815.5【例3.16】 重載函數(shù)的應(yīng)用。int sum(int a,int b) return a+b;double sum(double a,double b) return a+b;float sum(float a,float b,float c) return a+b+c;int main() cout3+5=sum(3, 5) endl; cout2.2+5.6= sum(2.2,

溫馨提示

  • 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

提交評論