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

下載本文檔

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

文檔簡介

1、信息科學與工程學院計算機系信息科學與工程學院計算機系卡米力卡米力C程序設計程序設計(第三版)(第三版) 學好程序設計語言的唯一途徑學好程序設計語言的唯一途徑是上機練習。是上機練習。你的編程能力與你在計算機上你的編程能力與你在計算機上投入的時間成正比。投入的時間成正比。 課程要求課程要求 課前請做好預習課前請做好預習 保持課堂安靜,頭腦清醒,思維活躍保持課堂安靜,頭腦清醒,思維活躍 做好課堂筆記做好課堂筆記 認真、獨立、按時完成并提交作業(yè)認真、獨立、按時完成并提交作業(yè) 重視上機實踐,有效利用寶貴的上機時重視上機實踐,有效利用寶貴的上機時間間7.1 為什么要用函數(shù)為什么要用函數(shù) 7.2怎樣定義函數(shù)

2、怎樣定義函數(shù)7.3調(diào)用函數(shù)調(diào)用函數(shù)7.4 對被調(diào)用函數(shù)的聲明和函數(shù)原型對被調(diào)用函數(shù)的聲明和函數(shù)原型 7.5 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用7.6函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用 7.7數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)7.8局部變量和全局變量局部變量和全局變量7.9變量的存儲方式和生存期變量的存儲方式和生存期 7.10 關(guān)于變量的聲明和定義關(guān)于變量的聲明和定義7.11 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù) 第第7章章 函數(shù)函數(shù) 7.1 為什么要用函數(shù)為什么要用函數(shù)問題:問題:如果程序的功能比較多,規(guī)模比較大,如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在把所有代碼都寫在main函數(shù)中,就會使函數(shù)中

3、,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維主函數(shù)變得龐雜、頭緒不清,閱讀和維護變得困難護變得困難。有時程序中要多次實現(xiàn)某一功能,就需有時程序中要多次實現(xiàn)某一功能,就需要多次重復編寫實現(xiàn)此功能的程序代碼要多次重復編寫實現(xiàn)此功能的程序代碼,這使程序冗長,不精煉這使程序冗長,不精煉。 解決的方法:解決的方法: 用用模塊化程序設計的思路模塊化程序設計的思路采用采用“組裝組裝”的辦法簡化程序設計的過的辦法簡化程序設計的過程程事先編好一批實現(xiàn)各種不同功能的函數(shù)事先編好一批實現(xiàn)各種不同功能的函數(shù)把它們保存在函數(shù)庫中把它們保存在函數(shù)庫中,需要時需要時直接用直接用.函數(shù)就是功能函數(shù)就是功能:函數(shù)函數(shù)就是就是用來

4、用來完成完成特定的功能特定的功能的代碼的代碼函數(shù)名就是給該函數(shù)名就是給該( (函數(shù)函數(shù)) )功能起的名字功能起的名字函數(shù)的名字應反映其代表的功能函數(shù)的名字應反映其代表的功能函數(shù)名應該遵循函數(shù)名應該遵循“見名知意見名知意”。在設計一個較大的程序時,在設計一個較大的程序時,往往把它分往往把它分為為若干個程序模塊,若干個程序模塊,每一個模塊包括每一個模塊包括一一個或多個函數(shù)個或多個函數(shù),每個函數(shù)實現(xiàn)一個特定每個函數(shù)實現(xiàn)一個特定的功能的功能。程序可由一個主函數(shù)和若干個其他函程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成數(shù)構(gòu)成;主函數(shù)調(diào)用其他函數(shù),主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以其他函數(shù)也可以互相調(diào)用互相調(diào)用

5、;同一個函數(shù)可以被一個或多個函數(shù)調(diào)用同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次任意多次。由主函數(shù)調(diào)用其他函數(shù),由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)其他函數(shù)也可以互相調(diào)用。用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。多次。在程序開發(fā)中,在程序開發(fā)中,常將一些常用的功能模塊常將一些常用的功能模塊編寫成編寫成函數(shù),函數(shù),放在公共函數(shù)庫中放在公共函數(shù)庫中供大家選用。供大家選用。圖圖7-1 7-1 函數(shù)之間的調(diào)用關(guān)系示意圖函數(shù)之間的調(diào)用關(guān)系示意圖例例7.1 7.1 輸出一行信息,用函數(shù)調(diào)用來實現(xiàn)輸出一行信息,用函數(shù)調(diào)用來實現(xiàn)# include void m

6、ain() void printstar(); / *函數(shù)函數(shù)printstar的聲明的聲明 * / void print_message(); /* 函數(shù)函數(shù)print_message的聲明的聲明 */ printstar(); /* 調(diào)用自定義函數(shù)調(diào)用自定義函數(shù)printstar */ print_message(); /* 調(diào)用自定義函數(shù)調(diào)用自定義函數(shù)print_message */ printstar(); /* 調(diào)用自定義函數(shù)調(diào)用自定義函數(shù)printstar */ void printstar() *printstar函數(shù)的定義函數(shù)的定義* printf(* * * * * * *

7、* * * * * *n);void print_message() printf(How do you do!n); 解題思路:解題思路:在輸出的文字上下分在輸出的文字上下分別有一行別有一行“*”號,顯然不必重復號,顯然不必重復寫這段代碼,用一個函數(shù)寫這段代碼,用一個函數(shù)print_star來實現(xiàn)輸出一行來實現(xiàn)輸出一行“*”號的功能。號的功能。再寫一個再寫一個print_message函數(shù)來函數(shù)來輸出中間一行文字信息用主函數(shù)輸出中間一行文字信息用主函數(shù)分別調(diào)用這兩個函數(shù)分別調(diào)用這兩個函數(shù)。#include int main() void print_star(); void print_me

8、ssage(); 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ù)函數(shù)的調(diào)用函數(shù)的調(diào)用(1)一個一個C程序程序由一個或多個由一個或多個程序模塊組成程序模塊組成,每一個程序模塊每一個程序模塊作為一個源程序文件作為一個源程序文件。對較大的程序,對較大的程序,一般不希望把所有內(nèi)容全放一般不希望把所有內(nèi)容全放在一個文件中,在一個文件中,而是將他們分別

9、放在若干個而是將他們分別放在若干個源文件中,源文件中,再由若干源程序文件再由若干源程序文件組成一個組成一個C C程程序。序。這樣便于分別編寫、這樣便于分別編寫、分別編譯,提高調(diào)試效分別編譯,提高調(diào)試效率。率。一個源程序文件可以為多個一個源程序文件可以為多個C C程序公用。程序公用。(2) 一個源程序文件一個源程序文件由一個由一個或或多個函數(shù)多個函數(shù)以以及其他有關(guān)內(nèi)容及其他有關(guān)內(nèi)容(如命令行、數(shù)據(jù)定義等)(如命令行、數(shù)據(jù)定義等)組成。組成。一個源程序文件一個源程序文件是一個編譯單位,是一個編譯單位,在程序編在程序編譯時譯時是以源程序文件為單位是以源程序文件為單位進行編譯的,進行編譯的,而而不是以

10、函數(shù)為單位不是以函數(shù)為單位進行編譯的。進行編譯的。(3)C程序的執(zhí)行程序的執(zhí)行是是從從main函數(shù)開始函數(shù)開始的,的,如是在如是在main函數(shù)中函數(shù)中調(diào)用其他函數(shù),調(diào)用其他函數(shù),在調(diào)用后在調(diào)用后流程返回到流程返回到main函數(shù),函數(shù),在在main函數(shù)中函數(shù)中結(jié)束整個程序的運行。結(jié)束整個程序的運行。(4) 所有函數(shù)都是平行的,所有函數(shù)都是平行的,即在定義即在定義函數(shù)時是分別進行的,函數(shù)時是分別進行的,是互相獨立的。是互相獨立的。一個函數(shù)一個函數(shù)并不從屬于另一函數(shù),并不從屬于另一函數(shù),即函數(shù)即函數(shù)不能嵌套定義。不能嵌套定義。函數(shù)間可以互相調(diào)用,函數(shù)間可以互相調(diào)用,但不能調(diào)用但不能調(diào)用main函數(shù)。

11、函數(shù)。main函數(shù)是函數(shù)是系統(tǒng)調(diào)用的。系統(tǒng)調(diào)用的。(5)從用戶使用的角度看,函數(shù)有兩種:)從用戶使用的角度看,函數(shù)有兩種: 標準函數(shù),即庫函數(shù)。標準函數(shù),即庫函數(shù)。這是由系統(tǒng)提供的,這是由系統(tǒng)提供的,用戶不必自己定義這些用戶不必自己定義這些函數(shù),函數(shù),可以直接使用它們??梢灾苯邮褂盟鼈?。應該說明,應該說明,不同的不同的C系統(tǒng)提供的庫函數(shù)的系統(tǒng)提供的庫函數(shù)的數(shù)數(shù)量量和和功能功能會有一些不同會有一些不同。 用戶自己定義的函數(shù)。用戶自己定義的函數(shù)。用以解決用戶的專用以解決用戶的專門需要。門需要。(6) 從函數(shù)的形式看,函數(shù)分兩類:從函數(shù)的形式看,函數(shù)分兩類:無參函數(shù)。無參函數(shù)。如例如例7.1中的中的

12、printstar和和print_message就是就是無參函數(shù)。無參函數(shù)。在調(diào)用無參函數(shù)時,在調(diào)用無參函數(shù)時,主調(diào)函數(shù)主調(diào)函數(shù)不向不向被調(diào)用函被調(diào)用函數(shù)數(shù)傳遞數(shù)據(jù)。傳遞數(shù)據(jù)。無參函數(shù)無參函數(shù)一般用來執(zhí)行一般用來執(zhí)行指定的指定的一組操作。一組操作。void print_message() *定義定義print_message函數(shù)函數(shù)* printf(How do you do!n); 有參函數(shù)。有參函數(shù)。在調(diào)用函數(shù)時,在調(diào)用函數(shù)時,主調(diào)函數(shù)主調(diào)函數(shù)在調(diào)用在調(diào)用被調(diào)用函數(shù)被調(diào)用函數(shù)時,時,通過參數(shù)通過參數(shù)向被調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),一般傳遞數(shù)據(jù),一般情況下,情況下,執(zhí)行被調(diào)用函數(shù)時執(zhí)行被調(diào)

13、用函數(shù)時會得到一個函數(shù)會得到一個函數(shù)值,值,供主調(diào)函數(shù)使用。供主調(diào)函數(shù)使用。例如:例如:int max(int x,int y) int z; / *函數(shù)體中的聲明部分函數(shù)體中的聲明部分* z=xy?x:y ; / *函數(shù)體中的執(zhí)行語句函數(shù)體中的執(zhí)行語句* return(z); 形式參數(shù)形式參數(shù)7.2.1. 為什么要定義函數(shù)為什么要定義函數(shù)C語言要求,在程序中用到的所有函數(shù),必語言要求,在程序中用到的所有函數(shù),必須須“先定義,后使用先定義,后使用”。例如,例如,想調(diào)用想調(diào)用max函數(shù)函數(shù)來求出兩個數(shù)中的大來求出兩個數(shù)中的大者,者,必須事先定義要調(diào)用的必須事先定義要調(diào)用的max函數(shù),即函數(shù),即指

14、指定定函數(shù)函數(shù)名字名字、函數(shù)、函數(shù)返回值類型返回值類型、函數(shù)實現(xiàn)的、函數(shù)實現(xiàn)的功能功能以及以及參數(shù)的個數(shù)與類型參數(shù)的個數(shù)與類型,將這些信息通,將這些信息通知編譯系統(tǒng)。知編譯系統(tǒng)。定義函數(shù)應包括以下幾個內(nèi)容:定義函數(shù)應包括以下幾個內(nèi)容: 指定函數(shù)的名字指定函數(shù)的名字,以便以后按名調(diào)用,以便以后按名調(diào)用; 指定函數(shù)類型指定函數(shù)類型,即函數(shù)返回值的類型,即函數(shù)返回值的類型; 指定函數(shù)參數(shù)的名字和類型指定函數(shù)參數(shù)的名字和類型,以便在調(diào)用,以便在調(diào)用函數(shù)時向它們傳遞數(shù)據(jù)函數(shù)時向它們傳遞數(shù)據(jù); 指定函數(shù)的功能。指定函數(shù)的功能。這是最重要的,這是在這是最重要的,這是在函數(shù)體中解決的函數(shù)體中解決的。對于對于庫

15、函數(shù),庫函數(shù),程序設計者只需用程序設計者只需用#include指指令令把有關(guān)的頭文件把有關(guān)的頭文件包含到本文件模塊中即可包含到本文件模塊中即可.在有關(guān)的頭文件中包括了對函數(shù)的聲明,例在有關(guān)的頭文件中包括了對函數(shù)的聲明,例如,在程序中若用到數(shù)學函數(shù)如,在程序中若用到數(shù)學函數(shù)(sqrt,fabs),則在源文件的開頭寫上:,則在源文件的開頭寫上: #include當然,當然,程序設計者需要在程序中自己定義想程序設計者需要在程序中自己定義想用的用的而庫函數(shù)并沒有提供的函數(shù)而庫函數(shù)并沒有提供的函數(shù)1. 定義無參函數(shù)定義無參函數(shù)在定義函數(shù)時要用在定義函數(shù)時要用“類型名類型名”指定函數(shù)值的指定函數(shù)值的類型,

16、類型,即函數(shù)帶回來的值的類型。即函數(shù)帶回來的值的類型。例例7.中的中的printstar和和print_message函數(shù)函數(shù)都是都是無參函數(shù)無參函數(shù),函數(shù)名后面的括號中是空的,函數(shù)名后面的括號中是空的( void ),沒有任何參數(shù)。),沒有任何參數(shù)。定義無參函數(shù)的格式:定義無參函數(shù)的格式:定義無參函數(shù)的一般形式為定義無參函數(shù)的一般形式為:類型名類型名 函數(shù)名函數(shù)名(void) 函數(shù)體函數(shù)體 類型名類型名 函數(shù)名函數(shù)名() 函數(shù)體函數(shù)體 包括聲明部分包括聲明部分和語句部分和語句部分例例 無參函數(shù)無參函數(shù) printstar( ) printf(“*n”); 或或 printstar(void

17、) printf(“*n”); 定義函數(shù)時要用定義函數(shù)時要用“類型名類型名”指定函數(shù)值的類型,指定函數(shù)值的類型,即函數(shù)即函數(shù)帶回來的值的類型帶回來的值的類型.函數(shù)名后函數(shù)名后的的void表示空,即函數(shù)無參數(shù)表示空,即函數(shù)無參數(shù)定義有參函數(shù)的一般形式為定義有參函數(shù)的一般形式為:返回值類型返回值類型函數(shù)名函數(shù)名(形式參數(shù)表列形式參數(shù)表列) 聲明部分聲明部分 語句部分語句部分 函數(shù)體函數(shù)體例如:例如:int max(int x,int y) int z; /聲明部分聲明部分 z=xy?x:y ; /執(zhí)行部分執(zhí)行部分 return(z); 花括號內(nèi)是函數(shù)體,它包括聲明部分和語句部分。花括號內(nèi)是函數(shù)體,

18、它包括聲明部分和語句部分。在聲明部分定義在聲明部分定義所用的變量,所用的變量,此外此外對將要調(diào)用的函數(shù)作聲明對將要調(diào)用的函數(shù)作聲明。在函數(shù)體的語句中求出的值(為在函數(shù)體的語句中求出的值(為x與與y中大者);中大者);return(z)的作用的作用是將是將z的值作為函數(shù)值帶回到主調(diào)函數(shù)中。的值作為函數(shù)值帶回到主調(diào)函數(shù)中。return后面的括弧中的后面的括弧中的值值(z)作為函數(shù)帶回的值(或稱函數(shù)返回值)。作為函數(shù)帶回的值(或稱函數(shù)返回值)。在函數(shù)定義時已指定在函數(shù)定義時已指定max函數(shù)為整型,在函數(shù)體中定義函數(shù)為整型,在函數(shù)體中定義z為整型,為整型,二者是一致的二者是一致的,將,將z作為函數(shù)作為

19、函數(shù)max的值帶回調(diào)用函數(shù)。的值帶回調(diào)用函數(shù)。如果在定義函數(shù)時如果在定義函數(shù)時不指定函數(shù)類型不指定函數(shù)類型,系統(tǒng)會隱含指定函數(shù)類型為,系統(tǒng)會隱含指定函數(shù)類型為int型型。因此上面定義的因此上面定義的max函數(shù)左端的函數(shù)左端的int可以省寫可以省寫.這是一個求這是一個求x和和y二者中大者的函數(shù),二者中大者的函數(shù),笫笫1行第一個關(guān)鍵字行第一個關(guān)鍵字int表示函數(shù)值是表示函數(shù)值是整的。整的。max為函數(shù)名。括號中有兩為函數(shù)名。括號中有兩個形式參數(shù)個形式參數(shù)x和和y,它們都是整型的。,它們都是整型的。在調(diào)用此函數(shù)時,主調(diào)函數(shù)把實際在調(diào)用此函數(shù)時,主調(diào)函數(shù)把實際參數(shù)的值傳遞給被調(diào)用函數(shù)中的形參數(shù)的值傳遞

20、給被調(diào)用函數(shù)中的形式參數(shù)式參數(shù)x和和y。3. 空函數(shù)空函數(shù)調(diào)用此函數(shù)時,什么工作也不做,沒有任何調(diào)用此函數(shù)時,什么工作也不做,沒有任何實際作用。實際作用。在主調(diào)函數(shù)中寫上在主調(diào)函數(shù)中寫上“dummy();”表明表明“這這里要調(diào)用一個函數(shù)里要調(diào)用一個函數(shù)”,而現(xiàn)在這個函數(shù)沒有而現(xiàn)在這個函數(shù)沒有起作用,起作用,等以后擴充函數(shù)功能時補充上。等以后擴充函數(shù)功能時補充上。 例如:例如:void dummy( ) 定義空函數(shù)的一般形式為定義空函數(shù)的一般形式為:返回值類型函數(shù)名()返回值類型函數(shù)名() /函數(shù)體為空函數(shù)體為空 在程序設計中在程序設計中往往根據(jù)需要確定若干模往往根據(jù)需要確定若干模塊,塊, 分別

21、由一些分別由一些函數(shù)來實現(xiàn)。函數(shù)來實現(xiàn)。 而在第一階段而在第一階段只設計最基本的模塊,只設計最基本的模塊, 其其他一些次要功能他一些次要功能或或錦上添花錦上添花的功能的功能則在則在以后以后需要時需要時陸續(xù)補上。陸續(xù)補上。在編寫程序的開始階段,在編寫程序的開始階段,可以在將來準備擴可以在將來準備擴充功能的地方充功能的地方寫上一個空函數(shù)寫上一個空函數(shù)(函數(shù)名取將(函數(shù)名取將來采用的實際函數(shù)名來采用的實際函數(shù)名(如用(如用merge()()、matproduct()()、oncatenate()()、shell()()等,分別代表合并、矩陣相乘、字符串連接、等,分別代表合并、矩陣相乘、字符串連接、希

22、爾法排序等),希爾法排序等),只是這些函數(shù)未編好,只是這些函數(shù)未編好,先先占一個位置,以后用一個編好的函數(shù)代替它。占一個位置,以后用一個編好的函數(shù)代替它。這樣做,程序的結(jié)構(gòu)清楚,可讀性好,這樣做,程序的結(jié)構(gòu)清楚,可讀性好,以后以后擴充新功能方便,對程序結(jié)構(gòu)影響不大。擴充新功能方便,對程序結(jié)構(gòu)影響不大??湛蘸瘮?shù)在程序設計中常常是有用的。函數(shù)在程序設計中常常是有用的。 7.3 函數(shù)調(diào)用函數(shù)調(diào)用定義函數(shù)的目的就是為了調(diào)用此函數(shù),以得定義函數(shù)的目的就是為了調(diào)用此函數(shù),以得到預期的結(jié)果。到預期的結(jié)果。7.3.1 函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式調(diào)用一個函數(shù)的方法很簡單調(diào)用一個函數(shù)的方法很簡單,如:如: pr

23、int_star(); /調(diào)用無參函數(shù)調(diào)用無參函數(shù) c=max(a,b); /調(diào)用有參函數(shù)調(diào)用有參函數(shù)函數(shù)調(diào)用形式:函數(shù)調(diào)用形式: 函數(shù)名(實參表列);函數(shù)名(實參表列);如果是調(diào)用如果是調(diào)用無參函數(shù)無參函數(shù),則,則“實參表列實參表列”可以可以沒有,但括號不能省略沒有,但括號不能省略;如果實參表列如果實參表列包含多個實參包含多個實參,則各參數(shù)間用,則各參數(shù)間用逗號隔開逗號隔開。按函數(shù)調(diào)用按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置來在程序中出現(xiàn)的形式和位置來分分,可以有以下,可以有以下3種函數(shù)調(diào)用方式種函數(shù)調(diào)用方式:1. 函數(shù)調(diào)用語句函數(shù)調(diào)用語句把函數(shù)調(diào)用單獨作為一個語句把函數(shù)調(diào)用單獨作為一個語句。例如

24、:例如: printf_star();這時不要求函數(shù)帶回值,只要求函數(shù)完成一這時不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作定的操作。2. 函數(shù)表達式函數(shù)表達式函數(shù)調(diào)用出現(xiàn)在另一個表達式中函數(shù)調(diào)用出現(xiàn)在另一個表達式中。例如:例如:c=max(a,b); 。c=max(a,b); 是一次函數(shù)調(diào)用,它是賦值表是一次函數(shù)調(diào)用,它是賦值表達式中的一部分。達式中的一部分。這時要求函數(shù)帶回一個確定的值以參加表達這時要求函數(shù)帶回一個確定的值以參加表達式的運算式的運算。3. 函數(shù)參數(shù)函數(shù)參數(shù)函數(shù)調(diào)用作為另一函數(shù)調(diào)用時的實參函數(shù)調(diào)用作為另一函數(shù)調(diào)用時的實參。例如:例如: mmax(a,max(b,c);其中其中m

25、ax(b,c)是一次函數(shù)調(diào)用,是一次函數(shù)調(diào)用,它的值作為它的值作為max另一次調(diào)用的實參另一次調(diào)用的實參。經(jīng)過賦值后,。經(jīng)過賦值后,m的的值是值是a,b,c三者中的最大者,三者中的最大者,又如:又如:printf(“%d”,max(a , b); 也是把也是把max(a , b)作作為為printf函數(shù)的一個參數(shù)。函數(shù)的一個參數(shù)。 7.3.2 函數(shù)調(diào)用時的數(shù)據(jù)傳遞函數(shù)調(diào)用時的數(shù)據(jù)傳遞1. 形式參數(shù)和實際參數(shù)形式參數(shù)和實際參數(shù)在調(diào)用函數(shù)時,在調(diào)用函數(shù)時,大多數(shù)情況下,大多數(shù)情況下,主調(diào)函數(shù)主調(diào)函數(shù)和和被調(diào)用函數(shù)被調(diào)用函數(shù)之間之間有數(shù)據(jù)傳遞關(guān)系。有數(shù)據(jù)傳遞關(guān)系。 這就是這就是前面提到的前面提到的有

26、參函數(shù)。有參函數(shù)。 在定義函數(shù)時在定義函數(shù)時函數(shù)名后面函數(shù)名后面括號中的變量名括號中的變量名 稱為稱為“形式參數(shù)形式參數(shù)”(簡稱(簡稱“形參形參”);); 在主調(diào)函數(shù)中在主調(diào)函數(shù)中調(diào)用一個函數(shù)調(diào)用一個函數(shù)時,時,函數(shù)名后函數(shù)名后 面括號中的參數(shù)面括號中的參數(shù)(可以是一個表達式可以是一個表達式)稱為稱為 “實際參數(shù)實際參數(shù)”(簡稱(簡稱“實參實參”)。)。 實參可以是常量、變量或表達式實參可以是常量、變量或表達式。 在不同的函數(shù)之間在不同的函數(shù)之間傳遞數(shù)據(jù)時傳遞數(shù)據(jù)時,可以可以使用的法:使用的法: 參數(shù):參數(shù):通過形式參數(shù)和實際參數(shù)通過形式參數(shù)和實際參數(shù) 返回值:返回值:用用return語句返回

27、計算結(jié)果語句返回計算結(jié)果 全局變量:全局變量:外部變量外部變量函數(shù)參數(shù)及其傳遞方式:函數(shù)參數(shù)及其傳遞方式:形參與實參:形參與實參: 實際參數(shù):實際參數(shù):調(diào)用函數(shù)時調(diào)用函數(shù)時函數(shù)名后面函數(shù)名后面 括號中的括號中的變量名。變量名。 形式參數(shù):形式參數(shù):定義函數(shù)時定義函數(shù)時函數(shù)名后面函數(shù)名后面 括號中的括號中的變量名。變量名。 函數(shù)參數(shù)傳遞方式:函數(shù)參數(shù)傳遞方式:函數(shù)調(diào)用時函數(shù)調(diào)用時將將 實參值實參值傳遞給傳遞給形參。形參。2. 實參和形參間的數(shù)據(jù)傳遞實參和形參間的數(shù)據(jù)傳遞在調(diào)用函數(shù)過程中,在調(diào)用函數(shù)過程中,系統(tǒng)會把實參的值傳系統(tǒng)會把實參的值傳遞給被調(diào)用函數(shù)的形參遞給被調(diào)用函數(shù)的形參,或者說,或者說

28、,形參從形參從實參得到一個值實參得到一個值。該值在函數(shù)調(diào)用期間有效,該值在函數(shù)調(diào)用期間有效,可以參加可以參加被調(diào)被調(diào)函數(shù)中的運算函數(shù)中的運算。在調(diào)用函數(shù)過程中發(fā)生的在調(diào)用函數(shù)過程中發(fā)生的實參與形參間的實參與形參間的數(shù)據(jù)傳遞數(shù)據(jù)傳遞,稱為,稱為虛實結(jié)合虛實結(jié)合。例例7.2 輸入兩個整數(shù),要求輸出其中值較大輸入兩個整數(shù),要求輸出其中值較大者。要求用函數(shù)來找到大數(shù)。者。要求用函數(shù)來找到大數(shù)。解題思路:解題思路:1)函數(shù)名應是函數(shù)名應是見名知意見名知意,今定名為,今定名為max;2) 由于給定的兩個數(shù)是整數(shù),返回主調(diào)函數(shù)由于給定的兩個數(shù)是整數(shù),返回主調(diào)函數(shù) 的值的值(即較大數(shù))(即較大數(shù))應該是整型應

29、該是整型。3) max函數(shù)應當有兩個參數(shù),以便從主函函數(shù)應當有兩個參數(shù),以便從主函數(shù)接收兩個整數(shù),數(shù)接收兩個整數(shù),因此因此參數(shù)的類型應當參數(shù)的類型應當是整型是整型先編寫先編寫max函數(shù):函數(shù):int max(int x,int y) /函數(shù)的定義,函數(shù)的定義,x和和y是形參是形參 int z; z=xy?x:y; return(z); 在在max函數(shù)上面,函數(shù)上面,再編寫主函數(shù)再編寫主函數(shù)#include int main() int max(int x,int y); /函數(shù)的聲明函數(shù)的聲明 int a,b,c; printf(“two integer numbers: ); scanf(“

30、%d,%d”,&a,&b); c=max( a , b ); /函數(shù)的調(diào)用,函數(shù)的調(diào)用,實參可以是實參可以是常量常量變量變量或表達式或表達式 printf(“max is %dn”,c); #include int main() int max(int x,int y); /函數(shù)的聲明函數(shù)的聲明 int a,b,c; printf(“two integer numbers: ); scanf(“%d,%d”,&a,&b); c=max( a , b ); /函數(shù)的調(diào)用,函數(shù)的調(diào)用,實參可以是實參可以是常量常量變量變量或表或表達式達式 printf(“max is

31、 %dn”,c); int max(int x,int y) /函數(shù)的定義,函數(shù)的定義,x和和y是形參是形參 int z; z=xy?x:y; return(z); 在調(diào)用此函數(shù)時,主調(diào)函數(shù)把實在調(diào)用此函數(shù)時,主調(diào)函數(shù)把實參的值傳遞給參的值傳遞給max函數(shù)中的形參函數(shù)中的形參x和和y,實現(xiàn)了參數(shù)值的傳遞,實現(xiàn)了參數(shù)值的傳遞,把二者組合為一個程序文件,主函數(shù)在前面,把二者組合為一個程序文件,主函數(shù)在前面,max函數(shù)在下面。函數(shù)在下面。如:文件名為如:文件名為ka1.c說明:說明:在笫在笫2行的行的int表示函數(shù)值是整的。表示函數(shù)值是整的。主主函數(shù)中給出了被調(diào)用函數(shù)函數(shù)中給出了被調(diào)用函數(shù)max的聲

32、明,的聲明,max為函數(shù)名。為函數(shù)名。括號中有兩個括號中有兩個int型的形式型的形式參數(shù)參數(shù)x和和y。用。用c=max(a,b);調(diào)用了調(diào)用了max函數(shù)函數(shù)這時在這時在max函數(shù)中得到了要處理的函數(shù)中得到了要處理的兩個數(shù)據(jù),得到的最大值返回給兩個數(shù)據(jù),得到的最大值返回給c注意:注意:1) 實參可以是常量、變量或表達式,如:實參可以是常量、變量或表達式,如:max(3,a+b),但要求它們有確定的值;但要求它們有確定的值; 在函數(shù)調(diào)用時在函數(shù)調(diào)用時將實參的值傳遞給形參。將實參的值傳遞給形參。2) 實參與形參的類型應相同實參與形參的類型應相同或賦值兼容。或賦值兼容。例例7.2中實參和形參的類型相同

33、,都是中實參和形參的類型相同,都是int 型型,這是合法的,這是合法的 ;如果實參為如果實參為int型而形參型而形參x為為float型,或者相型,或者相反,則按不同類型數(shù)值的賦值規(guī)則進行轉(zhuǎn)換反,則按不同類型數(shù)值的賦值規(guī)則進行轉(zhuǎn)換.例如,實參例如,實參a為為float型變量,其值為型變量,其值為3.5,而而形參形參x為為int型,型,則在傳遞時先將實數(shù)則在傳遞時先將實數(shù)3.5轉(zhuǎn)換轉(zhuǎn)換成成3,然后送到形參,然后送到形參x。char型和型和int型通用型通用.main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is

34、 %d,c);max(int x, int y) /函數(shù)定義函數(shù)定義 int z; z=xy?x:y; return(z);形參形參實參實參(max 函數(shù))函數(shù))c=max(a , b);(main 函數(shù))函數(shù))max( int x, int y ) int z; z=xy?x:y; return(z); 實參和形參間的數(shù)據(jù)傳遞實參和形參間的數(shù)據(jù)傳遞void main() int x, y, z;int max( int a,int b );printf(請輸入兩個整數(shù):請輸入兩個整數(shù):n);scanf(“%d%d”,&x,&y); z=max( x , y ); printf

35、(“max=%dn”,z);int max( int a , int b ) int c; c=ab ? a : b; return c; 實參與形參,參數(shù)傳遞實參與形參,參數(shù)傳遞:x 3y 5zabc 5355 求兩個數(shù)中的最大數(shù):求兩個數(shù)中的最大數(shù):在定義函數(shù)中在定義函數(shù)中指定的形參,指定的形參,在未出現(xiàn)在未出現(xiàn)函數(shù)函數(shù)調(diào)用調(diào)用時,時,它們并不占它們并不占內(nèi)存中的存儲單元。內(nèi)存中的存儲單元。只有在發(fā)生只有在發(fā)生函數(shù)調(diào)用時函數(shù)調(diào)用時,函數(shù)函數(shù)max中的中的形參形參才被分配內(nèi)存單元。才被分配內(nèi)存單元。在調(diào)用結(jié)束后,在調(diào)用結(jié)束后,形參所占的內(nèi)存單元形參所占的內(nèi)存單元也也被釋放。被釋放。 7.3.

36、3 函數(shù)調(diào)用的過程函數(shù)調(diào)用的過程2a3bxy23實參實參形參形參調(diào)用函數(shù)時將實參對應的值傳遞給形參,調(diào)用函數(shù)時將實參對應的值傳遞給形參,如圖如圖7.3所示,實參的值為所示,實參的值為2,把把2傳遞給相應傳遞給相應的形參的形參x,這時形參,這時形參x就得到值就得到值2,同理,形同理,形參參y得到值得到值3。#include int main() int max(int x,int y); /函數(shù)的聲明函數(shù)的聲明 int a,b,c; printf(“two integer numbers: ); scanf(“%d,%d”,&a,&b); c=max( a , b ); /函數(shù)的

37、調(diào)用函數(shù)的調(diào)用 printf(“max is %dn”,c); int max(int x,int y) /函數(shù)的定義函數(shù)的定義 int z; z=xy?x:y; return(z); 在執(zhí)行在執(zhí)行max函數(shù)期間,函數(shù)期間,由于形參已經(jīng)有值由于形參已經(jīng)有值,就可以利用形參進行有關(guān)的運算就可以利用形參進行有關(guān)的運算(例如,(例如,x和和y比較,把最大值賦給比較,把最大值賦給z等)等)。#include int main() int max(int x,int y); /函數(shù)的聲明函數(shù)的聲明 int a,b,c; printf(“two integer numbers: ); scanf(“%d,

38、%d”,&a,&b); c=max( a , b ); /函數(shù)的調(diào)用函數(shù)的調(diào)用 printf(“max is %dn”,c); int max(int x,int y) /函數(shù)的定義函數(shù)的定義 int z; z=xy?x:y; return(z); 通過通過return語句將函數(shù)值帶回到主函數(shù)。語句將函數(shù)值帶回到主函數(shù)。例例7.2中在中在return語句中語句中指定的返回值是指定的返回值是z,這個,這個z就是就是函函數(shù)數(shù)max的返回值的返回值。執(zhí)行執(zhí)行return語句就把這個函數(shù)返語句就把這個函數(shù)返回值帶回主函數(shù)回值帶回主函數(shù)main。注意:注意:返回值返回值z的類型與的類型與

39、max函數(shù)的類型一致。函數(shù)的類型一致。若函數(shù)不需要返回值,若函數(shù)不需要返回值,則則不需要不需要return語句,語句,這時函數(shù)類型應定義為這時函數(shù)類型應定義為 main() int max(int x,int y); /函數(shù)的聲明函數(shù)的聲明 int a,b,c; scanf(“%d,%d”,&a,&b); c=max( a , b ); /函數(shù)的調(diào)用函數(shù)的調(diào)用 printf(“max is %dn”,c); int max(int x,int y) /函數(shù)的定義函數(shù)的定義 int z; z=xy?x:y; return(z); 函數(shù)函數(shù)調(diào)用結(jié)束,調(diào)用結(jié)束,則則形

40、參單元被釋放形參單元被釋放。注意:注意:實參單元仍保留并維持原值,實參單元仍保留并維持原值,實參的實參的值并值并沒有改變沒有改變。如果在執(zhí)行一個被調(diào)用函數(shù)時,如果在執(zhí)行一個被調(diào)用函數(shù)時,若若形參的值形參的值發(fā)生改變發(fā)生改變,則則不會改變主調(diào)函數(shù)的實參的值不會改變主調(diào)函數(shù)的實參的值.例如:形參在執(zhí)行例如:形參在執(zhí)行max函數(shù)的過程中,形參函數(shù)的過程中,形參x,y的值變?yōu)榈闹底優(yōu)?0和和15,但但a和和b的值仍為的值仍為2和和3,這是因為,這是因為實參與形參在內(nèi)存中占用不同實參與形參在內(nèi)存中占用不同的存儲單元。的存儲單元。2a3bxy1015實參實參形參形參/例子例子 函數(shù)參數(shù)為普通變量時形參對實

41、參的影響函數(shù)參數(shù)為普通變量時形參對實參的影響 void main() int swap(int x,int y); /被調(diào)用函數(shù)被調(diào)用函數(shù)swap的聲明的聲明 int a,b,result; printf(請輸入需要交換的兩個整數(shù)請輸入需要交換的兩個整數(shù):n); scanf(a=%d,b=%d,&a,&b); printf(交換之前的值是交換之前的值是:a=%d, b=%dn,a,b); swap(a,b); /swap函數(shù)的調(diào)用函數(shù)的調(diào)用printf(返回到返回到main函數(shù)后的最終交換結(jié)果是函數(shù)后的最終交換結(jié)果是:a=%d, b=%dn,a,b); int swap(int

42、 x,int y) /swap函數(shù)的定義函數(shù)的定義 int temp; temp=x; x=y; y=temp;printf(在在swap函數(shù)中兩個數(shù)交換的結(jié)果是函數(shù)中兩個數(shù)交換的結(jié)果是:a=%d, b=%dn,x,y); 在語言中,在語言中,實參實參向向形參的形參的數(shù)據(jù)傳遞是數(shù)據(jù)傳遞是“值值傳遞傳遞”,單向傳遞,單向傳遞,只由只由實參實參傳給傳給形參形參,而而不不能能由形參傳回來給實參。由形參傳回來給實參。在內(nèi)存中,在內(nèi)存中,實參單元實參單元與與形參單元形參單元是不同的單是不同的單元。元。 c=max(a , b ); (main 函數(shù))函數(shù))max(int x, int y) int z;

43、 z=xy?x:y; return(z); (max 函數(shù))函數(shù))2a3bxy1015實參實參形參形參【例例】 編寫求任意數(shù)之冪的程序編寫求任意數(shù)之冪的程序即求即求xn。分析:分析:在前面已給出了求在前面已給出了求x的的n次方的函數(shù)次方的函數(shù)power(),所以只要在主函數(shù)中,所以只要在主函數(shù)中,輸入輸入x和和n的值,的值,并作為并作為power()的參數(shù),的參數(shù),加上調(diào)用加上調(diào)用power(x,n) 語句即可,語句即可,完整的程序清單如下:完整的程序清單如下:#include void power(float x,int n) ;/*函數(shù)說明函數(shù)說明*/ void main( ) float

44、 x; int n; printf(“輸入輸入x=? n=? n”); scanf(“%f%d”,&x,&n); power(x,n); /*函數(shù)調(diào)用函數(shù)調(diào)用*/ void power(float x,int n) /*函數(shù)定義函數(shù)定義*/ int i; double p=1.0; for (i=1,p=1;i=n;i+) p *= x; /* xn=x*x*x.*x 即即n次連乘次連乘 */ printf(“%f的的%d次方次方=%fn”,x,n,p); 7.3.4 函數(shù)的返回值函數(shù)的返回值通常,希望通過函數(shù)調(diào)用通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到使主調(diào)函數(shù)能得到一個確定的

45、值,一個確定的值,這就是這就是函數(shù)的返回值。函數(shù)的返回值。例如例如:例例7.2中,中,c=max(2,3) ; 的值是的值是3; c=max(5,2); 的值是的值是5。賦值語句賦值語句將這個函數(shù)值將這個函數(shù)值3或或5賦給變量賦給變量c。例如:例如: c=max(5,2);main()() int max(int x,int y); int a,b,c;scanf(d,d,a,b);); cmax(a,b);); /*函數(shù)的調(diào)用函數(shù)的調(diào)用*/ printf(ax isd,c);); max(int x,int y) * 定義有參函數(shù)定義有參函數(shù)max* int z zxy?x y; retur

46、n(z);); return語句將被調(diào)用函數(shù)語句將被調(diào)用函數(shù)中的一個確定值帶回主調(diào)中的一個確定值帶回主調(diào)函數(shù)中去。函數(shù)中去。見圖見圖8.2中從中從return語句返回的箭頭。語句返回的箭頭。關(guān)于函數(shù)返回值的一些說明:關(guān)于函數(shù)返回值的一些說明: 函數(shù)的返回值函數(shù)的返回值是通過函數(shù)中的是通過函數(shù)中的return語句語句獲得的獲得的。 return語句將語句將被調(diào)用函數(shù)中的一個被調(diào)用函數(shù)中的一個確定確定值值帶回主調(diào)函數(shù)中去。帶回主調(diào)函數(shù)中去。見圖見圖7.2中從中從return語句返回的箭頭。語句返回的箭頭。如果需要如果需要從被調(diào)用函數(shù)從被調(diào)用函數(shù)帶回一個函數(shù)值供主帶回一個函數(shù)值供主調(diào)函數(shù)使用,調(diào)函數(shù)

47、使用,被調(diào)用函數(shù)中被調(diào)用函數(shù)中必須包含必須包含return語句。語句。如果不需要如果不需要從被調(diào)用函數(shù)從被調(diào)用函數(shù)帶回函數(shù)值帶回函數(shù)值可以不可以不要要return語句。語句。一個函數(shù)中一個函數(shù)中可以有一個以上的可以有一個以上的return語句,語句,執(zhí)行到哪一個執(zhí)行到哪一個return語句,語句,哪一個語句起作哪一個語句起作用。用。return語句后面的括弧語句后面的括弧也可以不要,如也可以不要,如: “ return z; ” 等價于等價于 “ return (z);); ” max(int x,int y)return(xy?x y););return后面的值后面的值可以是一個表達式可以是

48、一個表達式。例如,例例如,例7.2中的函數(shù)中的函數(shù)max可以改寫成:可以改寫成:這樣的函數(shù)更為簡短,只用一個這樣的函數(shù)更為簡短,只用一個return語句語句就把就把求值求值和和返回返回都解決了。都解決了。函數(shù)的返回值函數(shù)的返回值應當屬于應當屬于某一個確定的類型,某一個確定的類型,在定義函數(shù)時在定義函數(shù)時指定函數(shù)指定函數(shù)返回值的類型。返回值的類型。例如例如:下面是下面是3個函數(shù)的首行:個函數(shù)的首行:int max(float x,float y) /* 函數(shù)值為整型函數(shù)值為整型 */char letter(char c1,char c2) /* 函數(shù)值為字符型函數(shù)值為字符型 */ double

49、min(int x,int y) /* 函數(shù)值為雙精度型函數(shù)值為雙精度型 */在在C語言中,語言中,凡不加類型說明凡不加類型說明的函數(shù),的函數(shù),自動自動按整型按整型(int)處理。)處理。例例7.2中的中的max函數(shù)函數(shù)首行的函數(shù)類型首行的函數(shù)類型int可以可以省寫,省寫,用用TC 2.0編譯程序時編譯程序時能通過能通過,但用,但用TC+ 3.0編譯程序時編譯程序時不能通過,不能通過,因為因為C+要要求求所有函數(shù)所有函數(shù)都必須指定都必須指定函數(shù)類型。函數(shù)類型。因此因此,建議在定義時建議在定義時對所有函數(shù)對所有函數(shù)都指定都指定函數(shù)類函數(shù)類型。型。在定義函數(shù)時在定義函數(shù)時指定的指定的函數(shù)類型函數(shù)類

50、型一般應該一般應該和和return語句中的語句中的表達式類型表達式類型一致。一致。如果函數(shù)值的類型如果函數(shù)值的類型和和return語句中表達式的語句中表達式的值值不一致,不一致,則則以函數(shù)類型以函數(shù)類型為準。為準。對數(shù)值型數(shù)據(jù),對數(shù)值型數(shù)據(jù),可以自動進行類型轉(zhuǎn)換可以自動進行類型轉(zhuǎn)換。即即函數(shù)類型函數(shù)類型決定決定返回值的類型返回值的類型。 例例 7.3 返回值類型與函數(shù)類型不同返回值類型與函數(shù)類型不同#includevoid main() int max(float x,float y); float a,b; int c; printf(請輸入請輸入2個實數(shù):個實數(shù):n); scanf(%f,

51、%f,&a,&b); c=max(a,b); printf(max is %dn,c); int max(float x,float y) float z; z=xy?x:y; return(z);自定義函數(shù)自定義函數(shù)max定義為定義為int型,型,而而return語句中的語句中的z為為float型,型,類型不一致,類型不一致,按按上述規(guī)定上述規(guī)定,先將先將z轉(zhuǎn)換成轉(zhuǎn)換成int型,型,然后然后max(x,y)帶回一帶回一個個整型值整型值2返回主調(diào)函數(shù)返回主調(diào)函數(shù)main。如果將如果將main函數(shù)中的函數(shù)中的c定定義為義為float型,型,用用%f格式輸格式輸出,出,也是輸出也是

52、輸出2.000000。因為調(diào)用因為調(diào)用max函數(shù)得到的函數(shù)得到的是是2,然后把,然后把2賦給賦給float型型的的c則得到則得到2.000000。對于對于不帶回值的函數(shù),不帶回值的函數(shù),應當用應當用“void”定定義函數(shù)為義函數(shù)為“無類型無類型”(或稱或稱“空類型空類型”)。)。這樣,這樣,系統(tǒng)就保證系統(tǒng)就保證不使函數(shù)帶回任何值不使函數(shù)帶回任何值,即即禁止在調(diào)用函數(shù)中禁止在調(diào)用函數(shù)中使用使用被調(diào)用函數(shù)的返回值。被調(diào)用函數(shù)的返回值。此時此時在函數(shù)體中在函數(shù)體中不得出現(xiàn)不得出現(xiàn)return語句。語句。7.4 對被調(diào)用函數(shù)的聲明和函數(shù)原型對被調(diào)用函數(shù)的聲明和函數(shù)原型 在一個函數(shù)中調(diào)用另一個函數(shù)在一個

53、函數(shù)中調(diào)用另一個函數(shù)需要具備如下需要具備如下條件條件:(1) 被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)(是(是庫庫 函數(shù)或用戶自己定義的函數(shù))函數(shù)或用戶自己定義的函數(shù));(2) 如果使用庫函數(shù),應該在本文件開頭如果使用庫函數(shù),應該在本文件開頭加加相相 應的應的#include指令指令將調(diào)用有關(guān)庫函數(shù)時將調(diào)用有關(guān)庫函數(shù)時所所 需用到的信息包含到本文件中來需用到的信息包含到本文件中來。例如:。例如: #include如果如果不包含不包含文件中的信息,在程文件中的信息,在程序中序中就就無法使用無法使用輸入輸出庫中的函數(shù)。輸入輸出庫中的函數(shù)。若使用數(shù)學庫函數(shù)中的函數(shù)若使用數(shù)學庫函數(shù)

54、中的函數(shù),則使用:,則使用: #include(3) 如果使用如果使用自己定義的函數(shù)自己定義的函數(shù),而該函數(shù)的而該函數(shù)的位位置在調(diào)用它的函數(shù)置在調(diào)用它的函數(shù)(main函數(shù)函數(shù))后面后面(在同(在同一個文件中)一個文件中),應該,應該在主函數(shù)中給出在主函數(shù)中給出被被調(diào)用函數(shù)的調(diào)用函數(shù)的聲明聲明。聲明的作用是:聲明的作用是:把函數(shù)名,函數(shù)參數(shù)的個把函數(shù)名,函數(shù)參數(shù)的個數(shù)和參數(shù)類型等信息數(shù)和參數(shù)類型等信息通知編譯系統(tǒng)通知編譯系統(tǒng),以,以便在遇到函數(shù)調(diào)用時,便在遇到函數(shù)調(diào)用時,編譯系統(tǒng)能正確編譯系統(tǒng)能正確識別函數(shù)識別函數(shù)并檢查并檢查調(diào)用是否合法調(diào)用是否合法。 如果使用如果使用自己定義的函數(shù)自己定義的函

55、數(shù),而該函數(shù)而該函數(shù)的位的位置在調(diào)用它的函數(shù)置在調(diào)用它的函數(shù)(main函數(shù)函數(shù))之前之前,則在則在主函數(shù)中不需要給出主函數(shù)中不需要給出被調(diào)用函數(shù)的被調(diào)用函數(shù)的聲明聲明。函數(shù)的定義:函數(shù)的定義:對函數(shù)功能的確立,對函數(shù)功能的確立,包括指包括指定定函數(shù)的返回值類型,函數(shù)名、形參及其函數(shù)的返回值類型,函數(shù)名、形參及其類型、函數(shù)體等,類型、函數(shù)體等,它是一個完整的、獨立它是一個完整的、獨立的函數(shù)單位;的函數(shù)單位;函數(shù)的聲明:函數(shù)的聲明:把函數(shù)的返回值類型,函數(shù)名,把函數(shù)的返回值類型,函數(shù)名, 函數(shù)參數(shù)后面加分號,函數(shù)參數(shù)后面加分號,即函數(shù)定義中的第即函數(shù)定義中的第1行行(函數(shù)首部)(函數(shù)首部)加一個分

56、號加一個分號,就成了函數(shù)原,就成了函數(shù)原型或型或函數(shù)的聲明函數(shù)的聲明。例例7.4 輸入兩個實數(shù),用一個函數(shù)求出它們輸入兩個實數(shù),用一個函數(shù)求出它們之和。之和。解題思路:解題思路:用用add函數(shù)實現(xiàn)。首先要定義函數(shù)實現(xiàn)。首先要定義add函數(shù),它為函數(shù),它為float型,它應有兩個參數(shù),型,它應有兩個參數(shù),也應為也應為float型。型。分別編寫分別編寫add函數(shù)和函數(shù)和main函數(shù),它們組成一函數(shù),它們組成一個源程序文件個源程序文件。由于由于main函數(shù)的位置在函數(shù)的位置在add函數(shù)之前函數(shù)之前,因此因此在在main函數(shù)中對函數(shù)中對add函數(shù)進行聲明函數(shù)進行聲明。注意:注意:在在main函數(shù)中函數(shù)

57、中要要給出給出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; z=x+y; return(z); 對對add函數(shù)聲明函數(shù)聲明:函數(shù)定義:函數(shù)定義中的首行加分號中的首行加分號由于被調(diào)用由于被調(diào)用函數(shù)函數(shù)add的定義在的定義在

58、main函數(shù)的函數(shù)的下面下面,因此在,因此在main函函數(shù)中數(shù)中必須給出該函數(shù)必須給出該函數(shù)的聲明的聲明。add函數(shù)函數(shù)的定義:的定義:包括包括函數(shù)的返回值類型,函數(shù)的返回值類型,函數(shù)名、形參及其類函數(shù)名、形參及其類型、函數(shù)體。型、函數(shù)體。函數(shù)的首行加分號函數(shù)的首行加分號函數(shù)的聲明。函數(shù)的聲明。 為什么要用函數(shù)的首部來作為函數(shù)的聲明?為什么要用函數(shù)的首部來作為函數(shù)的聲明?這是為了便于對函數(shù)調(diào)用的合法性進行檢查這是為了便于對函數(shù)調(diào)用的合法性進行檢查.因為在函數(shù)的首部包含了因為在函數(shù)的首部包含了檢查調(diào)用函數(shù)是否檢查調(diào)用函數(shù)是否合法的基本信息合法的基本信息(它包括了函數(shù)的返回值類(它包括了函數(shù)的返回

59、值類型、函數(shù)名、函數(shù)的參數(shù)個數(shù)、參數(shù)類型和型、函數(shù)名、函數(shù)的參數(shù)個數(shù)、參數(shù)類型和參數(shù)順序),參數(shù)順序),在檢查函數(shù)調(diào)用時要求在檢查函數(shù)調(diào)用時要求函數(shù)名、函數(shù)名、函數(shù)類型、參數(shù)個數(shù)和參數(shù)順序函數(shù)類型、參數(shù)個數(shù)和參數(shù)順序必須與必須與函數(shù)函數(shù)聲明一致聲明一致,實參類型必須與函數(shù)聲明中的形實參類型必須與函數(shù)聲明中的形參類型相同參類型相同,否則就按出錯處理,否則就按出錯處理,這樣就能這樣就能保證函數(shù)的正確調(diào)用。保證函數(shù)的正確調(diào)用。函數(shù)原型的一般形式有兩種函數(shù)原型的一般形式有兩種:如:如: float add(float x, float y); 或者或者 float add(float, float);

60、實際上,在函數(shù)聲明中的形參名可以省寫,實際上,在函數(shù)聲明中的形參名可以省寫,而只寫形參的類型,而只寫形參的類型,這是因為:這是因為:編譯系統(tǒng)只編譯系統(tǒng)只關(guān)心和檢查參數(shù)個數(shù)和參數(shù)類型,關(guān)心和檢查參數(shù)個數(shù)和參數(shù)類型,而不檢查而不檢查參數(shù)名參數(shù)名,因為在調(diào)用函數(shù)時只要求,因為在調(diào)用函數(shù)時只要求保證實參保證實參類型與形參類型一致類型與形參類型一致,而不必考慮形參名是,而不必考慮形參名是什么。什么。若函數(shù)聲明放在文件的開頭,若函數(shù)聲明放在文件的開頭,這時下面的所這時下面的所有函數(shù)都可以使用此函數(shù)。有函數(shù)都可以使用此函數(shù)。函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(參數(shù)類型參數(shù)類型1,參數(shù)類型,參數(shù)類型2);函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(參數(shù)類型參數(shù)類型1,參數(shù)名,參數(shù)名1,參數(shù)類型,參數(shù)類型2,參數(shù)名,參數(shù)名2); 如果使用如果使用用戶自己定義的函數(shù),用戶自己定義的函數(shù),而該函數(shù)而該函數(shù) 的位置的

溫馨提示

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

評論

0/150

提交評論