計算機程序設(shè)計基礎(chǔ)C語言_第1頁
計算機程序設(shè)計基礎(chǔ)C語言_第2頁
計算機程序設(shè)計基礎(chǔ)C語言_第3頁
計算機程序設(shè)計基礎(chǔ)C語言_第4頁
計算機程序設(shè)計基礎(chǔ)C語言_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第7 7章章C C程序的模塊化設(shè)計程序的模塊化設(shè)計模塊化程序設(shè)計方法的思想模塊化程序設(shè)計方法的思想: 將一個較大的程序按功能分割成一些模塊,每將一個較大的程序按功能分割成一些模塊,每個模塊都是功能單一、結(jié)構(gòu)清晰、接口簡單、容個模塊都是功能單一、結(jié)構(gòu)清晰、接口簡單、容易理解的小任務(wù)。對每一個處于底層的小任務(wù)編易理解的小任務(wù)。對每一個處于底層的小任務(wù)編寫相應(yīng)的實現(xiàn)寫相應(yīng)的實現(xiàn)函數(shù)函數(shù),然后通過,然后通過函數(shù)調(diào)用函數(shù)調(diào)用的方法將的方法將多個這樣的函數(shù)按功能組合成一個較高層的調(diào)用多個這樣的函數(shù)按功能組合成一個較高層的調(diào)用函數(shù),多個這樣的調(diào)用函數(shù)又可成為被調(diào)函數(shù),函數(shù),多個這樣的調(diào)用函數(shù)又可成為被調(diào)函

2、數(shù),并按功能組織成更高層次的調(diào)用函數(shù)。并按功能組織成更高層次的調(diào)用函數(shù)。 模塊化程序設(shè)計的基本方法:模塊化程序設(shè)計的基本方法:自頂向下(或自底向上)自頂向下(或自底向上)和和逐步求精逐步求精。 C語言的開發(fā)工具提供了程序語言的開發(fā)工具提供了程序工程工程開發(fā)的能力開發(fā)的能力 。 工程由多個源程序文件組成。工程由多個源程序文件組成。 每個源程序文件可以單獨編譯;然后再連接成一每個源程序文件可以單獨編譯;然后再連接成一個大的可執(zhí)行文件個大的可執(zhí)行文件 。 每個源程序文件可以包含一個或多個函數(shù)。每個源程序文件可以包含一個或多個函數(shù)。 一個工程只能有一個一個工程只能有一個main主函數(shù)。主函數(shù)。 mai

3、n() f1( );f2( );f1( ) g1( ) f2( ) h1( );h2( );k1()g1( )k1()h1( ) h2( ) k1( ) 圖圖7.1由若干個函數(shù)組成的一個程序由若干個函數(shù)組成的一個程序/* */extern void f1();extern void f2();void main() f1(); f2(); /* */void g1( ); void k1( );void f1( ) g1( );void g1( ) k1( );void k1( ) /* */void h1( ); void h2( ); extern void k1( );void f2(

4、) h1( ); h2( );k1( );void h1( ) void h2( ) 注意:當再次調(diào)用注意:當再次調(diào)用函數(shù)時,無法保證函數(shù)時,無法保證變量始終保留原來變量始終保留原來的值。的值。 void main( ) int a, b; int x10,y10; if(ab) int t; t=a;a=b;b=t; Fun (x);void Fun (int x ) int a, b; int n =5; void fun(void);void main() printf(“1.main:n = %d n”, n); fun(); printf(“2.main:n = %d n”, n);

5、 void fun(void) n=10; printf(“3.fun:n = %d n”, n); 注意:全局變量只能定義一次,注意:全局變量只能定義一次,可多次用可多次用extern聲明以擴大作用域。聲明以擴大作用域。#include int n =5; int main() int n = 50; printf(“main:n = %d n”, n); fun();void fun(void) printf(“fun:n = %d n”, n); 注意注意靜態(tài)全局變量靜態(tài)全局變量和靜態(tài)局部變和靜態(tài)局部變量之分。量之分。 例例7.7 分析下列程序,由兩個源程序文件組成:分析下列程序,由兩個

6、源程序文件組成:/* test.c */#include extern void f1(); extern void f2();void main() f1();f2();f1();f2() ;/* test1.c */#include static int i; void f1(void) printf(“f1:i=%dn”,+i);void f2(void) printf(“f2:i=%dn”,+i);例例7.8 分析下列程序,注意全局變量、靜態(tài)局部變量分析下列程序,注意全局變量、靜態(tài)局部變量和局部變量的區(qū)別。和局部變量的區(qū)別。 #include void f1(); int n=1; v

7、oid main() int a=0,b=-10; printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1(); printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1();void f1() static int a=2; int b=5; a+=2,b+=5; n+=12; printf(“f1:a=%d,b=%d,n=%dn”,a,b,n);運行結(jié)果如下:main:a=0,b=-10,n=1f1: a=4,b=10,n=13main:a=0,b=-10,n=13f1: a=6,b=10,n=25void Fun (int x ) int

8、 a, b; void main( ) int a, b; int x10,y10; if(ab) int t; t=a;a=b;b=t; Fun (x);例例2,分析下列程序變量的作用域:,分析下列程序變量的作用域: #include void f1(); int n=1; void main() int a=0,b=-10; printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1(); printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1();void f1() static int a=2; int b=5; a+=2,b+=5; n

9、+=12; printf(“f1:a=%d,b=%d,n=%dn”,a,b,n);變量存在變量存在的區(qū)域的區(qū)域變量在不同的內(nèi)存變量在不同的內(nèi)存區(qū)域,將決定了其區(qū)域,將決定了其有不同的生存期。有不同的生存期。 例例 分析下列程序變量的生存期:分析下列程序變量的生存期: #include void f1(); int n=1; void main() int a=0,b=-10; printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1(); printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1();void f1() static int a=

10、2; int b=5; a+=2,b+=5; n+=12; printf(“f1:a=%d,b=%d,n=%dn”,a,b,n);#include int a;int main(void) bb.c #include extern int a;int fun1(void)cc.c #include int fun2(void) extern int a;aa.c分析下列程序的運行結(jié)果:分析下列程序的運行結(jié)果: #include void f1(); int n=1; void main() int a=0,b=-10; printf(“main:a=%d,b=%d,n=%dn”,a,b,n);

11、 f1(); printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1();void f1() static int a=2; int b=5; a+=2,b+=5; n+=12; printf(“f1:a=%d,b=%d,n=%dn”,a,b,n);其定義格式如下:其定義格式如下:static static 數(shù)據(jù)類型數(shù)據(jù)類型 函數(shù)名函數(shù)名( (形參列表形參列表) )其定義格式如下:其定義格式如下:數(shù)據(jù)類型數(shù)據(jù)類型 函數(shù)名函數(shù)名(形參列表形參列表)說明語句部分說明語句部分執(zhí)行語句部分執(zhí)行語句部分 外部函數(shù)可以被同一工程中的其它文件調(diào)用,外部函數(shù)可以被同一工程中的其它文件

12、調(diào)用,但必須在其它文件中進行聲明,聲明格式如下:但必須在其它文件中進行聲明,聲明格式如下:extern extern 數(shù)據(jù)類型數(shù)據(jù)類型 函數(shù)名函數(shù)名( (形參列表形參列表);); 包括動態(tài)存儲分配:包括動態(tài)存儲分配:malloc函數(shù)和函數(shù)和calloc函數(shù);函數(shù);動態(tài)存儲釋放及重新分配:動態(tài)存儲釋放及重新分配:free函數(shù)和函數(shù)和realloc。在。在使用這些函數(shù)時,應(yīng)當用使用這些函數(shù)時,應(yīng)當用“#include ”編譯預(yù)處理命令,把編譯預(yù)處理命令,把stdlib.h頭文件包含到程序文頭文件包含到程序文件中。件中。 C語言允許建立內(nèi)存動態(tài)分配區(qū)域:需要時隨語言允許建立內(nèi)存動態(tài)分配區(qū)域:需要時隨

13、時開辟,不需要時隨時釋放。時開辟,不需要時隨時釋放。 數(shù)據(jù)是臨時存放在一個特別自由的存儲區(qū),稱數(shù)據(jù)是臨時存放在一個特別自由的存儲區(qū),稱為堆區(qū)。為堆區(qū)。 申請動態(tài)內(nèi)存的函數(shù)有申請動態(tài)內(nèi)存的函數(shù)有malloc函數(shù)和函數(shù)和calloc函數(shù)。函數(shù)。1malloc函數(shù)函數(shù)函數(shù)原型為:函數(shù)原型為: void *malloc( unsigned int size);說明:說明:該函數(shù)的功能是申請分配指定該函數(shù)的功能是申請分配指定size個字節(jié)的存儲區(qū)。個字節(jié)的存儲區(qū)。若申請成功,返回一個指向該存儲區(qū)的首地址;若沒若申請成功,返回一個指向該存儲區(qū)的首地址;若沒有足夠的內(nèi)存空間分配,函數(shù)返回空有足夠的內(nèi)存空間分

14、配,函數(shù)返回空(NULL)。例如,例如,int *pi;/* 申請內(nèi)存空間,強制數(shù)據(jù)類型轉(zhuǎn)換申請內(nèi)存空間,強制數(shù)據(jù)類型轉(zhuǎn)換*/pi=(int*)malloc(sizeof(int); /* 如果申請成功,將如果申請成功,將123存儲于剛分配的存儲空間中存儲于剛分配的存儲空間中 */if (pi!=NULL) *pi=123; 2calloc函數(shù)函數(shù)函數(shù)原型為:函數(shù)原型為: void *calloc(unsigned n,unsigned size);說明:說明:該函數(shù)可以給該函數(shù)可以給n個同一類型的數(shù)據(jù)項分配連續(xù)的存儲空間個同一類型的數(shù)據(jù)項分配連續(xù)的存儲空間由由calloc所分配的存儲單元,系

15、統(tǒng)自動置初值所分配的存儲單元,系統(tǒng)自動置初值0 例如:例如:char *pc;pc=(char*)calloc(80, sizeof(char); /* pc指向具指向具有有80個連續(xù)個連續(xù)char型的存儲區(qū)域的首地址型的存儲區(qū)域的首地址 */用用malloc和和calloc函數(shù)在堆中分配的存儲空間,函數(shù)在堆中分配的存儲空間,隨時可以調(diào)用隨時可以調(diào)用free函數(shù)釋放函數(shù)釋放,也可以通過,也可以通過realloc函數(shù)函數(shù)對動態(tài)分配的內(nèi)存區(qū)調(diào)整大小。對動態(tài)分配的內(nèi)存區(qū)調(diào)整大小。1free函數(shù)函數(shù)函數(shù)原型為:函數(shù)原型為: void free(void *p);說明:說明:函數(shù)執(zhí)行后,函數(shù)執(zhí)行后,p指

16、向的存儲空間交還給系統(tǒng),指針變量指向的存儲空間交還給系統(tǒng),指針變量p就沒有確切的指向了。就沒有確切的指向了。2realloc函數(shù)函數(shù)函數(shù)原型為:函數(shù)原型為: void *realloc(void *p,unsigned int size);說明:說明:該函數(shù)的功能是將該函數(shù)的功能是將p所指向的已動態(tài)分配存儲區(qū)的大小所指向的已動態(tài)分配存儲區(qū)的大小改變?yōu)楦淖優(yōu)閟ize,size可比原來分配的空間大或小??杀仍瓉矸峙涞目臻g大或小。 void * 指針變量名;指針變量名;C99允許使用基類型為允許使用基類型為void的指針類型,其定義格式如下:的指針類型,其定義格式如下:說明:說明:這種類型的指針不指

17、向任何具體的數(shù)據(jù)。這種類型的指針不指向任何具體的數(shù)據(jù)。 在將它的值賦給另一指針變量時要進行強制類型轉(zhuǎn)換,在將它的值賦給另一指針變量時要進行強制類型轉(zhuǎn)換,使之適合于被賦值變量的類型。使之適合于被賦值變量的類型。 例例7.9 建立動態(tài)數(shù)組。輸入建立動態(tài)數(shù)組。輸入5個學(xué)生的成績,調(diào)用一個函數(shù)個學(xué)生的成績,調(diào)用一個函數(shù)檢查其中有無低于檢查其中有無低于60分的成績,輸出這些不合格的成績。分的成績,輸出這些不合格的成績。#include #include void main( ) void check(int *); int *p1,i; void *p2; p2=malloc(5*sizeof(int)

18、; p1=(int *)p2; printf(輸入輸入5個學(xué)生的成績:個學(xué)生的成績:); for(i=0;i5;i+) scanf(%d,p1+i); check(p1); free(p2);void check(int *p)int i; printf(不合格的成績有:不合格的成績有:); for(i=0;i5;i+) if(pi(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展開:宏展開:t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy?x:y);main() int

19、a,b,c,d,t; . t=max(a+b,c+d); 例例 用宏定義和函數(shù)實現(xiàn)同樣的功能用宏定義和函數(shù)實現(xiàn)同樣的功能帶參宏函數(shù)處理過程不分配內(nèi)存簡單的字符置換分配內(nèi)存先求實參值,再代入形參處理時間編譯時程序運行時參數(shù)類型無類型問題定義實參,形參類型程序長度變長不變運行速度不占運行時間調(diào)用和返回占時間例,例,#define PI3.1415926#undef PI一般形式:一般形式: #include “文件名文件名” 或或 #include #include “”BABA說明:說明:其作用是把指定文件的內(nèi)容包含(復(fù)制)到當前其作用是把指定文件的內(nèi)容包含(復(fù)制)到當前源文件里。源文件里。 一

20、般形式:一般形式: #include “文件名文件名” 或或 #include 說明:說明:這兩種使用形式有差別,其差異在于預(yù)處理程序這兩種使用形式有差別,其差異在于預(yù)處理程序定位頭文件的方式不同:定位頭文件的方式不同: #include ,預(yù)處理程序直接到系統(tǒng),預(yù)處理程序直接到系統(tǒng)指定的指定的include目錄中查找所需的文件。目錄中查找所需的文件。 #include “文件名文件名”,預(yù)處理程序首先在源文,預(yù)處理程序首先在源文件所在目錄里查找,如果沒找到,再到系統(tǒng)指定件所在目錄里查找,如果沒找到,再到系統(tǒng)指定的的include目錄查找。目錄查找。條件編譯命令有條件編譯命令有6個,分別是:個,分別是: #if 整型表達式整型表達式 #else #elif整型表達式整型表達式 /* else if的縮寫,分支測試的縮寫,分支測試 */ #endif /* 標識標識if作用范圍結(jié)束作用范圍結(jié)束 */ #ifdef 標識符標識符 /* 等價于等價于 #if defined標識符標識符 */ #ifndef標識符標識符 /* 等價于等價于 #if undefined標識標識符符 */條件編譯的作用是直接取舍程序語句和協(xié)調(diào)多個頭條件編譯的作用是直接取舍程序語句和協(xié)調(diào)多個頭文件。文件。例

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論