函數(shù)與指針c市公開課獲獎課件_第1頁
函數(shù)與指針c市公開課獲獎課件_第2頁
函數(shù)與指針c市公開課獲獎課件_第3頁
函數(shù)與指針c市公開課獲獎課件_第4頁
函數(shù)與指針c市公開課獲獎課件_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第7章 函數(shù)與指針7.1 遞歸函數(shù)7.2 函數(shù)重載7.3 指針和函數(shù)7.4 帶參數(shù)main()函數(shù)7.5 內(nèi)聯(lián)函數(shù)7.6 無參函數(shù)7.7 void和const類型指針第1頁第1頁7.1 遞歸函數(shù)1、遞歸調用一個函數(shù)自己調用自己,這種調用稱為遞歸調用。2、遞歸調用方式(1)直接調用其本身,稱為直接遞歸調用(2)通過其它函數(shù)間接地調用,稱為間接遞歸調用3、一個問題是否能夠轉換為遞歸來處理必須滿足下列條件:(1)必須包括一個或各種非遞歸基本形式;(2)普通形式必須能最后轉換到基本形式;(3)由基本形式來結束遞歸。(不會造成死循環(huán))注意: 遞歸程序結構清楚、簡樸、容易閱讀和理解。 但是遞歸調用在堆棧中

2、暫時占據(jù)存儲區(qū)域是較多,在實際運營時遞歸調用時間效率較差。 許多問題能夠用遞歸辦法求解,也能夠用普通循環(huán)結構求解。第2頁第2頁例7-1 采用遞歸算法求階乘n!int fac(int n) if(n1時,就需要借助另外一個針來移動。將n片金片由A移到C上能夠分解為下列幾種環(huán)節(jié): (1) 將A上n1片金片借助C針移到B針上; (2) 把A針上剩余一片金片由A針移到C針上; (3) 最后將剩余n1個金片借助A針由B針移到C針上。環(huán)節(jié)(1)和(3)與整個任務類似,但涉及金片只有n1個了。這是一個典型遞歸算法。 用字符A,B,C表示3根針第4頁第4頁第5頁第5頁例8-2 梵塔(hanoi塔)問題#inc

3、lude using namespace std;const int N=3;/考察當金片數(shù)為3個時情況/ 函數(shù)move():將金片由一根針移到另一根針上void move(char from, char to) cout From from to to endl;/ 函數(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); 第6頁

4、第6頁/測試主函數(shù)int main() hanoi(N, A, B, C); return 0; 第7頁第7頁7.2 函數(shù)重載函數(shù)重載一組參數(shù)和返回值不同函數(shù)共用同一個函數(shù)名。函數(shù)重載:a)使一個函數(shù)名含有各種功效,即含有“各種形態(tài)”,稱這種形態(tài)為多態(tài)性(面向對象主要特性)。b)面向對象理論中類結構函數(shù)需要重載機制當某個函數(shù)中調用到重載函數(shù)時,編譯器會依據(jù)參數(shù)不同(包含類型、個數(shù)和次序)去對應地調用對應函數(shù)。只有返回值類型不同幾個函數(shù)不能重載!匹配過程以下:1)假如有嚴格匹配函數(shù),就調用該函數(shù);2)參數(shù)內(nèi)部轉換后假如匹配,調用該函數(shù);3)經(jīng)過用戶定義轉換尋求匹配。第8頁第8頁例7-3 重載絕對

5、值函數(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; 第9頁第9頁int main() int x1 = 1;double x2 = -2.5;long x3 = 3L;cout |x1| = abs(x1) endl;cout |x2| = abs(x2) endl;cout |x3| = abs(x3) endl;return 0; 第10頁第10頁7.3 指針和函數(shù)一. 指針作為

6、函數(shù)參數(shù)二. 返回指針函數(shù)三. 指向函數(shù)指針第11頁第11頁一. 指針作為函數(shù)參數(shù)函數(shù)參數(shù)不但能夠是基本數(shù)據(jù)類型變量、對象名、數(shù)組名或函數(shù)名,并且能夠是指針。當以指針作為形參時,在函數(shù)調用過程中實參將地址值傳遞給形參,通過使實參與形參指針指向共同內(nèi)存空間,對形參指針所指變量值改變也同樣影響著實參指針所指向變量值,達到了參數(shù)雙向傳遞目的第12頁第12頁二. 返回指針函數(shù)函數(shù)返回值也能夠是一個地址 (如變量、數(shù)組和函數(shù)地址,指針變量值等)。在闡明返回值為地址函數(shù)時,要使用指針類型闡明符。比如:/ 查找字符c,返回字符c地址 char *strchr(char *string, int c); /在

7、string1中查找子字符串string2,返回string2地址 char *strstr(char *string1, char *string2);第13頁第13頁例7-4 將月份數(shù)值轉換為相應英文名稱#include char *month_name(int n) static char *month= /字符型指針數(shù)組 Illegal month, January, February, March, April, May, June, July, August, September,October, November, December ; /monthi指向第i個字符串 retur

8、n (n=1 & n=12)?monthn:month0; void main( ) coutendl; coutmonth_name(3); coutendl;第14頁第14頁三. 指向函數(shù)指針函數(shù)代碼在內(nèi)存中占有一片存儲區(qū)域,第一個代碼所在內(nèi)存地址稱為首地址。首地址是函數(shù)入口地址。主函數(shù)在調用子函數(shù)時,就是讓程序轉移到函數(shù)入口地址開始執(zhí)行。指向函數(shù)指針:就是指針值為該函數(shù)入口地址。闡明格式為: (*)();比如:int(*p)();/ p為指向返回值為整型函數(shù)指針float(*q)(float,int);/ q為指向返回值為浮點型函數(shù)指針第15頁第15頁假如將函數(shù)地址賦給一個指向函數(shù)指針變

9、量,就能夠通過該指針變量調用函數(shù)。/函數(shù)名即為函數(shù)入口地址,func為函數(shù)指針double (*func)(double) = cos; double y,x;x = 3.14159;y = (*func)(x);第16頁第16頁例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); s

10、um *= h;return sum; /將被積函數(shù)調用地址傳遞給積分函數(shù)第17頁第17頁7.4 帶參數(shù)main()函數(shù)函數(shù)原型為:int main(int argc, char *argv) 第一個整型參數(shù)指明在以命令行方式執(zhí)行本程序時所帶參數(shù)個數(shù)(包括程序名本身,故argc值至少為1)第二個參數(shù)為一個字符型指針數(shù)組(其中第1個下標變量argv0指向本程序名,接下來下標變量argv1,argv2.等分別指向命令行傳遞給程序各個參數(shù)),用來存儲命令行中命令字及各個參數(shù)字符串。第18頁第18頁例7-6 帶參數(shù)main函數(shù)#includeint main(int a, char *ar) if(a

11、!=2) coutError!endl;coutUsage: ProgramName endl;return 1;coutHello, ar1. Welcome to the world of C+ !endl;return 0;第19頁第19頁7.5 內(nèi)聯(lián)函數(shù)函數(shù)調用是以減少效率為代價。調用函數(shù)時,需要斷點現(xiàn)場保護、數(shù)據(jù)進棧、執(zhí)行函數(shù)體、保留返回值、恢復現(xiàn)場和斷點,開銷很大。有函數(shù)體比較簡樸,假如頻繁被調用,則附加時間開銷將很大。內(nèi)聯(lián)函數(shù)機制通過將函數(shù)體代碼直接插入到函數(shù)調用處來節(jié)約調用函數(shù)時間開銷(編譯器直接處理)內(nèi)聯(lián)函數(shù)事實上是一個用空間換時間方案,其目的是為了提升函數(shù)執(zhí)行效率。要定義一

12、個內(nèi)聯(lián)函數(shù),只需在定義函數(shù)時將該函數(shù)用關鍵字inline修飾即可第20頁第20頁7-7將例5-8函數(shù)max( )改寫成內(nèi)聯(lián)函數(shù)/ Example 求兩數(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 is max(a,b) endl;return 0;第21頁第21頁使用內(nèi)聯(lián)函數(shù)要注意:除了含有循環(huán)、switch分支和復雜嵌套if語句函數(shù)外,所有函數(shù)均能夠被闡明為內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)大多是小函數(shù)。內(nèi)聯(lián)函數(shù)定義必須出現(xiàn)在調用

13、之前。內(nèi)聯(lián)函數(shù)節(jié)約了程序運營時間開銷,卻增大了代碼占用內(nèi)存空間開銷第22頁第22頁7.6 無參函數(shù) void用于函數(shù)參數(shù)表明確闡明該函數(shù)不使用參數(shù)void闡明函數(shù)返回值闡明該函數(shù)不提供任何返回值比如: 申明函數(shù):void func(void) /既不需要參數(shù),也不提供返回 調用方式: func( )第23頁第23頁7.7 void和const類型指針 1、指向void類型指針通用型指針, 能夠指向任何類型變量。能夠對其賦值,不過指針參加運算之前必須強制類型轉換。int x,y;void * ptr;ptr = &x; /任何類型變量地址均可存入void類型指針y = *(int*)ptr);

14、/強制類型轉換2、用關鍵字const修飾一個指針修飾符const多用于修飾函數(shù)指針或引用參數(shù),以預防在編程中無意識地改變其值依據(jù)其位置不同有不同含義。比如:(1)const char *ptr = “Point to constant string”; /定義了一個指向常量字符串指針 *ptr = Q; /非法 ptr+; /合法 ,指針是變量(2)char *const qtr = “A constant pointer”; /定義了一個常量指針。指針是常量,指向對象是變量 第24頁第24頁程序設計舉例例7-8 改進模擬梵塔問題遞歸程序,打印更多信息。例7-9 采用遞歸算法尋找一個整型數(shù)組中

15、最大元素。例7-10 重載上例求最大元素函數(shù)。例7-11 編寫一個用于在字符串中查找某字符函數(shù)。例7-12 編寫一個用于三個整型變量排序程序。第25頁第25頁例7-8:改進梵塔問題模擬程序#include using namespace std;const intN=3;/ 函數(shù)move():將金片由一根針移到另一根針上void move(char from, char to)static long no = 0; / 局部靜態(tài)變量,用于統(tǒng)計調用本函多次數(shù)static int pillar3 = N, 0, 0; /局部靜態(tài)數(shù)組,用于統(tǒng)計每根針上金片數(shù)目no+; / 移動金片次數(shù)加1(pill

16、arfrom-A)-; / from針上金片數(shù)目減1(pillarto-A)+; / to 針上金片數(shù)目加1cout Step no :From from to to;cout , (A:pillar0 B:pillar1 C: pillar2 )endl; / 函數(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);第26頁第26頁/ 測試用

17、主函數(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;第27頁第27頁程序運營結果:第28頁第28頁例 7-9:采用遞歸算法尋找一個整型數(shù)組中最大元素#include using namespace std;int max_element(const int array , int lower, int upper) int maximum;if(lower=upper) return arraylower;else maxi

18、mum=max_element(array, lower+1, upper);if(arraylower=maximum) return arraylower;else return maximum;第29頁第29頁/ 測試遞歸函數(shù)主函數(shù)int main()int A=19,33,69,55,77,12,52;coutThe maximum element of the array is: max_element(A,0,6)endl; return 0;第30頁第30頁程序運營結果:第31頁第31頁例 7-10:重載采用遞歸算法尋找數(shù)組最大元素函數(shù)#include using namespa

19、ce std;/采用遞歸算法尋找整型數(shù)組中最大元素函數(shù)int max_element(const int array , int lower, int upper)int maximum;if(lower=upper) return arraylower;else maximum=max_element(array, lower+1, upper);if(arraylower=maximum)return arraylower;elsereturn maximum;第32頁第32頁/采用遞歸算法尋找雙精度型數(shù)組中最大元素函數(shù)double max_element(const double arr

20、ay , int lower, int upper) double maximum;if(lower=upper) return arraylower;elsemaximum=max_element(array, lower+1, upper);if(arraylower=maximum)return arraylower;elsereturn maximum;第33頁第33頁/ 測試遞歸函數(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;

21、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;第34頁第34頁程序運營結果:第35頁第35頁例 7-11:函數(shù)strchr(): 在字符串中查找指定字符 char *strchr(char *string, char c) while(*string!=c & *string!=0) string+; if(*string=c) / 查找成功 return string; /返回第一個待查字符地址 else /string=0(字符串結束符), 字符串中沒有c return NULL; 第36頁第36頁例7-12:三個整型變量排序#include using name

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論