國(guó)家級(jí)精品課程網(wǎng)站_第1頁(yè)
國(guó)家級(jí)精品課程網(wǎng)站_第2頁(yè)
國(guó)家級(jí)精品課程網(wǎng)站_第3頁(yè)
國(guó)家級(jí)精品課程網(wǎng)站_第4頁(yè)
國(guó)家級(jí)精品課程網(wǎng)站_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、國(guó)家級(jí)精品課程網(wǎng)站(本書(shū)配套教學(xué)網(wǎng)站)http:/ 1第7章 函數(shù)與指針7.1 遞歸函數(shù)遞歸函數(shù)7.2 函數(shù)重載函數(shù)重載7.3 指針和函數(shù)指針和函數(shù)7.4 帶參數(shù)的帶參數(shù)的main()函數(shù)函數(shù)7.5 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)7.6 無(wú)參函數(shù)無(wú)參函數(shù)7.7 void和和const類型的指針類型的指針27.1 遞歸函數(shù)1、遞歸調(diào)用、遞歸調(diào)用一個(gè)函數(shù)自己調(diào)用自己,這種調(diào)用稱為遞歸調(diào)用。一個(gè)函數(shù)自己調(diào)用自己,這種調(diào)用稱為遞歸調(diào)用。2、遞歸調(diào)用的方式、遞歸調(diào)用的方式(1)直接調(diào)用其本身)直接調(diào)用其本身(2)通過(guò)其他函數(shù)間接地調(diào)用)通過(guò)其他函數(shù)間接地調(diào)用33、一個(gè)問(wèn)題是否可以轉(zhuǎn)換為遞歸來(lái)處理必須滿足以下條件:、一

2、個(gè)問(wèn)題是否可以轉(zhuǎn)換為遞歸來(lái)處理必須滿足以下條件:(1)必須包含一種或多種非遞歸的基本形式;)必須包含一種或多種非遞歸的基本形式;(2)一般形式必須能最終轉(zhuǎn)換到基本形式;)一般形式必須能最終轉(zhuǎn)換到基本形式;(3)由基本形式來(lái)結(jié)束遞歸。)由基本形式來(lái)結(jié)束遞歸。遞歸調(diào)用在堆棧中臨時(shí)占據(jù)的存儲(chǔ)區(qū)域是較多的,在實(shí)際遞歸調(diào)用在堆棧中臨時(shí)占據(jù)的存儲(chǔ)區(qū)域是較多的,在實(shí)際運(yùn)行時(shí),遞歸調(diào)用的時(shí)間效率較差。運(yùn)行時(shí),遞歸調(diào)用的時(shí)間效率較差。4例7-1 采用遞歸算法求n!int fac(int n) if(n1時(shí),就需要借助另外一個(gè)針來(lái)移動(dòng)。將時(shí),就需要借助另外一個(gè)針來(lái)移動(dòng)。將n片金片由片金片由A移到移到C上上可以分解

3、為以下幾個(gè)步驟:可以分解為以下幾個(gè)步驟: (1) 將將A上的上的n 1片金片借助片金片借助C針移到針移到B針上針上; (2) 把把A針上剩下的一片金片由針上剩下的一片金片由A針移到針移到C針上針上; (3) 最后將剩下的最后將剩下的n 1個(gè)金片借助個(gè)金片借助A針由針由B針移到針移到C針上。針上。步驟步驟(1)和和(3)與整個(gè)任務(wù)類似,但涉及的金片只有與整個(gè)任務(wù)類似,但涉及的金片只有n 1個(gè)了。這是個(gè)了。這是一個(gè)典型遞歸算法。一個(gè)典型遞歸算法。 67例8-2 梵塔(hanoi塔)問(wèn)題#include using namespace std; const int N=3;/考察當(dāng)金片數(shù)為考察當(dāng)金片

4、數(shù)為3個(gè)時(shí)的情況個(gè)時(shí)的情況 / 函數(shù)函數(shù)move():將金片由一根針移到另一根針上:將金片由一根針移到另一根針上void move(char from, char to) cout From from to to endl;8/ 函數(shù)函數(shù) hanoi():將:將n片金片由片金片由p1借助借助p2移到移到p3上上void hanoi(int n, char p1, char p2, char p3) if(n=1) move(p1, p3); else hanoi(n-1, p1, p3, p2); move(p1, p3); hanoi(n-1, p2, p1, p3); 9 / 測(cè)試用主函數(shù)

5、int main()hanoi(N, A, B, C);return 0; 107.2 函數(shù)重載函數(shù)重載函數(shù)重載一組參數(shù)和返回值不同的函數(shù)共用一個(gè)函數(shù)名。一組參數(shù)和返回值不同的函數(shù)共用一個(gè)函數(shù)名。函數(shù)重載使一個(gè)函數(shù)名具有多種功能,即具有函數(shù)重載使一個(gè)函數(shù)名具有多種功能,即具有“多多種形態(tài)種形態(tài)”,稱這種形態(tài)為多態(tài)性。,稱這種形態(tài)為多態(tài)性。當(dāng)某個(gè)函數(shù)中調(diào)用到重載函數(shù)時(shí),編譯器會(huì)根據(jù)實(shí)當(dāng)某個(gè)函數(shù)中調(diào)用到重載函數(shù)時(shí),編譯器會(huì)根據(jù)實(shí)參的類型去對(duì)應(yīng)地調(diào)用相應(yīng)的函數(shù)。匹配過(guò)程如參的類型去對(duì)應(yīng)地調(diào)用相應(yīng)的函數(shù)。匹配過(guò)程如下:下:(1)如果有嚴(yán)格匹配的函數(shù),就調(diào)用該函數(shù);)如果有嚴(yán)格匹配的函數(shù),就調(diào)用該函數(shù);

6、(2)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù);)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù);(3)通過(guò)用戶定義的轉(zhuǎn)換尋求匹配。)通過(guò)用戶定義的轉(zhuǎn)換尋求匹配。11例7-3 重載絕對(duì)值函數(shù)#include using namespace std;int abs(int x) return x=0?x:-x; double abs(double x) return x=0?x:-x; long abs(long x) return x=0?x:-x; 12int main() int x1 = 1;double x2 = -2.5;long x3 = 3L;cout |x1| = abs(x1) endl;co

7、ut |x2| = abs(x2) endl;cout |x3| = abs(x3) =1 & n=12)?monthn:month0;17void main( ) coutendl; coutmonth_name(3); cout“ 15,2000”;18三. 指向函數(shù)的指針首地址是函數(shù)的入口地址。主函數(shù)在調(diào)用子函數(shù)時(shí),首地址是函數(shù)的入口地址。主函數(shù)在調(diào)用子函數(shù)時(shí),就是讓程序轉(zhuǎn)移到函數(shù)的入口地址開(kāi)始執(zhí)行。就是讓程序轉(zhuǎn)移到函數(shù)的入口地址開(kāi)始執(zhí)行。指向函數(shù)的指針:就是指針的值為該函數(shù)的入口地指向函數(shù)的指針:就是指針的值為該函數(shù)的入口地址。址。19指向函數(shù)的指針變量的說(shuō)明格式為指向函數(shù)的指針變量的

8、說(shuō)明格式為: (*)();例如例如:int(*p)();/ p為指向返回值為整型的函數(shù)的指針為指向返回值為整型的函數(shù)的指針float(*q)(float,int);/ q為指向返回值為浮點(diǎn)型函數(shù)的為指向返回值為浮點(diǎn)型函數(shù)的指針指針20例7-5 通用數(shù)值積分函數(shù)double integral(double a, double b, double (*fun)(double), int n) double h = (b-a)/n;double sum = (*fun)(a)+(*fun)(b)/2;int i;for(i=1; in; i+)sum += (*fun)(a+i*h);sum *=

9、h;return sum; 217.4 帶參數(shù)的main()函數(shù)函數(shù)原型為:函數(shù)原型為:int main(int argc, char *argv) 第一個(gè)整型參數(shù)第一個(gè)整型參數(shù)指明在以命令行方式執(zhí)行本程序時(shí)所帶的參數(shù)個(gè)數(shù)(包括程序名指明在以命令行方式執(zhí)行本程序時(shí)所帶的參數(shù)個(gè)數(shù)(包括程序名本身,故本身,故argc的值至少為的值至少為1););第二個(gè)參數(shù)第二個(gè)參數(shù)為一個(gè)字符型指針數(shù)組(其中第為一個(gè)字符型指針數(shù)組(其中第1個(gè)下標(biāo)變量個(gè)下標(biāo)變量argv0指向本程序名,指向本程序名,接下來(lái)的下標(biāo)變量接下來(lái)的下標(biāo)變量argv1,argv2.等分別指向命令行傳遞給程等分別指向命令行傳遞給程序的各個(gè)參數(shù)),

10、用來(lái)存放命令行中命令字及各個(gè)參數(shù)的字符序的各個(gè)參數(shù)),用來(lái)存放命令行中命令字及各個(gè)參數(shù)的字符串。串。22例7-6 帶參數(shù)的main函數(shù)#includeint main(int a, char *ar) if(a!=2) coutError!endl;coutUsage: ProgramName endl;return 1;coutHello, ar1. Welcome to the world of C+ !endl;return 0;237.5 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)機(jī)制通過(guò)將函數(shù)體的代碼直接插入到函數(shù)內(nèi)聯(lián)函數(shù)機(jī)制通過(guò)將函數(shù)體的代碼直接插入到函數(shù)調(diào)用處來(lái)節(jié)省調(diào)用函數(shù)的時(shí)間開(kāi)銷調(diào)用處來(lái)節(jié)省調(diào)用函數(shù)的

11、時(shí)間開(kāi)銷內(nèi)聯(lián)函數(shù)實(shí)際上是一種用空間換時(shí)間的方案,其目?jī)?nèi)聯(lián)函數(shù)實(shí)際上是一種用空間換時(shí)間的方案,其目的是為了提高函數(shù)的執(zhí)行效率。的是為了提高函數(shù)的執(zhí)行效率。要定義一個(gè)內(nèi)聯(lián)函數(shù),只需在定義函數(shù)時(shí)將該函數(shù)要定義一個(gè)內(nèi)聯(lián)函數(shù),只需在定義函數(shù)時(shí)將該函數(shù)用關(guān)鍵字用關(guān)鍵字inline修飾即可修飾即可247-7將例5-8的函數(shù)max( )改寫(xiě)成內(nèi)聯(lián)函數(shù)/ Example 求兩數(shù)中的大數(shù)求兩數(shù)中的大數(shù)#include using namespace std;inline int max(int x, int y) return xy?x:y;int main()cout a b;cout The maximum

12、is max(a,b) endl;return 0;257.6 無(wú)參函數(shù) void用于函數(shù)的參數(shù)表用于函數(shù)的參數(shù)表明確說(shuō)明該函數(shù)不使用參數(shù)明確說(shuō)明該函數(shù)不使用參數(shù)void說(shuō)明函數(shù)的返回值說(shuō)明函數(shù)的返回值說(shuō)明該函數(shù)不提供任何返回值說(shuō)明該函數(shù)不提供任何返回值例如:例如: 聲明函數(shù):聲明函數(shù):void func(void) 調(diào)用方式:調(diào)用方式: func( )267.7 void和const類型的指針 1、指向、指向void類型的指針類型的指針通用型的指針通用型的指針, 可以指向任何類型的變量??梢灾赶蛉魏晤愋偷淖兞俊?、用關(guān)鍵字、用關(guān)鍵字const修飾一個(gè)指針修飾一個(gè)指針修飾符修飾符const多用

13、于修飾函數(shù)的指針或引用參數(shù),以防止在編多用于修飾函數(shù)的指針或引用參數(shù),以防止在編程中無(wú)意識(shí)地改變其值程中無(wú)意識(shí)地改變其值根據(jù)其位置的不同有不同的含義。根據(jù)其位置的不同有不同的含義。例如例如:(1)const char *ptr = “Point to constant string”; /定義了一個(gè)指向常數(shù)字符串的指針定義了一個(gè)指向常數(shù)字符串的指針(2)char *const qtr = “A constant pointer”; /定義了一個(gè)常指針定義了一個(gè)常指針27程序設(shè)計(jì)舉例例例7-8 改善模擬梵塔問(wèn)題的遞歸程序,打印更多的信息。改善模擬梵塔問(wèn)題的遞歸程序,打印更多的信息。例例7-9 采

14、用遞歸算法尋找一個(gè)整型數(shù)組中的最大元素。采用遞歸算法尋找一個(gè)整型數(shù)組中的最大元素。例例7-10 重載上例的求最大元素的函數(shù)。重載上例的求最大元素的函數(shù)。例例7-11 編寫(xiě)一個(gè)用于在字符串中查找某字符的函數(shù)。編寫(xiě)一個(gè)用于在字符串中查找某字符的函數(shù)。例例7-12 編寫(xiě)一個(gè)用于三個(gè)整型變量排序的程序。編寫(xiě)一個(gè)用于三個(gè)整型變量排序的程序。28例例7-8:改進(jìn)的梵塔問(wèn)題模擬程序#include using namespace std;const intN=3;/ 函數(shù)函數(shù)move():將金片由一根針移到另一根針上:將金片由一根針移到另一根針上void move(char from, char to)st

15、atic long no = 0;/ 局部靜態(tài)變量,用于統(tǒng)計(jì)調(diào)用本函數(shù)的次數(shù)局部靜態(tài)變量,用于統(tǒng)計(jì)調(diào)用本函數(shù)的次數(shù)static int pillar3 = N, 0, 0; /局部靜態(tài)數(shù)組,用于記錄每根針上的金片數(shù)目局部靜態(tài)數(shù)組,用于記錄每根針上的金片數(shù)目no+;/ 移動(dòng)金片的次數(shù)加移動(dòng)金片的次數(shù)加1(pillarfrom-A)-;/ from針上的金片數(shù)目減針上的金片數(shù)目減1(pillarto-A)+;/ to 針上的金片數(shù)目加針上的金片數(shù)目加1cout Step no :From from to to;cout , (A:pillar0 B:pillar1 C: pillar2 )endl

16、;29 / 函數(shù)函數(shù) hanoi():將:將n片金片由片金片由p1借助借助p2移到移到p3上上void hanoi(int n, char p1, char p2, char p3)if(n=1)move(p1, p3);elsehanoi(n-1, p1, p3, p2);move(p1, p3);hanoi(n-1, p2, p1, p3);30 / 測(cè)試用主函數(shù)int main()cout Simulation of hanoi tower. endl;cout Step 0: (A: N B: 0 C: 0) endl;hanoi(N, A, B, C);return 0;31例 7-

17、9:采用遞歸算法尋找一個(gè)整型數(shù)組中的最大元素#include using namespace std;int max_element(const int array , int lower, int upper) int maximum;if(lower=upper) return arraylower;elsemaximum=max_element(array, lower+1, upper);if(arraylower=maximum) return arraylower;elsereturn maximum;32/ 測(cè)試遞歸函數(shù)的主函數(shù)int main()int A=19,33,69,5

18、5,77,12,52;coutThe maximum element of the array is: max_element(A,0,6)endl;return 0;33例 7-10:重載采用遞歸算法尋找數(shù)組最大元素的函數(shù)#include using namespace std;int max_element(const int array , int lower, int upper)int maximum;if(lower=upper) return arraylower;elsemaximum=max_element(array, lower+1, upper);if(arraylow

19、er=maximum)return arraylower;elsereturn maximum;34/采用遞歸算法尋找雙精度型數(shù)組中的最大元素的函數(shù)采用遞歸算法尋找雙精度型數(shù)組中的最大元素的函數(shù)double max_element(const double array , int lower, int upper)double maximum;if(lower=upper) return arraylower;elsemaximum=max_element(array, lower+1, upper);if(arraylower=maximum)return arraylower;elsere

20、turn maximum;35/ 測(cè)試遞歸函數(shù)的主函數(shù)int main()int A=19,33,69,55,77,12,52;double B=10.1, 21.3, 12.4, 321.42, 5.2, 7.1, 8.3, 12.31, 70.0;coutThe maximum element of the array A is: max_element(A,0,6)endl;coutThe maximum element of the array B is: max_element(B,0,8)endl;return 0;36例 7-11:函數(shù)strchr(): 在字符串中查找指定字符 char *strchr(char *string, int c) wh

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論