




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第八章 函數(shù)1、熟練掌握函數(shù)的定義;2、對(duì)函數(shù)的參數(shù)和函數(shù)的值要深刻理解; 3、學(xué)會(huì)函數(shù)的調(diào)用;4、靈活掌握函數(shù)變量的類(lèi)型及存儲(chǔ)類(lèi)別;本章要求: 函函 數(shù)數(shù) 函函 數(shù)數(shù) 概概 念念 函函 數(shù)數(shù) 調(diào)調(diào) 用用 應(yīng)應(yīng) 用用 舉舉 例例 遞遞 歸歸 調(diào)調(diào) 用用全局變量與局部變量全局變量與局部變量 動(dòng)態(tài)與靜態(tài)存儲(chǔ)變量動(dòng)態(tài)與靜態(tài)存儲(chǔ)變量?jī)?nèi)部與外部函數(shù)內(nèi)部與外部函數(shù) 第八章 函數(shù)8 8. 1 8. 1 概述概述 8. 8.函數(shù)定義的一般形式函數(shù)定義的一般形式 8. 8.函數(shù)參數(shù)和函數(shù)的值函數(shù)參數(shù)和函數(shù)的值 8. 8.函數(shù)的調(diào)用函數(shù)的調(diào)用 8. 8.函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 8. 8.函數(shù)的遞歸調(diào)用函數(shù)的
2、遞歸調(diào)用 8. 8.數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù) 8. 8 8. 8 局部變量和全局變量局部變量和全局變量 8. 8.變量的存儲(chǔ)類(lèi)別變量的存儲(chǔ)類(lèi)別 8.10 8.10 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)本章要求:本章要求:1、熟練掌握函數(shù)的定義;、熟練掌握函數(shù)的定義;2、對(duì)函數(shù)的參數(shù)和函數(shù)的值要深刻理、對(duì)函數(shù)的參數(shù)和函數(shù)的值要深刻理 解;解; 3、學(xué)會(huì)函數(shù)的調(diào)用;、學(xué)會(huì)函數(shù)的調(diào)用;4、靈活掌握函數(shù)變量的類(lèi)型及存儲(chǔ)類(lèi)、靈活掌握函數(shù)變量的類(lèi)型及存儲(chǔ)類(lèi) 別;別; 一個(gè)程序可由一個(gè)主函數(shù)和若干個(gè)其他函一個(gè)程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成。數(shù)構(gòu)成。在高級(jí)語(yǔ)。在高級(jí)語(yǔ)言中用子程序?qū)崿F(xiàn)模塊的功能
3、言中用子程序?qū)崿F(xiàn)模塊的功能, , 子程序由函數(shù)來(lái)子程序由函數(shù)來(lái)完成。完成。 C C是模塊化程序設(shè)計(jì)語(yǔ)言是模塊化程序設(shè)計(jì)語(yǔ)言源 程 序 文 件 1預(yù) 編 譯 命 令說(shuō) 明 部 分執(zhí) 行 部 分函 數(shù) 1函 數(shù) n源 程 序 文 件 i源 程 序 文 件 nC程 序C C程序結(jié)構(gòu)程序結(jié)構(gòu)&C C是是函數(shù)式函數(shù)式語(yǔ)言語(yǔ)言&必須有且只能有一個(gè)名為必須有且只能有一個(gè)名為mainmain的主函數(shù)的主函數(shù)&C C程序的執(zhí)行總是程序的執(zhí)行總是從從mainmain函數(shù)開(kāi)始,在函數(shù)開(kāi)始,在mainmain中結(jié)束中結(jié)束&函數(shù)函數(shù)不能嵌套定義不能嵌套定義, ,可以嵌套調(diào)用可以嵌套調(diào)用模
4、塊化程序設(shè)計(jì)模塊化程序設(shè)計(jì)v基本思想:將一個(gè)大的程序按功能分割成一些小模塊基本思想:將一個(gè)大的程序按功能分割成一些小模塊v特點(diǎn):特點(diǎn):l各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡(jiǎn)單各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡(jiǎn)單l控制了程序設(shè)計(jì)的復(fù)雜性控制了程序設(shè)計(jì)的復(fù)雜性l提高元件的可靠性提高元件的可靠性l縮短開(kāi)發(fā)周期縮短開(kāi)發(fā)周期l避免程序開(kāi)發(fā)的重復(fù)勞動(dòng)避免程序開(kāi)發(fā)的重復(fù)勞動(dòng)l易于維護(hù)和功能擴(kuò)充易于維護(hù)和功能擴(kuò)充v開(kāi)發(fā)方法開(kāi)發(fā)方法: : 函數(shù)分類(lèi)函數(shù)分類(lèi) 從用戶(hù)角度從用戶(hù)角度標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供供用戶(hù)自定義函數(shù)用戶(hù)自定義函數(shù) 從函數(shù)形式從函數(shù)形式無(wú)參函數(shù)無(wú)參
5、函數(shù)有參函數(shù)有參函數(shù):1)1) 由系統(tǒng)提供,用戶(hù)無(wú)須定義,也不必在由系統(tǒng)提供,用戶(hù)無(wú)須定義,也不必在程序中作類(lèi)型說(shuō)明,只需在程序前包含有該函數(shù)原型的頭文程序中作類(lèi)型說(shuō)明,只需在程序前包含有該函數(shù)原型的頭文件即可在程序中直接調(diào)用。在前面各章的例題中反復(fù)用到件即可在程序中直接調(diào)用。在前面各章的例題中反復(fù)用到printf、scanf、getchar、putchar、gets、puts、strcat等等函數(shù)均屬此類(lèi)。函數(shù)均屬此類(lèi)。應(yīng)注意:應(yīng)注意:1 1、函數(shù)功能、函數(shù)功能2 2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)的意義和類(lèi)型、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)的意義和類(lèi)型3 3、函數(shù)返回值的意義和類(lèi)型、函數(shù)返
6、回值的意義和類(lèi)型4 4、需要使用的包含文件、需要使用的包含文件 標(biāo)準(zhǔn)函數(shù)一般均是系統(tǒng)提供,因此程序質(zhì)量應(yīng)是最高的,即速標(biāo)準(zhǔn)函數(shù)一般均是系統(tǒng)提供,因此程序質(zhì)量應(yīng)是最高的,即速度快、精度高且占內(nèi)存少,調(diào)用方便。度快、精度高且占內(nèi)存少,調(diào)用方便。C 中庫(kù)函數(shù)按功能分類(lèi):中庫(kù)函數(shù)按功能分類(lèi): 編程中常遇到完成某個(gè)功能的程序段出現(xiàn)多次,為使程編程中常遇到完成某個(gè)功能的程序段出現(xiàn)多次,為使程序更簡(jiǎn)化;常遇到大家均要用到的功能,為了減少不必要的序更簡(jiǎn)化;常遇到大家均要用到的功能,為了減少不必要的重復(fù)編程使程序質(zhì)量提高。在計(jì)算機(jī)高級(jí)語(yǔ)言中,引入函數(shù)重復(fù)編程使程序質(zhì)量提高。在計(jì)算機(jī)高級(jí)語(yǔ)言中,引入函數(shù)(或子程序
7、、過(guò)程),稱(chēng)為(或子程序、過(guò)程),稱(chēng)為標(biāo)準(zhǔn)函數(shù)標(biāo)準(zhǔn)函數(shù),C中稱(chēng)中稱(chēng)庫(kù)函數(shù)庫(kù)函數(shù)。 函數(shù)函數(shù) 頭文件頭文件 輸入、輸出函數(shù)輸入、輸出函數(shù) stdio.h 數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù) math.h 字符和字符串函數(shù)字符和字符串函數(shù) string.h 動(dòng)態(tài)分配函數(shù)動(dòng)態(tài)分配函數(shù) malloc.h 圖形函數(shù)圖形函數(shù) graphics.h語(yǔ)言不僅提供了語(yǔ)言不僅提供了極為豐富的庫(kù)函數(shù)極為豐富的庫(kù)函數(shù)( (如如Turbo CTurbo C,MS CMS C都提供了三百多個(gè)都提供了三百多個(gè)庫(kù)函數(shù)庫(kù)函數(shù)) ),還允許,還允許用戶(hù)建立自己定義用戶(hù)建立自己定義的函數(shù)。用戶(hù)可把的函數(shù)。用戶(hù)可把自己的算法編成一自己的算法編成一個(gè)個(gè)
8、相對(duì)獨(dú)立的函個(gè)個(gè)相對(duì)獨(dú)立的函數(shù)模塊,然后用調(diào)數(shù)模塊,然后用調(diào)用的方法來(lái)使用函用的方法來(lái)使用函數(shù)。可以說(shuō)程序數(shù)??梢哉f(shuō)程序的全部工作都是由的全部工作都是由各式各樣的函數(shù)完各式各樣的函數(shù)完成的,所以也把成的,所以也把語(yǔ)言稱(chēng)為函數(shù)式語(yǔ)語(yǔ)言稱(chēng)為函數(shù)式語(yǔ)言。言。2)2) 由用戶(hù)按需要寫(xiě)的函數(shù)。由用戶(hù)按需要寫(xiě)的函數(shù)。Void main( )Void main( ) int max( int a, int b ); int max( int a, int b ); int x, y, z; int x, y, z; printf(input two numbers:n); printf(input two
9、numbers:n); scanf(%d%d, &x, &y); scanf(%d%d, &x, &y); z=max(x, y);z=max(x, y); printf(maxmum=%d, z); printf(maxmum=%d, z); 函數(shù)說(shuō)明與函數(shù)定義中的函數(shù)函數(shù)說(shuō)明與函數(shù)定義中的函數(shù)頭部分相同,但是末尾要加分號(hào)頭部分相同,但是末尾要加分號(hào) int max( int a, int b )int max( int a, int b ) if (ab) return a; else return b;【 1)1) 函數(shù)定義、函數(shù)說(shuō)明及函數(shù)調(diào)用中均函數(shù)定義
10、、函數(shù)說(shuō)明及函數(shù)調(diào)用中均不帶參數(shù)。主調(diào)函數(shù)和被調(diào)函數(shù)之間不進(jìn)行參數(shù)傳送。此不帶參數(shù)。主調(diào)函數(shù)和被調(diào)函數(shù)之間不進(jìn)行參數(shù)傳送。此類(lèi)類(lèi),可以返回或不返回,可以返回或不返回函數(shù)值。函數(shù)值。2)2) 也稱(chēng)為帶參函數(shù)。在函數(shù)定義及函數(shù)也稱(chēng)為帶參函數(shù)。在函數(shù)定義及函數(shù)說(shuō)明時(shí)都有參數(shù),稱(chēng)為形式參數(shù)說(shuō)明時(shí)都有參數(shù),稱(chēng)為形式參數(shù)( (簡(jiǎn)稱(chēng)為形參簡(jiǎn)稱(chēng)為形參) )。在函數(shù)調(diào)。在函數(shù)調(diào)用時(shí)也必須給出參數(shù),稱(chēng)為實(shí)際參數(shù)用時(shí)也必須給出參數(shù),稱(chēng)為實(shí)際參數(shù)( (簡(jiǎn)稱(chēng)為實(shí)參簡(jiǎn)稱(chēng)為實(shí)參) )。進(jìn)行。進(jìn)行。通過(guò)參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù)。void Hello( ) void main( ) :無(wú)參函數(shù):無(wú)參函數(shù):函數(shù)定義、函數(shù)說(shuō)明及函
11、數(shù)調(diào)用中均函數(shù)定義、函數(shù)說(shuō)明及函數(shù)調(diào)用中均不帶參數(shù)不帶參數(shù)。主調(diào)函數(shù)和被調(diào)函數(shù)之間主調(diào)函數(shù)和被調(diào)函數(shù)之間不進(jìn)行參數(shù)傳送不進(jìn)行參數(shù)傳送。無(wú)參函數(shù)無(wú)參函數(shù)一個(gè)函數(shù)調(diào)用的簡(jiǎn)單例子一個(gè)函數(shù)調(diào)用的簡(jiǎn)單例子(無(wú)參)# include void main() printstar(); *調(diào)用printstar函數(shù)* print_message(); /*調(diào)用print_message函數(shù)*/ printstar(); *調(diào)用printstar函數(shù)*/ *定義printstar函數(shù)* printf(* * * * * * * * * * * * * * * *n); *定義print_message函數(shù)* p
12、rintf(How do you do!n); 運(yùn)行情況如下:運(yùn)行情況如下:* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *How do you do!How do you do!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *【補(bǔ)補(bǔ)例例2】調(diào)用函數(shù),輸出若干個(gè)】調(diào)用函數(shù),輸出若干個(gè) “ * ” 每行輸出每行輸出10個(gè)個(gè)“* *”,共輸出三行。,共輸出三行。 void myprint ( ) int i ; for (i=1; i=10;
13、i+) printf (* ) ; printf (n ) ; void main ( ) myprint ( ) ; myprint ( ) ; myprint ( ) ; 無(wú)參函數(shù)無(wú)參函數(shù) *#include 輸出一行輸出一行10個(gè)個(gè)“*” 有參函數(shù):有參函數(shù):在函數(shù)定義及函數(shù)說(shuō)明時(shí)都在函數(shù)定義及函數(shù)說(shuō)明時(shí)都有參數(shù)有參數(shù),稱(chēng)為形式參,稱(chēng)為形式參數(shù)數(shù)(簡(jiǎn)稱(chēng)為形參簡(jiǎn)稱(chēng)為形參)。在函數(shù)調(diào)用時(shí)也必須給出參數(shù),稱(chēng)為實(shí)際。在函數(shù)調(diào)用時(shí)也必須給出參數(shù),稱(chēng)為實(shí)際參數(shù)參數(shù)(簡(jiǎn)稱(chēng)為實(shí)參簡(jiǎn)稱(chēng)為實(shí)參)。進(jìn)行函數(shù)調(diào)用時(shí),主調(diào)函數(shù)。進(jìn)行函數(shù)調(diào)用時(shí),主調(diào)函數(shù)將把實(shí)參的將把實(shí)參的值傳送給形參值傳送給形參,供被調(diào)函數(shù)使用。
14、,供被調(diào)函數(shù)使用。void main( ) int a, b, c; scanf(%d,%d, &a, &b); c=c=max (a , b ) ;max (a , b ) ; printf(Max is %d, c ) ;max ( int x , int y)max ( int x , int y) int z; z=xy? x: y ; return( z ); void main( ) int x, y, z; scanf(%d,%d, &x, &y); z=xy? x: y ; printf(Max is %d, z ) ;:【補(bǔ)補(bǔ)例例2】調(diào)用函數(shù),
15、輸出若干個(gè)】調(diào)用函數(shù),輸出若干個(gè)“*” 每行輸出每行輸出 n 個(gè)個(gè)“* *”,共輸出三行。,共輸出三行。 void myprint_n (int n) int i ; for (i=1; i=n; i+) printf (* ) ; printf (n ) ; void main ( ) myprint_n(5); myprint_n(10); myprint_n(15); 有參函數(shù)有參函數(shù) *#include 輸出一行輸出一行n個(gè)個(gè)“*” 【補(bǔ)例【補(bǔ)例3】計(jì)算】計(jì)算xy的值的值 請(qǐng)注意:請(qǐng)注意:C語(yǔ)言中語(yǔ)言中 解法解法1:調(diào)用庫(kù)函數(shù):調(diào)用庫(kù)函數(shù)pow ,計(jì)算,計(jì)算xy 計(jì)算計(jì)算xy 調(diào)用庫(kù)函
16、數(shù)調(diào)用庫(kù)函數(shù)必須加此行必須加此行 pow要求要求x和和y為為double Input data: 2.0 3.0 2.000000的的3.000000次方是次方是 8.000000解法解法2:調(diào)用自編函數(shù):調(diào)用自編函數(shù)mypow,計(jì)算,計(jì)算xy若庫(kù)中未提供求若庫(kù)中未提供求xy的函數(shù),的函數(shù),則用戶(hù)先編寫(xiě)后再使用則用戶(hù)先編寫(xiě)后再使用 #include #include double mypow ( double x, double y ) int i; double z ;z = 1.0;for ( i = 1; i b) return a; else return b; 形形參參: 形參出現(xiàn)在
17、函數(shù)定義中,形參出現(xiàn)在函數(shù)定義中,形參變量只有在被調(diào)用形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),立立刻釋放所分配刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。 實(shí)實(shí)參參:max(,)實(shí)參和形參在數(shù)量上,類(lèi)型上,順序上應(yīng)嚴(yán)格一致實(shí)參和形參在數(shù)量上,類(lèi)型上,順序上應(yīng)嚴(yán)格一致否則會(huì)發(fā)生否則會(huì)發(fā)生”類(lèi)型不匹配類(lèi)型不匹配”的錯(cuò)誤。的錯(cuò)誤。 主調(diào)函數(shù)和被調(diào)用函數(shù)之間有主調(diào)函數(shù)和被調(diào)用函數(shù)之間有的關(guān)系。的關(guān)系。在不同的函
18、數(shù)之間傳遞數(shù)據(jù),可以使用的方法有:在不同的函數(shù)之間傳遞數(shù)據(jù),可以使用的方法有:通過(guò)形式參數(shù)和實(shí)際參數(shù)通過(guò)形式參數(shù)和實(shí)際參數(shù)用用returnreturn語(yǔ)句返回計(jì)算結(jié)果語(yǔ)句返回計(jì)算結(jié)果外部變量外部變量#include void main( ) int max(int int max(int ,int int ) ); /* 對(duì)對(duì)max函數(shù)的聲明函數(shù)的聲明 */ int aint a,b b,c c; scanf (scanf (,a a,b)b); printfprintf( ,c c );); int max(int ,int ) *定義有參函數(shù)定義有參函數(shù)max * int int ; ?
19、; returnreturn();(); 運(yùn)行情況如下:運(yùn)行情況如下:, 通過(guò)函數(shù)調(diào)用,可使兩個(gè)函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系。通過(guò)函數(shù)調(diào)用,可使兩個(gè)函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系。void main() int n; scanf(%d, &n); s(n); printf(n=%dn, n );int s(int n) int i; for(i=n-1; i=1; i-) n=n+i; printf(n=%dn, n); 運(yùn)行結(jié)果:運(yùn)行結(jié)果:n=5050 n=100形參的值形參的值實(shí)參的值實(shí)參的值100s=0;for(i=1; iy? x: y ; return( z ); void main( ) i
20、nt x, y, z; scanf(%d,%d, &x, &y); z=xy? x: y ; printf(Max is %d, z ) ;:1 1、值傳遞、值傳遞方式方式l方式:方式: 函數(shù)調(diào)用時(shí)函數(shù)調(diào)用時(shí), ,為形參分配單元為形參分配單元, ,并將實(shí)參的值并將實(shí)參的值復(fù)制復(fù)制到形到形參中參中, ,既實(shí)參將值直接賦給形參(變量)既實(shí)參將值直接賦給形參(變量) ;調(diào)用結(jié)束,形參;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值。單元被釋放,實(shí)參單元仍保留并維持原值。 l特點(diǎn):特點(diǎn):u形參與實(shí)參占用形參與實(shí)參占用不同不同的內(nèi)存單元的內(nèi)存單元u稱(chēng)做稱(chēng)做單方向值調(diào)用單方向值調(diào)用-單
21、向單向傳遞傳遞實(shí)參變量對(duì)形參變量的數(shù)據(jù)傳遞有兩種方式:實(shí)參變量對(duì)形參變量的數(shù)據(jù)傳遞有兩種方式: 實(shí)參和形參在數(shù)量上,類(lèi)型上,順序上應(yīng)嚴(yán)格一致實(shí)參和形參在數(shù)量上,類(lèi)型上,順序上應(yīng)嚴(yán)格一致補(bǔ)例補(bǔ)例 交換兩個(gè)數(shù)交換兩個(gè)數(shù)void swap(int a,int b) int temp; temp=a; a=b; b=temp; printf(“a=%dtb=%dn, a, b ); Void main( ) int x=7,y=11; printf(x=%d, y=%dn, x, y ); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn, x, y )
22、;調(diào)用交調(diào)用交1.C711x:y:調(diào)用前:調(diào)用前:調(diào)用調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp調(diào)用結(jié)束:調(diào)用結(jié)束:711x:y:調(diào)用之前調(diào)用之前x7y11x = 7 , y = 11printf (x = %d , y = %dn , x , y ) ;x7y11調(diào)用開(kāi)始調(diào)用開(kāi)始實(shí)參實(shí)參形參形參abx = 7 , y = 11711開(kāi)辟開(kāi)辟x7y11實(shí)參實(shí)參形參形參abx = 7 , y = 11711711temp = a ; a= b ; b = temp ;a = 11 , b = 7x7y11調(diào)用完畢調(diào)用完畢實(shí)參實(shí)參形參形參abx = 7 , y
23、 = 11711釋放釋放x = 7 , y = 11“按值按值”單向傳遞單向傳遞 printf (x = %d , y = %dn , x , y ) ;2 2、地址傳遞(暫略)、地址傳遞(暫略)l方式:方式: 函數(shù)調(diào)用時(shí),將數(shù)據(jù)的函數(shù)調(diào)用時(shí),將數(shù)據(jù)的存儲(chǔ)地址存儲(chǔ)地址作為參數(shù)傳遞作為參數(shù)傳遞給形參給形參,表示被調(diào)函數(shù)和主調(diào)函數(shù)操作的是同一批表示被調(diào)函數(shù)和主調(diào)函數(shù)操作的是同一批內(nèi)存單元內(nèi)容內(nèi)存單元內(nèi)容l特點(diǎn):特點(diǎn):u形參與實(shí)參占用形參與實(shí)參占用同樣同樣的存儲(chǔ)單元的存儲(chǔ)單元u形參的值發(fā)生改變,帶回主調(diào)函數(shù)形參的值發(fā)生改變,帶回主調(diào)函數(shù)-“雙向雙向”傳遞傳遞u實(shí)參和形參必須是實(shí)參和形參必須是地址地址
24、常量或變量常量或變量swap (int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; scanf(%d,%d,&a,&b); printf(“a=%d,b=%dn”,a,b); printf(“swapped:n”); swap(&a, &b); printf(”a=%d,b=%dn,a,b);例例 交換兩個(gè)數(shù)交換兩個(gè)數(shù)a59b調(diào)前:調(diào)前:a59b調(diào)調(diào)swap:p1&a&bp2a95b交換:交換:p1&a&bp2a95b返回:返回:略返回值返回值: 函數(shù)的值是
25、指函數(shù)被調(diào)用之后,函數(shù)的值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)執(zhí)行函數(shù)體中的程序段所取得的并返回給主調(diào)函數(shù)的值。體中的程序段所取得的并返回給主調(diào)函數(shù)的值。如如; ; 調(diào)用正弦函數(shù)取得調(diào)用正弦函數(shù)取得, 例例8.中,中,max(,)的值是,(,)的值是,max(,)的值是(,)的值是5。賦值語(yǔ)句將這個(gè)函數(shù)值賦。賦值語(yǔ)句將這個(gè)函數(shù)值賦給變量。給變量。 調(diào)用調(diào)用等。等。 : return(表達(dá)式表達(dá)式); return 表達(dá)式;表達(dá)式; return;使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)同時(shí) 把返值帶給調(diào)用函數(shù)把返值帶給調(diào)用函數(shù)例例 無(wú)返回值函數(shù)無(wú)返回值函數(shù)v
26、oid swap(int x, int y ) int temp; temp=x; x=y; y=temp; 返回語(yǔ)句返回語(yǔ)句說(shuō)明說(shuō)明: (1 1)函數(shù)的返回值是通過(guò)函數(shù)中的函數(shù)的返回值是通過(guò)函數(shù)中的returnreturn語(yǔ)句獲得的。語(yǔ)句獲得的。 一個(gè)函數(shù)中可以有一個(gè)以上的一個(gè)函數(shù)中可以有一個(gè)以上的語(yǔ)句,執(zhí)行到哪一個(gè)語(yǔ)句,執(zhí)行到哪一個(gè) 語(yǔ)句,哪一個(gè)語(yǔ)句起作用。語(yǔ)句,哪一個(gè)語(yǔ)句起作用。 語(yǔ)句后面的括弧也可以不要語(yǔ)句后面的括弧也可以不要例如例如: : “;” 等價(jià)于等價(jià)于 “;” 后面的值可以是一個(gè)表達(dá)式。后面的值可以是一個(gè)表達(dá)式。例如例如: : 若無(wú)若無(wú) 語(yǔ)句,遇語(yǔ)句,遇“ ”時(shí),自動(dòng)返回調(diào)用
27、函數(shù)時(shí),自動(dòng)返回調(diào)用函數(shù)(2 2)函數(shù)的返回值應(yīng)當(dāng)屬于某一個(gè)確定的類(lèi)型,在定函數(shù)的返回值應(yīng)當(dāng)屬于某一個(gè)確定的類(lèi)型,在定 義函數(shù)時(shí)指定函數(shù)返回值的類(lèi)型。義函數(shù)時(shí)指定函數(shù)返回值的類(lèi)型。例如例如: 下面是下面是3個(gè)函數(shù)的首行:個(gè)函數(shù)的首行: int max(float ,float ) /* 函數(shù)值為整型 */ char letter(char c1,char c2) /* 函數(shù)值為字符型 */ double min(int ,int ) /* 函數(shù)值為雙精度型 */ 注意:注意: 若函數(shù)類(lèi)型與若函數(shù)類(lèi)型與語(yǔ)句中表達(dá)式值的類(lèi)語(yǔ)句中表達(dá)式值的類(lèi)型不一致,按函數(shù)類(lèi)型為準(zhǔn),自動(dòng)轉(zhuǎn)換型不一致,按函數(shù)類(lèi)型為準(zhǔn)
28、,自動(dòng)轉(zhuǎn)換-函數(shù)調(diào)函數(shù)調(diào)用轉(zhuǎn)換用轉(zhuǎn)換(3 3)對(duì)于不帶回值的函數(shù),應(yīng)當(dāng)用對(duì)于不帶回值的函數(shù),應(yīng)當(dāng)用“void”定義函定義函 數(shù)為數(shù)為“無(wú)類(lèi)型無(wú)類(lèi)型”(或稱(chēng)(或稱(chēng)“空類(lèi)型空類(lèi)型”)。此時(shí))。此時(shí)在函在函 數(shù)體中不得出現(xiàn)數(shù)體中不得出現(xiàn)return語(yǔ)句。語(yǔ)句。 return、break、exit、contiune的作用:的作用: return 語(yǔ)句語(yǔ)句 退出調(diào)用函數(shù)退出調(diào)用函數(shù) break 語(yǔ)句語(yǔ)句 退出退出switch語(yǔ)句體或本層循環(huán)語(yǔ)句體或本層循環(huán) exit 結(jié)束整個(gè)程序執(zhí)行結(jié)束整個(gè)程序執(zhí)行 contiune 語(yǔ)句語(yǔ)句 return( (表達(dá)式)表達(dá)式)僅僅返回一個(gè)值返回一個(gè)值;若不返回任何值可
29、不要若不返回任何值可不要 return ( ); 凡函數(shù)未說(shuō)明返回值類(lèi)型均以凡函數(shù)未說(shuō)明返回值類(lèi)型均以 int 處理;處理; 例例 8.3 返回值類(lèi)型與函數(shù)類(lèi)型不同返回值類(lèi)型與函數(shù)類(lèi)型不同# include void main() int max(float ,float ); float ,; int c; scanf(,); c(,); printf( ,c); max(float ,float ) ; /* z為實(shí)型變量 */ ? ; return(z); , Max is Max is 說(shuō)明說(shuō)明: :如果是調(diào)用無(wú)參函數(shù),則如果是調(diào)用無(wú)參函數(shù),則“實(shí)參表列實(shí)參表列”可以沒(méi)可以沒(méi) 有,但括
30、弧不能省略。有,但括弧不能省略。實(shí)參與形參實(shí)參與形參個(gè)數(shù)相等個(gè)數(shù)相等,類(lèi)型一致類(lèi)型一致,按順序一一按順序一一 對(duì)應(yīng)對(duì)應(yīng)實(shí)參表求值順序,因系統(tǒng)而定實(shí)參表求值順序,因系統(tǒng)而定(Turbo C 自右向左自右向左)例例 8.4 實(shí)參求值的順序?qū)崊⑶笾档捻樞?include void main() int f( int a, int b ); /* 函數(shù)聲明 */ int i=2,p; p=f( i, +i ); /* 函數(shù)調(diào)用 */ printf(%dn, p ); int f( int a, int b) /* 函數(shù)定義 */ int c; if(ab) c=1; else if(a=b) c=0;
31、 else c=-1; return(c); 如果按自左至右順序求實(shí)如果按自左至右順序求實(shí)參的值,則函數(shù)調(diào)用相當(dāng)參的值,則函數(shù)調(diào)用相當(dāng)于(,)于(,) 如果按自右至左順序求實(shí)如果按自右至左順序求實(shí)參的值,則函數(shù)調(diào)用相當(dāng)參的值,則函數(shù)調(diào)用相當(dāng)于(于(3,),) 對(duì)于函數(shù)調(diào)用對(duì)于函數(shù)調(diào)用 int i=2, p;p=f( i, +i ); 函數(shù)調(diào)用的一般形式加上分號(hào)即構(gòu)成函函數(shù)調(diào)用的一般形式加上分號(hào)即構(gòu)成函數(shù)語(yǔ)句。數(shù)語(yǔ)句。 如:如: printf(“ %sn”, “BBI”);作為表達(dá)式中的一項(xiàng)出現(xiàn)作為表達(dá)式中的一項(xiàng)出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)
32、算。 如:如: y= max(a, b) + 100;函數(shù)作為另一個(gè)函數(shù)函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。調(diào)用的實(shí)際參數(shù)出現(xiàn)。 如:如: printf(“ %d n”, max(s, b) ) ; 如:如: y= max( max(a, b), c );首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫(kù)函數(shù)首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫(kù)函數(shù)或用戶(hù)自己定義的函數(shù))。但光有這一條件還不夠。或用戶(hù)自己定義的函數(shù))。但光有這一條件還不夠。如果如果,還應(yīng)該在本文件開(kāi)頭用,還應(yīng)該在本文件開(kāi)頭用#include 命令將調(diào)用有關(guān)庫(kù)函數(shù)時(shí)所需用到的信息命令將調(diào)用有關(guān)庫(kù)函數(shù)時(shí)所需用到的信息“包含包含”到本
33、到本文件中來(lái)。文件中來(lái)。 如果使用用戶(hù)自己定義的函數(shù),而該函數(shù)的位置在調(diào)用如果使用用戶(hù)自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)(即主調(diào)函數(shù))的后面,應(yīng)該在主調(diào)函數(shù)中它的函數(shù)(即主調(diào)函數(shù))的后面,應(yīng)該在主調(diào)函數(shù)中函數(shù)原型的一般形式為函數(shù)原型的一般形式為: : 聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)類(lèi)型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時(shí),類(lèi)型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時(shí),編譯系統(tǒng)能正確識(shí)別函數(shù)并檢查調(diào)用是否合法。編譯系統(tǒng)能正確識(shí)別函數(shù)并檢查調(diào)用是否合法。1.2.返回值是返回值是非非整型和字符型整型和字符型且函數(shù)定義在主調(diào)且函數(shù)定義
34、在主調(diào) 函數(shù)之后時(shí),均須在主調(diào)函數(shù)里加說(shuō)明。函數(shù)之后時(shí),均須在主調(diào)函數(shù)里加說(shuō)明。 格格 式:式: 或?yàn)椋夯驗(yàn)椋?float max( float a, float b );float max( float a, float b );或?qū)憺榛驅(qū)憺? : float max( float, float ); float max( float, float );這便于編譯系統(tǒng)進(jìn)行檢錯(cuò),以防止可能出現(xiàn)的錯(cuò)誤這便于編譯系統(tǒng)進(jìn)行檢錯(cuò),以防止可能出現(xiàn)的錯(cuò)誤 聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)類(lèi)型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時(shí),類(lèi)型等信息通知編譯系統(tǒng)
35、,以便在遇到函數(shù)調(diào)用時(shí),編譯系統(tǒng)能正確識(shí)別函數(shù)并檢查調(diào)用是否合法。編譯系統(tǒng)能正確識(shí)別函數(shù)并檢查調(diào)用是否合法。(與函數(shù)定義不同(與函數(shù)定義不同)注意:注意: 函數(shù)的函數(shù)的“定義定義”和和“聲明聲明”的區(qū)別:的區(qū)別:l 是指對(duì)是指對(duì)函數(shù)功能的確立函數(shù)功能的確立,包括指定函數(shù)名,包括指定函數(shù)名,函數(shù)值類(lèi)型、形參及其類(lèi)型、函數(shù)體等,它是一個(gè)完函數(shù)值類(lèi)型、形參及其類(lèi)型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。整的、獨(dú)立的函數(shù)單位。l 的的作用則是把函數(shù)的名字、函數(shù)類(lèi)型以及作用則是把函數(shù)的名字、函數(shù)類(lèi)型以及形參的類(lèi)型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用形參的類(lèi)型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)
36、時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查。該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查。 void main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);int型函數(shù)可不作函數(shù)說(shuō)明型函數(shù)可不作函數(shù)說(shuō)明例例 函數(shù)說(shuō)明舉例函數(shù)說(shuō)明舉例float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f, &
37、a, &b); c=add(a, b); printf(sum is %f, c );被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說(shuō)明之前,不必函數(shù)說(shuō)明void main( ) float add(float, float); /*function declaration*/ float a, b, c; scanf(%f, %f, &a, &b); c=add(a, b); printf(sum is %f, c);float add(float x, float y) float z; z=x+y; return(z);float add(); 在函數(shù)
38、外預(yù)先說(shuō)明了各個(gè)函在函數(shù)外預(yù)先說(shuō)明了各個(gè)函數(shù)的類(lèi)型,則在以后的各主調(diào)數(shù)的類(lèi)型,則在以后的各主調(diào)函數(shù)中,可不再對(duì)被調(diào)函數(shù)作函數(shù)中,可不再對(duì)被調(diào)函數(shù)作說(shuō)明。說(shuō)明。 例例8. 58. 5 對(duì)被調(diào)用的函數(shù)作聲明對(duì)被調(diào)用的函數(shù)作聲明# include void main() float a,b,c; scanf(f,f,a,b); cadd(a,b); printf(sum is f n,c);float add(float ,float ) *函數(shù)首部* float ; /* 函數(shù)體 */ z; return(z); 定義在后 例例8 8 對(duì)被調(diào)用的函數(shù)作聲對(duì)被調(diào)用的函數(shù)作聲明明# include f
39、loat add(float ,float ) *函數(shù)首部函數(shù)首部* float ; /* 函數(shù)體函數(shù)體 */ z; return(z);); void main()() float a,b,c; scanf(f,f,a,b);); cadd(a,b); printf(sum is f n,c);); 定義在前形式參數(shù):函數(shù)名后面括號(hào)中的變量名稱(chēng)為“形式參數(shù)”(簡(jiǎn)稱(chēng)“形參形參”)。實(shí)際參數(shù):主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中的參數(shù)(可以是一個(gè)表達(dá)式)稱(chēng)為“實(shí)際參數(shù)”(簡(jiǎn)稱(chēng)“實(shí)參實(shí)參”)。函數(shù)返回值:return后面的括號(hào)中的值作為函數(shù)帶回的值(稱(chēng)函數(shù)返回值函數(shù)返回值)。 形式參數(shù)和實(shí)際
40、參數(shù)形式參數(shù)和實(shí)際參數(shù) 語(yǔ)言中不允許作嵌套的函數(shù)定義。因此各函數(shù)之間是平語(yǔ)言中不允許作嵌套的函數(shù)定義。因此各函數(shù)之間是平行的,不存在上一級(jí)函數(shù)和下一級(jí)函數(shù)的問(wèn)題。但語(yǔ)言允許行的,不存在上一級(jí)函數(shù)和下一級(jí)函數(shù)的問(wèn)題。但語(yǔ)言允許在一個(gè)函數(shù)的定義中出現(xiàn)對(duì)另一個(gè)函數(shù)的調(diào)用。這樣就出現(xiàn)了在一個(gè)函數(shù)的定義中出現(xiàn)對(duì)另一個(gè)函數(shù)的調(diào)用。這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用, , 即在被調(diào)函數(shù)中又調(diào)用其它函數(shù)。即在被調(diào)函數(shù)中又調(diào)用其它函數(shù)。例例 8. 用弦截法求方程用弦截法求方程 f(x)=x3-5x2+16x-80=0 f(x)=x3-5x2+16x-80=0 的根的根 取兩個(gè)不同點(diǎn)x1, x2, 如果 f
41、(x1) 和 f(x2) 符號(hào)相反, 則(x1, x2) 區(qū)間內(nèi)必有一個(gè)根。如果f(x1)與f(x2)同符號(hào), 則應(yīng)改變 x1, x2, 直到 f(x1)、f(x2) 異號(hào)為止。注意 x1、x2 的值不應(yīng)差太大, 以保證(x1, x2) 區(qū)間內(nèi)只有一個(gè)根。 連接( x1, f(x1) )和 (x2, f(x2) )兩點(diǎn), 此線(xiàn)(即弦)交x軸于x。 若 f(x)與 f(x1)同符號(hào), 則根必在( x, x2 )區(qū)間內(nèi), 此時(shí)將 x 作為新的 x1。如果 f(x) 與 f(x2) 同符號(hào), 則表示根在( x1, x )區(qū)間內(nèi), 將 x 作為新的 x2。 重復(fù)步驟 (2) 和 (3) , 直到 f(
42、x) 為止, 為一個(gè)很小的數(shù), 例如 10-6。此時(shí)認(rèn)為 f(x)0 。 取兩個(gè)不同點(diǎn)取兩個(gè)不同點(diǎn)x1, x2, 如果如果 f(x1) 和和 f(x2) 符號(hào)相反符號(hào)相反, 則則(x1, x2) 區(qū)間內(nèi)必有一個(gè)根。如果區(qū)間內(nèi)必有一個(gè)根。如果f(x1)與與f(x2)同符號(hào)同符號(hào), 則應(yīng)則應(yīng)改變改變 x1, x2, 直到直到 f(x1)、f(x2) 異號(hào)為止。注意異號(hào)為止。注意 x1、x2 的的值不應(yīng)差太大值不應(yīng)差太大, 以保證以保證(x1, x2) 區(qū)間內(nèi)只有一個(gè)根。區(qū)間內(nèi)只有一個(gè)根。 連接連接( x1, f(x1) )和和 (x2, f(x2) )兩點(diǎn)兩點(diǎn), 此線(xiàn)此線(xiàn)(即弦即弦)交交x軸于軸于
43、x。方法:方法: 若若 f(x)與與 f(x1)同符號(hào)同符號(hào), 則根必在則根必在( x, x2 )區(qū)間內(nèi)區(qū)間內(nèi), 此時(shí)此時(shí)將將 x 作為新的作為新的 x1。如果。如果 f(x) 與與 f(x2) 同符號(hào)同符號(hào), 則表示根在則表示根在( x1, x )區(qū)間內(nèi)區(qū)間內(nèi), 將將 x 作為新的作為新的 x2。 重復(fù)步驟重復(fù)步驟 (2) 和和 (3) , 直到直到 f(x) 為止為止, 為一個(gè)為一個(gè)很小的數(shù)很小的數(shù), 例如例如 10-6。此時(shí)認(rèn)為。此時(shí)認(rèn)為 f(x)0 。N-S流程圖流程圖 實(shí)現(xiàn)各部分功能的幾個(gè)函數(shù)實(shí)現(xiàn)各部分功能的幾個(gè)函數(shù): :用函數(shù)用函數(shù) f(x) 代表代表 x 的函數(shù)的函數(shù): x3-5
44、x2+16x-80。2. 用函數(shù)調(diào)用用函數(shù)調(diào)用 xpoint ( x1, x2) 來(lái)求來(lái)求 (x1, f(x1) )和和 ( x2, f(x2) )的連線(xiàn)與的連線(xiàn)與 x軸的交點(diǎn)軸的交點(diǎn)x 的坐標(biāo)。的坐標(biāo)。3. 用函數(shù)調(diào)用用函數(shù)調(diào)用 root ( x1, x2) 來(lái)求來(lái)求 (x1, x2) 區(qū)間的區(qū)間的 那個(gè)實(shí)根。顯然那個(gè)實(shí)根。顯然, 執(zhí)行執(zhí)行 root 函數(shù)過(guò)程中要用到函函數(shù)過(guò)程中要用到函 數(shù)數(shù) xpoint, 而執(zhí)行而執(zhí)行 xpoint 函數(shù)過(guò)程中要用到函數(shù)過(guò)程中要用到 f 函數(shù)。函數(shù)。 include include float f(float x) float y;return(y);
45、/ * 定 義 函 數(shù) , 以 實(shí) 現(xiàn) f(x) x3-5x2+16x-80 * y=(x-5.0)*x+16.0)* x-80.0;float xpoint (float x1,float x2) *定義xpoint函數(shù),求出弦與x軸交點(diǎn) */ float y; y=( x1* f(x2)-x2*f(x1) ) (f(x2)- f(x1); return (y); float root(float x1,float x2) /* 定義root函數(shù),求近似根 */ float x,y,y1; y1 f(x1); do while(fabs(y)0.0001); return( x) void
46、main( ) *主函數(shù)主函數(shù) */ float x1,x2,f1,f2,x; do printf( ,:); scanf(,x1,x2); f1 f(x1); f2 f(x2); while(f1* f2); xroot( x1, x2 ); printf(“ root of equation is .n”,x );運(yùn)行情況如下:input ,:, root of equation is 5.0000補(bǔ)例補(bǔ)例1 求三個(gè)數(shù)中求三個(gè)數(shù)中最大數(shù)最大數(shù)和和最小數(shù)最小數(shù)的的差值差值#include int dif( int x, int y, int z ); int max( int x, int
47、y, int z ); int min( int x, int y, int z);void main() int a,b,c,d; scanf(%d%d%d, &a,&b,&c); d=dif( a, b, c ); printf(Max-Min=%dn, d ); main( )調(diào)用函數(shù)調(diào)用函數(shù)dif輸出輸出結(jié)束結(jié)束dif函數(shù)函數(shù)max函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)調(diào)用函數(shù)minmin函數(shù)函數(shù)【補(bǔ)例補(bǔ)例2】編寫(xiě)函數(shù)】編寫(xiě)函數(shù)mysum,用以求,用以求 其中其中 f ( i ) = i +5 niif0)( return i+5; scanf(%d,&
48、n);printf(%d,%dn,n, mysum ( n );void main( ) int n ;int mysum ( int n ) int i , s = 0 ;for ( i=0; i=n ; i+ )s = s + myf(i);return s ;int myf(int i)int mysum ( int n ) ; int myf ( int i ) ;niif0)()(if for(i=0;i 1) 用用遞歸遞歸方法求方法求n! n!= = (n-1)! * * n按公式可編程如下:按公式可編程如下:if (n0)printf(“n1)【例【例8. 8】用遞歸法計(jì)算用遞歸
49、法計(jì)算n!【例【例8.7】有個(gè)人坐在一起,問(wèn)第個(gè)人多少歲?他說(shuō)有個(gè)人坐在一起,問(wèn)第個(gè)人多少歲?他說(shuō)比第個(gè)人大歲。問(wèn)第個(gè)人歲數(shù),他說(shuō)比第個(gè)人比第個(gè)人大歲。問(wèn)第個(gè)人歲數(shù),他說(shuō)比第個(gè)人大歲。問(wèn)第個(gè)人,又說(shuō)比第個(gè)人大歲。問(wèn)第大歲。問(wèn)第個(gè)人,又說(shuō)比第個(gè)人大歲。問(wèn)第個(gè)人,說(shuō)比第個(gè)人大歲。最后問(wèn)第個(gè)人,他說(shuō)是個(gè)人,說(shuō)比第個(gè)人大歲。最后問(wèn)第個(gè)人,他說(shuō)是歲。請(qǐng)問(wèn)第個(gè)人多大。歲。請(qǐng)問(wèn)第個(gè)人多大。 age(5)= age (4)+2age(4)= age (3)+2age(3)= age (2)+2age(2)= age (1)+2age(1)= 10用數(shù)學(xué)公式表述如下:age(n)= 10 ()age(n-1)+
50、2 ()有有5人,每人的年齡均是前一個(gè)人年齡人,每人的年齡均是前一個(gè)人年齡+2,問(wèn)第五個(gè)人的年齡,問(wèn)第五個(gè)人的年齡?第第5人人 第第4人人 第第3人人 第第2人人 第第1人人 (第(第5人年人年 齡是第齡是第 4人年齡人年齡+2, 第第4人人 年齡是第年齡是第3人年齡人年齡 +2, 依次類(lèi)推。)依次類(lèi)推。)( 第第1人年齡是人年齡是10則第二人年則第二人年齡是齡是12.) age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10 回推回推 遞推遞推歸遞公式:歸遞公式:age(n)=10 (n=1) age(n)=
51、 age(n-1)+2 (n1) (當(dāng)?shù)谝粋€(gè)人年齡確定,其它人年齡可知)(當(dāng)?shù)谝粋€(gè)人年齡確定,其它人年齡可知) int age(int n) void main( ) int c; int num; if (n= =1) c=10; scanf(“%d”, &num); else c=age(n-1) +2; printf(“age is %dn” , ); return ( c); age(4)+2 age(1)+2c=10age(5)=18 age(4)=16 age(1)=10輸出輸出age(5)main( ) 用一個(gè)主函數(shù)調(diào)用age函數(shù),求得第5人的年齡。*求年齡的遞歸函數(shù)*運(yùn)
52、行結(jié)果如下:運(yùn)行結(jié)果如下: 18 【例【例8-9】Hanoi塔問(wèn)題塔問(wèn)題 一塊板上有三根針,一塊板上有三根針,A A,B B,C C。A A針上套有針上套有6464個(gè)大小不等個(gè)大小不等的圓盤(pán),大的在下,小的在上。要把這的圓盤(pán),大的在下,小的在上。要把這6464個(gè)圓盤(pán)從個(gè)圓盤(pán)從A A針移動(dòng)針移動(dòng)C C針上,每次只能移動(dòng)一個(gè)圓盤(pán),移動(dòng)可以借助針上,每次只能移動(dòng)一個(gè)圓盤(pán),移動(dòng)可以借助B B針進(jìn)行。但針進(jìn)行。但在任何時(shí)候,任何針上的圓盤(pán)都必須保持大盤(pán)在下,小盤(pán)在在任何時(shí)候,任何針上的圓盤(pán)都必須保持大盤(pán)在下,小盤(pán)在上。求移動(dòng)的步驟。上。求移動(dòng)的步驟。ABC略略如果如果n=1n=1,則將圓盤(pán)從則將圓盤(pán)從A
53、 A直接移動(dòng)到直接移動(dòng)到C C。如果如果n=2n=2,則:則: 1.1.將將A A上的上的n-1(n-1(等于等于1)1)個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到B B上;上; 2.2.再將再將A A上的一個(gè)圓盤(pán)移到上的一個(gè)圓盤(pán)移到C C上;上; 3.3.最后將最后將B B上的上的n-1(n-1(等于等于1)1)個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到C C上。上。如果如果n=3n=3,則:則: A. A. 將將A A上的上的n-1(n-1(等于等于2 2,令其為,令其為n)n)個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到B(B(借助于借助于C)C),步驟如下:步驟如下: (1)(1)將將A A上的上的n-1(n-1(等于等于1)1)個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到C
54、 C上。上。 (2)(2)將將A A上的一個(gè)圓盤(pán)移到上的一個(gè)圓盤(pán)移到B B。 (3)(3)將將C C上的上的n-1(n-1(等于等于1)1)個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到B B。 B. B. 將將A A上的一個(gè)圓盤(pán)移到上的一個(gè)圓盤(pán)移到C C。 C. C. 將將B B上的上的n-1(n-1(等于等于2 2,令其為,令其為n)n)個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到C(C(借助借助A)A),步,步驟如下:驟如下: (1)(1)將將B B上的上的n-1(n-1(等于等于1)1)個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到A A。 (2)(2)將將B B上的一個(gè)盤(pán)子移到上的一個(gè)盤(pán)子移到C C。 (3)(3)將將A A上的上的n-1(n-1(等于等于1
55、)1)個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到C C。 到此,完成了三個(gè)圓盤(pán)的移動(dòng)過(guò)程。到此,完成了三個(gè)圓盤(pán)的移動(dòng)過(guò)程。略略 從上面分析可以看出,當(dāng)從上面分析可以看出,當(dāng)n n大于等于大于等于2 2時(shí),移動(dòng)的時(shí),移動(dòng)的過(guò)程可分解為三個(gè)步驟:過(guò)程可分解為三個(gè)步驟:第一步第一步 把把A A上的上的n-1n-1個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到B B上;上;第二步第二步 把把A A上的一個(gè)圓盤(pán)移到上的一個(gè)圓盤(pán)移到C C上;上;第三步第三步 把把B B上的上的n-1n-1個(gè)圓盤(pán)移到個(gè)圓盤(pán)移到C C上;其中第一步和上;其中第一步和第三步是類(lèi)同的。第三步是類(lèi)同的。 當(dāng)當(dāng)n=3n=3時(shí),第一步和第三步又分解為類(lèi)同的三步,時(shí),第一步和第三步又
56、分解為類(lèi)同的三步,即把即把n-1n-1個(gè)圓盤(pán)從一個(gè)針移到另一個(gè)針上,這里的個(gè)圓盤(pán)從一個(gè)針移到另一個(gè)針上,這里的n=n-1n=n-1。 顯然這是一個(gè)遞歸過(guò)程,據(jù)此算法可編程顯然這是一個(gè)遞歸過(guò)程,據(jù)此算法可編程如下:如下:略略由上面的分析可知:將個(gè)盤(pán)子從座移到座可以分解為以下3個(gè)步驟: 1.1.將上個(gè)盤(pán)借助座先移到座上。將上個(gè)盤(pán)借助座先移到座上。2.2.把座上剩下的一個(gè)盤(pán)移到座上。把座上剩下的一個(gè)盤(pán)移到座上。3.3.將個(gè)盤(pán)從座借助于座移到座上。將個(gè)盤(pán)從座借助于座移到座上。ABC略略程序如下程序如下:#include void main() void hanoi( int n, char one,
57、char two, char three ); /* 對(duì)hanoi函數(shù)的聲明 */ int m; printf( input the number of diskes:“ ); scanf( “%d”, &m); printf( The step to moveing %d diskes:n, m ); hanoi( m , A, B ,C ); 略略void hanoi(int n, char one, char two, char three) /*定義hanoi函數(shù),將個(gè)盤(pán)從one座借助two座,移到three座 */ void move( char x, char y ); /
58、* 對(duì)move函數(shù)的聲明 */ if(n=1) move( one ,three); else hanoi( n-1, one, three, two); move( one, three ); hanoi( n-1, two, one, three ); void move(char x,char y) /* 定義move函數(shù) */ printf(“%c-%cn, x, y) ; 略略運(yùn)行情況如下:運(yùn)行情況如下:input the number of diskes:3 The steps to noving 3 diskes: 略略 數(shù)組可以作為函數(shù)的參數(shù)使用,進(jìn)行數(shù)據(jù)傳送。數(shù)數(shù)組可以作為函
59、數(shù)的參數(shù)使用,進(jìn)行數(shù)據(jù)傳送。數(shù)組用作函數(shù)參數(shù)有兩種形式,組用作函數(shù)參數(shù)有兩種形式,是把數(shù)組元素是把數(shù)組元素( (下標(biāo)變下標(biāo)變量量) )作為實(shí)參使用;作為實(shí)參使用;是把數(shù)組名作為函數(shù)的形參和是把數(shù)組名作為函數(shù)的形參和實(shí)參使用。實(shí)參使用。數(shù)數(shù) 數(shù)組元素就是下標(biāo)變量,它與普通變量并無(wú)區(qū)別。數(shù)組元素就是下標(biāo)變量,它與普通變量并無(wú)區(qū)別。因此它作為函數(shù)實(shí)參使用與普通變量是完全相同的,在發(fā)因此它作為函數(shù)實(shí)參使用與普通變量是完全相同的,在發(fā)生函數(shù)調(diào)用時(shí),把作為實(shí)參的數(shù)組元素的值傳送給形參,生函數(shù)調(diào)用時(shí),把作為實(shí)參的數(shù)組元素的值傳送給形參,實(shí)現(xiàn)單向的值傳送。實(shí)現(xiàn)單向的值傳送。 711x:y:調(diào)用前:調(diào)用前:調(diào)用
60、結(jié)束:調(diào)用結(jié)束:711x:y:例例 交換兩個(gè)數(shù)交換兩個(gè)數(shù)void main() int x=7,y=11; printf(x=%d, y=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp; printf(“a=%dtb=%dn,a,b);調(diào)用:調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp普通變量作參數(shù)普通變量作參數(shù)例例 交換兩個(gè)數(shù)交換兩個(gè)數(shù)Void main() int x2=7, 11; printf(swapped:n); swap (x0, x1 ); printf(“x0=%d x1=%d , x0, x1);Void swap(int a,int b)int temp; temp=a; a=b; b=temp; printf(“a=
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 移動(dòng)閱讀應(yīng)用的內(nèi)容策劃與推廣考核試卷
- 糧油產(chǎn)品故事?tīng)I(yíng)銷(xiāo)與消費(fèi)者情感共鳴考核試卷
- 肉制品加工業(yè)的市場(chǎng)戰(zhàn)略規(guī)劃考核試卷
- 海水養(yǎng)殖病害生物控制技術(shù)研究考核試卷
- 紡織鞋材的耐磨損性能評(píng)估考核試卷
- 聚苯乙烯纖維的化學(xué)性質(zhì)和應(yīng)用考核試卷
- 綠色供應(yīng)鏈企業(yè)環(huán)保實(shí)踐考核試卷
- 熱電聯(lián)產(chǎn)項(xiàng)目風(fēng)險(xiǎn)評(píng)估考核試卷
- 糖果與巧克力品牌故事與企業(yè)文化塑造考核試卷
- 球類(lèi)生產(chǎn)環(huán)境保護(hù)與可持續(xù)發(fā)展考核試卷
- 定額〔2025〕1號(hào)文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價(jià)格水平調(diào)整的通知
- 【MOOC】機(jī)械原理-西北工業(yè)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 一種基于STM32的智能門(mén)鎖系統(tǒng)的設(shè)計(jì)-畢業(yè)論文
- 2023山西焦煤集團(tuán)有限責(zé)任公司井下操作工招聘2000人筆試模擬試題及答案解析
- 分紅險(xiǎn)、萬(wàn)能險(xiǎn)銷(xiāo)售資質(zhì)考試真題模擬匯編(共763題)
- 魚(yú)臺(tái)工程運(yùn)河杯匯報(bào)材料
- GB/T 16895.25-2022低壓電氣裝置第7-711部分:特殊裝置或場(chǎng)所的要求展覽、展示及展區(qū)
- 《運(yùn)營(yíng)管理》案例庫(kù)
- 煤礦安全監(jiān)控系統(tǒng)設(shè)備管理報(bào)廢制度
- 機(jī)關(guān)事業(yè)單位退休人員養(yǎng)老金領(lǐng)取資格確認(rèn)表
- 第五屆“國(guó)藥工程杯”全國(guó)大學(xué)生制藥工程設(shè)計(jì)競(jìng)賽
評(píng)論
0/150
提交評(píng)論