第四章 模塊化程序設(shè)計_第1頁
第四章 模塊化程序設(shè)計_第2頁
第四章 模塊化程序設(shè)計_第3頁
第四章 模塊化程序設(shè)計_第4頁
第四章 模塊化程序設(shè)計_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章 模塊化程序設(shè)計 前面各幾章的學(xué)習(xí),大家已有了編制小程序的經(jīng)驗。如果想編制大程序,在C語言下就得用模塊化程序設(shè)計,其基本思想是將一個大的程序按功能分割成一些模塊,使每一個模塊都成為功能單一、結(jié)構(gòu)清晰、接口簡單、容易理解的小程序。C語言提供了支持模塊化軟件開發(fā)的功能: 1 函數(shù)式的程序結(jié)構(gòu)。程序由一個或多個函數(shù)組成,每個函數(shù)都有各自獨立的功能和界面。 2 允許通過使用不同的存儲類別的變量,控制模塊內(nèi)部和外部的信息交換。 3具有預(yù)編譯處理功能,為程序的調(diào)試、移植提供方便,支持模塊化程序設(shè)計。 本章介紹這些功能及進行程序開發(fā)的基本方法。 4.1 函數(shù) 4.2 變量的存儲屬性 4.3 編譯預(yù)處理

2、結(jié)束放映4.1 函數(shù)4.1.1 C程序的結(jié)構(gòu) 4.1.2 函數(shù)定義和函數(shù)聲明 4.1.3 函數(shù)的傳值調(diào)用4.1.4 函數(shù)嵌套調(diào)用 4.1.5 函數(shù)的遞歸調(diào)用C程序結(jié)構(gòu)(一) 無論涉及的問題是復(fù)雜還是簡單,規(guī)模是大還是小,用C語言設(shè)計程序,任務(wù)只有一種,就是編寫函數(shù),至少要編寫一個主函數(shù)main(),C程序的執(zhí)行就是執(zhí)行相應(yīng)的main()函數(shù)。即從它的main()函數(shù)的第一個花括號開始,依次執(zhí)行后面的語句,直到最后的花括號為止。其它函數(shù)只有在執(zhí)行了main()函數(shù)的過程中被調(diào)用時才執(zhí)行。如圖所示某一復(fù)雜程序執(zhí)行的情況:main() f1( ); f2( ); f1( )f11();.f11()

3、f21()f2( )f21( );f22()f22() . 程序執(zhí)行過程中:主函數(shù)中含有調(diào)用函數(shù)f1,f2當執(zhí)行到f1( )時函數(shù)f1才被調(diào)用,到達時f2()時函數(shù)f2才被調(diào)用。調(diào)用f1時,main()向f1傳遞一些信息,并將流程轉(zhuǎn)向f1。函數(shù)f1執(zhí)行完后,向main()傳回一些信息,再將流程返回main()。調(diào)用f2時的情形相同。當然在在執(zhí)行f1函數(shù)時,也可以調(diào)用別的函數(shù)。C程序結(jié)構(gòu)(二) 高級語言中“函數(shù)”的概念和數(shù)學(xué)中“函數(shù)”的概念不完全相同。英語單詞function有“函數(shù)”和“功能”兩種介紹,高級語言中的函數(shù)實際上是功能的意思。當要完成某一個功能時,就用一個函數(shù)去實現(xiàn)它。在程序設(shè)計時

4、首先要考慮main()函數(shù)中的算法,當main()中需要使用某一功能時,就用一個具有該功能的函數(shù)表達式表示。這時的函數(shù),我們只知道它具有什么功能,其它先不作處理。設(shè)計完main()的算法并檢驗無誤后,這時開始考慮它所調(diào)用的函數(shù)。如果在庫函數(shù)中能找到,就可直接使用,否則再動手設(shè)計這些函數(shù)。這種設(shè)計方法稱為自頂向下、逐步細化的程序設(shè)計方法。這種方法設(shè)計出來的程序在功率高,程序?qū)哟畏置?、結(jié)構(gòu)清晰。復(fù)雜程序的層次可從以下圖形中看出:main()f1()f2()f11()f21()f22()C程序結(jié)構(gòu)(三) 許多大型軟件系統(tǒng)包含了相當豐富的,可供從事某一領(lǐng)域工作人員選用,如一個高等學(xué)校的信息管理系統(tǒng)就包

5、含了教務(wù)、科研、人事、財務(wù),設(shè)備、圖書、后勤、辦公室等子系統(tǒng)。每一個子系統(tǒng)以可分為許多子子系統(tǒng)。 這種軟件為了方便用戶大都采用菜單(menu)方式,這種形式的軟件,大家都用過。用戶只需按一些簡單的鍵,就能調(diào)用該功能,就像在飯店點菜一樣那么方便。高等院校事務(wù)管理系統(tǒng)的模塊結(jié)構(gòu)如下:(程序menu.c)辦 公 室 管 理學(xué) 藉 管 理 成 績 管 理排 課教 務(wù) 管 理科 研 管 理人 事 管 理財 務(wù) 管 理設(shè) 備 管 理圖 書 資 料 管 理后 勤 管 理高 等 院 校 事 務(wù) 管 理函數(shù)的定義與函數(shù)聲明(一) 函數(shù)就是在程序中設(shè)定的一個函數(shù)模塊。一個函數(shù)是由變量聲明部分與可執(zhí)行語句組的成獨立

6、實體,用來完成一指定功能。除了系統(tǒng)提供的函數(shù)外,用戶編制函數(shù)才是一種正確的選擇。 (一)(一).函數(shù)定義:函數(shù)定義:(函數(shù)類型、函數(shù)名、形參、函數(shù)體內(nèi)容)函數(shù)返回值的類型說明 函數(shù)名(類型名 形式參數(shù)1,類型名 形式參數(shù)2,) 函數(shù)首部 說明部分 函數(shù)體 語句部分 函數(shù)類型:函數(shù)計算后的值是什么類型。 函數(shù)名: 用戶命名的標識符,在主函數(shù)中調(diào)用的名字。 形式參數(shù):函數(shù)中處理的變量,通過它接收主函數(shù)傳過來的具體值。 函數(shù)體: 函數(shù)計算時的具體方法和函數(shù)的表達式。由變量定義部分和 語句組成。 函數(shù)的返回:由函數(shù)返回調(diào)用它的函數(shù),可由以下返回形式: return 表達式;return; 可沒有ret

7、urn語句,也可有多個return語句。函數(shù)的定義與函數(shù)聲明(二) 函數(shù)名 (類型名 形式參數(shù)1,類型名 形式參數(shù)2,) 省略類型說明,C語言默認返回值為int型。例:求兩個雙精度數(shù)這和的函數(shù)。 double add(double a,double b) double s; s=a+b; return s; 函數(shù)返回值的類型可以是整型、實型、字符型和指針類型。以上函數(shù)的返回值是double型。 可用double add(a,b) double a,b來寫函數(shù)首部。 定義函數(shù)可以沒有參數(shù),但一對括號不省略,如:dummy() ,函數(shù)體也可是空的,這樣的函數(shù)什么也不做。編程時可作為一個虛設(shè)的部分。

8、函數(shù)舉例:編一個求兩個數(shù)中最小數(shù)的函數(shù),用循環(huán)語句多次調(diào)用該函數(shù),找出十個數(shù)中的最小數(shù)。 (ec711.c)函數(shù)名函數(shù)返回值類型類型名與形式參數(shù)函數(shù)返回值函數(shù)聲明(三)在C 語言中,除了主函數(shù)外,對于用定義的函數(shù)要遵循“先定義,后使用”的規(guī)則。凡是未在調(diào)用前定義函數(shù),C編譯程序都 默認函數(shù)的返回值為int類型。對于返回值為其它類型的函數(shù),若把函的定義放在調(diào)用之后,應(yīng)該在調(diào)用之前對函進行說明。即只有函數(shù)的首部,一般形式為: 類型名 函數(shù)名(參數(shù)類型1,參數(shù)類型2,)如:double add(double,double)或 類型名 函數(shù)名(參數(shù)類型1 參數(shù)名1,參數(shù)類型2,參數(shù)名2,)如:doub

9、le add(double p,double q) 這里的參數(shù)是虛設(shè)的,實際上參數(shù)名常常省略。函數(shù)說明語句中的類型名必須與函數(shù)返回值的類型一致。函數(shù)說明既可以作為一條單獨的語句如:double add(double,double)也可以與普通變量的說明在一起如:double x,y,add(double,double) 函數(shù)說明的位置與調(diào)用的關(guān)系 當在所有函數(shù)的外部、被調(diào)用之前說明函數(shù)時,在說明之后的任何位置都 可調(diào)用。 函數(shù)說明也可放在調(diào)用函數(shù)內(nèi)的說明部分,但只能在該函內(nèi)調(diào)用。 函數(shù)的傳值調(diào)用(一) 參數(shù)是函數(shù)調(diào)用時進行信息交換的載體,實參和形參結(jié)合,完成信息交換,函數(shù)的執(zhí)行部分對這些傳遞來

10、的數(shù)據(jù)進行處理后,返回相應(yīng)的函數(shù)值。與數(shù)學(xué)中的知道函數(shù)表達式求函數(shù)值相類似。(f(x)=3x+1;f(5)=?,f(0)=?)只不過是C語言中的函數(shù)自變量個數(shù)不只是一個。1.當所調(diào)用的函數(shù)用于求出某個值時,函數(shù)的調(diào)用可作為表達式出現(xiàn)在允許表達式出現(xiàn)的任何地方,如: y=add(3.0,4.0); 也可出現(xiàn)有關(guān)系表達式中用于條件判斷。2.如果只為了某些操作不返回函數(shù)值時,函數(shù)作為一條獨立的語句,如: 函數(shù)名(實在參數(shù));函數(shù)調(diào)用時的語法要求:1.調(diào)用函數(shù)時,函數(shù)名必須與定義的函數(shù)名字完全一致。2.實在參數(shù)的個數(shù)必須與形式參數(shù)的個數(shù)一樣。實在參數(shù)可以是表達式,類型上應(yīng)按位置與形式參數(shù)一一對應(yīng)匹配。

11、如果類型不一致,編譯系統(tǒng)會根據(jù)賦值兼容規(guī)定進行轉(zhuǎn)換,若類型不賦值兼容,不給出錯信息,程序繼續(xù)執(zhí)行,得不到正確的結(jié)果。函數(shù)的傳值調(diào)用(二) 在C語言中調(diào)用函數(shù)與被調(diào)用函數(shù)之間的數(shù)據(jù)可通過三種方法進行傳遞: 1.實在參數(shù)和形式參數(shù)之間進行數(shù)據(jù)傳遞。 2.通過return語句把函數(shù)值返回調(diào)用函數(shù)。 3.通過全局變量。這種方法不好。在C語言中,數(shù)據(jù)只能從實參傳遞給形參,稱為“按值”傳遞。也就是說,當用簡單變量作為實在參數(shù),用不能在函數(shù)中改變對應(yīng)的值。觀察參數(shù)傳遞兩個實例: 函數(shù)參數(shù)之間的單向傳遞。(ec71.c) 調(diào)用函數(shù)交換兩個變量中的值。(ec72.c) 沒有返回值的調(diào)用:(ec710.c)函數(shù)的

12、嵌套調(diào)用 C程序的main()函數(shù)在調(diào)用一個函數(shù)時,被調(diào)用的函數(shù),又要調(diào)用另一個函數(shù),這種調(diào)用稱為函數(shù)的嵌套調(diào)用。 例:把一個偶數(shù)分解為兩個素數(shù)之和。 兩次調(diào)用判斷一個數(shù)是否為素數(shù)的函數(shù); (ec74.c) (ec75.c) . )()(int0和作為函數(shù)返回值用以求編寫函數(shù)nxxfnsum函數(shù)的遞歸調(diào)用 C語言中的函數(shù)可以遞歸調(diào)用,即:可直接叵間接地調(diào)用自己。前者稱為簡單遞歸,后者稱為間接遞歸,只討論簡單遞歸。 遞歸符合的三個條件: 1. 可以反要解決的問題轉(zhuǎn)化為一個新的問題,而這個新的問題的解法仍與原野來的解法相同,只是所處理的對象有規(guī)律地遞增或遞減。 2 .可以應(yīng)用這個轉(zhuǎn)化過程使問題得到

13、解決。 3 .必有一個明確的結(jié)束遞歸的條件。 例:用遞歸的方法求n!。 把計算n的階乘轉(zhuǎn)化為n-1的階乘,而計算方法相同。當計算到n為0時,問題完成。 時0n1)(nn時0n1n!當當函數(shù)的遞歸調(diào)用 函數(shù)遞歸調(diào)用如何分析執(zhí)行結(jié)果: fac(5) fac(5)=5*fac(4)=5*4*3*2*1=120 5*fac(4) fac(4)=4*f(3)=4*3*2*1=24 4*fac(3) fac(3)=3*fac(2)=3*2*1=6 3*fac(2) fac(2)=2*fac(1)=2*1=2 2*fac(1) fac(1)=1*fac(0)=1*1=1 1*fac(0) fac(0)=1f

14、ac(int n) main() int t; int m,y; if(n= =1|n= =0) return 1; scanf(“%d”,&m); else t=n*fac(n-1); return t; if (m0) printf(“Input data error”); else y=fac(m);printf(“%d”,y); 程序執(zhí)行結(jié)果 ec1102.c函數(shù)的遞歸調(diào)用 分析11.7程序的執(zhí)行結(jié)果: fun(6,&x) fun(6,&x)=fun(5,&x)+fun(4,&x) =5+3=8 fun(5,&x) fun(5,&

15、x)=fun(4,&x)+fun(3,&x) =3+2=5 fun(4,&x) fun(4,&x)=fun(3,&x)+fun(2,&x) =2+1=3 fun(3,&x) fun(3,&x)=fun(2,&x)+fun(1,&x) =1+1=2 fun(2,&x) fun(2,&x)=1 fun(1,&x) fun(1,&x) =1 先下來,再返上去,這就是遞歸的分析的方法。 看程序執(zhí)行結(jié)果 ec1103.c程序舉例1.編寫函數(shù)判斷自變量是不為素數(shù),若是素數(shù),函數(shù)返回1,否則返回0

16、。(ec73.c)2.編寫函數(shù),驗證任意偶數(shù)可分解為兩個素數(shù)之和,并輸出這個素數(shù)。 (ec74.c)3.(ec75.c)4.用梯形法求函數(shù)的定積分。近似公式如下:(ec76.c)5.把小寫字母轉(zhuǎn)換成大寫字母的函數(shù)。 (ec77.c)6.統(tǒng)計輸入字符的個數(shù)。 (ec78.c)7.統(tǒng)計輸入一段文本中的單詞個數(shù)。用空格、換行符、跳格隔開。 (ec79.c). )()(int0和作為函數(shù)返回值用以求編寫函數(shù)nxxfnsum變量的存儲屬性 變量是對程序中數(shù)據(jù)的存儲空間的抽象。前面介紹的數(shù)據(jù)類型是變量的操作屬性。除此之外,影響變量使用的還有變量的存儲屬性。 變量的存儲類型:計算機中的存儲器分為內(nèi)存和外存,

17、除此這外不有一個稱為寄存器的臨時存儲器,用來存儲一些反復(fù)被加工的數(shù)據(jù),存取速度比內(nèi)存和外存要快得多。 變量的生存期:C語言中的變量可用兩種方法建立:在編譯時分配存儲單元,程序開始執(zhí)行變量被創(chuàng)建,結(jié)束被撤銷。這種變量生存期為程序執(zhí)行的整個過程,在該過程中占有固定存儲空間,稱為永久存儲;另一種是在某一段時間內(nèi)存在,函數(shù)的形參和在函數(shù)體中的定義的變量,在程序進入該函數(shù),才分配存儲空間,函數(shù)結(jié)束,存儲空間又被撤銷,稱為動態(tài)存儲。 變量的可用域:分為兩種:局部可用和全局可用,即局部變量與全局變量。 用存儲屬性可表示這三個方面的屬性;分為四種存儲類別說明auto(自動);register(寄存器);sta

18、tic(靜態(tài))和extern(外部)。以上屬性說明,放在類型說明符的左邊,也可以放在類型說明符的右邊。 auto int k,l ; int auto k,l; 4.2.1 動態(tài)變量 4.2.2 靜態(tài)變量 4.2.3 外部變量動態(tài)變量(一)(一)自動(auto)變量: 在變量定義時使用auto和不使用auto定義都是自動變量,這類變量的使用和前面所用變量一樣。在主函數(shù)和子函數(shù)中變量名一樣的變量分析程序時要特別注意。 1.自動變量是局部變量 自動變量只有在它定義的那個局部才能使用。(ec72.c) (ec712.c) 2.在對自動變量賦值之前,它值是不確定。 在編制累加和累乘的程序時,為什么要給

19、和單元及積單元賦初值,原理就在這里。 (ec713.c) 程序計算的結(jié)果不確定。 (ec714.c)變量x沒有賦初值,執(zhí)行的結(jié)果不可預(yù)測。動態(tài)變量(二)二寄存器(register)變量: 它的值保留的CPU的寄存器中,不占用內(nèi)存單元,存取時間快,用它可提高程序的運行速度。通常把使用頻率較高的變量定義為寄存器變量。定義與自動變量一樣。 由于現(xiàn)在的計算機運算速度快,定義寄存器變量,很難分辨出它執(zhí)行的情況。 打印乘法九九表的程序: (ec715.c) 由循環(huán)控制變量i,j經(jīng)常用,所以定義為寄存器變量。 由于各種計算機系統(tǒng)中的寄存器數(shù)目不同,寄存器的長度也不同,因此程序中定義寄存器變量的數(shù)量受限制。

20、靜態(tài)變量 靜態(tài)static變量: 它中的值和其它類型變量不一樣在于: 1.在整個程序運行期間,靜態(tài)局部變量在內(nèi)存中占有永久性的存儲單元,即使退出函數(shù)以后,再進入函數(shù)時,靜態(tài)局部變量仍使用原來的存儲單元。由于不釋放原來的值,它的值可以使用到程序結(jié)束。 2.它的初值是在編譯時賦予的,在執(zhí)行時不再賦初值,末賦初值時系統(tǒng)自動賦初值0。 在函數(shù)多次被調(diào)用過程中靜態(tài)局部變量的值具有可繼承性。 (ec716.c) (ec716a.c) 靜態(tài)局部變量的值只能在本函數(shù)中使用。外部變量 一、外部變量(extern)是全局變量 定義在所有函數(shù)之外的變量稱為外部變量。 (ec717.c) (ec717a.c) (ec

21、718.c) 二、外部變量使用的幾種情況 產(chǎn)生隨機數(shù) (ec719.c) 在不同的編譯單位內(nèi)用extern說明符來擴展全局變量的作用域 同一編譯單位是在同一C的源程序中。不同的編譯單位是在兩個以上不同的C源程序內(nèi)。通過頭文件來進行互相訪問的。 三、外部變量的副作用 主函數(shù)和子函數(shù)用同名外部變量產(chǎn)生的錯誤。(ec720.c) 編譯預(yù)處理 “編譯預(yù)處理”就是在C編譯程序?qū)源程序進行編譯前,由編譯預(yù)處理程序?qū)@些編譯預(yù)處理命令處理的過程。 C語言的預(yù)處理均以 #include #define開頭不加分號。 編譯預(yù)處理是C語言的一個重要特點,它能改善程序設(shè)計環(huán)境,有助于編寫易移植、易處理的程序,也是模塊化程序設(shè)計的一個重要工具。 4.3.1 宏替換 4.3.2 文件包含編譯預(yù)處理(一) 宏替換是用預(yù)處理命令 #define指定的預(yù)處理。 一、 不帶參數(shù)的宏: #define 宏名 替換文本 #define SIZE 1000 這種使用在前面的程序中已用到,如果替換文本還用到已定義的宏時,分析時要注意。 替換文本中包含已定義過的宏: #define PI 3.14 #define ADDPI (PI+1) #define TWO_ADDPI (2*ADDPI) 如果有表達式:x=TWO_ADDPI/2,則替換后為:x=(2*(3.14+1)/2

溫馨提示

  • 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

提交評論