第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計 - 專業(yè)_第1頁
第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計 - 專業(yè)_第2頁
第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計 - 專業(yè)_第3頁
第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計 - 專業(yè)_第4頁
第7章 用函數(shù)實現(xiàn)模塊化程序設(shè)計 - 專業(yè)_第5頁
已閱讀5頁,還剩161頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、問題:問題:u如果程序的功能比較多,規(guī)模比較大,把所有代如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在碼都寫在main函數(shù)中,就會使主函數(shù)變得龐雜、函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護變得困難頭緒不清,閱讀和維護變得困難u有時程序中要多次實現(xiàn)某一功能,就需要多次重有時程序中要多次實現(xiàn)某一功能,就需要多次重復(fù)編寫實現(xiàn)此功能的程序代碼復(fù)編寫實現(xiàn)此功能的程序代碼,這使程序冗長,這使程序冗長,不精煉不精煉解決的方法:解決的方法:用函數(shù)實現(xiàn)用函數(shù)實現(xiàn)模塊化程序設(shè)計模塊化程序設(shè)計u函數(shù)函數(shù)就是功能就是功能,每一個函數(shù)用來實現(xiàn)每一個函數(shù)用來實現(xiàn)一個特定的功能一個特定的功能,函數(shù)的名字應(yīng)反映

2、函數(shù)的名字應(yīng)反映其代表的功能其代表的功能。u程序可由程序可由一個主函數(shù)一個主函數(shù)和若干個其他和若干個其他函數(shù)構(gòu)成函數(shù)構(gòu)成。u主函數(shù)調(diào)用其他函數(shù)主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可其他函數(shù)也可以互相調(diào)用以互相調(diào)用mainabcfghdeie可以使用可以使用庫函數(shù)庫函數(shù)可以使用可以使用自己編寫的函數(shù)自己編寫的函數(shù)在程序設(shè)計中要善于利用函數(shù),可以減少在程序設(shè)計中要善于利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時可以方便重復(fù)編寫程序段的工作量,同時可以方便地地實現(xiàn)模塊化的程序設(shè)計實現(xiàn)模塊化的程序設(shè)計例例7.1 輸出以下的結(jié)果,用函數(shù)調(diào)用實現(xiàn)。輸出以下的結(jié)果,用函數(shù)調(diào)用實現(xiàn)。 * How do you d

3、o! *解題思路:解題思路:u在輸出的文字上下分別有一行在輸出的文字上下分別有一行“*”號,顯然不號,顯然不必重復(fù)寫這段代碼,用一個函數(shù)必重復(fù)寫這段代碼,用一個函數(shù)print_star來來實現(xiàn)輸出一行實現(xiàn)輸出一行“*”號的功能。號的功能。u再寫一個再寫一個print_message函數(shù)來輸出中間一函數(shù)來輸出中間一行文字信息行文字信息u用用主函數(shù)主函數(shù)分別調(diào)用這兩個函數(shù)分別調(diào)用這兩個函數(shù)例例7.1 輸出以下的結(jié)果,用函數(shù)調(diào)用實現(xiàn)。輸出以下的結(jié)果,用函數(shù)調(diào)用實現(xiàn)。 * How do you do! *print_star();print_star();print_message();#includ

4、e int main() void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0;void print_star() printf(“*n”); void print_message() printf(“ How do you do!n”); 聲明函數(shù)聲明函數(shù)定義函數(shù)定義函數(shù)#include int main() void print_star(); void print_message(); print_star(); print_message(); pri

5、nt_star(); return 0;void print_star() printf(“*n”); void print_message() printf(“ How do you do!n”); 調(diào)用函數(shù)調(diào)用函數(shù)#include int main() void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0;void print_star() printf(“*n”); void print_message() printf(“ How do you do!

6、n”); 調(diào)用函數(shù)調(diào)用函數(shù)#include int main() void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0;void print_star() printf(“*n”); void print_message() printf(“ How do you do!n”); 調(diào)用函數(shù)調(diào)用函數(shù)說明:說明: (1) 一個程序由一個或多個程序模塊組成,一個程序由一個或多個程序模塊組成,每一個程序模塊作為一個每一個程序模塊作為一個源程序文件源程序文件(.c)。

7、(2)一個一個源程序文件源程序文件由一個或多個由一個或多個函數(shù)函數(shù)以及以及其其他有關(guān)內(nèi)容他有關(guān)內(nèi)容(如預(yù)處理指令、數(shù)據(jù)聲明與定義(如預(yù)處理指令、數(shù)據(jù)聲明與定義等)組成。等)組成。程序ex1.cex2.cex3.c函數(shù)1函數(shù)2其它主函數(shù)只有一個主函數(shù)只有一個說明:說明: (3) 程序的執(zhí)行是程序的執(zhí)行是從從main函數(shù)開始的函數(shù)開始的,如,如果在果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到程返回到main函數(shù),函數(shù),在在main函數(shù)中結(jié)束函數(shù)中結(jié)束整整個程序的運行。個程序的運行。 (4) 函數(shù)間可以互相調(diào)用,但不能調(diào)用函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)

8、。函數(shù)。main函數(shù)是被操作系統(tǒng)調(diào)用的函數(shù)是被操作系統(tǒng)調(diào)用的。說明:說明: (5) 從用戶使用的角度看,函數(shù)有兩種。從用戶使用的角度看,函數(shù)有兩種。u庫函數(shù)庫函數(shù),它是由系統(tǒng)提供的,用戶不必自己定,它是由系統(tǒng)提供的,用戶不必自己定義而直接使用它們。義而直接使用它們。 #include指令把有關(guān)指令把有關(guān)的頭文件包含到本文件中的頭文件包含到本文件中。u用戶自己定義的函數(shù)用戶自己定義的函數(shù)。它是用以解決用戶專門。它是用以解決用戶專門需要的函數(shù)。需要的函數(shù)。說明:說明:(6) 從函數(shù)的形式看,函數(shù)分兩類。從函數(shù)的形式看,函數(shù)分兩類。 無參函數(shù)無參函數(shù)。無參函數(shù)一般用來執(zhí)行指定的一。無參函數(shù)一般用來執(zhí)

9、行指定的一組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,但一般以不帶回函數(shù)值的居多。但一般以不帶回函數(shù)值的居多。void print_star() printf(“*n”); void print_message() printf(“ How do you do!n”); 括號內(nèi)空無參數(shù)括號內(nèi)空無參數(shù)說明:說明:(6) 從函數(shù)的形式看,函數(shù)分兩類。從函數(shù)的形式看,函數(shù)分兩類。 無參函數(shù)無參函數(shù)。無參函數(shù)一般用來執(zhí)行指定的。無參函數(shù)一般用來執(zhí)行指定的一組操作。無參函數(shù)可以帶回或不帶回函數(shù)值一組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,但一般以不帶回函數(shù)值的居多。,但

10、一般以不帶回函數(shù)值的居多。 有參函數(shù)。有參函數(shù)。在調(diào)用函數(shù)時,主調(diào)函數(shù)通過在調(diào)用函數(shù)時,主調(diào)函數(shù)通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),一般情況下,執(zhí)參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),一般情況下,執(zhí)行被調(diào)用函數(shù)時會得到一個函數(shù)值,供主調(diào)函行被調(diào)用函數(shù)時會得到一個函數(shù)值,供主調(diào)函數(shù)使用。數(shù)使用。int max(int x,int y) int z; if (x y) z = x; else z = y; return(z);括號內(nèi)有參數(shù)括號內(nèi)有參數(shù)7.2.1 為什么要定義函數(shù)為什么要定義函數(shù)7.2.2 定義函數(shù)的方法定義函數(shù)的方法C語言要求,在程序中用到的所有函數(shù),語言要求,在程序中用到的所有函數(shù),必須必須“先定

11、義,后使用先定義,后使用”指定指定函數(shù)的名字函數(shù)的名字,以便以后,以便以后按按名調(diào)用名調(diào)用指定指定函數(shù)類型函數(shù)類型,即函數(shù)返回值,即函數(shù)返回值的類型的類型指定指定函數(shù)參數(shù)的名字和類型函數(shù)參數(shù)的名字和類型,以便在調(diào)用函數(shù)時向它們以便在調(diào)用函數(shù)時向它們傳遞傳遞數(shù)據(jù)數(shù)據(jù)指定函數(shù)的功能指定函數(shù)的功能。這是最重要。這是最重要的,這是在函數(shù)體中解決的的,這是在函數(shù)體中解決的int max(int x,int y) int z; z =xy? x:y; return(z);int max(int x,int y) int z; if (x y) z = x; else z = y; return(z);in

12、t max(int x,int y) int z; z =xy? x:y; return(z);條件表達式條件表達式表達式表達式1?表達式2:表達式表達式3真真假假1.定義無參函數(shù)定義無參函數(shù)定義無參函數(shù)的一般形式為定義無參函數(shù)的一般形式為:類型名類型名 函數(shù)名函數(shù)名(void) 函數(shù)體函數(shù)體 類型名類型名 函數(shù)名函數(shù)名() 函數(shù)體函數(shù)體 1.定義無參函數(shù)定義無參函數(shù)定義無參函數(shù)的一般形式為定義無參函數(shù)的一般形式為:類型名類型名 函數(shù)名函數(shù)名() 函數(shù)體函數(shù)體 int floatdoublevoid2.定義有參函數(shù)定義有參函數(shù)定義有參函數(shù)的一般形式為定義有參函數(shù)的一般形式為:類型名類型名 函數(shù)

13、名函數(shù)名(形式參數(shù)表列形式參數(shù)表列) 函數(shù)體函數(shù)體 int max(int x,int y) int z;/聲明部分聲明部分 z =xy? x:y;/語句部分語句部分 return(z);形式參數(shù):形式參數(shù):函數(shù)函數(shù)定義時定義時函數(shù)名后面括號中的變量名稱函數(shù)名后面括號中的變量名稱3. 定義空函數(shù)定義空函數(shù)定義定義空空函數(shù)的一般形式為函數(shù)的一般形式為:類型名類型名 函數(shù)名(函數(shù)名( ) 先用空函數(shù)占一個位置,以后先用空函數(shù)占一個位置,以后逐步逐步擴充擴充好處:好處:程序結(jié)構(gòu)清楚,可讀性好,以后程序結(jié)構(gòu)清楚,可讀性好,以后擴充新功能方便,對程序結(jié)構(gòu)影響不大擴充新功能方便,對程序結(jié)構(gòu)影響不大7.3.

14、1函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞函數(shù)調(diào)用時的數(shù)據(jù)傳遞7.3.3函數(shù)調(diào)用的過程函數(shù)調(diào)用的過程7.3.4函數(shù)的返回值函數(shù)的返回值函數(shù)函數(shù)調(diào)用調(diào)用的一般形式為:的一般形式為: 函數(shù)名(實參表列)函數(shù)名(實參表列)分清函數(shù)定義與函數(shù)調(diào)用分清函數(shù)定義與函數(shù)調(diào)用實際參數(shù):實際參數(shù):主調(diào)主調(diào)函數(shù)中函數(shù)中調(diào)用一個函數(shù)時,調(diào)用一個函數(shù)時,函數(shù)名后面函數(shù)名后面括號中的變量名稱括號中的變量名稱形式參數(shù):形式參數(shù):函數(shù)函數(shù)定義時定義時函數(shù)名后面括號中的變量名稱函數(shù)名后面括號中的變量名稱#include int main( ) int max(int x,int y); int a,b,c;

15、 scanf(”%d,%d”,&a,&b); c = max(a,b); printf(max=%dn,c); return 0;int max(int x,int y) int z; if (x y) z = x; else z = y; return(z);調(diào)用調(diào)用max函數(shù)函數(shù)max函數(shù)函數(shù)定義定義#include int main( ) int max(int x,int y); int a,b,c; scanf(”%d,%d”,&a,&b); c = max(a,b); printf(max=%dn,c); return 0;int max(int x,int y) int z; i

16、f (x y) z = x; else z = y; return(z);實際參數(shù)實際參數(shù)形式參數(shù)形式參數(shù)函數(shù)函數(shù)調(diào)用調(diào)用的一般形式為:的一般形式為: 函數(shù)名(實參表列)函數(shù)名(實參表列)如果是調(diào)用無參函數(shù),則如果是調(diào)用無參函數(shù),則“實參表列實參表列”可以沒有,但可以沒有,但括號不能省略括號不能省略實際參數(shù):實際參數(shù):主調(diào)主調(diào)函數(shù)中函數(shù)中調(diào)用一個函數(shù)時,調(diào)用一個函數(shù)時,函數(shù)名后面函數(shù)名后面括號中的變量名稱括號中的變量名稱#include int main() void print_star(); void print_message(); print_star(); print_message

17、(); print_star(); return 0;void print_star() printf(“*n”); void print_message() printf(“ How do you do!n”); 調(diào)用無實參調(diào)用無實參定義無形參定義無形參函數(shù)函數(shù)調(diào)用調(diào)用的一般形式為:的一般形式為: 函數(shù)名(實參表列)函數(shù)名(實參表列)如果實參表列包含多個實參,則各參數(shù)如果實參表列包含多個實參,則各參數(shù)間用間用逗號隔開逗號隔開實際參數(shù):實際參數(shù):主調(diào)主調(diào)函數(shù)中函數(shù)中調(diào)用一個函數(shù)時,調(diào)用一個函數(shù)時,函數(shù)名后面函數(shù)名后面括號中的變量名稱括號中的變量名稱#include int main( ) in

18、t max(int x,int y); int a,b,c; scanf(”%d,%d”,&a,&b); c = max(a,b); printf(max=%dn,c); return 0;int max(int x,int y) int z; if (x y) z = x; else z = y; return(z);主函數(shù)主函數(shù)max函數(shù)函數(shù)函數(shù)函數(shù)調(diào)用調(diào)用的一般形式為:的一般形式為: 函數(shù)名(實參表列)函數(shù)名(實參表列) max(2,3) 不是語句不是語句 按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置來分,可以有以下來分,可以有以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式:

19、. 函數(shù)調(diào)用函數(shù)調(diào)用語句語句把函數(shù)調(diào)用單獨作為一個語句把函數(shù)調(diào)用單獨作為一個語句 如如printf_star();這時這時不要求函數(shù)帶回值不要求函數(shù)帶回值,只要求函數(shù)完,只要求函數(shù)完成一定的操作成一定的操作按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置來分,可以有以下來分,可以有以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式:. 函數(shù)函數(shù)表達式表達式函數(shù)調(diào)用出現(xiàn)在另一個表達式中函數(shù)調(diào)用出現(xiàn)在另一個表達式中 如如c=max(a,b);這時這時要求函數(shù)帶回一個確定的值要求函數(shù)帶回一個確定的值以參加以參加表達式的運算表達式的運算按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置按函數(shù)調(diào)用在程序中出現(xiàn)的形式

20、和位置來分,可以有以下來分,可以有以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式:. 函數(shù)函數(shù)參數(shù)參數(shù)函數(shù)調(diào)用作為另一函數(shù)調(diào)用時的實參函數(shù)調(diào)用作為另一函數(shù)調(diào)用時的實參 如如mmax(a,max(b,c);其中其中max(b,c)是一次函數(shù)調(diào)用,它的值作為是一次函數(shù)調(diào)用,它的值作為max另一次調(diào)用的實參另一次調(diào)用的實參printf(“%d”, max(b,c);1.形式參數(shù)和實際參數(shù)形式參數(shù)和實際參數(shù)u定義函數(shù)定義函數(shù)時函數(shù)名后面的變量名稱為時函數(shù)名后面的變量名稱為“形形式參數(shù)式參數(shù)”(簡稱(簡稱“形參形參”)u主調(diào)函數(shù)中主調(diào)函數(shù)中調(diào)用一個函數(shù)時調(diào)用一個函數(shù)時,函數(shù)名后面,函數(shù)名后面參數(shù)稱為參數(shù)稱為“實際參

21、數(shù)實際參數(shù)”(簡稱(簡稱“實參實參”)u 實際參數(shù)可以是常量、變量或表達式實際參數(shù)可以是常量、變量或表達式c=max(3,b); c=max(a,b);c=max(a+3,b);2. 實參和形參間的數(shù)據(jù)傳遞實參和形參間的數(shù)據(jù)傳遞u在調(diào)用函數(shù)過程中,系統(tǒng)會把在調(diào)用函數(shù)過程中,系統(tǒng)會把實參的值傳實參的值傳遞給遞給被調(diào)用函數(shù)的被調(diào)用函數(shù)的形參形參,或者說,形參從或者說,形參從實參得到一個值實參得到一個值u該值在函數(shù)調(diào)用期間有效,可以參加該值在函數(shù)調(diào)用期間有效,可以參加被調(diào)被調(diào)函數(shù)中的運算函數(shù)中的運算 例例7.2 輸入輸入兩個整數(shù)兩個整數(shù),要求輸出其中值較大者。,要求輸出其中值較大者。要求用函數(shù)來找到

22、大數(shù)。要求用函數(shù)來找到大數(shù)。自定義函數(shù)的自定義函數(shù)的解題思路:解題思路:(1)函數(shù)函數(shù)取名:取名:函數(shù)函數(shù)名應(yīng)是見名知意,今定名為名應(yīng)是見名知意,今定名為max(2)確定函數(shù)的類型:確定函數(shù)的類型: 由于給定的兩個數(shù)是整數(shù),返回由于給定的兩個數(shù)是整數(shù),返回主調(diào)函數(shù)的值主調(diào)函數(shù)的值(即較大數(shù))(即較大數(shù))應(yīng)該是整型應(yīng)該是整型(3)確定函數(shù)參數(shù)的個數(shù)及類型:確定函數(shù)參數(shù)的個數(shù)及類型:max函數(shù)應(yīng)當有函數(shù)應(yīng)當有兩個兩個參數(shù)參數(shù),以便從主函數(shù)接收兩個整數(shù),以便從主函數(shù)接收兩個整數(shù),因此因此參數(shù)的類型參數(shù)的類型應(yīng)當是整型應(yīng)當是整型(4)編寫函數(shù)體:編寫函數(shù)體:求兩個數(shù)的最大值求兩個數(shù)的最大值先編寫先編寫

23、max函數(shù):函數(shù):int max(int x,int y) int z; z=xy?x:y; return(z); 再編寫主函數(shù)再編寫主函數(shù)#include int main() int max(int x,int y); int a,b,c; printf(“two integer numbers: ); scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max is %dn”,c); 函數(shù)聲明函數(shù)聲明函數(shù)調(diào)用函數(shù)調(diào)用實際參數(shù)實際參數(shù) c=max(a,b); (main函數(shù))函數(shù))int max(int x, int y) (max函數(shù))函數(shù)) int z;

24、 z=xy?x:y; return(z); 2a3bxy23實參實參形參形參在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時,在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時,它們并不占內(nèi)存中的存儲單元。在發(fā)生函數(shù)調(diào)用它們并不占內(nèi)存中的存儲單元。在發(fā)生函數(shù)調(diào)用時,函數(shù)時,函數(shù)max的的形參被臨時分配內(nèi)存單元形參被臨時分配內(nèi)存單元。2a3bxy23實參實參形參形參實參實參形參形參傳遞數(shù)據(jù)具有單向性傳遞數(shù)據(jù)具有單向性函數(shù)調(diào)用函數(shù)調(diào)用如果在執(zhí)行一個被調(diào)用函數(shù)時如果在執(zhí)行一個被調(diào)用函數(shù)時,形參的值,形參的值發(fā)生改變,不會改變主調(diào)函數(shù)的實參的值發(fā)生改變,不會改變主調(diào)函數(shù)的實參的值a=2;b=3; c=max(a,b

25、); (main函數(shù))函數(shù))printf(“a=%d,b=%dn”,a,b)int max(int a, int b) (max函數(shù))函數(shù)) int z; z=ab?a:b; a=a+2; b=b+3; return(z); 通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個確定的值,這就是函數(shù)值到一個確定的值,這就是函數(shù)值(函數(shù)的返函數(shù)的返回值回值)函數(shù)的返回值是通過函數(shù)中的函數(shù)的返回值是通過函數(shù)中的return語句語句獲得的。獲得的。(1)一個函數(shù)中可以有一個以上的一個函數(shù)中可以有一個以上的return語句,語句,執(zhí)行到哪一個執(zhí)行到哪一個return語句,哪一個

26、語句,哪一個就就起作用起作用通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個確定的值,這就是函數(shù)值到一個確定的值,這就是函數(shù)值(函數(shù)的返函數(shù)的返回值回值)(2) 如果函數(shù)值的類型和如果函數(shù)值的類型和return語句中表達式的值語句中表達式的值不一致,則以函數(shù)類型為準不一致,則以函數(shù)類型為準,函數(shù)類型決定返回函數(shù)類型決定返回值的類型值的類型int max(int x,int y) float z; if (x y) z = x; else z = y; return(z);例例7.3將例將例7.2稍作改動,將在稍作改動,將在max函數(shù)中定函數(shù)中定義的變量義的變量z改

27、為改為float型。函數(shù)返回值的類型型。函數(shù)返回值的類型與指定的函數(shù)類型不同,分析其處理方法。與指定的函數(shù)類型不同,分析其處理方法。#include int main() int max(float x,float y); float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(max is %dn,c); return 0; int max(float x,float y) float z; z=xy?x:y; return( z ) ;1.52.62.62變?yōu)樽優(yōu)?從用戶使用的角度看,函數(shù)有兩種。從用戶使用的角度看,函數(shù)有兩種。u庫

28、函數(shù)庫函數(shù)。它是由系統(tǒng)提供的,用戶不必自它是由系統(tǒng)提供的,用戶不必自己定義而直接使用它們。己定義而直接使用它們。 #include指令指令把有關(guān)的頭文件包含到本文件中把有關(guān)的頭文件包含到本文件中。(不需要(不需要再進行函數(shù)聲明)再進行函數(shù)聲明)u用戶自己定義的函數(shù)用戶自己定義的函數(shù)。它是用以解決用戶。它是用以解決用戶專門需要的函數(shù)。專門需要的函數(shù)。如果函數(shù)的定義出現(xiàn)在調(diào)如果函數(shù)的定義出現(xiàn)在調(diào)用后,用后,需要聲明需要聲明。 例例7.4 輸入輸入兩個實數(shù)兩個實數(shù),用一個函數(shù)求出它,用一個函數(shù)求出它們之和。們之和。解題思路:用解題思路:用add函數(shù)實現(xiàn)。首先要定義函數(shù)實現(xiàn)。首先要定義add函數(shù),它為

29、函數(shù),它為float型,型,它應(yīng)有兩個參它應(yīng)有兩個參數(shù)數(shù),也應(yīng)為,也應(yīng)為float型。型。分別編寫分別編寫add函數(shù)和函數(shù)和main函數(shù),它們組函數(shù),它們組成一個源程序文件成一個源程序文件main函數(shù)的位置在函數(shù)的位置在add函數(shù)之前函數(shù)之前,所以,所以在在main函數(shù)中函數(shù)中要要對對add函數(shù)進行聲明函數(shù)進行聲明#include int main() float add(float x, float y); float a,b,c; printf(Please enter a and b:); scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %fn

30、,c); return 0;float add(float x,float y) float z; z=x+y; return(z); 求兩個實數(shù)之和求兩個實數(shù)之和,add在在main之后之后對對add函數(shù)聲明函數(shù)聲明#include int main() float add(float x, float y); float a,b,c; printf(Please enter a and b:); scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %fn,c); return 0;float add(float x,float y) float z;

31、 z=x+y; return(z); 函數(shù)聲明與函函數(shù)聲明與函數(shù)定義中的第數(shù)定義中的第1行(行(函數(shù)原型函數(shù)原型)只差一個分號只差一個分號float add(float x,float y) float z; z=x+y; return(z); #include int main() float add(float x, float y); float a,b,c; printf(Please enter a and b:); scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %fn,c); return 0;add函數(shù)在函數(shù)在main之前聲明可省。之

32、前聲明可省。聲明可以放在文件的開頭聲明可以放在文件的開頭,這時所有函數(shù)都可以使用,這時所有函數(shù)都可以使用此函數(shù)。此函數(shù)。上節(jié)課內(nèi)容回顧上節(jié)課內(nèi)容回顧從從用戶使用的角度看用戶使用的角度看庫函數(shù)庫函數(shù)用戶自己定義的函數(shù)用戶自己定義的函數(shù)#include指令把有關(guān)的指令把有關(guān)的頭文件包含到本文件中頭文件包含到本文件中。從從函數(shù)的形式看函數(shù)的形式看無參函數(shù)無參函數(shù) 有有參函數(shù)參函數(shù)無參函數(shù)無參函數(shù) 有有參函數(shù)參函數(shù)#include /函數(shù)聲明函數(shù)聲明int main() /調(diào)用函數(shù)調(diào)用函數(shù) return 0;類型名類型名 函數(shù)名函數(shù)名(形式參數(shù)表列形式參數(shù)表列) 函數(shù)體函數(shù)體 函數(shù)定義的第一行函數(shù)定義

33、的第一行+分號分號函數(shù)名函數(shù)名(實實參表列參表列);實參向形參單向傳遞值實參向形參單向傳遞值 當當main函數(shù)函數(shù)調(diào)用其它函數(shù)時調(diào)用其它函數(shù)時,main函函數(shù)的寫法數(shù)的寫法#include 必要的函數(shù)聲明;必要的函數(shù)聲明;/函數(shù)函數(shù)被被調(diào)用調(diào)用的位置在定義的前面要聲明的位置在定義的前面要聲明int main() 變量定義;變量定義; /輸入、輸出變量等輸入、輸出變量等 必要的數(shù)據(jù)輸入必要的數(shù)據(jù)輸入; / scanf gets() 函數(shù)調(diào)用;函數(shù)調(diào)用;/函數(shù)名(實參表列),函數(shù)名(實參表列),常用常用c=max(a,b); 必要的結(jié)果輸出;必要的結(jié)果輸出; / printf puts() ret

34、urn 0;指定指定函數(shù)的名字函數(shù)的名字,以便以后,以便以后按按名調(diào)用名調(diào)用指定指定函數(shù)類型函數(shù)類型,即函數(shù),即函數(shù)返回值返回值的類型的類型指定指定函數(shù)參數(shù)的名字和類型函數(shù)參數(shù)的名字和類型,以便在調(diào)用函數(shù)時向它們以便在調(diào)用函數(shù)時向它們傳遞傳遞數(shù)據(jù)數(shù)據(jù)指定函數(shù)的功能指定函數(shù)的功能。這是最重要。這是最重要的,這是在函數(shù)體中解決的的,這是在函數(shù)體中解決的int max(int x,int y) int z; z =xy? x:y; return(z);參數(shù)的個數(shù)參數(shù)的個數(shù)參數(shù)的類型參數(shù)的類型自定義函數(shù)的編寫方法自定義函數(shù)的編寫方法1.形式參數(shù)和實際參數(shù)形式參數(shù)和實際參數(shù)u定義函數(shù)定義函數(shù)時函數(shù)名后面

35、的變量名稱為時函數(shù)名后面的變量名稱為“形式參形式參數(shù)數(shù)”(簡稱(簡稱“形參形參”)u主調(diào)函數(shù)中主調(diào)函數(shù)中調(diào)用一個函數(shù)時調(diào)用一個函數(shù)時,函數(shù)名后面參數(shù),函數(shù)名后面參數(shù)稱為稱為“實際參數(shù)實際參數(shù)”(簡稱(簡稱“實參實參”)2. 實參和形參間的實參和形參間的數(shù)據(jù)傳遞數(shù)據(jù)傳遞實參實參形參形參數(shù)據(jù)傳遞數(shù)據(jù)傳遞c=max(2,3);int max(int x,int y)單向性單向性按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置來分,可以有以下來分,可以有以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式:. 函數(shù)調(diào)用函數(shù)調(diào)用語句語句 把函數(shù)調(diào)用單獨作為一個語句把函數(shù)調(diào)用單獨作為一個語句, 如如pr

36、int_star();. 函數(shù)函數(shù)表達式表達式 函數(shù)調(diào)用出現(xiàn)在另一個表達式中函數(shù)調(diào)用出現(xiàn)在另一個表達式中, 如如c=max(a,b);. 函數(shù)函數(shù)參數(shù)參數(shù) 函數(shù)調(diào)用作為另一函數(shù)調(diào)用時的實參函數(shù)調(diào)用作為另一函數(shù)調(diào)用時的實參, 如如printf(“%d”, max(a,b);語言的函數(shù)定義是互相平行、獨立的語言的函數(shù)定義是互相平行、獨立的,即即函數(shù)不能嵌套定義函數(shù)不能嵌套定義但可以但可以嵌套調(diào)用函數(shù)嵌套調(diào)用函數(shù),即,即調(diào)用一個函數(shù)的調(diào)用一個函數(shù)的過程中,又過程中,又可以可以調(diào)用另一個函數(shù)調(diào)用另一個函數(shù)main函數(shù)函數(shù)調(diào)用調(diào)用a函數(shù)函數(shù)結(jié)束結(jié)束a函數(shù)函數(shù)調(diào)用調(diào)用b函數(shù)函數(shù)b函數(shù)函數(shù) 例例7.5 輸入

37、輸入4個整數(shù),找出其中最大的數(shù)。個整數(shù),找出其中最大的數(shù)。用函數(shù)的嵌套調(diào)用來處理。用函數(shù)的嵌套調(diào)用來處理。解題思路:解題思路:umain中調(diào)用中調(diào)用max4函數(shù)函數(shù),找,找4個數(shù)中最大者個數(shù)中最大者umax4中再調(diào)用中再調(diào)用max2,找兩個數(shù)中的大者找兩個數(shù)中的大者umax4中多次調(diào)用中多次調(diào)用max2,可找,可找4個數(shù)中的大個數(shù)中的大者,然后把它作為函數(shù)值返回者,然后把它作為函數(shù)值返回main函數(shù)函數(shù)umain函數(shù)中輸出結(jié)果函數(shù)中輸出結(jié)果#include int main() int max4(int a,int b,int c,int d); int a,b,c,d,max; printf

38、(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數(shù)主函數(shù)對對max4 函數(shù)聲明函數(shù)聲明#include int main() int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); ret

39、urn 0; 主函數(shù)主函數(shù)輸入輸入4個整數(shù)個整數(shù)#include int main() int max4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 主函數(shù)主函數(shù)調(diào)用后肯定是調(diào)用后肯定是4個數(shù)中最大者個數(shù)中最大者輸出最大者輸出最大者int max4(int a,int b,int c,int d) int max2(int a,int

40、b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)函數(shù)對對max2 函數(shù)聲明函數(shù)聲明int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)函數(shù)a,b中較大者中較大者a,b,c中較大者中較大者a,b,c,d中最大者中最大者int max4(int a,int b,int c,int d) int max2(int a,int b)

41、; int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)函數(shù)int max2(int a,int b) if(a=b) return a; else return b; max2函數(shù)函數(shù)找找a,b中較大者中較大者#include int main() int max4(int a,int b,int c,int d); int a,b,c,d,max; . max=max4(a,b,c,d); printf(max=%d n,max); return 0; int max4(int a,int b,int c,int d

42、) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); int max2(int a,int b) if(a=b) return a; else return b; int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)函數(shù)int max2(int a,int b) if(a=b) return a; e

43、lse return b; max2函數(shù)函數(shù)return(ab?a:b);int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)函數(shù)int max2(int a,int b) return(ab?a:b); int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d);

44、return(m); max4函數(shù)函數(shù)m=max2(max2(a,b),c);int max2(int a,int b) return(ab?a:b); int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)函數(shù)m=max2(max2(max2(a,b),c),d);int max2(int a,int b) return(ab?a:b); int max4(int a,int b,int c,int d) i

45、nt max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); max4函數(shù)函數(shù)ruturn max2(max2(max2(a,b),c),d);int max2(int a,int b) return(ab?a:b); int max4(int a,int b,int c,int d) int max2(int a,int b); ruturn max2(max2(max2(a,b),c),d);int max2(int a,int b) return(ab?a:b); #include int m

46、ain() max=max4(a,b,c,d); 在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地接地調(diào)用該函數(shù)本身調(diào)用該函數(shù)本身,稱為函數(shù)的,稱為函數(shù)的遞歸調(diào)遞歸調(diào)用用。語言的特點之一就在于允許函數(shù)的遞歸語言的特點之一就在于允許函數(shù)的遞歸調(diào)用。調(diào)用。 f2函數(shù)函數(shù)調(diào)用調(diào)用f1函數(shù)函數(shù) int f(int x) int z; z=f(x); return (2*z); f函數(shù)函數(shù)調(diào)用調(diào)用f函數(shù)函數(shù) f1函數(shù)函數(shù)調(diào)用調(diào)用f2函數(shù)函數(shù)應(yīng)使用應(yīng)使用if語句控制結(jié)束調(diào)用語句控制結(jié)束調(diào)用直接調(diào)用本函數(shù)直接調(diào)用本函數(shù)間接調(diào)用本函數(shù)間接調(diào)用本函數(shù) 例例7.6 有有5個學(xué)生坐在一起

47、個學(xué)生坐在一起u問第問第5個學(xué)生多少歲?他說比第個學(xué)生多少歲?他說比第4個學(xué)生大個學(xué)生大2歲歲u問第問第4個學(xué)生歲數(shù),他說比第個學(xué)生歲數(shù),他說比第3個學(xué)生大個學(xué)生大2歲歲u問第問第3個學(xué)生,又說比第個學(xué)生,又說比第2個學(xué)生大個學(xué)生大2歲歲u問第問第2個學(xué)生,說比第個學(xué)生,說比第1個學(xué)生大個學(xué)生大2歲歲u最后問第最后問第1個學(xué)生,他說是個學(xué)生,他說是10歲歲u請問第請問第5個學(xué)生多大個學(xué)生多大解題思路:解題思路:u要求要求第個年齡第個年齡,就必須先知道第個年齡,就必須先知道第個年齡u要求第個年齡必須先知道第個年齡要求第個年齡必須先知道第個年齡u第個年齡又取決于第個年齡第個年齡又取決于第個年齡u第

48、個年齡取決于第個年齡取決于第個年齡第個年齡u每個學(xué)生年齡都比其前個學(xué)生的年齡大每個學(xué)生年齡都比其前個學(xué)生的年齡大解題思路:解題思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10 age(1)=10; age(n)=age(n-1)+2; age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =16 age(5) =18 回溯階段回溯階段 遞推階段遞推

49、階段 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =16 age(5) =18 回回溯溯階段階段 遞推階段遞推階段結(jié)束遞歸的條件結(jié)束遞歸的條件#include int main() int age(int n); printf(NO.5,age:%dn,age(5); return 0; int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); age(5)輸

50、出輸出age(5)mainc=age(4)+2age函數(shù)函數(shù)n=5c=age(3)+2age函數(shù)函數(shù)n=4c=age(1)+2age函數(shù)函數(shù)n=2c=age(2)+2age函數(shù)函數(shù)n=3c=10age函數(shù)函數(shù)n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=1818int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); 例例7.7 用遞歸方法求!。用遞歸方法求!。解題思路:解題思路:u求!可以用求!可以用遞推遞推方法方法:即從開始,乘,即從開始,乘,再乘再乘一直乘到。一直乘到。

51、u遞推法的特點是從一個已知的事實遞推法的特點是從一個已知的事實(如如1!=1)出發(fā),按一定規(guī)律推出下一個事實出發(fā),按一定規(guī)律推出下一個事實(如如2!=1!*2),再從這個新的已知的事實出發(fā),再從這個新的已知的事實出發(fā),再向下推出一個新的事實再向下推出一個新的事實(3!=3*2!)。n!=n*(n-1)!。例例7.7 用遞歸方法求!。用遞歸方法求!。解題思路:解題思路:u求!可以用求!可以用遞推遞推方法方法:即從開始,乘,即從開始,乘,再乘再乘一直乘到。一直乘到。/* 自定義函數(shù)自定義函數(shù)fact() ,實現(xiàn)求,實現(xiàn)求n!的功能的功能*/double fact( int n)int i;doub

52、le f=1;for(i=1; i=n; i+) f=f*i; return f;例例7.7 用遞歸方法求!。用遞歸方法求!。解題思路:解題思路:u求!也可以用求!也可以用遞歸遞歸方法,即!等于!方法,即!等于!,而!,而!,!,!u可用下面的遞歸公式表示:可用下面的遞歸公式表示:!1(0,1)!(1)!(1)nnnnnn f=fac(n-1)*n#include int main() int fac(int n); int n; int y; printf(input an integer number:); scanf(%d,&n); y=fac(n); printf(%d!=%dn,n,

53、y); return 0;int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0 | | n=1) f=1; else f=fac(n-1)*n; return(f); #include int main() int fac(int n); int n; int y; printf(input an integer number:); scanf(%d,&n); y=fac(n); printf(%d!=%dn,n,y); return 0;3int fac(int n) int f; if(n=0 | n=1) f=1

54、; else f=fac(n-1)*n; return(f); 3int fac(int n) int f; if(n=0 | n=1) f=1; else f=fac(n-1)*n; return(f); 2int fac(int n) int f; if(n=0 | n=1) f=1; else f=fac(n-1)*n; return(f); 1返回調(diào)用處返回調(diào)用處2=1*26=2*3返回返回主調(diào)主調(diào)函數(shù)函數(shù)#include int main() int fac(int n); int n; int y; printf(input an integer number:); scanf(%

55、d,&n); y=fac(n); printf(%d!=%dn,n,y); return 0;3注意溢出注意溢出在調(diào)用一個函數(shù)的過程中又出現(xiàn)在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接直接或間接地地調(diào)用該函數(shù)本身調(diào)用該函數(shù)本身,稱為函數(shù)的,稱為函數(shù)的遞歸調(diào)用遞歸調(diào)用。二個階段二個階段:回溯階段與遞推階段回溯階段與遞推階段當前所求當前所求結(jié)束條件結(jié)束條件求得當前求得當前回溯階段回溯階段遞推階段遞推階段結(jié)束條件:結(jié)束條件:當當條件成立時不再調(diào)用本身條件成立時不再調(diào)用本身通過調(diào)用自己和通過調(diào)用自己和實參實參設(shè)定設(shè)定7.7.1數(shù)組元素數(shù)組元素作函數(shù)作函數(shù)實參實參7.7.2數(shù)組名數(shù)組名作函數(shù)作函數(shù)參數(shù)參數(shù)7.

56、7.3多維數(shù)組名作函數(shù)參數(shù)多維數(shù)組名作函數(shù)參數(shù) 例例7.9 輸入輸入10個數(shù),要求輸出其中值個數(shù),要求輸出其中值最大的元素和該數(shù)是第幾個數(shù)。最大的元素和該數(shù)是第幾個數(shù)。解題思路:解題思路:u定義數(shù)組定義數(shù)組a,用來存放,用來存放10個數(shù)個數(shù)u設(shè)計設(shè)計函數(shù)函數(shù)max,用來求兩個數(shù)中的大者,用來求兩個數(shù)中的大者u用用“打擂臺打擂臺”算法,在主函數(shù)中定義變量算法,在主函數(shù)中定義變量m,初值為,初值為a0,依次將數(shù)組元素,依次將數(shù)組元素a1到到a9與與m比較,最后得到的比較,最后得到的m值就是值就是10個數(shù)中的最大者個數(shù)中的最大者。#include int main() int max(int x,i

57、nt y); int a10,m,n,i; printf(“10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); for(i=1,m=a0,n=0;im) /if(aim) m=max(m,ai); /m=ai n=i; printf(“l(fā)argest number is %dn,m); printf(“%dth number.n“,n+1);int max(int x,int y) return(xy?x:y); 除了可以用除了可以用數(shù)組元素數(shù)組元素作為函數(shù)參數(shù)外作為函數(shù)參數(shù)外,還可以用,還可以用數(shù)組名數(shù)組名作作函數(shù)

58、參數(shù)函數(shù)參數(shù)(包括實包括實參和形參參和形參)用數(shù)組元素作實參時,向形參變量用數(shù)組元素作實參時,向形參變量傳傳遞的是數(shù)組元素的值遞的是數(shù)組元素的值用數(shù)組名作函數(shù)實參時,向形參用數(shù)組名作函數(shù)實參時,向形參 傳遞傳遞的是數(shù)組的是數(shù)組第一個第一個元素的地址元素的地址 例例7.10 有一個一維數(shù)組有一個一維數(shù)組score,內(nèi)放,內(nèi)放10個學(xué)生成績,求平均成績。個學(xué)生成績,求平均成績。解題思路:解題思路:u用用函數(shù)函數(shù)average求平均成績,用求平均成績,用數(shù)組名數(shù)組名作為函數(shù)實參,形參也用數(shù)組名作為函數(shù)實參,形參也用數(shù)組名u在在average函數(shù)中引用各數(shù)組元素,求函數(shù)中引用各數(shù)組元素,求出出平均成績

59、平均成績后后返回返回main函數(shù)函數(shù)#include int main() float average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); printf(n); aver=average(score); printf(%5.2fn,aver); return 0; 定義實參數(shù)組定義實參數(shù)組內(nèi)存地址假設(shè)內(nèi)存地址假設(shè)數(shù)組元組數(shù)組元組輸入數(shù)據(jù)輸入數(shù)據(jù)1000score011004score1211008score2310012s

60、core3510016score4610020score52210024score61110028score71710032score81010036score95score#include int main() float average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); printf(n); aver=average(score); printf(%5.2fn,aver); return 0; 數(shù)組名作為實參數(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論