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

下載本文檔

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

文檔簡介

1、大學(xué)C+程序設(shè)計教程西安交通大學(xué)計算機(jī)教學(xué)實驗中心第8章 函數(shù)和指針C+語言的模塊設(shè)計離不開函數(shù),函數(shù)設(shè)計更離不開參數(shù)。掌握函數(shù)設(shè)計和調(diào)用的正確方法,是程序設(shè)計的基本功。正確設(shè)計函數(shù)原型和參數(shù)類型,不僅能保證函數(shù)的正確性,而且能提高程序設(shè)計的效率。介紹函數(shù)調(diào)用、遞歸調(diào)用以及函數(shù)調(diào)用中的參數(shù)替換和返回值等問題之外,還將結(jié)合軟件編程技術(shù)的發(fā)展,討論函數(shù)指針、內(nèi)聯(lián)函數(shù)、函數(shù)重載等。理解指針和函數(shù)的幾種關(guān)系1授課內(nèi)容8.1 遞歸函數(shù)8.2 函數(shù)重載8.3 指針和函數(shù)8.4 帶參數(shù)的main()函數(shù)8.5 內(nèi)聯(lián)函數(shù)8.6 不使用參數(shù)的函數(shù)8.7 void和const類型的指針2一、遞歸函數(shù)函數(shù)調(diào)用,一般

2、是一個函數(shù)調(diào)用另外一個函數(shù)。此外,函數(shù)還可以自己調(diào)用自己,這種調(diào)用叫做函數(shù)的遞歸調(diào)用。遞歸調(diào)用有兩種方式,一種是直接調(diào)用其本身,另一種是通過其他函數(shù)間接地調(diào)用。3例8-1 采用遞歸算法求n!算 法:由階乘的概念可以寫出其遞歸定義: 0! = 1 n! = n*(n-1)!5Example 8-1:用遞歸方法求n!/ 函數(shù)fac():求階乘的遞歸函數(shù)int fac(int n)if(n0)/ 不能求負(fù)數(shù)的階乘return 1;else if(n=0)/ 0的階乘為1return 1;elsereturn n*fac(n-1);/ n!為(n-1)!乘以n68例8-2 梵塔(hanoi塔)問題#i

3、nclude const int N=3;/考察當(dāng)金片數(shù)為3個時的情況void move(char from, char to) / 函數(shù)move():將金片由一根針移到另一根針上cout From from to to endl;9void 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;10二、函數(shù)重載函數(shù)重載使一個函數(shù)名具有

4、多種功能,即具有“多種形態(tài)”,稱這種形態(tài)為多態(tài)性。函數(shù)重載: 一組參數(shù)和返回值不同的函數(shù)共用一個函數(shù)名。例如求絕對值函數(shù),對應(yīng)不同的參數(shù)類型,可以定義如下幾個重載函數(shù): int abs(int); double fabs(double); long labs(1ong);11當(dāng)某個函數(shù)中調(diào)用到重載函數(shù)時,編譯器會根據(jù)實參的類型去對應(yīng)地調(diào)用相應(yīng)的函數(shù)。匹配過程按如下步驟進(jìn)行:(1)如果有嚴(yán)格匹配的函數(shù),就調(diào)用該函數(shù);(2)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù);(3)通過用戶定義的轉(zhuǎn)換尋求匹配。12例8-3 重載絕對值函數(shù)#include int abs(int x)return x=0?x:-x;

5、double abs(double x)return x=0?x:-x;long abs(long x)return x=0?x:-x;void 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;138.3.1 指針作為函數(shù)的參數(shù)函數(shù)的參數(shù)不僅可以是基本數(shù)據(jù)類型的變量、對象名、數(shù)組名或函數(shù)名,而且可以是指針。例7.1例7.3都使用了這一方法。通過使實參與形參指針指向共同的內(nèi)存空間,達(dá)到了參數(shù)雙

6、向傳遞的目的。158.3.2 返回指針的函數(shù)函數(shù)返回值類型不僅可以是int、double之類的簡單類型,也可以將一個地址 (如變量、數(shù)組和函數(shù)的地址,指針變量的值等)作為函數(shù)的返回值。在說明返回值為地址的函數(shù)時,要使用指針類型說明符,例如:char *strchr(char *string, int c);char *strstr(char *string1, char *string2);168.3.3 指向函數(shù)的指針首地址是函數(shù)的入口地址。主函數(shù)在調(diào)用子函數(shù)時,就是讓程序轉(zhuǎn)移到函數(shù)的入口地址開始執(zhí)行。指向函數(shù)的指針:就是指針的值為該函數(shù)的入口地址。18指向函數(shù)的指針變量的說明格式為: (*

7、)();例如:int(*p)();/ p為指向返回值為整型的函數(shù)的指針float(*q)(float,int);/ q為指向返回值為浮點(diǎn)型函數(shù)的指針19例8-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 *= h;return sum;/20調(diào)試函數(shù) integral() 的主函數(shù)double

8、 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; 218.4 帶參數(shù)的main()函數(shù)函數(shù)原型為:int main(int argc, char *argv) 第一個整型參數(shù)指明在以命令行方式執(zhí)行本程序時所帶的參數(shù)個數(shù)(包括程序名本身,故argc的值至少為1);第二個參數(shù)為一個字符型指針數(shù)組(其中第1個下標(biāo)變量argv0指向本程序名,接下來的下標(biāo)變量argv1,ar

9、gv2.等分別指向命令行傳遞給程序的各個參數(shù)),用來存放命令行中命令字及各個參數(shù)的字符串。22例8-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;238.5 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)機(jī)制通過將函數(shù)體的代碼直接插入到函數(shù)調(diào)用處來節(jié)省調(diào)用函數(shù)的時間開銷,內(nèi)聯(lián)函數(shù)實際上是一種用空間換時間的方案,其目的是為了提高函數(shù)的執(zhí)行效率。要定

10、義一個內(nèi)聯(lián)函數(shù),只需在定義函數(shù)時將該函數(shù)用關(guān)鍵字inline修飾即可258.6 不使用參數(shù)的函數(shù) void用于函數(shù)的參數(shù)表, 是明確說明該函數(shù)不使用參數(shù); void說明函數(shù)的返回值則是說明該函數(shù)不提供任何返回值。26程序設(shè)計舉例例8-8 改善模擬梵塔問題的遞歸程序,打印更多的信息。例8-9 采用遞歸算法尋找一個整型數(shù)組中的最大元素。例8-10 重載上例的求最大元素的函數(shù)。例8-11 編寫一個用于在字符串中查找某字符的函數(shù)。例8-12 編寫一個用于三個整型變量排序的程序。28實例編程-五子棋算法 棋局?jǐn)?shù)組數(shù)組內(nèi)部相干元素的關(guān)系29小 結(jié)遞歸函數(shù)是直接或間接地調(diào)用了自身的函數(shù)。每個遞歸函數(shù)必須包含

11、一種或多種非遞歸的基本形式,一般形式必須能最終轉(zhuǎn)換到基本形式,而基本形式可以結(jié)束遞歸。函數(shù)重載是指一組參數(shù)和返回值不同的函數(shù)共用一個函數(shù)名,編譯器會根據(jù)函數(shù)參數(shù)的不同(包括類型、個數(shù)和順序)來確定應(yīng)該調(diào)用哪一個函數(shù)。30重載函數(shù)之間必須在參數(shù)的類型或個數(shù)方面有所不同。只有返回值類型不同的幾個函數(shù)不能重載。指針和函數(shù)的關(guān)系可以有以下幾種:指針作為函數(shù)的參數(shù),指針作為函數(shù)的返回值,指向函數(shù)的指針。帶參數(shù)的main()函數(shù)原型:int main(int argc, char *argv)31習(xí) 題1用指針重新編寫例4-5的冒泡排序程序。2編寫程序,將某一個輸入的位數(shù)不確定的正整數(shù)按照標(biāo)準(zhǔn)的三位分節(jié)格式輸出,例如,當(dāng)用戶輸入82668634時,程序應(yīng)該輸出82,668,634。3編寫程序,把10個整數(shù)1、2、10賦予某個int型數(shù)組,然后用int型指針輸出該數(shù)組元素的值。4用指針編寫一個程序,當(dāng)輸入一個字符串后,要求不僅能夠統(tǒng)計其中字符的個數(shù),還能分別指出其中大、小寫字母、數(shù)字以及其他字符的個數(shù)。325編寫一個函數(shù), 用于將一個字符串轉(zhuǎn)換為整型數(shù)值。其原型為

溫馨提示

  • 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

提交評論