




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第1111章章 C C語言的模塊化程序設(shè)計(jì)語言的模塊化程序設(shè)計(jì) Return 本章學(xué)習(xí)目標(biāo)本章學(xué)習(xí)目標(biāo) q掌握模塊化程序設(shè)計(jì)的基本方法。掌握模塊化程序設(shè)計(jì)的基本方法。 q掌握內(nèi)部函數(shù)和外部函數(shù)的概念和使用方法。掌握內(nèi)部函數(shù)和外部函數(shù)的概念和使用方法。 q掌握由多個(gè)源文件組成的掌握由多個(gè)源文件組成的C C程序設(shè)計(jì)和編譯運(yùn)行程序設(shè)計(jì)和編譯運(yùn)行 方法。方法。 11.1 11.1 程序設(shè)計(jì)的基本方法程序設(shè)計(jì)的基本方法 11.2 C11.2 C語言對(duì)模塊化編程的支持語言對(duì)模塊化編程的支持 11.3 11.3 多個(gè)源程序文件組成的多個(gè)源程序文件組成的C C程序設(shè)計(jì)案例分析程序設(shè)計(jì)案例分析 11.1 程序
2、設(shè)計(jì)的基本方法 結(jié)構(gòu)化程序設(shè)計(jì)方法是隨著結(jié)構(gòu)化程序設(shè)計(jì)語言(如 PASCAL、C)的出現(xiàn)和發(fā)展而建立起來的,已經(jīng)被廣泛 應(yīng)用于軟件系統(tǒng)的開發(fā)。 結(jié)構(gòu)化程序設(shè)計(jì)方法主要包括如下3個(gè)方面:1)自頂 向下、逐步求精的設(shè)計(jì)過程。2)模塊化程序設(shè)計(jì)。3) 結(jié)構(gòu)化編程。 11.1.1 11.1.1 自頂向下、逐步求精的設(shè)計(jì)過程自頂向下、逐步求精的設(shè)計(jì)過程 所謂自頂向下、逐步求精的設(shè)計(jì)過程就是在進(jìn)行一個(gè)復(fù)雜 系統(tǒng)的設(shè)計(jì)時(shí)采取先全局后局部、先整體后細(xì)節(jié)、先抽象后具 體的分析設(shè)計(jì)方法,把系統(tǒng)分解為層次分明、結(jié)構(gòu)清晰、容易 實(shí)現(xiàn)的若干個(gè)模塊,然后再將每一個(gè)模塊細(xì)化為若干個(gè)處理步 驟或算法,直到可用程序設(shè)計(jì)語言的語
3、句來編程實(shí)現(xiàn)。 下面用一個(gè)簡單例子說明這種自頂向下、逐步求精的設(shè)計(jì)過程。 【例例11-111-1】 設(shè)計(jì)一個(gè)簡單的通訊錄管理程序。 【思路導(dǎo)航思路導(dǎo)航】首先將問題分解成以下7個(gè)模塊: (1)主控模塊 (2)菜單模塊 (3)添加模塊 (4)刪除模塊 (5)修改模塊 (6)顯示模塊 (7) 保存模塊 然后,對(duì)這7個(gè)模塊再分別進(jìn)一步細(xì)化。 v主控模塊可細(xì)化為: (1)初始化; (2)循環(huán)等待用戶選擇菜單項(xiàng); (3)根據(jù)用戶選擇菜單項(xiàng)執(zhí)行相應(yīng)操作: 若是“添加”,則調(diào)用添加模塊; 若是“刪除”。則調(diào)用刪除模塊; 若是“修改”,則調(diào)用修改模塊; 若是“顯示”,則調(diào)用顯示模塊; 若是“保存”,則調(diào)用保存模
4、塊; 若是“退出”,則結(jié)束程序。 v添加模塊可細(xì)化為: (1)查找 (2)根據(jù)查找結(jié)果做出相應(yīng)操作: 若該名字已存在,輸出提示信息;若該名字未存在,插入 新記錄。 v刪除模塊可細(xì)化為: (1)查找 (2)根據(jù)查找結(jié)果做出相應(yīng)操作: 若該名字不存在,輸出提示信息;若該名字存在,刪除該 記錄。 v修改模塊可細(xì)化為: (1)查找 (2)根據(jù)查找結(jié)果做出相應(yīng)操作: 若該名字不存在,輸出提示信息;若該名字存在,修改該記 錄。 v保存模塊可細(xì)化為: (1)提示輸入文件名; (2)以寫方式打開該文件; (3)把數(shù)據(jù)寫入該文件 最后,把各個(gè)子模塊再細(xì)化為具體的C語言語句。請(qǐng)看書中 /*exam11_1*/。程
5、序編譯運(yùn)行后的用戶界面如圖11-1所示。 演示 圖11-1 11.1.2 11.1.2 模塊化程序設(shè)計(jì)模塊化程序設(shè)計(jì) 1什么是程序模塊? 在軟件設(shè)計(jì)過程中,往往將一個(gè)大規(guī)模的程序劃分 成若干個(gè)大小適當(dāng)?shù)某绦蚨稳ゾ帉懀蛘呤菍⒛切┲?復(fù)使用的程序段進(jìn)行獨(dú)立設(shè)計(jì),以達(dá)到計(jì)算機(jī)可以重 復(fù)執(zhí)行,而設(shè)計(jì)人員又不必重復(fù)去編寫的目的。這樣 劃分的程序段被稱為程序模塊。 2什么是模塊化程序設(shè)計(jì)? 模塊化程序設(shè)計(jì)就是遵循一定的模塊分解和組織 原則,把一個(gè)大程序分解為多個(gè)容易理解和實(shí)現(xiàn)的大 小適當(dāng)、功能明確、具有一定獨(dú)立性的程序模塊的過 程。 (1)模塊分解原則 在進(jìn)行模塊分解時(shí),要求各模塊功能盡可能專一, 各模
6、塊之間的聯(lián)系盡可能簡單。模塊之間的聯(lián)系越簡 單,獨(dú)立性就越強(qiáng),就越容易獨(dú)立地進(jìn)行設(shè)計(jì)、維護(hù) 和修改,程序的可維護(hù)性和可擴(kuò)展性就越好,程序設(shè) 計(jì)的效率和質(zhì)量也就越高。 (2)模塊組織原則 結(jié)構(gòu)化程序設(shè)計(jì)方法要求按層次結(jié)構(gòu)組織各模塊。 “自頂向下”地將一個(gè)大程序逐層分解,得到程序的 模塊層次結(jié)構(gòu),而后再進(jìn)一步把每個(gè)模塊分解為具體 的執(zhí)行模塊或執(zhí)行步驟。 按層次組織模塊時(shí),一般較上層的模塊描述“做 什么”,最底層的模塊才描述“如何做”。 3C語言的模塊化技術(shù) (1)C語言的模塊化粒度 在C語言中,函數(shù)是實(shí)現(xiàn)程序模塊化的有力工具。一 般地,一個(gè)函數(shù)實(shí)現(xiàn)一個(gè)模塊功能,一個(gè)模塊(或一 個(gè)源程序文件)可以由
7、多個(gè)函數(shù)組成。C語言的模塊粒 度從小到大依次為:函數(shù)源程序文件程序,如圖 11-1所示。 C程序 源程序文件1源程序文件2源程序文件n 函數(shù)1函數(shù)2函數(shù)n 圖11-1 (2)C語言編譯系統(tǒng)對(duì)模塊化的技術(shù)支持 C語言編譯系統(tǒng)提供了宏定義、文件包含、條件編譯等 編譯預(yù)處理命令來實(shí)現(xiàn)編譯預(yù)處理,并且提供了豐富的 庫函數(shù),為實(shí)現(xiàn)模塊化編程提供了極大的方便。 (3)C語言對(duì)模塊化的技術(shù)支持 C語言提供函數(shù)和局部變量以實(shí)現(xiàn)模塊的包裝和獨(dú)立 性(在第7章已介紹),提供全局變量以實(shí)現(xiàn)多個(gè)模塊 之間的數(shù)據(jù)共享,提供extern聲明的全局變量和外部 函數(shù)以擴(kuò)展其作用域從而提高模塊之間的函數(shù)和數(shù)據(jù) 的共享性,提供s
8、tatic聲明的全局變量和內(nèi)部函數(shù)以 限制其作用域從而提高模塊的相對(duì)獨(dú)立性。本章11.2 節(jié)將重點(diǎn)討論這些技術(shù)的使用。 11.1.3 11.1.3 結(jié)構(gòu)化編程結(jié)構(gòu)化編程 結(jié)構(gòu)化編程是把任何程序的結(jié)構(gòu)都限制為順序、選 擇和循環(huán)三種基本結(jié)構(gòu),以提高程序的可讀性和可靠 性。 一個(gè)結(jié)構(gòu)化程序應(yīng)當(dāng)具有以下特點(diǎn): (1) 有一個(gè)入口、一個(gè)出口; (2) 沒有死語句(永遠(yuǎn)執(zhí)行不到的語句), 每一個(gè)語 句應(yīng)當(dāng)至少有一條從入口到出口的路徑通過它; (3) 沒有死循環(huán)(無限制的循環(huán))。 在本書前面的章節(jié)已經(jīng)詳細(xì)介紹了順序結(jié)構(gòu)、選擇 結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的程序設(shè)計(jì),這里就不再重復(fù)。 11.2 C語言對(duì)模塊化編程的支持 1
9、1.2.1 11.2.1 局部變量與全局變量局部變量與全局變量 1. 1. 定義變量的位置定義變量的位置 C語言中定義變量的位置基本上有三種:在函數(shù)體內(nèi)、函數(shù)體外 和函數(shù)形式參數(shù)。在函數(shù)體內(nèi)定義的變量以及函數(shù)的形式參數(shù)都 稱作局部變量,在所有函數(shù)體外定義的變量稱作全局變量。 2. 2. 局部變量局部變量 局部變量只在定義它們的函數(shù)內(nèi)有效,在此函數(shù)之外不能使用 它們。局部變量還可以在函數(shù)內(nèi)的復(fù)合語句中定義,此時(shí)局部變 量只在定義它們的復(fù)合語句中有效。常常把起于左大括號(hào)“”, 止于右大括號(hào)“”內(nèi)的語句塊統(tǒng)稱為代碼塊,所以可以說,局部 變量僅在定義它們的代碼塊中有效。 例如: fun1() int
10、z; /*z在函數(shù)fun1內(nèi)有效*/ z=10; fun2(int x,int y) int z; /*x,y,z在函數(shù)fun2內(nèi)有效*/ z=x+y; return z; fun3() int flag; /*flag在函數(shù)fun3內(nèi)有效*/ scan(“%d”,flag); if(flag) char s30; /*s僅在if語句塊中有效*/ printf(“please enter information:”); gets(s); 注意:在C語言中,代碼塊中的局部變量必須在代 碼塊開始處定義,即變量的定義必須出現(xiàn)在其它非變 量定義語句之前。而在c+中則不存在此限制,可以 在任意地方定義變
11、量。 例如: fun() int i;i=10; int j;j=20; j變量的定義出現(xiàn)在給i的賦值語句之后,在多數(shù)C編譯系統(tǒng)中會(huì) 報(bào)告語法錯(cuò)誤。應(yīng)改為: fun() int i;int j; i=10;j=20; 3. 3. 全局變量全局變量 與局部變量不同,全局變量可以自定義 位置起被本源文件中的其他所有函數(shù)使用 ,也可以用extern聲明后,在由多個(gè)文件 組成的程序中被其它源文件使用(關(guān)于 extern的作用在下一節(jié)關(guān)于變量存儲(chǔ)類型 中再詳細(xì)討論)。 【例例11-211-2】全局變量的作用范圍。 代碼如下: / /* *exam11_2exam11_2* */ / #include i
12、nt count; /*定義全局變量count*/ fun1() int temp; /*定義局部變量temp*/ temp=count; /*引用全局變量count*/ fun2(); printf(“ncount is %d, temp is %d ”,count,temp); int temp; /*定義全局變量temp*/ fun2() int count; /*局部變量count屏蔽了全局變量count*/ for(count=1;count=temp;count+)/*引用全局變量temp*/ putchar(*); int main(void) temp=10; /*對(duì)全局變量t
13、emp賦值*/ count=100; /*對(duì)全局變量count賦值*/ fun1(); return 0; 全局變量 count的作用范圍 全局變量temp的作用范圍 演示 雖然main函數(shù)和fun1函數(shù)都沒有定義count,但由于在 兩個(gè)函數(shù)之前定義了全局變量count,所以main和fun1都 可以使用count;main和fun2函數(shù)都沒有定義temp,但由 于在兩個(gè)函數(shù)之前定義了全局變量temp,所以main和fun2 函數(shù)都可以使用temp;但是temp是在fun1之后才定義的全 局變量,所以如果在fun1函數(shù)中企圖引用全局變量temp, 則會(huì)報(bào)告出錯(cuò)。 fun2函數(shù)定義了與全局變量
14、同名的局部變量count,所 以全局變量count在fun2中被屏蔽,即不起作用,而只使 用局部變量count。fun1函數(shù)定義了與全局變量同名的局 部變量temp,全局變量temp在本函數(shù)無效,并且就算fun1 函數(shù)內(nèi)沒有定義同名的局部變量temp,也不能引用全局變 量temp,因?yàn)槿肿兞縯emp在fun1函數(shù)之后才定義(若使 用extern聲明后擴(kuò)展了有效范圍則可以引用,參考下節(jié)關(guān) 于變量的存儲(chǔ)類型討論)。 說明:說明: (1)使用全局變量的好處 全局變量可以起到在不同函數(shù)間進(jìn)行數(shù)據(jù)傳遞的作用,尤 其當(dāng)需要從一個(gè)函數(shù)返回多于一個(gè)的返回值時(shí)可以利用全 局變量來實(shí)現(xiàn)。這是因?yàn)樵谝粋€(gè)函數(shù)中改變
15、了全局變量的 值,則會(huì)影響到所有使用該全局變量的函數(shù)。 (2)使用全局變量的壞處 使用全局變量會(huì)使函數(shù)的通用性變。C語言的一大特點(diǎn)就 是支持模塊化編程,通過函數(shù)和局部變量實(shí)現(xiàn)對(duì)代碼數(shù)據(jù) 的包裝,函數(shù)之間除了通過參數(shù)傳遞數(shù)據(jù)外盡量不要有其 它任何依賴關(guān)系,使得程序的移植性好,可讀性強(qiáng)。使用 全局變量則使函數(shù)之間的依賴變強(qiáng),降低程序的通用性。 在程序中大量使用全局變量容易引起程序錯(cuò)誤,因?yàn)楦?個(gè)函數(shù)執(zhí)行時(shí)都可能改變?nèi)肿兞康闹?,容易產(chǎn)生副作用 。 全局變量在程序的整個(gè)執(zhí)行期間占用存儲(chǔ)單元,而不像 局部變量只在需要時(shí)占用存儲(chǔ)空間。 鑒于上述原因,建議非不得已時(shí)不使用全局變量。 【例例11-311-3
16、】通過全局變量從函數(shù)得到多于一個(gè)的返回值。 編寫一個(gè)函數(shù),能夠求出一組整數(shù)中的最大值和最小值。 【思路導(dǎo)航思路導(dǎo)航】因?yàn)橥ㄟ^函數(shù)的return 語句只能返回一個(gè)值 ,所以把另一個(gè)結(jié)果賦給一個(gè)全局變量,從而達(dá)到返回兩個(gè) 結(jié)果的目的。 / /* *exam11_3exam11_3* */ / int Max=0;/*定義全局變量*/ int minimum(int array,int n) int min,j; Max=min=array0; for(j=0;jarrayj) min=arrayj; else if(Maxarrayj) Max=arrayj; return min; int ma
17、in(void) int a10,k; for(k=0;k10;k+) scanf(“%d”,a+k); printf(“Max=%dnmin=%dn”,Max, minimum(a,10); return 0; 演示 1 2 3 4 5 6 7 8 9 10 Max=10 min=1 運(yùn)行情況 注意:上面主函數(shù)中的printf函數(shù)的參數(shù)的前后位 置。若把Max放在minimum(a,10)的右邊,則得不到正 確結(jié)果,因?yàn)镃函數(shù)的參數(shù)運(yùn)算順序是從右到左,所 以應(yīng)把minimum(a,10)放在Max的右邊,這樣才能先調(diào) 用minimum函數(shù)從而同時(shí)得到最大值和最小值的結(jié)果 。 11.2.2 1
18、1.2.2 變量的存儲(chǔ)類型變量的存儲(chǔ)類型 在C語言中,每一個(gè)變量有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ) 類型。數(shù)據(jù)類型是指數(shù)據(jù)被定義為整形、字符型、實(shí)數(shù)型等,前 面已詳細(xì)介紹過。存儲(chǔ)類型是指數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方法,分為 兩大類:靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)。 所謂靜態(tài)存儲(chǔ)是指在程序運(yùn)行期間分配固定存儲(chǔ)空間的方式; 動(dòng)態(tài)存儲(chǔ)是指根據(jù)需要進(jìn)行存儲(chǔ)空間分配,不需要時(shí)即釋放存儲(chǔ) 空間的方式。 變量的存儲(chǔ)類型具體又分為四種類型,四種類型說明 符如下: auto(自動(dòng)) register(寄存器) static(靜態(tài)) extern(外部) 動(dòng)態(tài)存儲(chǔ) 靜態(tài)存儲(chǔ) 一般以如下形式對(duì)變量進(jìn)行聲明: 存儲(chǔ)類型說明符存儲(chǔ)類型說明符
19、 數(shù)據(jù)類型數(shù)據(jù)類型 變量名;變量名; 如: auto int a,b; static int c=1; 1. auto1. auto變量變量 函數(shù)的局部變量,如果不作static存儲(chǔ)類型聲明,都是動(dòng)態(tài)分 配存儲(chǔ)空間的;函數(shù)的形式參數(shù)也是動(dòng)態(tài)分配存儲(chǔ)空間的,兩者 都是在函數(shù)調(diào)用時(shí)系統(tǒng)給它們分配存儲(chǔ)空間,在函數(shù)結(jié)束時(shí)系統(tǒng) 自動(dòng)釋放這些存儲(chǔ)空間。所以這類局部變量和形式參數(shù)都屬于 auto(自動(dòng))變量。 這類局部變量可用auto關(guān)鍵字聲明,例如: int fun(int m) auto int j,k; /*定義j,k為自動(dòng)變量,auto可以省略不寫*/ 關(guān)鍵字auto可以省略不寫,系統(tǒng)把沒有進(jìn)行static聲明的局 部變量和形式參數(shù)默認(rèn)為自動(dòng)型變量。 2. 2. 用用extern extern 聲明全局變量聲明全局變量 全局變量是在所有函數(shù)的外部定義的,它的作用范圍是從定 義位置起到本文件本文件結(jié)束處,全局變量是靜態(tài)分配存儲(chǔ)空間的,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大慶出租車考試練習(xí)題庫
- 立德樹人理念下初中體育教學(xué)中德育滲透研究
- 2025年甘肅省高考?xì)v史試卷真題(含答案解析)
- 行業(yè)資質(zhì)證書專注于特定行業(yè)的權(quán)威證書(5篇)
- 電影拍攝項(xiàng)目合作及投資分配協(xié)議
- 印刷制作及版權(quán)許可協(xié)議
- 2025年一建考試《機(jī)電工程管理與實(shí)務(wù)》案例分析題庫-電氣設(shè)備安裝與調(diào)試技術(shù)解析
- 傳統(tǒng)節(jié)日中的故事童話色彩作文5篇范文
- 2025年導(dǎo)游資格證考試筆試旅游服務(wù)質(zhì)量管理與旅游行業(yè)法規(guī)解讀試卷
- 2025年醫(yī)用X射線設(shè)備項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告模板
- 2024-2025學(xué)年統(tǒng)編版七年級(jí)語文下學(xué)期期中考試模擬卷(含答案)
- 語言學(xué)導(dǎo)論知到課后答案智慧樹章節(jié)測(cè)試答案2025年春廣東外語外貿(mào)大學(xué)
- 2024-2025北師大版小學(xué)數(shù)學(xué)四年級(jí)上冊(cè)期末考試測(cè)試卷及參考答案(共三套)
- 2024-2025學(xué)年接力版(2024)小學(xué)英語三年級(jí)下冊(cè)(全冊(cè))知識(shí)點(diǎn)歸納
- 2025年憲法知識(shí)競賽全套題庫及答案(共150題)
- 高空作業(yè)佩戴安全帶培訓(xùn)
- 2025年春人教版英語七年級(jí)下冊(cè) Unit 7 A Day to Remember(教學(xué)設(shè)計(jì))
- 小學(xué)信息技術(shù)五年級(jí)上冊(cè)第3課《流程圖描述算法》教學(xué)設(shè)計(jì)
- 市政工程計(jì)量表格樣表
- 職業(yè)院校教師人工智能素養(yǎng):內(nèi)涵流變、框架構(gòu)建與生成路徑
- 封裝車間預(yù)防錯(cuò)漏混報(bào)告
評(píng)論
0/150
提交評(píng)論