清華大學C程序設計(第三版) 第8章_函數(shù)2_第1頁
清華大學C程序設計(第三版) 第8章_函數(shù)2_第2頁
清華大學C程序設計(第三版) 第8章_函數(shù)2_第3頁
清華大學C程序設計(第三版) 第8章_函數(shù)2_第4頁
清華大學C程序設計(第三版) 第8章_函數(shù)2_第5頁
已閱讀5頁,還剩109頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C程序設計(第三版)程序設計(第三版) http:/ 2C程序設計(第三版)程序設計(第三版) http:/ 3 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ù)的遞歸調(diào)用 8. 8.數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù) 8.8 8.8 局部變量和全局變量局部變量和全局變量 8. 8.變量的存儲類別變量的存儲類別 8.10 8.10 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)C程序設計(第三版)程序設計(第三版) http:/

2、4 一個程序可由一個主函數(shù)和若干個其他函數(shù)構成。一個較大的程序可分為若干個程序模塊,每一個模塊用來實現(xiàn)一個特定的功能。在高級語言中用子程序實現(xiàn)模塊的功能。子程序由函數(shù)來完成。 函數(shù)間的調(diào)用關系:由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。C程序設計(第三版)程序設計(第三版) http:/ 5C程序設計(第三版)程序設計(第三版) http:/ 6例例8.18.1先舉一個函數(shù)調(diào)用的簡單例子先舉一個函數(shù)調(diào)用的簡單例子# include void main() void printstar(); /*對對printstar函數(shù)聲明函數(shù)聲明*/ void

3、 print_message(); /*對對print_message函數(shù)聲明函數(shù)聲明*/ printstar(); *調(diào)用調(diào)用printstar函數(shù)函數(shù)* print_message(); /*調(diào)用調(diào)用print_message函數(shù)函數(shù)*/ printstar(); *調(diào)用調(diào)用printstar函數(shù)函數(shù)*/ C程序設計(第三版)程序設計(第三版) http:/ 7void printstar() *定義定義printstar函數(shù)函數(shù)* printf(* * * * * * * * * * * * * * * *n);void print_message() *定義定義print_messag

4、e函數(shù)函數(shù)* printf(How do you do!n); 運行情況如下:運行情況如下:* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *How do you do!How do you do!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *C程序設計(第三版)程序設計(第三版) http:/ 8說明:說明: (1)一個程序由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。對于較大的程序,通常將程序內(nèi)容分別放在若干個源文件中,再

5、由若干源程序文件組成一個C程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。一個源程序文件可以為多個C程序公用。C程序設計(第三版)程序設計(第三版) http:/ 9(2) 一個源程序文件由一個或多個函數(shù)以及其他有關內(nèi)容(如命令行、數(shù)據(jù)定義等)組成。一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進行編譯的,而不是以函數(shù)為單位進行編譯的。(3) 程序的執(zhí)行是從main函數(shù)開始的,如果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結束整個程序的運行。C程序設計(第三版)程序設計(第三版) http:/ 10(4)所有函數(shù)都是平行的,即在定義函數(shù)時是分

6、別進行的,是互相獨立的。一個函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義。函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是系統(tǒng)調(diào)用的。C程序設計(第三版)程序設計(第三版) http:/ 11(5)從用戶使用的角度看,函數(shù)有兩種: 標準函數(shù),即庫函數(shù)。這是由系統(tǒng)提供的,用戶不必自己定義這些函數(shù),可以直接使用它們。不同的C系統(tǒng)提供的庫函數(shù)的數(shù)量和功能會有一些不同,但許多基本的函數(shù)是共同的。 用戶自己定義的函數(shù)。用以解決用戶的專門需要。 C程序設計(第三版)程序設計(第三版) http:/ 12(6) 從函數(shù)的形式看,函數(shù)分兩類: 無參函數(shù)。無參函數(shù)一般用來執(zhí)行指定的一組操作。在調(diào)用無參函

7、數(shù)時,主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞數(shù)據(jù)。有參函數(shù)。主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時,通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù)。 C程序設計(第三版)程序設計(第三版) http:/ 138.8.函數(shù)定義的一般形式函數(shù)定義的一般形式8.2.1 8.2.1 無參函數(shù)的定義一般形式無參函數(shù)的定義一般形式定義無參函數(shù)的一般形式為定義無參函數(shù)的一般形式為:類型標識符類型標識符函數(shù)名函數(shù)名()() 聲明部分聲明部分 語句部分語句部分 C程序設計(第三版)程序設計(第三版) http:/ 148.2.2 8.2.2 有參函數(shù)定義的一般形式有參函數(shù)定義的一般形式定義有參函數(shù)的一般形式為定義有參函數(shù)的一般形式為:類型標識符類型標識

8、符函數(shù)名函數(shù)名(形式參數(shù)表列)(形式參數(shù)表列) 聲明部分聲明部分 語句部分語句部分 例如:例如: (int ,int ) ;/ *函數(shù)體中的聲明部分*?; return(); C程序設計(第三版)程序設計(第三版) http:/ 158.2.3 8.2.3 空函數(shù)空函數(shù)定義空函數(shù)的一般形式為定義空函數(shù)的一般形式為:類型標識符類型標識符函數(shù)名函數(shù)名()() 例如:例如:()() 主調(diào)函數(shù)調(diào)用空函數(shù)時,只表明這里要調(diào)用一個函數(shù),但函數(shù)本身什么工作也不做等,以后擴充函數(shù)功能時補充上。 C程序設計(第三版)程序設計(第三版) http:/ 168.8.函數(shù)參數(shù)和函數(shù)的值函數(shù)參數(shù)和函數(shù)的值8.8. .形

9、式參數(shù)和實際參數(shù)形式參數(shù)和實際參數(shù)形式參數(shù):函數(shù)名后面括號中的變量名稱為“形式參數(shù)”(簡稱“形參形參”)。實際參數(shù):主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面括號中的參數(shù)(可以是一個表達式)稱為“實際參數(shù)”(簡稱“實參實參”)。函數(shù)返回值:return后面的括號中的值作為函數(shù)帶回的值(稱函數(shù)返回值函數(shù)返回值)。 C程序設計(第三版)程序設計(第三版) http:/ 17 主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞的關系。在不同的函數(shù)之間傳遞數(shù)據(jù),可以使用的方法有:參數(shù):通過形式參數(shù)和實際參數(shù)返回值:用return語句返回計算結果全局變量:外部變量C程序設計(第三版)程序設計(第三版) http:/ 18例例

10、8.調(diào)用函數(shù)時的數(shù)據(jù)傳遞調(diào)用函數(shù)時的數(shù)據(jù)傳遞#include void () int max(int ,int ); /* 對函數(shù)的聲明 */ int ,; scanf(,); (,); printf( ,); C程序設計(第三版)程序設計(第三版) http:/ 19int max(int ,int )*定義有參函數(shù)max * int ; ?; return(); 運行情況如下:運行情況如下:, C程序設計(第三版)程序設計(第三版) http:/ 20通過函數(shù)調(diào)用,可使兩個函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系。C程序設計(第三版)程序設計(第三版) http:/ 21關于形參與實參的說明:關于形參與實參的

11、說明:(1 1) 在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時,它們并不占內(nèi)存中的存儲單元。只有在發(fā)生函數(shù)調(diào)用時,函數(shù)max中的形參才被分配內(nèi)存單元。在調(diào)用結束后,形參所占的內(nèi)存單元也被釋放。(2 2) 實參可以是常量、變量或表達式,例如:例如: max(,);但要求它們有確定的值。在調(diào)用時將實參的值賦給形參。C程序設計(第三版)程序設計(第三版) http:/ 22(3 3)在被定義的函數(shù)中,必須指定形參的類型。(4 4)實參與形參的類型應相同或賦值兼容。(5 5)值傳遞:實參向形參的數(shù)據(jù)傳遞是單向“值傳遞”,只能由實參傳給形參,而不能由形參傳回來給實參。 在調(diào)用函數(shù)時,給形參分配存儲單元,并

12、將實參對應的值傳遞給形參,調(diào)用結束后,形參單元被釋放,實參單元仍保留并維持原值。C程序設計(第三版)程序設計(第三版) http:/ 23 8.3.2 8.3.2 函數(shù)的返回值函數(shù)的返回值 函數(shù)的返回值函數(shù)的返回值是通過函數(shù)調(diào)用使主調(diào)函數(shù)得到的確定值。例如例如: :例8.中,max(,)的值是,max(,)的值是5。賦值語句將這個函數(shù)值賦給變量。 C程序設計(第三版)程序設計(第三版) http:/ 24說明:說明: (1)函數(shù)的返回值是通過函數(shù)中的return語句獲得的。 一個函數(shù)中可以有一個以上的return語句,執(zhí)行到哪一個return語句,哪一個語句起作用。return語句后面的括弧也

13、可以不要例如例如: “return ;” 等價于等價于 “return ();();”return后面的值可以是一個表達式。例如例如: (int ,int ) return(?:);); C程序設計(第三版)程序設計(第三版) http:/ 25(2)函數(shù)的返回值應當屬于某一個確定的類型,在定義函數(shù)時指定函數(shù)返回值的類型。例如例如:下面是下面是3個函數(shù)的首行:個函數(shù)的首行:int max(float ,float ) /* 函數(shù)值為整型 */char letter(char c1,char c2) /* 函數(shù)值為字符型 */ double min(int ,int ) /* 函數(shù)值為雙精度型

14、*/ 注意:注意:凡不加類型說明的函數(shù),自動按整型處理。C程序設計(第三版)程序設計(第三版) http:/ 26(3)在定義函數(shù)時指定的函數(shù)類型一般應該和return語句中的表達式類型一致。 如果函數(shù)值的類型和return語句中表達式的值不一致,則以函數(shù)類型為準。 對數(shù)值型數(shù)據(jù),可以自動進行類型轉換。即函數(shù)類型決定返回值的類型。(4)對于不帶回值的函數(shù),應當用“void”定義函數(shù)為“無類型”(或稱“空類型”)。此時在函數(shù)體中不得出現(xiàn)return語句。 C程序設計(第三版)程序設計(第三版) http:/ 27例例 8.8. 返回值類型與函數(shù)類型不同返回值類型與函數(shù)類型不同# include

15、void main() int (float ,float ); float ,; int ; scanf(,); (,); printf( ,); int max(float ,float ) float ; /* z為實型變量 */ ? ; return(); 運行情況如下:, Max is C程序設計(第三版)程序設計(第三版) http:/ 288.8. 函數(shù)的調(diào)用函數(shù)的調(diào)用 8.8.1 .1 函數(shù)調(diào)用的一般形式函數(shù)調(diào)用的一般形式函數(shù)調(diào)用的一般形式為函數(shù)調(diào)用的一般形式為: : 函數(shù)名(實參表列)函數(shù)名(實參表列)說明說明: :(1 1)如果是調(diào)用無參函數(shù),則“實參表列”可以沒有,但括弧

16、不能省略。C程序設計(第三版)程序設計(第三版) http:/ 29(3 3)如果實參表列包括多個實參,對實參求值的順序并不是確定的,有的系統(tǒng)按自左至右順序求實參的值,有的系統(tǒng)則按自右至左順序。(2 2)如果實參表列包含多個實參,則各參數(shù)間用逗號隔開。實參與形參的個數(shù)應相等,類型應匹配。實參與形參按順序對應,一一傳遞數(shù)據(jù)。C程序設計(第三版)程序設計(第三版) http:/ 30例例 8.4 8.4 實參求值的順序實參求值的順序#include void main() int f(int a,int b); /* 函數(shù)聲明 */ int i=2,p; p=f(i,+i); /* 函數(shù)調(diào)用 */

17、 printf(%dn,p); C程序設計(第三版)程序設計(第三版) http:/ 31int f(int a,int b) /* 函數(shù)定義 */ int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); C程序設計(第三版)程序設計(第三版) http:/ 32如果按自左至右順序求實如果按自左至右順序求實參的值,則函數(shù)調(diào)用相當參的值,則函數(shù)調(diào)用相當于(,)于(,) 如果按自左至右順序求實如果按自左至右順序求實參的值,則函數(shù)調(diào)用相當參的值,則函數(shù)調(diào)用相當于(于(3,),) 對于函數(shù)調(diào)用對于函數(shù)調(diào)用 int i=2,p;p=f(i,+

18、i); C程序設計(第三版)程序設計(第三版) http:/ 338.4.2 8.4.2 函數(shù)調(diào)用的方式函數(shù)調(diào)用的方式函數(shù)語句函數(shù)語句把函數(shù)調(diào)用作為一個語句。這時不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。函數(shù)表達式函數(shù)表達式函數(shù)出現(xiàn)在一個表達式中,這種表達式稱為函數(shù)表達函數(shù)表達式式。這時要求函數(shù)帶回一個確定的值以參加表達式的運算。例如:* *(,);(,); 按函數(shù)在程序中出現(xiàn)的位置來分,可以有以按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下三種函數(shù)調(diào)用方式:下三種函數(shù)調(diào)用方式: C程序設計(第三版)程序設計(第三版) http:/ 34函數(shù)參數(shù)函數(shù)參數(shù)函數(shù)調(diào)用作為一個函數(shù)的實參。例如例如: :

19、m = max (a , max ( b , c ) ) ;其中max ( b , c )是一次函數(shù)調(diào)用,它的值作為max另一次調(diào)用的實參。m的值是a、b、c三者中的最大者。C程序設計(第三版)程序設計(第三版) http:/ 358.4.3 8.4.3 對被調(diào)用函數(shù)的聲明和函數(shù)原型對被調(diào)用函數(shù)的聲明和函數(shù)原型1.首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))。但光有這一條件還不夠。C程序設計(第三版)程序設計(第三版) http:/ 363.如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)(即主調(diào)函數(shù))的后面,應該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)作聲明。2.如果使用庫

20、函數(shù),還應該在本文件開頭用#include 命令將調(diào)用有關庫函數(shù)時所需用到的信息“包含”到本文件中來。 C程序設計(第三版)程序設計(第三版) http:/ 37函數(shù)原型的一般形式為函數(shù)原型的一般形式為: :1. 函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2);2. 函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)名2); 聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個數(shù)和參數(shù)類型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時,編譯系統(tǒng)能正確識別函數(shù)并檢查調(diào)用是否合法。C程序設計(第三版)程序設計(第三版) http:/ 38注意:注意: 函數(shù)的“定義”和“聲明”的區(qū)別:l 函數(shù)的定義是指對函數(shù)功能的確立,

21、包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個完整的、獨立的函數(shù)單位。l 函數(shù)的聲明的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時系統(tǒng)按此進行對照檢查。 C程序設計(第三版)程序設計(第三版) http:/ 39例例8. 對被調(diào)用的函數(shù)作聲明對被調(diào)用的函數(shù)作聲明# include void main() float add(float x, float y); *對被調(diào)用函數(shù)add的聲明* float a,b,c; scanf(f,f,a,b); cadd(a,b); printf(sum is f n,c);float add(flo

22、at ,float ) *函數(shù)首部* float ; /* 函數(shù)體 */ z; return(z); C程序設計(第三版)程序設計(第三版) http:/ 40例例8 8 對被調(diào)用的函數(shù)作聲對被調(diào)用的函數(shù)作聲明明# include float add(float ,float ) *函數(shù)首部* float ; /* 函數(shù)體 */ z; return(z); void main() float a,b,c; scanf(f,f,a,b); cadd(a,b); printf(sum is f n,c);C程序設計(第三版)程序設計(第三版) http:/ 418.8. 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)

23、用嵌套定義就是在定義一個函數(shù)時,其函數(shù)體內(nèi)又包含另一個函數(shù)的完整定義 。C程序設計(第三版)程序設計(第三版) http:/ 42例 8. 用弦截法求方程 f(x)=x3-5x2+16x-80=0 的根 C程序設計(第三版)程序設計(第三版) http:/ 431.1. 取兩個不同點x1,x2,如果f(x1)和f(x2)符號相反,則(x1,x2)區(qū)間內(nèi)必有一個根。如果f(x1)與f(x2)同符號,則應改變x1,x2,直到f(x1)、f(x2)異號為止。注意x1、x2的值不應差太大,以保證(x1,x2)區(qū)間內(nèi)只有一個根。 2.2. 連接(x1,f(x1)和(x2,f(x2)兩點,此線(即弦)交x

24、軸于x。方法:方法:C程序設計(第三版)程序設計(第三版) http:/ 443.3. 若f(x)與f(x1)同符號,則根必在(x,x2)區(qū)間內(nèi),此時將x作為新的x1。如果f(x)與f(x2)同符號,則表示根在(x1,x)區(qū)間內(nèi),將x作為新的x2。4.4. 重復步驟 (2) 和 (3) , 直到 f(x) 為止, 為一個很小的數(shù), 例如 10-6. 此時認為 f(x)0 。C程序設計(第三版)程序設計(第三版) http:/ 45N-S流程圖流程圖 C程序設計(第三版)程序設計(第三版) http:/ 46實現(xiàn)各部分功能的幾個函數(shù)實現(xiàn)各部分功能的幾個函數(shù):1. 用函數(shù)f(x)代表x的函數(shù):x3

25、-5x2+16x-80。2. 用函數(shù)調(diào)用xpoint (x1,x2)來求(x1,f(x1)和 (x2,f(x2)的連線與x軸的交點x的坐標。3. 用函數(shù)調(diào)用root (x1,x2)來求(x1,x2)區(qū)間的 那個實根。顯然,執(zhí)行root函數(shù)過程中要用到函 數(shù)xpoint,而執(zhí)行xpoint函數(shù)過程中要用 到f函數(shù)。C程序設計(第三版)程序設計(第三版) http:/ 47include include float f(float x) * 定義函數(shù),以實現(xiàn)f(x) x3-5x2+16x-80 * float ; =(-.)*+.)*-.; return(); C程序設計(第三版)程序設計(第三版

26、) http:/ 48float xpoint (float x1,float x2) *定義xpoint函數(shù),求出弦與x軸交點 */ float ; =(*()-*() ()-(); return (); C程序設計(第三版)程序設計(第三版) http:/ 49float root(float ,float ) /* 定義root函數(shù),求近似根 */float ,; (); do xpoint(,); (); if(*) /*()與()同符號 */ ; ; ; while(fabs()0.0001); return( C程序設計(第三版)程序設計(第三版) http:/ 50 void m

27、ain() *主函數(shù) */float ,; do printf( ,:); scanf(,); (); (); while(*); (,); printf( root of equation is .n,); 運行情況如下:input ,:, root of equation is 5.0000C程序設計(第三版)程序設計(第三版) http:/ 51 8.6 8.6 函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用 在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。語言的特點之一就在于允許函數(shù)的遞歸調(diào)用。例如:例如: int f ( int ) ,; (); return(*); C程

28、序設計(第三版)程序設計(第三版) http:/ 52C程序設計(第三版)程序設計(第三版) http:/ 53例例 8.7:8.7: 有個人坐在一起,問第個人多少歲?他說比第個人大歲。問第個人歲數(shù),他說比第個人大歲。問第個人,又說比第個人大歲。問第個人,說比第個人大歲。最后問第個人,他說是歲。請問第個人多大。 age(5)= age (4)+2age(4)= age (3)+2age(3)= age (2)+2age(2)= age (1)+2age(1)= 10用數(shù)學公式表述如下:age(n)= 10 ()age(n-1)+2 ()C程序設計(第三版)程序設計(第三版) http:/ 54

29、可以用一個函數(shù)來描述上述遞歸過程:可以用一個函數(shù)來描述上述遞歸過程:int age(int ) *求年齡的遞歸函數(shù)* int ; * 用作存放函數(shù)的返回值的變量 * if() ; else (); return();運行結果如下:運行結果如下: 用一個主函數(shù)調(diào)用age函數(shù),求得第5人的年齡。#include void main() printf(,age(); C程序設計(第三版)程序設計(第三版) http:/ 55例例8.8.用遞歸方法求!用遞歸方法求! 求!也可以用遞歸方法,即!等于!,而!。可用下面的遞歸公式表示: ! (,) ()! ()C程序設計(第三版)程序設計(第三版) htt

30、p:/ 56例例8.9 Hanoi(漢諾塔)問題(漢諾塔)問題:C程序設計(第三版)程序設計(第三版) http:/ 57由上面的分析可知:將個盤子從座移到座可以分解為以下3個步驟:1.將上個盤借助座先移到座上。2.把座上剩下的一個盤移到座上。3.將個盤從座借助于座移到座上。C程序設計(第三版)程序設計(第三版) http:/ 58程序如下:程序如下:#include void main()void hanoi(int n,char one,char two,char three); /* 對hanoi函數(shù)的聲明 */ int m; printf(input the number of dis

31、kes:); scanf(“%d”,&m); printf(The step to moveing %d diskes:n,m); hanoi(m,A,B,C); C程序設計(第三版)程序設計(第三版) http:/ 59void hanoi(int n,char one,char two,char three) /* 定義hanoi函數(shù),將個盤從one座借助two座,移到three座 */ void move(char x,char y); /* 對move函數(shù)的聲明 */ if(n=1) move(one,three); else hanoi(n-1,one,three,two); mov

32、e(one,three); hanoi(n-1,two,one,three); void move(char x,char y) /* 定義move函數(shù) */ printf(“%c-%cn,x,y); C程序設計(第三版)程序設計(第三版) http:/ 60運行情況如下:運行情況如下:input the number of diskes:3 The steps to noving 3 diskes: C程序設計(第三版)程序設計(第三版) http:/ 618.8.數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)8.7.1 8.7.1 數(shù)組元素作函數(shù)實參數(shù)組元素作函數(shù)實參 由于實參可以是表達式,而數(shù)組元素可

33、以是表達式的組成部分,因此數(shù)組元素可以作為函數(shù)的實參,與用變量作實參一樣,是單向傳遞,即“值傳送”方式。 C程序設計(第三版)程序設計(第三版) http:/ 62例例 8.108.10 有兩個數(shù)組和,各有個元素,將它們對應地逐個相比(即與比,與比)。如果數(shù)組中的元素大于數(shù)組中的相應元素的數(shù)目多于b數(shù)組中元素大于a數(shù)組中相應元素的數(shù)目(例如,aibi6次,biai3次,其中i每次為不同的值),則認為a數(shù)組大于b數(shù)組,并分別統(tǒng)計出兩個數(shù)組相應元素大于、等于、小于的次數(shù)。 C程序設計(第三版)程序設計(第三版) http:/ 63#include void main() int large(int

34、 x,int y); /* 函數(shù)聲明 */ int 10,10,,; printf(enter array a ); for(;) scanf(,); printf(); printf( enter array ); for(;) scanf (,); printf(); for(;) if(large (i,i )= ) ; else if( large (i,i )=) =+; else ;C程序設計(第三版)程序設計(第三版) http:/ 64printf(aibi %d timesnai=bi %d timesnaik) printf(array a is larger than a

35、rray bn); else if (nk) printf(array a is smaller than array bn); else printf(array is equal to array bn);large(int ,int ) int ; if();else if()flag;else flag; return(flag);C程序設計(第三版)程序設計(第三版) http:/ 65運行情況如下:運行情況如下: enter array a: 5 3 8 9 1 3 5 6 0 4 array a is smaller thann array bC程序設計(第三版)程序設計(第三版

36、) http:/ 66 8.7.2 8.7.2 數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù) 用數(shù)組名作函數(shù)參數(shù)時,此時形參應當用數(shù)組名或用指針變量 。例例8.11 有一個一維數(shù)組score,內(nèi)放10個學生成績,求平均成績。C程序設計(第三版)程序設計(第三版) http:/ 67#include void main() float average(float array10); /* 函數(shù)聲明 */ float score10 , aver; int ; printf(input scores:); for(; scanf(,score); printf(); averaverage( score );

37、 printf ( average score is .n, aver);C程序設計(第三版)程序設計(第三版) http:/ 68float average (float array10) int ; float aver,; for (;);return(aver);運行情況如下:運行情況如下:input scores: .5 .5 average score is 83.40 C程序設計(第三版)程序設計(第三版) http:/ 69例例 8.8.形參數(shù)組不定義長度形參數(shù)組不定義長度#include void main() float average(float ,int ) float

38、 score_15 , .,; float score_210= 67.5,89.5,99,6.5, 77,89.5,76.5,54,60,99.5; printf(“the average of class A is %6.2fn”, average(score_1,5); printf(“the average of class B is %6.2fn”, average(score_2,10); C程序設計(第三版)程序設計(第三版) http:/ 70float average(float ,int ) int ; float aver,; for(; sumsumarray; ave

39、rsum; return(); 運行結果如下:運行結果如下:the average of class A is 80.40The average of class is 78.20C程序設計(第三版)程序設計(第三版) http:/ 71例例 8.13 用選擇法對數(shù)組中10個整數(shù)按由小到大排序。 所謂選擇法就是先將10個數(shù)中最小的數(shù)與a0對換;再將a1到a9中最小的數(shù)與a1對換每比較一輪,找出一個未經(jīng)排序的數(shù)中最小的一個。共比較9輪。C程序設計(第三版)程序設計(第三版) http:/ 72未排序時的情況:a0 a1 a2 a3 a4 3 6 1 9 4 將5個數(shù)中最小的數(shù)1與a0對換: 1

40、6 3 9 4 將余下的4個數(shù)中最小的數(shù)3與a1對換 1 3 6 9 4 將余下的3個數(shù)中最小的數(shù)4與a2對換 1 3 4 9 6 將余下的2個數(shù)中最小的數(shù)6與a3對換 1 3 4 6 9 C程序設計(第三版)程序設計(第三版) http:/ 73程序:程序:#include void main() void sort(int ,int ); int ,; printf(enter the array); for(; scanf(,); sort(,); printf(the sorted array ); for(; printf(,); printf(); C程序設計(第三版)程序設計(第

41、三版) http:/ 74void sort(int array,int )/*排序函數(shù)*/ int ,; for(;) ; for(;) if(array array=; =arrayk; arrayk=arrayi;arrayi=t C程序設計(第三版)程序設計(第三版) http:/ 75 8.7.3. 8.7.3. 多維數(shù)組名作函數(shù)參數(shù)多維數(shù)組名作函數(shù)參數(shù)程序:程序:#include void main() max_value ( int 4); int 34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is , max_value(a)

42、 ); 用多維數(shù)組名作為函數(shù)實參和形參。在被調(diào)函數(shù)中對形參數(shù)組定義時可以指定每一維的大小 。C程序設計(第三版)程序設計(第三版) http:/ 76max_value ( int array 4) int ,max; max=; for(=;) for(;if(array) max= array ; return(max); 運行結果如下:運行結果如下:Max value is 34C程序設計(第三版)程序設計(第三版) http:/ 778.88.8局部變量和全局變量局部變量和全局變量.1局部變量局部變量內(nèi)部變量:在一個函數(shù)內(nèi)部定義的變量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)有效,

43、即:只有在本函數(shù)內(nèi)才能使用這些變量,故稱為“局部變量” 。C程序設計(第三版)程序設計(第三版) http:/ 78例:float f1( int a) /*函數(shù)f1 */int b,c; /* a、b、c有效*/ char f2(int x,int y) /*函數(shù)f2 */int i,j; /* x、y、i、j有效*/ void main( ) /*主函數(shù)*/int m,n; /* m、n有效*/ C程序設計(第三版)程序設計(第三版) http:/ 79主函數(shù)中定義的變量只在主函數(shù)中有效,而不因為在主函數(shù)中定義而在整個文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。(2) 不同函數(shù)

44、中可以使用相同名字的變量,它們代表不同的對象,互不干擾。(3) 形式參數(shù)也是局部變量。(4) 在一個函數(shù)內(nèi)部,可以在復合語句中定義變量,這些變量只在本復合語句中有效,這種復合語句也稱為“分程序”或“程序塊”。C程序設計(第三版)程序設計(第三版) http:/ 80void main ( )int a,b;int c; c=a+b; c在此范圍內(nèi)有效 a,b在此范圍內(nèi)有效 C程序設計(第三版)程序設計(第三版) http:/ 81外部變量:函數(shù)之外定義的變量稱為外部變量。外部變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結束。所以也稱全程變量。C程序設計(第三版

45、)程序設計(第三版) http:/ 82int p=1,q=5; /* 外部變量 */float f1(int a) /* 定義函數(shù)f1 */int b,c;char c1,c2; /* 外部變量*/char f2 (int x, int y) /* 定義函數(shù)f2 */int i,j; 全局變量p,q的作用范圍 全局變量c1,c2的作用范圍void main ( ) /*主函數(shù)*/int m,n; C程序設計(第三版)程序設計(第三版) http:/ 83例8.15 有一個一維數(shù)組,內(nèi)放個學生成績,寫一個函數(shù),求出平均分、最高分和最低分。#include float Max,Min; *全局變

46、量*void main() float average(float array ,int n); float ave,score10; int ; for(;) scanf(,); ave= average(,); printf(“max=%6.2fnmin=%6.2fn average=%6.2fn“,Max,Min,ave); C程序設計(第三版)程序設計(第三版) http:/ 84float average(float array ,int n) * 定義函數(shù),形參為數(shù)組 */ int ; float aver,sum=array; Max=Min=array; for(=;) if(

47、arrayMax)Maxarray; else if(arrayMin)Min array; sum=sum+array; aver; return(); 運行情況如下:運行情況如下: C程序設計(第三版)程序設計(第三版) http:/ 85C程序設計(第三版)程序設計(第三版) http:/ 86建議:不必要時不要使用全局變量,原因如下: 全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟單元。 使用全局變量過多,會降低程序的清晰性。在各個函數(shù)執(zhí)行時都可能改變外部變量的值,程序容易出錯。因此,要限制使用全局變量。C程序設計(第三版)程序設計(第三版) http:/ 87降

48、低函數(shù)的通用性。因為函數(shù)在執(zhí)行時要依賴于其所在的外部變量。如果將一個函數(shù)移到另一個文件中,還要將有關的外部變量及其值一起移過去。但若該外部變量與其他文件的變量同名時,就會出現(xiàn)問題,降低了程序的可靠性和通用性。一般要求把程序中的函數(shù)做成一個封閉體,除了可以通過“實參形參”的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。C程序設計(第三版)程序設計(第三版) http:/ 88例例 8.8.6 6 外部變量與局部變量同名外部變量與局部變量同名#include int a=3,b=5; /* a,b為外部變量*/ a,b作用范圍void main ( ) int a=8; /*a為局部變量 */ 局部變量a作

49、用范圍 printf (%d, max (a,b); 全局變量b的作用范圍 max (int a, int b) /*a,b為局部變量 */ int c; c=ab?a b; 形參a、b作用范圍 return (c); 運行結果為運行結果為 8 C程序設計(第三版)程序設計(第三版) http:/ 898.8. 變量的存儲類別變量的存儲類別 8.9.1 8.9.1 動態(tài)存儲方式與靜態(tài)存儲方式動態(tài)存儲方式與靜態(tài)存儲方式 從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。從變量值存在的時間角度來分,又可以分為靜態(tài)存儲方式和動態(tài)存儲方式。靜態(tài)存儲方式:指在程序運行期間由系統(tǒng)分配固定的存

50、儲空間的方式。動態(tài)存儲方式:則是在程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間的方式。這個存儲空間可以分為三部分:1.1.程序區(qū)程序區(qū) 2.2.靜態(tài)存儲區(qū)靜態(tài)存儲區(qū) 3.3.動態(tài)存儲區(qū)動態(tài)存儲區(qū)C程序設計(第三版)程序設計(第三版) http:/ 90 變量和函數(shù)有兩個屬性:數(shù)據(jù)類型數(shù)據(jù)類型和數(shù)據(jù)的存儲數(shù)據(jù)的存儲類別類別。存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方式。存儲方式分為兩大類:靜態(tài)存儲類和動態(tài)存儲類。包含:自動的(自動的(auto););靜態(tài)的(靜態(tài)的(static););寄存器的(寄存器的(register););外部的(外部的(extern)。 根據(jù)變量的存儲類別,可以知道變量的作用域和生

51、存期。 C程序設計(第三版)程序設計(第三版) http:/ 918.9.2 auto8.9.2 auto變量變量自動變量auto:不專門聲明為static存儲類別的局部變量都是動態(tài)分配存儲空間,在調(diào)用該函數(shù)時系統(tǒng)會給它們分配存儲空間,在函數(shù)調(diào)用結束時就自動釋放這些存儲空間。因此這類局部變量稱為自動變量。函數(shù)中的形參和在函數(shù)中定義的變量(包括在復合語句中定義的變量),都屬此類。自動變量用關鍵字auto作存儲類別的聲明。例如:例如:int (int ) *定義f函數(shù),為形參 *auto int ,;/*定義、為自動變量 * C程序設計(第三版)程序設計(第三版) http:/ 928.9.3 8

52、.9.3 用用staticstatic聲明局部變量聲明局部變量 當函數(shù)中的局部變量的值在函數(shù)調(diào)用結束后不消失而保留原值時,該變量稱為靜態(tài)局部變量。用關鍵字static進行聲明。C程序設計(第三版)程序設計(第三版) http:/ 93例例87 考察靜態(tài)局部變量的值#include void main()int (int); int ,; for(; printf( ,(); int (int )auto int ; static ; ; return(); C程序設計(第三版)程序設計(第三版) http:/ 94對靜態(tài)局部變量的說明:對靜態(tài)局部變量的說明:(1) 靜態(tài)局部變量屬于靜態(tài)存儲類別

53、,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。而自動變量(即動態(tài)局部變量)屬于動態(tài)存儲類別,占動態(tài)存儲區(qū)空間而不占靜態(tài)存儲區(qū)空間,函數(shù)調(diào)用結束后即釋放。(2)對靜態(tài)局部變量是在編譯時賦初值的,即只賦初值一次,在程序運行時它已有初值。以后每次調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù)調(diào)用結束時的值。C程序設計(第三版)程序設計(第三版) http:/ 95(3)如在定義局部變量時不賦初值的話,則對靜態(tài)局部變量來說,編譯時自動賦初值(對數(shù)值型變量)或空字符(對字符變量)。而對自動變量來說,如果不賦初值則它的值是一個不確定的值。(4)雖然靜態(tài)局部變量在函數(shù)調(diào)用結束后仍然存在,但其他函數(shù)不

54、能引用它。C程序設計(第三版)程序設計(第三版) http:/ 96例例88 輸出到的階乘值#include void main()int fac(int ); int ; for(;) printf(%!=,fac();Int fac(int )static int ; *; return(); C程序設計(第三版)程序設計(第三版) http:/ 978.9.4 register8.9.4 register變量變量 變量的值是存放在內(nèi)存中的。當程序中用到哪一個變量的值時,由控制器發(fā)出指令將內(nèi)存中該變量的值送到運算器中。 經(jīng)過運算器進行運算,如果需要存數(shù),再從運算器將數(shù)據(jù)送到內(nèi)存存放。 C程

55、序設計(第三版)程序設計(第三版) http:/ 98 如果有一些變量使用頻繁,則為存取變量的值要花費不少時間。為提高執(zhí)行效率,語言允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠高于對內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存寄存器變量器變量,用關鍵字registerregister作聲明。C程序設計(第三版)程序設計(第三版) http:/ 99例819使用寄存器變量#include void main ( )long fac(long); long i,n; scanf(%ld,&n); for(

56、i=1;i=n;i+) printf(%ld!=%ldn,i,fac(i);long fac(long n)register long i,f=1; /*定義寄存器變量*/ for (i=1;i=n;i+) f=f*i; return (f);C程序設計(第三版)程序設計(第三版) http:/ 1008.9.5 8.9.5 用用externextern聲明外部變量聲明外部變量 外部變量是在函數(shù)的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個函數(shù)所引用。編譯時將外部變量分配在靜態(tài)存儲區(qū)。用extern來聲明外部變量,以擴展外部變量

57、的作用城。C程序設計(第三版)程序設計(第三版) http:/ 1011. 在一個文件內(nèi)聲明外部變量在一個文件內(nèi)聲明外部變量例例820 用用extern聲明外部變量,擴展它在程聲明外部變量,擴展它在程序文件中的作用域序文件中的作用域#include void main() int max(int,int); *外部變量聲明* extern A,B; printf(%dn,max(A,B); int A=13,B=-8; *定義外部變量* int max(int x,int y) *定義函數(shù) * int z; z=xy?x:y; return(z); C程序設計(第三版)程序設計(第三版) ht

58、tp:/ 1022. 在多文件的程序中聲明外部變量在多文件的程序中聲明外部變量#include int A; /*定義外部變量*/void main() int (int); /*函數(shù)聲明*/ int ,; printf(enter the number a and its power m:n); scanf(,A,); A*; printf(*,A,); (); printf(*n,A,); 例例8.8. 用extern將外部變量的作用域擴展到其他文件。本程序的作用是給定的值,輸入和,求和am的值。文件file.中的內(nèi)容為:C程序設計(第三版)程序設計(第三版) http:/ 103文件file中的內(nèi)容為:extern A; /*聲明A為一個已定義的外部變量*/ int powre(int );int ,; for(;) *A; return(); C程序設計(第三版)程序設計(第三版) http:/ 1048.9.6 8.9.6 用用staticstatic聲明外部變量聲明外部變量在程序設計中,某些外部變量只限于被本文件引用,而不能被其他文件引用。這時可以在定義外部變量時加一個staitic聲明。例如:例如:file1.c file2.cstatic int A; extern int A;void main ( ) void fun (int n) A=A*n; C程序

溫馨提示

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

評論

0/150

提交評論