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

下載本文檔

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

文檔簡介

1、國家級精品課程網(wǎng)站(本書配套教學(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 無參函數(shù)無參函數(shù)7.7 void和和const類型的指針類型的指針27.1 遞歸函數(shù)1、遞歸調(diào)用、遞歸調(diào)用一個函數(shù)自己調(diào)用自己,這種調(diào)用稱為遞歸調(diào)用。一個函數(shù)自己調(diào)用自己,這種調(diào)用稱為遞歸調(diào)用。2、遞歸調(diào)用的方式、遞歸調(diào)用的方式(1)直接調(diào)用其本身)直接調(diào)用其本身(2)通過其他函數(shù)間接地調(diào)用)通過其他函數(shù)間接地調(diào)用33、一個問題是否可以轉(zhuǎn)換為遞歸來處理必須滿足以下條件:、一

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

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

4、數(shù)為3個時的情況個時的情況 / 函數(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 / 測試用主函數(shù)

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

6、(2)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù);)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù);(3)通過用戶定義的轉(zhuǎn)換尋求匹配。)通過用戶定義的轉(zhuǎn)換尋求匹配。11例7-3 重載絕對值函數(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ù)在調(diào)用子函數(shù)時,就是讓程序轉(zhuǎn)移到函數(shù)的入口地址開始執(zhí)行。就是讓程序轉(zhuǎn)移到函數(shù)的入口地址開始執(zhí)行。指向函數(shù)的指針:就是指針的值為該函數(shù)的入口地指向函數(shù)的指針:就是指針的值為該函數(shù)的入口地址。址。19指向函數(shù)的指針變量的說明格式為指向函數(shù)的指針變量的

8、說明格式為: (*)();例如例如:int(*p)();/ p為指向返回值為整型的函數(shù)的指針為指向返回值為整型的函數(shù)的指針float(*q)(float,int);/ q為指向返回值為浮點型函數(shù)的為指向返回值為浮點型函數(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) 第一個整型參數(shù)第一個整型參數(shù)指明在以命令行方式執(zhí)行本程序時所帶的參數(shù)個數(shù)(包括程序名指明在以命令行方式執(zhí)行本程序時所帶的參數(shù)個數(shù)(包括程序名本身,故本身,故argc的值至少為的值至少為1););第二個參數(shù)第二個參數(shù)為一個字符型指針數(shù)組(其中第為一個字符型指針數(shù)組(其中第1個下標(biāo)變量個下標(biāo)變量argv0指向本程序名,指向本程序名,接下來的下標(biāo)變量接下來的下標(biāo)變量argv1,argv2.等分別指向命令行傳遞給程等分別指向命令行傳遞給程序的各個參數(shù)),

10、用來存放命令行中命令字及各個參數(shù)的字符序的各個參數(shù)),用來存放命令行中命令字及各個參數(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ù)機制通過將函數(shù)體的代碼直接插入到函數(shù)內(nèi)聯(lián)函數(shù)機制通過將函數(shù)體的代碼直接插入到函數(shù)調(diào)用處來節(jié)省調(diào)用函數(shù)的時間開銷調(diào)用處來節(jié)省調(diào)用函數(shù)的

11、時間開銷內(nèi)聯(lián)函數(shù)實際上是一種用空間換時間的方案,其目內(nèi)聯(lián)函數(shù)實際上是一種用空間換時間的方案,其目的是為了提高函數(shù)的執(zhí)行效率。的是為了提高函數(shù)的執(zhí)行效率。要定義一個內(nèi)聯(lián)函數(shù),只需在定義函數(shù)時將該函數(shù)要定義一個內(nèi)聯(lián)函數(shù),只需在定義函數(shù)時將該函數(shù)用關(guān)鍵字用關(guān)鍵字inline修飾即可修飾即可247-7將例5-8的函數(shù)max( )改寫成內(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 無參函數(shù) void用于函數(shù)的參數(shù)表用于函數(shù)的參數(shù)表明確說明該函數(shù)不使用參數(shù)明確說明該函數(shù)不使用參數(shù)void說明函數(shù)的返回值說明函數(shù)的返回值說明該函數(shù)不提供任何返回值說明該函數(shù)不提供任何返回值例如:例如: 聲明函數(shù):聲明函數(shù):void func(void) 調(diào)用方式:調(diào)用方式: func( )267.7 void和const類型的指針 1、指向、指向void類型的指針類型的指針通用型的指針通用型的指針, 可以指向任何類型的變量??梢灾赶蛉魏晤愋偷淖兞?。2、用關(guān)鍵字、用關(guān)鍵字const修飾一個指針修飾一個指針修飾符修飾符const多用

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

14、用遞歸算法尋找一個整型數(shù)組中的最大元素。采用遞歸算法尋找一個整型數(shù)組中的最大元素。例例7-10 重載上例的求最大元素的函數(shù)。重載上例的求最大元素的函數(shù)。例例7-11 編寫一個用于在字符串中查找某字符的函數(shù)。編寫一個用于在字符串中查找某字符的函數(shù)。例例7-12 編寫一個用于三個整型變量排序的程序。編寫一個用于三個整型變量排序的程序。28例例7-8:改進的梵塔問題模擬程序#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)計調(diào)用本函數(shù)的次數(shù)局部靜態(tài)變量,用于統(tǒng)計調(diào)用本函數(shù)的次數(shù)static int pillar3 = N, 0, 0; /局部靜態(tài)數(shù)組,用于記錄每根針上的金片數(shù)目局部靜態(tài)數(shù)組,用于記錄每根針上的金片數(shù)目no+;/ 移動金片的次數(shù)加移動金片的次數(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 / 測試用主函數(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:采用遞歸算法尋找一個整型數(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/ 測試遞歸函數(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/ 測試遞歸函數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論