大學(xué)C程序設(shè)計案教程_第1頁
大學(xué)C程序設(shè)計案教程_第2頁
大學(xué)C程序設(shè)計案教程_第3頁
大學(xué)C程序設(shè)計案教程_第4頁
大學(xué)C程序設(shè)計案教程_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、大學(xué)大學(xué)c+程序設(shè)計教程程序設(shè)計教程西安交通大學(xué)西安交通大學(xué)計算機教學(xué)實驗中心計算機教學(xué)實驗中心http:/1/33第第8章章 函數(shù)和指針函數(shù)和指針c+語言的模塊設(shè)計離不開函數(shù),函數(shù)設(shè)計更離語言的模塊設(shè)計離不開函數(shù),函數(shù)設(shè)計更離不開參數(shù)。不開參數(shù)。掌握函數(shù)設(shè)計和調(diào)用的正確方法,是程序設(shè)計掌握函數(shù)設(shè)計和調(diào)用的正確方法,是程序設(shè)計的基本功。的基本功。正確設(shè)計函數(shù)原型和參數(shù)類型,不僅能保證函正確設(shè)計函數(shù)原型和參數(shù)類型,不僅能保證函數(shù)的正確性,而且能提高程序設(shè)計的效率。數(shù)的正確性,而且能提高程序設(shè)計的效率。介紹函數(shù)調(diào)用、遞歸調(diào)用以及函數(shù)調(diào)用中的參介紹函數(shù)調(diào)用、遞歸調(diào)用以及函數(shù)調(diào)用中的參數(shù)替換和返回值等

2、問題之外,還將結(jié)合軟件編數(shù)替換和返回值等問題之外,還將結(jié)合軟件編程技術(shù)的發(fā)展,討論函數(shù)指針、內(nèi)聯(lián)函數(shù)、函程技術(shù)的發(fā)展,討論函數(shù)指針、內(nèi)聯(lián)函數(shù)、函數(shù)重載等。數(shù)重載等。理解指針和函數(shù)的幾種關(guān)系理解指針和函數(shù)的幾種關(guān)系2/33授課內(nèi)容授課內(nèi)容u8.1 遞歸函數(shù)遞歸函數(shù)u8.2 函數(shù)重載函數(shù)重載u8.3 指針和函數(shù)指針和函數(shù)u8.4 帶參數(shù)的帶參數(shù)的main()函數(shù)函數(shù)u8.5 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)u8.6 不使用參數(shù)的函數(shù)不使用參數(shù)的函數(shù)u8.7 void和和const類型的指針類型的指針3/33一、遞歸函數(shù)一、遞歸函數(shù)u函數(shù)調(diào)用,一般是一個函數(shù)調(diào)用另外函數(shù)調(diào)用,一般是一個函數(shù)調(diào)用另外一個函數(shù)。此外,函

3、數(shù)還可以自己調(diào)一個函數(shù)。此外,函數(shù)還可以自己調(diào)用自己,這種調(diào)用叫做函數(shù)的遞歸調(diào)用自己,這種調(diào)用叫做函數(shù)的遞歸調(diào)用。用。u遞歸調(diào)用有兩種方式,一種是直接調(diào)遞歸調(diào)用有兩種方式,一種是直接調(diào)用其本身,另一種是通過其他函數(shù)間用其本身,另一種是通過其他函數(shù)間接地調(diào)用。接地調(diào)用。4/33u一個問題是否可以轉(zhuǎn)換為遞歸來處理必須一個問題是否可以轉(zhuǎn)換為遞歸來處理必須滿足以下條件:滿足以下條件:(1)必須包含一種或多種非遞歸的基本形式;)必須包含一種或多種非遞歸的基本形式;(2)一般形式必須能最終轉(zhuǎn)換到基本形式;)一般形式必須能最終轉(zhuǎn)換到基本形式;(3)由基本形式來結(jié)束遞歸。)由基本形式來結(jié)束遞歸。u遞歸調(diào)用在堆

4、棧中臨時占據(jù)的存儲區(qū)域是遞歸調(diào)用在堆棧中臨時占據(jù)的存儲區(qū)域是較多的,在實際運行時,遞歸調(diào)用的時間較多的,在實際運行時,遞歸調(diào)用的時間效率較差。效率較差。5/33例例8-1 采用遞歸算法求采用遞歸算法求n!u算算 法:法:u由階乘的概念可以寫出其遞歸定義:由階乘的概念可以寫出其遞歸定義:u 0! = 1u n! = n*(n-1)!6/33example 8-1:用遞歸方法求:用遞歸方法求n!/ 函數(shù)函數(shù)fac():求階乘的遞歸函數(shù):求階乘的遞歸函數(shù)int fac(int n)if(n1時,就需要借助另外一個針來移動。將時,就需要借助另外一個針來移動。將n片金片由片金片由a移到移到c上可以分解為

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

6、時的情況況void move(char from, char to) / 函數(shù)函數(shù)move():將金片由一根針移到另一:將金片由一根針移到另一根針上根針上 cout from from to to endl;10/33void hanoi(int n, int p1, int p2, int p3) if(n=1)move(p1, p3);elsehanoi(n-1, p1, p3, p2);move(p1, p3);hanoi(n-1, p2, p1, p3);int main()hanoi(n, a, b, c); return 0;11/33二、函數(shù)重載二、函數(shù)重載u函數(shù)重載使一個函數(shù)名

7、具有多種功能,即函數(shù)重載使一個函數(shù)名具有多種功能,即具有具有“多種形態(tài)多種形態(tài)”,稱這種形態(tài)為多態(tài)性。,稱這種形態(tài)為多態(tài)性。u函數(shù)重載函數(shù)重載: 一組參數(shù)和返回值不同的函數(shù)共一組參數(shù)和返回值不同的函數(shù)共用一個函數(shù)名。用一個函數(shù)名。u例如求絕對值函數(shù),對應(yīng)不同的參數(shù)類型,例如求絕對值函數(shù),對應(yīng)不同的參數(shù)類型,可以定義如下幾個重載函數(shù):可以定義如下幾個重載函數(shù): int abs(int); double fabs(double); long labs(1ong);12/33u當(dāng)某個函數(shù)中調(diào)用到重載函數(shù)時,編當(dāng)某個函數(shù)中調(diào)用到重載函數(shù)時,編譯器會根據(jù)實參的類型去對應(yīng)地調(diào)用譯器會根據(jù)實參的類型去對應(yīng)地

8、調(diào)用相應(yīng)的函數(shù)。匹配過程按如下步驟進相應(yīng)的函數(shù)。匹配過程按如下步驟進行:行:(1)如果有嚴(yán)格匹配的函數(shù),就調(diào)用該)如果有嚴(yán)格匹配的函數(shù),就調(diào)用該函數(shù);函數(shù);(2)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù);函數(shù);(3)通過用戶定義的轉(zhuǎn)換尋求匹配。)通過用戶定義的轉(zhuǎn)換尋求匹配。13/33例例8-3 重載絕對值函數(shù)重載絕對值函數(shù)#include 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;void main() int x1

9、 = 1; double x2 = 2.5; long x3 = 3l; cout |x1| = abs(x1) endl; cout |x2| = abs(x2) endl; cout |x3| = abs(x3) =1 & n=12)?monthn:month0;void main( ) coutendl; coutmonth_name(3); cout“ 15,2000”;18/338.3.3 指向函數(shù)的指針指向函數(shù)的指針u首地址是函數(shù)的入口地址。主函數(shù)在首地址是函數(shù)的入口地址。主函數(shù)在調(diào)用子函數(shù)時,就是讓程序轉(zhuǎn)移到函調(diào)用子函數(shù)時,就是讓程序轉(zhuǎn)移到函數(shù)的入口地址開始執(zhí)行。數(shù)的入口

10、地址開始執(zhí)行。u指向函數(shù)的指針:就是指針的值為該指向函數(shù)的指針:就是指針的值為該函數(shù)的入口地址。函數(shù)的入口地址。19/33u指向函數(shù)的指針變量的說明格式為指向函數(shù)的指針變量的說明格式為: (*)();u例如例如:int(*p)();/ p為指向返回值為整為指向返回值為整型的函數(shù)的指針型的函數(shù)的指針float(*q)(float,int);/ q為指向返回值為浮為指向返回值為浮點型函數(shù)的指針點型函數(shù)的指針20/33例例8-5 通用數(shù)值積分函數(shù)通用數(shù)值積分函數(shù)double integral(double a, double b, double (*fun)(double), int n)doubl

11、e h = (b-a)/n;double sum = (*fun)(a)+(*fun)(b)/2;int i;for(i=1; in; i+)sum += (*fun)(a+i*h);sum *= h;return sum;/21/33調(diào)試函數(shù)調(diào)試函數(shù) integral() 的主函數(shù)的主函數(shù)double func(double x) return sin(x)+x; void main() double sum; sum = integral(0.0, 1.0, func, 1000); cout(the integral of sin(x)+x, 0, 1 is ” sum; 22/338.

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

13、序的各個參數(shù)),用來存放命令行中命令字及各個參數(shù)的字符串。字及各個參數(shù)的字符串。23/33例例8-6 帶參數(shù)的帶參數(shù)的main函數(shù)函數(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;24/33自學(xué)內(nèi)容自學(xué)內(nèi)容u8.5 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù) u8.6 不使用參數(shù)的函數(shù)不使用參數(shù)的函數(shù) u8.7 void和和const類型的指針類型的指針 25/33

14、8.5 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)u內(nèi)聯(lián)函數(shù)機制通過將函數(shù)體的代碼直內(nèi)聯(lián)函數(shù)機制通過將函數(shù)體的代碼直接插入到函數(shù)調(diào)用處來節(jié)省調(diào)用函數(shù)接插入到函數(shù)調(diào)用處來節(jié)省調(diào)用函數(shù)的時間開銷,的時間開銷,u內(nèi)聯(lián)函數(shù)實際上是一種用空間換時間內(nèi)聯(lián)函數(shù)實際上是一種用空間換時間的方案,其目的是為了提高函數(shù)的執(zhí)的方案,其目的是為了提高函數(shù)的執(zhí)行效率。行效率。u要定義一個內(nèi)聯(lián)函數(shù),只需在定義函要定義一個內(nèi)聯(lián)函數(shù),只需在定義函數(shù)時將該函數(shù)用關(guān)鍵字?jǐn)?shù)時將該函數(shù)用關(guān)鍵字inline修飾即可修飾即可26/338.6 不使用參數(shù)的函數(shù)不使用參數(shù)的函數(shù) uvoid用于函數(shù)的參數(shù)表用于函數(shù)的參數(shù)表, 是明確說明該是明確說明該函數(shù)不使用參數(shù)函數(shù)不

15、使用參數(shù); uvoid說明函數(shù)的返回值則是說明該函說明函數(shù)的返回值則是說明該函數(shù)不提供任何返回值。數(shù)不提供任何返回值。27/338.7 void和和const類型的指針類型的指針 u指向指向void類型的指針是通用型的指針類型的指針是通用型的指針, 可以可以指向任何類型的變量。指向任何類型的變量。u用關(guān)鍵字用關(guān)鍵字const修飾一個指針時,根據(jù)其位修飾一個指針時,根據(jù)其位置的不同有不同的含義。例如置的不同有不同的含義。例如:uconst char *ptr = “point to constant string”; u /定義了一個指向常數(shù)字符串的指針定義了一個指向常數(shù)字符串的指針uchar

16、*const qtr = “a constant pointer”; u /定義了一個常指針。定義了一個常指針。u修飾符修飾符const多用于修飾函數(shù)的指針或引用多用于修飾函數(shù)的指針或引用參數(shù),以防止在編程中無意識地改變其值。參數(shù),以防止在編程中無意識地改變其值。28/33程序設(shè)計舉例程序設(shè)計舉例u例例8-8 改善模擬梵塔問題的遞歸程序,打改善模擬梵塔問題的遞歸程序,打印更多的信息。印更多的信息。u例例8-9 采用遞歸算法尋找一個整型數(shù)組中采用遞歸算法尋找一個整型數(shù)組中的最大元素。的最大元素。u例例8-10 重載上例的求最大元素的函數(shù)。重載上例的求最大元素的函數(shù)。u例例8-11 編寫一個用于在

17、字符串中查找某字編寫一個用于在字符串中查找某字符的函數(shù)。符的函數(shù)。u例例8-12 編寫一個用于三個整型變量排序的編寫一個用于三個整型變量排序的程序。程序。29/33實例編程-五子棋五子棋u算法 u棋局棋局?jǐn)?shù)組數(shù)組u數(shù)組內(nèi)部相干元素的關(guān)系數(shù)組內(nèi)部相干元素的關(guān)系30/33小小 結(jié)結(jié)遞歸函數(shù)是直接或間接地調(diào)用了自身的遞歸函數(shù)是直接或間接地調(diào)用了自身的函數(shù)。函數(shù)。每個遞歸函數(shù)必須包含一種或多種非遞每個遞歸函數(shù)必須包含一種或多種非遞歸的基本形式,一般形式必須能最終轉(zhuǎn)歸的基本形式,一般形式必須能最終轉(zhuǎn)換到基本形式,而基本形式可以結(jié)束遞換到基本形式,而基本形式可以結(jié)束遞歸。歸。函數(shù)重載是指一組參數(shù)和返回值不

18、同的函數(shù)重載是指一組參數(shù)和返回值不同的函數(shù)共用一個函數(shù)名,編譯器會根據(jù)函函數(shù)共用一個函數(shù)名,編譯器會根據(jù)函數(shù)參數(shù)的不同(包括類型、個數(shù)和順序)數(shù)參數(shù)的不同(包括類型、個數(shù)和順序)來確定應(yīng)該調(diào)用哪一個函數(shù)。來確定應(yīng)該調(diào)用哪一個函數(shù)。31/33重載函數(shù)之間必須在參數(shù)的類型或個數(shù)重載函數(shù)之間必須在參數(shù)的類型或個數(shù)方面有所不同。只有返回值類型不同的方面有所不同。只有返回值類型不同的幾個函數(shù)不能重載。幾個函數(shù)不能重載。指針和函數(shù)的關(guān)系可以有以下幾種:指指針和函數(shù)的關(guān)系可以有以下幾種:指針作為函數(shù)的參數(shù),指針作為函數(shù)的返針作為函數(shù)的參數(shù),指針作為函數(shù)的返回值,指向函數(shù)的指針?;刂?,指向函數(shù)的指針。帶參數(shù)的帶參數(shù)的main()函數(shù)原型:函數(shù)原型:int main(int argc, char *argv)32/33習(xí)習(xí) 題題1用指針重新編寫例用指針重新編寫例4-5的冒泡排序程序。的冒泡排序程序。2編寫程序,將某一個輸入的位數(shù)不確定的正編寫程序,將某一個輸入的位數(shù)不確定的正整數(shù)按照標(biāo)準(zhǔn)

溫馨提示

  • 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

提交評論