第5章模塊化編程_第1頁
第5章模塊化編程_第2頁
第5章模塊化編程_第3頁
第5章模塊化編程_第4頁
第5章模塊化編程_第5頁
已閱讀5頁,還剩61頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、模塊化程序設計模塊化程序設計n復雜問題的解決方法一般會是把原問題分解成若干個規(guī)模較小的問題加以解決,并可以類推的繼續(xù)向下分解。n結構化程序設計的基本思想之一是程序的“模塊化” (module)。所謂“模塊化”就是把一個較為復雜的大程序化分成若干個功能相對獨立的程序塊,每個程序塊實現(xiàn)一個功能。n在C語言中,這樣的程序塊被稱為函數(shù)函數(shù)。n函數(shù)是程序的基本模塊,C 語言被稱為函數(shù)式語言。第五章第五章 模塊化編程模塊化編程d1d2墊圈面積墊圈面積=42122dd從一個例子說起:求從一個例子說起:求n個墊圈的面積總和個墊圈的面積總和E/求求n個墊圈的面積總和個墊圈的面積總和main()int n,i;f

2、loat t,d1,d2,sum=0;printf(墊圈的數(shù)量墊圈的數(shù)量=);scanf(%d,&n);for(i=1;i=n;i+)printf(%2d:外徑外徑=,i);scanf(%f,&d1);printf( 內(nèi)徑內(nèi)徑=,i);scanf(%f,&d2);t=(d1*d1-d2*d2)/4*3.1415926;sum+=t;printf(sum=%f,sum);getch();main() 輸入墊圈個數(shù)輸入墊圈個數(shù)n 調(diào)用求和函數(shù)調(diào)用求和函數(shù)sum(n) 顯示顯示n個墊圈面積個墊圈面積總和總和sum求求n數(shù)之和的函數(shù)數(shù)之和的函數(shù)float sum(int n)for(i=0;in;i+

3、) s+=area(d1,d2);求一個墊圈面積的函數(shù)求一個墊圈面積的函數(shù)float area(float d1,float d2)nd1 d2area反復反復n次次float sum(int n);float area(float d1,float d2);main()int n;printf(墊圈的數(shù)量墊圈的數(shù)量=);scanf(%d,&n);printf(sum=%f,sum(n);getch();float sum(int n) /計算計算n個墊圈面積之和的函數(shù)個墊圈面積之和的函數(shù)int i;float d1,d2,s=0;for(i=1;i=n;i+)printf(%2d:外徑外徑=

4、,i);scanf(%f,&d1);printf( 內(nèi)徑內(nèi)徑=,i);scanf(%f,&d2);s+=area(d1,d2);return s;float area(float d1,float d2) /計算一個墊圈面積的函數(shù)計算一個墊圈面積的函數(shù)float t;t=(d1*d1-d2*d2)/4*3.1415926;return t;墊圈的數(shù)量墊圈的數(shù)量=2 1:外徑外徑=2 內(nèi)徑內(nèi)徑=1 2:外徑外徑=3 內(nèi)徑內(nèi)徑=2 sum=6.283185在這個程序中我們使用了在這個程序中我們使用了3個函數(shù)。其中個函數(shù)。其中main()函數(shù)用于輸入和輸出,函數(shù)用于輸入和輸出,而計算求和以及墊圈面積

5、分別用獨立的函數(shù)而計算求和以及墊圈面積分別用獨立的函數(shù)sum()和和area()完成。完成。 幾點體驗:幾點體驗:函數(shù)sum,area要先聲明,后使用;函數(shù)sum,area通過參數(shù)表中的參數(shù)n,d1,d2傳遞數(shù)據(jù),以return語句從函數(shù)名sum,area獲得返回的函數(shù)值。函數(shù)的參數(shù)n,d1,d2都是有類型的。函數(shù)參數(shù)的傳遞遵循NOT原則:Number、Order、Type必須一致必須一致幾點體驗:幾點體驗:The heart and soul of C programming is the function. A function represents a piece of code tha

6、t is a building block in the problem-solving process.Functions, called modules, allow programmers to modularize a program. Functions support structured programming and offer the following advantages:Hierarchical flow control;Break large tasks into smaller ones;Easy to maintain;Improve software reusa

7、bility.5.2 函數(shù)的定義與聲明函數(shù)的定義與聲明所有的函數(shù)定義,包括主函數(shù)main(),都是平行的,函數(shù)可以嵌套調(diào)用或相互調(diào)用,但不能嵌套定義。調(diào)用者稱為主調(diào)函數(shù),被調(diào)用的函數(shù)稱為被調(diào)函數(shù)函數(shù)自己調(diào)用自己,稱為遞歸調(diào)用。main 函數(shù)是主函數(shù),它可以調(diào)用其它函數(shù),而不允許被其它函數(shù)調(diào)用。程序的執(zhí)行總是從main函數(shù)開始,完成對其它函數(shù)的調(diào)用后再返回到main函數(shù),最后由main函數(shù)結束整個程序源程序中必須有,也只能有1個main函數(shù)/175.2.1 函數(shù)的分類函數(shù)的分類n從用戶角度分類:從用戶角度分類:n庫函數(shù): 由系統(tǒng)提供,用戶無須定義,不必在程序中作類型說明,只需在程序前包含有該函數(shù)

8、原型的頭文件即可在程序中直接調(diào)用。 如 printf()、scanf()、getchar()、putchar()n用戶定義函數(shù):由用戶按需要寫的函數(shù)。對于用戶自定義函數(shù),不僅要在程序中定義函數(shù)本身,而且在主調(diào)函數(shù)模塊中還必須對該被調(diào)函數(shù)進行類型說明,然后才能使用。 如例5.1中sum(int n)、area(float d1,float d2)n從函數(shù)執(zhí)行過程分類從函數(shù)執(zhí)行過程分類: 有返回值函數(shù),無返回值函數(shù)n從函數(shù)定義形式分類從函數(shù)定義形式分類: 有參函數(shù),無參函數(shù)/175.2.2 函數(shù)的定義形式函數(shù)的定義形式1. 無參函數(shù)的定義形式無參函數(shù)的定義形式 類型標識符類型標識符 函數(shù)名函數(shù)名(

9、) 聲明部分聲明部分 語句部分語句部分 類型標識符類型標識符:說明函數(shù)返回值的數(shù)據(jù)類型;若缺省,則為 int 類型;若函數(shù)無值,則定義為 voidvoid 類型函數(shù)名函數(shù)名:由用戶自己命名,合法的標識符無參函數(shù)可以有也可以有返回值,但無返回值的較常見。無返回值函數(shù)的類型標識符是 void。void line() printf(n);/17【例【例5- 2】無返回值的無參函數(shù)舉例】無返回值的無參函數(shù)舉例#include #include void line() / 無參函數(shù)定義無參函數(shù)定義printf(n);main() printf( Hello !n); line(); / 無參函數(shù)調(diào)用無參

10、函數(shù)調(diào)用 printf( Follow me !n); line(); getch();/17Hello !Follow me !【例【例5- 3】有返回值的無參函數(shù)】有返回值的無參函數(shù)#include #include main() if(test() = 1) printf( return 1 n); else printf( return 0 n);int test() return 1; /17 return 12. 有參函數(shù)的定義形式有參函數(shù)的定義形式函數(shù)類型函數(shù)類型 函數(shù)名(形參類型說明表)函數(shù)名(形參類型說明表) 說明部分說明部分 語句部分語句部分 形參類型說明表形參類型說明表:

11、說明函數(shù)參數(shù)的個數(shù)和類型/17例例 正確的有參函數(shù)正確的有參函數(shù) int max(int x,int y) int z; z=xy?x:y; return(z); 例例 錯誤的有參函數(shù)錯誤的有參函數(shù) int max (int x, y) int z; z=xy?x:y; return(z); 5.2.3函數(shù)的參數(shù)和函數(shù)的返回值函數(shù)的參數(shù)和函數(shù)的返回值Formal parameters are parameters as they appear in function declarations.Actual parameters are parameters as they appear in

12、function calls.A parameter cannot be both a formal and an actual parameter, but both formal parameters and actual parameters can be either value parameters or variable parameters./171. 1. 函數(shù)的形參和實參函數(shù)的形參和實參n 在定義函數(shù)時,有參函數(shù)名后面括弧中的變量名稱為形式參數(shù)(formal parameter),簡稱形參;n 在調(diào)用函數(shù)時,函數(shù)名后面括弧中的表達式稱為實際參數(shù)(actual paramete

13、r),簡稱實參。n 主調(diào)函數(shù)和被調(diào)函數(shù)之間的信息交換可以通過實參與形參的結合和return語句來實現(xiàn),稱為按值調(diào)用(call by value)。例如 float max(float x,float y); main()float a,b,c,d,e;printf(a=);scanf(%f,&a);printf(b=);scanf(%f,&b);c=max(a,b); / 調(diào)用函數(shù)語句,調(diào)用函數(shù)語句,a,b為實參為實參printf(max is %fn,c);getch(); float max(float x,float y) /函數(shù)定義函數(shù)定義,x,y 為形參為形參float z;z=xy

14、?x:y;return z; 運行時輸入:運行時輸入:3.5 8.3顯示:顯示:max is 8.300000 通過函數(shù)調(diào)用,使通過函數(shù)調(diào)用,使main()和和max()這這兩個函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系兩個函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系形參與實參的特點:形參與實參的特點:形參形參只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結束時,即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結束返回主調(diào)函數(shù)后,則不能再使用該形參。實參實參可以是常量、變量、表達式、函數(shù)調(diào)用等,無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值、輸入等方法使實參獲得確定值。/1

15、7函數(shù)參數(shù)表的一致性原則(函數(shù)參數(shù)表的一致性原則(NOT)函數(shù)調(diào)用中實參的數(shù)目(Number)必須與函數(shù)原型中形參的數(shù)目一致。函數(shù)調(diào)用中實參的順序(Order)必須與函數(shù)原型中形參的對應順序一致。函數(shù)調(diào)用中實參的數(shù)據(jù)類型(Type)必須與函數(shù)原型中對應形參的數(shù)據(jù)類型一致。函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實參中的值不會變化。如果要將被調(diào)函數(shù)的結果返回主調(diào)函數(shù),則應使用return語句并體現(xiàn)為主調(diào)函數(shù)名。/172. 函數(shù)函數(shù)的返回值的返回值/17n返回語句形式返回語句形式: return 表達式;

16、表達式;或或 return (表達式表達式);n功能:功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返值帶給調(diào)用函數(shù)。n說明:說明:n函數(shù)中可有多個return語句,但只執(zhí)行第一個,n若無return語句,遇 時,自動返回調(diào)用函數(shù),n若函數(shù)類型與return語句中表達式值的類型不一致,按函數(shù)類型為準,自動轉換-函數(shù)調(diào)用轉換函數(shù)調(diào)用轉換n 語句語句 return 0; 結束main()程序運行,返回正常值0(把控制權交還給操作系統(tǒng))對函數(shù)返回值說明:對函數(shù)返回值說明:int max(int x, int y) int z; z=(xy)?x:y; return z;/17或或int max

17、(int x, int y) return xy?x:y;這兩種這兩種return 寫法等價寫法等價1) 函數(shù)的值只能通過return語句返回主調(diào)函數(shù)。2)函數(shù)值的類型和函數(shù)定義中函數(shù)的類型應保持一致。如果兩者不一致,則以函數(shù)的類型為準,編譯系統(tǒng)會自動進行類型轉換。3)若不要求被調(diào)函數(shù)有返回值,可以不使用return語句,或在return后面只有一個分號,即寫成return;4)對于不返回函數(shù)值的函數(shù),函數(shù)類型可以明確定義為“空類型”,即“void”。n函數(shù)的調(diào)用方式函數(shù)的調(diào)用方式n語句方式如:語句方式如:line(); 用于用于void型函數(shù)型函數(shù)n表達式方式如:表達式方式如:c=sum(a

18、,b);n參數(shù)方式如:參數(shù)方式如:m=max(c,max(a,b); n被調(diào)用的函數(shù)必須具備的條件被調(diào)用的函數(shù)必須具備的條件n被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)n若調(diào)用庫函數(shù),應該在文件開頭用#include命令將所需的信息包含到本文件中來。如:#include 或 #include math.hn 若使用自定義函數(shù),該函數(shù)與主調(diào)函數(shù)應該在同一個文件中。n 一般應該在文件開頭或主調(diào)函數(shù)中對被調(diào)函數(shù)進行說明。但有兩個例外:n 整型或字符型函數(shù)可以不說明 n 被調(diào)函數(shù)寫在主調(diào)函數(shù)之前可以不說明 總結:函數(shù)的調(diào)用方式和被調(diào)用的函數(shù)必須具備的條件總結:函數(shù)的調(diào)用方式和被調(diào)用的函數(shù)必須具備的條件 5.2.

19、4 函數(shù)的聲明函數(shù)的聲明n除int型或char型函數(shù)外,若主調(diào)用函數(shù)在被調(diào)用函數(shù)之前,必須在調(diào)用前用被調(diào)用函數(shù)的函數(shù)原型作聲明n 函數(shù)聲明(declaration)的方式采用函數(shù)原型(Function Prototype)n 函數(shù)原型一般形式為: 類型說明符類型說明符 被調(diào)函數(shù)名被調(diào)函數(shù)名(類型類型 形參,類型形參,類型 形參形參);或為: 類型說明符類型說明符 被調(diào)函數(shù)名被調(diào)函數(shù)名(類型,類型類型,類型); 例如: int max(int a,int b);也可以寫為: int max(int,int);/17函數(shù)定義與函數(shù)聲明的函數(shù)定義與函數(shù)聲明的區(qū)別區(qū)別:函數(shù)定義是指對函數(shù)功能的建立,包

20、括指定函數(shù)名、函數(shù)類型、形參及其類型、函數(shù)體等,它是一個完整的、獨立的函數(shù)單位。函數(shù)聲明的作用是在程序的編譯階段對被調(diào)函數(shù)的合法性進行全面檢查,將函數(shù)名、函數(shù)返回值的類型以及形參的類型、個數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用時系統(tǒng)進行對照檢查。簡而言之,函數(shù)的聲明是將函數(shù)定義中的第1行(函數(shù)首部)復制后再加一個分號。/17可以省略函數(shù)可以省略函數(shù)聲明的聲明的幾種情況幾種情況被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,在主調(diào)函數(shù)中可以不對被調(diào)函數(shù)聲明而直接調(diào)用,如例5-2。整型或字符型函數(shù)可以不加聲明。系統(tǒng)將自動對被調(diào)函數(shù)返回值按整型處理,如例5-3。如果在文件的開頭對函數(shù)統(tǒng)一進行了聲明,則在各調(diào)用函數(shù)中

21、可不再對被調(diào)用函數(shù)加以聲明。調(diào)用庫函數(shù)時不必進行聲明,只需用#include包含相應的頭文件(標準庫函數(shù)的原型在系統(tǒng)提供的相應頭文件中)。/175.3 函數(shù)的調(diào)用函數(shù)的調(diào)用語言中,函數(shù)調(diào)用的一般形式為: 函數(shù)名函數(shù)名( (實際參數(shù)表實際參數(shù)表););函數(shù)調(diào)用的方式: 1)函數(shù)語句:函數(shù)調(diào)用的一般形式加上分號 即構成函數(shù)語句 例如: printf(%d,a); scanf(%d,&b); 2)函數(shù)表達式:函數(shù)調(diào)用作為表達式中的一項出現(xiàn)在表達式中,用函數(shù)返回值參與表達式的運算。這種方式要求函數(shù)是有返回值的。 例如: return xy?x:y; z=max(x,y)/17【例【例5- 4】求】求1

22、!+2!+10!long fact(int n)int i,t=1;for(i=1;i=n;i+)t*=i;return t;/17sum=4037913#include #includevoid main()long sum=0;int i;for(i=1;i=10;i+)sum+= fact(i); /函數(shù)表達式的調(diào)用函數(shù)表達式的調(diào)用printf(sum=%ld,sum);getch();函數(shù)調(diào)用的方式函數(shù)調(diào)用的方式 3) : 3)函數(shù)實參:函數(shù)調(diào)用作為另1個函數(shù)調(diào)用的實際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實參進行傳送,因此要求該函數(shù)必須是有返回值的【例5- 5】函數(shù)調(diào)用作為另1個函

23、數(shù)調(diào)用的實際參數(shù),求4個數(shù)的最大值#include #include int max(int x,int y); main()int a,b,c,d,e;printf(a=);scanf(%d,&a);printf(b=);scanf(%d,&b);printf(c=);scanf(%d,&c);printf(d=);scanf(%d,&d);e=max(max(max(a,b),c),d); /函數(shù)作為實參被調(diào)用函數(shù)作為實參被調(diào)用 printf(max is %dn,e);getch();int max(int x,int y)return xy?x:y;/175.3.2 函數(shù)調(diào)用時的參數(shù)傳

24、遞函數(shù)調(diào)用時的參數(shù)傳遞主調(diào)函數(shù)把實參值復制給被調(diào)函數(shù)形參的過程,稱為參數(shù)傳遞參數(shù)傳遞參數(shù)傳遞方式:參數(shù)傳遞方式:n如果使用普通變量作為函數(shù)的參數(shù)進行調(diào)用,這種方式稱為按值調(diào)用按值調(diào)用(Call by Value)。n如果使用地址型數(shù)據(jù)作為函數(shù)參數(shù)進行調(diào)用,則稱為按地址調(diào)用按地址調(diào)用(Call by Reference)。We have seen call-by-reference when we use the scanf() function. Values supplied by the calling function as parameters cannot be updated by

25、 the called function. When we want a called function to update an identifier in the calling function, we pass it a pointer to the identifier. The effect of call-by-reference is accomplished by:a.Declaring a function parameter to be a pointer.b.Using the dereferenced pointer in the function body.c.Pa

26、ssing an address as an argument when the function is called./171. 按值調(diào)用(按值調(diào)用(Call by Value)1) 變量作為函數(shù)參數(shù)變量作為函數(shù)參數(shù)n 當形參和實參是基本型變量時,參數(shù)傳遞的方式是按值調(diào)用(Call by Value),形參和實參各自占用不同的存儲單元。因此,函數(shù)中形參的數(shù)值變化不會導致實參的相應變化。函數(shù)只能通過return語句返回1個函數(shù)值n 按值調(diào)用采用的就是一種“單向單向”的值傳遞方式。寫程序,使用swap函數(shù)來嘗試交換兩個數(shù)值x和yswap(int a,int b) int t;t=a, a=b,

27、b=t;return a; return b; 你的程序交換成功了嗎?/17main() int x=7,y=11; swap(x,y); printf(%d %dn,x,y); getch();2)數(shù)組元素作函數(shù)實參數(shù)組元素作函數(shù)實參 數(shù)組是一種構造類型,其中數(shù)組元素的使用等同于基本型變量,因此數(shù)組元素作函數(shù)實參時,實參和形參間也是“單向”值傳遞。而函數(shù)的形參仍然用基本型變量,當函數(shù)調(diào)用時,把作為實參的數(shù)組元素的值傳送給形參變量,從而實現(xiàn)單向的值傳遞。【例5-7】的程序段: int a5,i; printf(input 5 numbersn); for(i=0;i5;i+) scanf(%d

28、,&ai); nzp(ai); /172 .按地址調(diào)用(按地址調(diào)用(Call by Reference)當形參和實參是地址變量、指針變量或者數(shù)組名時,實參到形參的當形參和實參是地址變量、指針變量或者數(shù)組名時,實參到形參的參數(shù)傳遞是地址值的傳遞,稱為按地址調(diào)用(參數(shù)傳遞是地址值的傳遞,稱為按地址調(diào)用(Call by Reference)。按地址調(diào)用采用的就是一種按地址調(diào)用采用的就是一種“雙向雙向”的地址傳遞方式。形參和實參的地址傳遞方式。形參和實參此時此時指向同一存儲單元,函數(shù)中形參的數(shù)值變化直接導致了實參的指向同一存儲單元,函數(shù)中形參的數(shù)值變化直接導致了實參的相應變化,函數(shù)也可以無須通過相應變

29、化,函數(shù)也可以無須通過return語句返回函數(shù)值了。語句返回函數(shù)值了。 1)指針作函數(shù)形參指針作函數(shù)形參 指針作函數(shù)形參時,表示形參接收的數(shù)據(jù)只能是一個地址值。 寫一個新的swap()函數(shù)來嘗試交換x,y的值: swap(int *a, int *b) int t; t=*a, *a=*b, *b=t; /17【例【例5- 8】用指針作函數(shù)參數(shù)實現(xiàn)兩個數(shù)的交換。】用指針作函數(shù)參數(shù)實現(xiàn)兩個數(shù)的交換。main()int x=7,y=11; printf(%d %dn,x,y); swap(&x,&y); printf(%d %dn,x,y);getch();/17實參實參&x形參指針形參指針a&x

30、x7*a*b形參指形參指針針b&y實參實參&yy11t隨機隨機數(shù)數(shù)swap()main()(調(diào)用調(diào)用swap函數(shù)函數(shù)t隨機隨機數(shù)數(shù)swap()main()實參實參&x形參指形參指針針a&xx11*a*b形參指形參指針針b&y實參實參&yy7(執(zhí)行執(zhí)行swap函數(shù)函數(shù)2 ) 數(shù)組名作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)n用不帶方括號的數(shù)組名作為實參調(diào)用函數(shù),可以把一個數(shù)組傳遞給一個函數(shù) 。n用數(shù)組名作實參實際上是將數(shù)組的首地址傳給被調(diào)函數(shù),使形參數(shù)組與實參數(shù)組具有相同的首地址,實際占用同一段存儲單元。/17主調(diào)函數(shù)主調(diào)函數(shù)被調(diào)函數(shù)被調(diào)函數(shù)地址值地址值修改修改地址值地址值地址值地址值數(shù)組數(shù)組地址值地址值地

31、址值地址值已改變已改變實參實參形參形參實參實參實參實參形參形參(函數(shù)調(diào)用時函數(shù)調(diào)用時 執(zhí)行被調(diào)函數(shù)執(zhí)行被調(diào)函數(shù) 返回主調(diào)函數(shù)返回主調(diào)函數(shù)【例例5- 9】用數(shù)組名作函數(shù)參數(shù)實現(xiàn)數(shù)組元素平均值的求解】用數(shù)組名作函數(shù)參數(shù)實現(xiàn)數(shù)組元素平均值的求解/數(shù)組數(shù)組a中存放了中存放了1個學生個學生5門課程的成績,求平均成績。門課程的成績,求平均成績。float aver(float a) int i; float avr,s=a0; for(i=1;i5;i+) s=s+ai; avr=s/5; return avr;main() float sco5,avr; int i; printf(ninput 5 s

32、cores:n); for(i=0;i5;i+) scanf(%f,&scoi); avr=aver(sco); printf(average score is %5.2f,avr); getch();input 5 scores:89 88 76 90 92 average score is 87.00使用使用數(shù)組名作為函數(shù)參數(shù)時還應注意以下問題:數(shù)組名作為函數(shù)參數(shù)時還應注意以下問題:n形參數(shù)組和實參數(shù)組的類型必須一致,否則將引起錯誤。n因為在調(diào)用時,只傳送首地址而不檢查形參數(shù)組的長度。當形參數(shù)組的長度與實參數(shù)組不一致時,雖不至于出現(xiàn)語法錯誤(編譯能通過),但程序執(zhí)行結果將與實際不符。n在函

33、數(shù)中為了防止對形參數(shù)組的賦值,可以在該形參數(shù)組聲明中加限定詞const。/17/數(shù)組求和數(shù)組求和 c=a+bvoid add(const int a,const int b,int c,int n)int i;for(i=0;in;+i)ci=ai+bi;main()int i,x5=1,3,5,7,9,y5=10,8,6,4,2,z5;add(x,y,z,5);for(i=0;i5;i+) printf(%4d,zi); getch();語言中不允許作嵌套的函數(shù)定義。但是語言允許在語言中不允許作嵌套的函數(shù)定義。但是語言允許在1個個函數(shù)的定義中出現(xiàn)對另函數(shù)的定義中出現(xiàn)對另1個函數(shù)的調(diào)用。這樣就

34、出現(xiàn)了函數(shù)個函數(shù)的調(diào)用。這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用。即在被調(diào)函數(shù)中又調(diào)用其它函數(shù)。的嵌套調(diào)用。即在被調(diào)函數(shù)中又調(diào)用其它函數(shù)。【例例5-12】sum=1!+2!+3!+10!。!。 main()函數(shù) + sum()函數(shù) + fact()函數(shù) /175.3.3函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用main()函數(shù)函數(shù)sum()函數(shù)函數(shù)fact()函數(shù)函數(shù)調(diào)用調(diào)用sum函數(shù)函數(shù)調(diào)用調(diào)用fact函數(shù)函數(shù)main()結束結束sum()結束結束fact()結束結束float sum(int n) int a; float s=0; for (a=1;a=n;a+) s+=fac(a); return s; floa

35、t sum(int n);float fac(int a);main ( ) float x; x=sum(10); printf(“x=%10.1f,x); getch(); float fac(int a) float t=1; int n=1; while (n06/2=303/2=101/2=0 0顯示余數(shù)1回回溯溯過過程程顯示余數(shù)1顯示余數(shù)0顯示余數(shù)0 遞遞 推推 過過程程【例例5- 13】用遞歸法實現(xiàn)用遞歸法實現(xiàn)1個正整數(shù)以二進制數(shù)形式的輸出個正整數(shù)以二進制數(shù)形式的輸出 main() bin(12); /運行結果:運行結果:1100 getch();bin(int x) if(x/

36、20) bin(x/2); / 短除短除2直到商為直到商為0 printf(%d ,x%2);/ (逐層逐層)顯示余數(shù)顯示余數(shù)圖解執(zhí)行過程圖解執(zhí)行過程main() bin(12); getch();bin(12) if(12/20) bin(12/2); printf(%d ,12%2);bin(6) if(6/20) bin(6/2); printf(%d ,6%2);bin(3) if(3/20) bin( 3/2); printf(%d ,3%2);bin(1) if(1/20) bin(1/2); printf(%d ,1%2); 1 (n=0) n由于由于 n!= n(n-1)! (

37、n0)根據(jù)階乘的定義,可將根據(jù)階乘的定義,可將遞歸關系用下述公式表示:遞歸關系用下述公式表示: f(0)= 1; f(n)= n*f(n-1);相應的程序語句為:相應的程序語句為: if(n=0)x=1;elsex=n*f(n-1);而而 : n!=n*(n-1)! (n-1)!=(n-1)*(n-2)! (n-2)!=(n-2)*(n-3)! 2!=2*1! 1!=1*0! 0!=1 (初始條件) 構成了回溯過程構成了回溯過程【例例5- 14】用遞歸法計算用遞歸法計算n!求求n! n!的遞歸程序的遞歸程序 #include #include main() long fact(int); in

38、t n; printf(ninput n: ); scanf(%d,&n); printf(%d!=%ldn,n,fact(n);getch();long fact(int n) if(n0) return n*fact(n-1); else return 1;結果:結果:5!=120 1 (n=0) n!= n(n-1)! (n0)運行過程:運行過程:/17main() fact(5) fact(5) 5*fact(4) fact(4) 4*fact(3) fact(3) 3*fact(2) fact(2) 2*fact(1) fact(1) 1*fact(0) fact(0) 1 fact

39、(3) 3*fact(2) 1126241205.4 變量的作用域與存儲類型變量的作用域與存儲類型5.4.1. 變量的作用域 變量有效性的范圍稱變量的作用域 函數(shù)外部定義的,稱為全局變量Global variable; 函數(shù)內(nèi)部定義的,稱為局部變量Local variable。1) 局部變量 凡在塊內(nèi)部或者函數(shù)內(nèi)部定義的變量稱為局部變量。局部變量是在塊內(nèi)或者函數(shù)內(nèi)作定義說明的,其作用域僅限于所在的塊或者函數(shù)內(nèi),在變量的作用域以外該變量不能被引用。/17【例例5- 16】函數(shù)內(nèi)定義的局部變量與復合語句中定義的局部變函數(shù)內(nèi)定義的局部變量與復合語句中定義的局部變量量 /17#include #inc

40、lude main()int x=10;printf(x=%dn,x);if(x0)int x;x=-10;printf(x=%dn,x);printf(x=%dn,x);getch();函數(shù)內(nèi)局部變量函數(shù)內(nèi)局部變量X=10 有效有效復合語句內(nèi)局部變量復合語句內(nèi)局部變量X=-10 有效有效函數(shù)內(nèi)局部變量函數(shù)內(nèi)局部變量X=10 有效有效局部變量作用域的幾點說明局部變量作用域的幾點說明主函數(shù)中定義的變量也只能在主函數(shù)中使用,不能在其它函數(shù)中使用。同時,主函數(shù)中也不能使用其它函數(shù)中定義的變量。因為主函數(shù)也是1個函數(shù),它與其它函數(shù)是平行關系。這一點是與其它語言不同的,應予以注意。形參變量是屬于被調(diào)函數(shù)

41、的局部變量,實參變量是屬于主調(diào)函數(shù)的局部變量。允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發(fā)生混淆。/172)全局變量)全局變量凡在函數(shù)外部定義的變量稱為全局變量(或稱為外部變量),其作用域從定義位置開始到本源文件結束。n在函數(shù)中使用全局變量,一般應作全局變量說明。n若是在程序最開始定義的全局變量,則變量可以在整個程序各個函數(shù)中使用;若是在程序中其他位置定義的全局變量,則變量可以在從定義位置以后的各函數(shù)中使用。/17【例【例5- 17】用全局變量實現(xiàn)兩個數(shù)的交換?!坑萌肿兞繉崿F(xiàn)兩個數(shù)的交換。#include #include int x,y; /

42、全局變量全局變量x、y默認初值為默認初值為0void swap()x=y=x=y; /使用異或運算實現(xiàn)兩個整數(shù)交換使用異或運算實現(xiàn)兩個整數(shù)交換main()x=3,y=7;swap();printf(x=%d y=%dn,x,y);getch();【例例5- 18】用用全局變量將函數(shù)中多個數(shù)據(jù)返回到主函數(shù)全局變量將函數(shù)中多個數(shù)據(jù)返回到主函數(shù)/ 輸入立方體的長寬高輸入立方體的長寬高l,w,h。求體積及。求體積及3個面?zhèn)€面x*y,x*z,y*z的面積。的面積。#include #include int s1,s2,s3; / 3個全局變量分別表示立方體的個全局變量分別表示立方體的3個面積個面積int

43、 vs( int a,int b,int c) int v; / 局部變量表示立方體的體積局部變量表示立方體的體積 v=a*b*c; s1=a*b; s2=b*c; s3=a*c; return v; / 立方體的體積通過函數(shù)的返回值傳回主調(diào)函數(shù)立方體的體積通過函數(shù)的返回值傳回主調(diào)函數(shù)main() int v,l,w,h; printf(ninput length,width and heightn); scanf(%d%d%d,&l,&w,&h); v=vs(l,w,h); printf(nv=%d,s1=%d,s2=%d,s3=%dn,v,s1,s2,s3); getch();關于全局變量

44、的說明:關于全局變量的說明:如果沒有指定初值,則全局變量的初值是變量數(shù)據(jù)類型的系統(tǒng)默認值。int類型為0,float類型為0.0,char類型為0,指針類型為NULL。定義的全局變量在某一函數(shù)中發(fā)生改變,則該變量的值將影響到其它函數(shù)。可以利用全局變量從被調(diào)函數(shù)中返回多個值。若函數(shù)中的局部變量與全局變量同名,則在該函數(shù)中全局變量不起作用。過多的使用全局變量不僅加大了系統(tǒng)開銷,而且使程序的可讀性降低。因此,要限制使用全局變量。若要在全局變量定義之前使用全局變量,可在使用前使用extern進行聲明。/175.4.2 變量的存儲類型變量的存儲類型1)靜態(tài)存儲方式與動態(tài)存儲方式用戶存儲空間可以分為3個部

45、分:存儲在靜態(tài)存儲區(qū)中的變量叫做靜態(tài)變量,如全局變量。存儲在動態(tài)存儲區(qū)中的變量叫做動態(tài)變量。如函數(shù)形參、局部變量、函數(shù)調(diào)用時的現(xiàn)場保護和返回地址等Every variable and function in C has two attributes: type and storage class. The four storage classes are: auto,extern,register, static. By far the most common storage class for variables is automatic. However, the programmer n

46、eeds to know about all the storage class. They all have important uses./172)變量的存儲類別)變量的存儲類別在C語言中,每個變量都有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。對1個變量的完整定義應指出變量的兩種屬性,因此變量類型定義的一般形式為: 存儲類別符存儲類別符 數(shù)據(jù)類型符數(shù)據(jù)類型符 變量表變量表;n變量的存儲類別分為:auto(自動類別)、register(寄存器類別)、static(靜態(tài)類別)和extern(外部類別)4種。 (1) auto 變量變量 函數(shù)中的局部變量,如果沒有專門聲明,都是動態(tài)分配存儲空間的,數(shù)據(jù)

47、存儲在動態(tài)存儲區(qū)中。這類局部變量稱為自動變量。自動變量用關鍵字auto作存儲類別的聲明。變量存貯類別的默認值是 auto。變量定義時自動賦給隨機數(shù)。/17(2)用用static聲明局部變量聲明局部變量 有時希望函數(shù)中的局部變量在函數(shù)調(diào)用結束后不消失且保留原值,當下次再調(diào)用該函數(shù)時還能繼續(xù)使用這些變量,這時就應該指定這些局部變量為“靜態(tài)局部變量”,用關鍵字static進行聲明。(3) register變量變量 為了提高效率,C語言允許將局部變量的值放在CPU中的寄存器中,這種變量叫“寄存器變量”,用關鍵字register進行聲明。 (4)用用extern聲明外部變量聲明外部變量 外部變量(即全局

48、變量)是在函數(shù)的外部定義的,外部變量的作用域是從定義開始到源文件的結束。為了擴大外部變量的作用域,系統(tǒng)允許用extern來聲明外部變量,表示該變量是1個已經(jīng)定義的外部變量。 /17【例【例5- 22】用】用extern聲明外部變量,擴展程序文件中的作用域聲明外部變量,擴展程序文件中的作用域#include #include int max(int x,int y) int z; z=xy?x:y; return(z);main() extern A,B; / 等同于等同于extern int A,B;,是外部變量的聲明,是外部變量的聲明 printf(%dn,max(A,B); getch()

49、;int A=13,B=-8; /外部變量(全局變量)的定外部變量(全局變量)的定義義/175.5 內(nèi)部函數(shù)與外部函數(shù)內(nèi)部函數(shù)與外部函數(shù)內(nèi)部函數(shù):函數(shù)只能在所定義的源文件中被其他函數(shù)調(diào)用,而不能被程序中其他源文件中的函數(shù)所調(diào)用聲明方式: static類型定義符函數(shù)名類型定義符函數(shù)名 (參數(shù)表參數(shù)表);外部函數(shù): 函數(shù)除可以被所定義的源文件中的其他函數(shù)調(diào)用外,還可以被程序中其他源文件中的函數(shù)所調(diào)用聲明方式: extern類型定義符函數(shù)名類型定義符函數(shù)名 (參數(shù)表參數(shù)表)/175.6 指針函數(shù)指針函數(shù)在C語言中,函數(shù)的返回值的類型可以是指針,即返回值為某種數(shù)據(jù)類型的地址。返回指針的函數(shù)稱為指針函數(shù)

50、。指針函數(shù)的定義格式: 類型定義符類型定義符 *函數(shù)名函數(shù)名(形式參數(shù)表形式參數(shù)表) 函數(shù)體函數(shù)體 例如:例如: char *day(int n)/17【例【例5- 24】由鍵盤輸入表示星期日至星期六的】由鍵盤輸入表示星期日至星期六的0 6,顯示出其英文名,顯示出其英文名,若不是若不是0 6則顯示則顯示“Illegal day”。#include #include char *day(int n)char *name8= Sunday , Monday , Tuesday , Wednesday , Thursday ,Friday , Saturday , Illegal day ; if(n6) return(name7); else return(namen);main() int x; scanf(d, &x); printf(s n, day(x); getch();程序中name是1個指針數(shù)組,它的每

溫馨提示

  • 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

提交評論