譚浩強(qiáng)高等教育出版社第3版_第4章模塊化程序設(shè)計_第1頁
譚浩強(qiáng)高等教育出版社第3版_第4章模塊化程序設(shè)計_第2頁
譚浩強(qiáng)高等教育出版社第3版_第4章模塊化程序設(shè)計_第3頁
譚浩強(qiáng)高等教育出版社第3版_第4章模塊化程序設(shè)計_第4頁
譚浩強(qiáng)高等教育出版社第3版_第4章模塊化程序設(shè)計_第5頁
已閱讀5頁,還剩140頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第四章第四章 模塊化程序設(shè)計模塊化程序設(shè)計主講人:韓維良2022年3月8日C語言程序設(shè)計C語言支持模塊化程序設(shè)計的功能:(1) C語言用函數(shù)組織程序: 一個程序由一個或多個源程序文件組成; 每一個源程序文件就是一個程序模塊; 每一個程序模塊由一個或多個函數(shù)組成。程序設(shè)計的任務(wù)就是設(shè)計一個個函數(shù),并且確定它們之間的調(diào)用關(guān)系。在設(shè)計函數(shù)時要使每個函數(shù)都具有各自獨(dú)立的功能和明顯的界面。 C語言程序設(shè)計 (2) 通過給變量定義不同的存儲類別,控制模塊內(nèi)部及外部的信息交換。 (3) 具有編譯預(yù)處理功能,為程序的調(diào)試、移植提供了方便,也支持了模塊化程序設(shè)計。C語言程序設(shè)計第一節(jié)第一節(jié) 函函 數(shù)數(shù)一、設(shè)計一

2、、設(shè)計C C語言程序就是設(shè)計函數(shù)語言程序就是設(shè)計函數(shù)用C語言設(shè)計程序,任務(wù)只有一種,就是編寫函數(shù),至少也要編寫一個main函數(shù)。執(zhí)行C程序也就是執(zhí)行相應(yīng)的main函數(shù)。即從main函數(shù)的第一個前花括號開始,依次執(zhí)行后面的語句,直到最后的后花括號為止。C語言程序設(shè)計模塊化程序設(shè)計有一個原則模塊化程序設(shè)計有一個原則:就是每個模塊的規(guī)模一般不能太大(一般要控制在4060行之間),以便于閱讀,便于檢查其中的錯誤。在C語言中,減少主函數(shù)規(guī)模的一項(xiàng)基本措施就是通過調(diào)用其它函數(shù)來實(shí)現(xiàn)主函數(shù)需要的一些功能。一般一般C C語言程序的執(zhí)行過程語言程序的執(zhí)行過程程序結(jié)構(gòu)圖程序結(jié)構(gòu)圖大學(xué)信息管理系統(tǒng)C語言程序設(shè)計二、

3、函數(shù)結(jié)構(gòu)二、函數(shù)結(jié)構(gòu)一個C語言函數(shù)的結(jié)構(gòu)形式如下:函數(shù)頭函數(shù)體C語言程序設(shè)計1. 函數(shù)頭函數(shù)頭結(jié)構(gòu): 函數(shù)類型函數(shù)類型 函數(shù)名(形式參數(shù)表列)函數(shù)名(形式參數(shù)表列)一個函數(shù)的函數(shù)頭的結(jié)構(gòu)如下:(1)函數(shù)類型:指定函數(shù)值的類型,即函數(shù)返回值的類型。(2)函數(shù)名:必須采用合法的用戶標(biāo)識符。(3)圓括號:是“函數(shù)運(yùn)算符”,表示進(jìn)行函數(shù)運(yùn)算,函數(shù)運(yùn)算符具有很高的運(yùn)算優(yōu)先級別。C語言程序設(shè)計(4)形式參數(shù)表:由寫在一對圓括號(函數(shù)運(yùn)算符)中的一系列參數(shù)組成。每一個參數(shù)由一個類型符和一個參數(shù)名組成。參數(shù)名是合法的標(biāo)識符。函數(shù)可以沒有參數(shù),這時在函數(shù)運(yùn)算符內(nèi)寫一個“void”,也可以空白,但小括號不能省略。

4、C語言程序設(shè)計2. 函數(shù)體 函數(shù)體由一些語句組成。主要是三種類型的語句:聲明語句聲明語句:聲明在函數(shù)中要使用的變量等程序?qū)嶓w??蓤?zhí)行語句可執(zhí)行語句:用來實(shí)現(xiàn)函數(shù)的功能,包括若干流程控制 語句和表達(dá)式語句。returnreturn語句語句:停止本函數(shù)的執(zhí)行,使流程返回到調(diào)用處。C語言程序設(shè)計編譯器將函數(shù)分為三類進(jìn)行處理:純粹計算型函數(shù),如sqrt()和sin()。將返回一個計算結(jié)果。完成一項(xiàng)具體工作,返回完成的成敗。如printf()執(zhí)行成功時,返回顯示的字節(jié)數(shù);失敗時,返回一個負(fù)整數(shù)。函數(shù)不產(chǎn)生返回值,其類型應(yīng)定義為void。C99規(guī)定,對于非void類型的函數(shù),必須使用有返回值的return

5、語句。int absolutevalue (int x) /* 絕對值函數(shù) */ return (x=0?x:-x); void spc (int n) /* n空格函數(shù) */ int i;for (i=0; in;i+) printf ();return; /* 可以不要return語句 */ float y(float x) if (x10)return (2*n+3);elsereturn; C語言程序設(shè)計3. 函數(shù)中變量的作用域 作用域作用域指的是一個程序段中的變量的作用范圍,在一個函數(shù)中定義的變量只在本函數(shù)中有效,在其它函數(shù)中不能使用這個變量。因此說,該變量的作用域是它所在的函數(shù)(從

6、定義該變量的行開始到函數(shù)末尾)。即使在不同的函數(shù)中定義了同名的變量,它們也是指不同的變量。#include int func(int x) x=5;return x+3;int main(void)printf(x=%dn,x);return 0;C語言程序設(shè)計 4. 空函數(shù)空函數(shù)是一個不產(chǎn)生任何有效操作的函數(shù),但它卻是一個合法的C函數(shù)。例如函數(shù)void null(void) 就是一個空函數(shù)。空函數(shù)多使用在模塊化程序的設(shè)計或測試中。有一些函數(shù)還未編寫,可用空函數(shù)進(jìn)行調(diào)試,這樣就可以調(diào)試程序的其它部分,等以后再逐步補(bǔ)上。C語言程序設(shè)計三、函數(shù)定義與函數(shù)聲明三、函數(shù)定義與函數(shù)聲明1、函數(shù)定義函數(shù)定

7、義是按照C語言的語法規(guī)則引入新的函數(shù),并提供如下信息:函數(shù)的返回值類型(如果有);參數(shù)的個數(shù)及類型和名稱;調(diào)用函數(shù)時要執(zhí)行的代碼;函數(shù)的有效性(不能嵌套定義)。C語言程序設(shè)計函數(shù)的定義函數(shù)的定義類型說明符類型說明符 函數(shù)名函數(shù)名( (類型名類型名 形式參數(shù)形式參數(shù)1 , 1 , 類型名類型名 形形式參數(shù)式參數(shù)2 , ) /2 , ) /* * 函數(shù)的首部函數(shù)的首部 * */ / 說明部分說明部分 / /* * 函數(shù)體函數(shù)體 * */ / 語句部分語句部分 C語言程序設(shè)計其中類型說明符和函數(shù)名部分共稱為函數(shù)頭函數(shù)頭。類型說明符類型說明符即本函數(shù)的類型,實(shí)為函數(shù)返回值的類型。函數(shù)名函數(shù)名是由用戶定

8、義的標(biāo)識符,函數(shù)名后有一個括號,其內(nèi)容為形參表。在形參表中給出的參數(shù)稱為形式參數(shù)形式參數(shù),即形式參數(shù)變量的定義,各參數(shù)定義之間用逗號間隔各參數(shù)定義之間用逗號間隔。在進(jìn)行函數(shù)調(diào)用時,主調(diào)函數(shù)將賦予這些形式參數(shù)實(shí)際的值。當(dāng)形參表中無參數(shù)時,括號不可少。 中的內(nèi)容稱為函數(shù)體函數(shù)體。在函數(shù)體中也有類型說明, 這是對函數(shù)體內(nèi)部所用到的變量的類型說明。注意:函數(shù)不能嵌套定義。 void fun1() int fun2() C語言程序設(shè)計2 2、函數(shù)的返回值及其類型、函數(shù)的返回值及其類型(1 1) returnreturn語句語句函數(shù)的返回值通過函數(shù)體內(nèi)的return語句實(shí)現(xiàn)。returnreturn 返回

9、值表達(dá)式返回值表達(dá)式 ; ;或returnreturn ( (返回值表達(dá)式返回值表達(dá)式););如果沒有返回值,格式中的左、右圓括號可以省略,即寫為:returnreturn ; ;功能:返回調(diào)用函數(shù),并將“返回值表達(dá)式”的值帶給調(diào)用函數(shù)。C語言程序設(shè)計說明:1)函數(shù)的返回值只能有一個。2)當(dāng)函數(shù)中不需要指明返回值時,可以寫成:return;也可以不寫。函數(shù)運(yùn)行到右花括號自然結(jié)束。3)一個函數(shù)體內(nèi)可以有多個返回語句,不論執(zhí)行到哪一個,函數(shù)都結(jié)束,回到主調(diào)函數(shù)。4)當(dāng)函數(shù)沒有指明返回值,即return; 或沒有返回語句時,函數(shù)執(zhí)行后實(shí)際上不是沒有返回值,而是返回一個不確定的值,有可能給程序帶來某種

10、意外的影響。C語言程序設(shè)計(2)函數(shù)返回值的類型函數(shù)定義時的類型就是函數(shù)返回值的類型。從理論上,C語言要求函數(shù)定義的類型應(yīng)當(dāng)與返回語句中表達(dá)式的類型保持一致。當(dāng)兩者不一致時,系統(tǒng)自動進(jìn)行轉(zhuǎn)換,將函數(shù)返回語句中表達(dá)式的類型轉(zhuǎn)換為函數(shù)定義時的類型。如果定義函數(shù)缺省函數(shù)類型,則如果定義函數(shù)缺省函數(shù)類型,則系統(tǒng)一律按系統(tǒng)一律按intint型處理型處理。C語言程序設(shè)計 3、函數(shù)聲明函數(shù)聲明是對所用到的函數(shù)的特征進(jìn)行必要的聲明。編譯系統(tǒng)以函數(shù)聲明為檢測依據(jù)編譯系統(tǒng)以函數(shù)聲明為檢測依據(jù):檢測形參與實(shí)參類型是否一致,返回值的類型是否正確,以保證調(diào)用表達(dá)式與函數(shù)之間的參數(shù)正確傳遞。聲明語句提供的必要信息包括聲明

11、語句提供的必要信息包括:函數(shù)名,函數(shù)的類型,函數(shù)參數(shù)的個數(shù)、排列次序以及每個參數(shù)的類型。C語言程序設(shè)計函數(shù)的定義可以按任意的次序,但在主調(diào)函數(shù)中,要調(diào)用另一個函數(shù),則需要對被調(diào)函數(shù)先做聲明(或者說明)。所謂聲明所謂聲明,就是把函數(shù)的類型、函數(shù)的名稱、函數(shù)形參的類型及個數(shù)、順序通知編譯系統(tǒng),便于在調(diào)用時進(jìn)行檢查。函數(shù)聲明的一般形式: 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( (參數(shù)類型參數(shù)類型1 , 1 , 參數(shù)類型參數(shù)類型2) ;2) ;或 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( (參數(shù)類型參數(shù)類型1 1 參數(shù)名參數(shù)名1 , 1 , 參數(shù)類型參數(shù)類型2 2 參數(shù)名參數(shù)名2) ;2) ;C語言程序設(shè)計說明:(

12、1)如果被調(diào)函數(shù)的返回值為int類型,則不管被調(diào)函數(shù)位置如何均不需要在主調(diào)函數(shù)中說明。(2) 如果被調(diào)用函數(shù)的聲明放在源文件的開頭,則該聲明對整個源文件都有效。(3) 如果被調(diào)用函數(shù)的聲明是在調(diào)用函數(shù)定義的內(nèi)部,則該聲明僅對該調(diào)用函數(shù)有效。 C語言程序設(shè)計(4) 在函數(shù)調(diào)用中,有下面幾種情況可以省略聲明:a. 如果調(diào)用函數(shù)和被調(diào)用函數(shù)是在同一個源文件中,而且被調(diào)用函數(shù)的定義是在調(diào)用函數(shù)之前。b. 函數(shù)的返回值是整數(shù)或字符。c. 所有被調(diào)用函數(shù)的聲明都是在源文件開頭。d. 如果被調(diào)用函數(shù)不是在源文件開頭,而是在源文件中間且在所有函數(shù)之外某處被聲明時,則在被聲明之后引用它時,不必再聲明,但在被聲明

13、之前引用它時,需要對其進(jìn)行聲明。(5) 如果調(diào)用函數(shù)和被調(diào)用函數(shù)的定義是在同一源文件中,應(yīng)該先說明或定義被調(diào)用函數(shù)。設(shè)有一函數(shù)的定義為:double func (double a, int b, char c)/* 函數(shù)體*/與之相應(yīng)的函數(shù)聲明應(yīng)為:double func (double x, int y, char z); /* 注意末尾的分號 */3333C語言程序設(shè)計例求二實(shí)數(shù)之和main ( ) float add(float,float); float a, b, c; scanf(%f%f,&a, &b); c=add(a, b); /*函數(shù)表達(dá)式調(diào)用形式*/ printf (su

14、m= %f;c);float add( float x, float y) float z; z=x+y; return z;說明:調(diào)用過程中參數(shù)的對應(yīng)關(guān)系。C語言程序設(shè)計例 定義一個求兩個整數(shù)中極大值的max()函數(shù)。 /*功能:求2個整數(shù)中的較大數(shù) */*形參:2個,整型 */*返回值: 2個整數(shù)中的較大數(shù) */int max(int n1,int n2) /*函數(shù)定義 */ int z; z= n1 n2 ? n1 : n2; return (z);C語言程序設(shè)計void main( void ) int max(int n1, int n2); /*對被調(diào)函數(shù)說明*/ int num1

15、,num2; printf(input two numbers: ); scanf(%d%d, &num1, &num2); printf(max=%dn, max(num1, num2);C語言程序設(shè)計四、虛實(shí)結(jié)合與傳值調(diào)用四、虛實(shí)結(jié)合與傳值調(diào)用一個函數(shù)中的函數(shù)體,只有在該函數(shù)被調(diào)用時才會執(zhí)行。在函數(shù)被調(diào)用時進(jìn)行如下兩個操作:將函數(shù)調(diào)用中的實(shí)際參數(shù)值傳送給函數(shù)定義中的形式參數(shù);將流程從調(diào)用處轉(zhuǎn)到被調(diào)用函數(shù)的開頭,開始執(zhí)行函數(shù)體中的代碼。C語言程序設(shè)計1 1、函數(shù)調(diào)用的一般形式、函數(shù)調(diào)用的一般形式格式: 函數(shù)名(實(shí)參表)函數(shù)按名稱調(diào)用。如果是調(diào)用無參函數(shù),則實(shí)參表可以沒有,但括號不能省略。用逗

16、號分隔多個實(shí)參。實(shí)參與形參的個數(shù)應(yīng)相等,類型應(yīng)一致。實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。 調(diào)用時,實(shí)參必須具有確定的值,且與形參個數(shù)相等、調(diào)用時,實(shí)參必須具有確定的值,且與形參個數(shù)相等、類型匹配。類型匹配。C語言程序設(shè)計(1 1)形參與實(shí)參)形參與實(shí)參形式參數(shù)形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名:定義函數(shù)時函數(shù)名后面括號中的變量名實(shí)際參數(shù)實(shí)際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式:調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式開參是虛的,類似于占位符,而實(shí)參是實(shí)的,具體的。形參出現(xiàn)在函數(shù)定義中,只能在該函數(shù)體內(nèi)表示欲處理的數(shù)據(jù),并沒有確定的值。發(fā)生函數(shù)調(diào)用時,調(diào)用函數(shù)把實(shí)參的值傳送給被調(diào)用函數(shù)中

17、的形參,從而實(shí)現(xiàn)調(diào)用函數(shù)向被調(diào)用函數(shù)的數(shù)據(jù)傳送。C語言程序設(shè)計(2 2)函數(shù)調(diào)用的方式)函數(shù)調(diào)用的方式按函數(shù)在程序中出現(xiàn)的位置分,有2種函數(shù)調(diào)用方式。1) 1) 函數(shù)語句函數(shù)語句函數(shù)語句的調(diào)用,是指把被調(diào)函數(shù)作為一個獨(dú)立的語句直接出現(xiàn)在主調(diào)函數(shù)中。2) 2) 函數(shù)表達(dá)式函數(shù)表達(dá)式被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)中的表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。在被調(diào)函數(shù)中,必須有一個函數(shù)返回值,返回主調(diào)函數(shù)以參加表達(dá)式的運(yùn)算。 C語言程序設(shè)計(3 3)說明)說明1)按函數(shù)名調(diào)用函數(shù)。2)實(shí)參在類型上按順序與形參一一對應(yīng)和匹配實(shí)參在類型上按順序與形參一一對應(yīng)和匹配。如果類型不匹配,C編譯程序?qū)促x值兼容的規(guī)則進(jìn)行轉(zhuǎn)

18、換。如果實(shí)參和形參的類型不賦值兼容,通常并不給出出錯信息,且程序仍然繼續(xù)執(zhí)行,只是得不到正確的結(jié)果。3)實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等。無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此,應(yīng)預(yù)先用賦值、輸入等辦法,使實(shí)參獲得確定的值。C語言程序設(shè)計4)形參變量只有在被調(diào)用時,才分配內(nèi)存單元;調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元。因此,形參只有在該函數(shù)內(nèi)有效。調(diào)用結(jié)束,返回調(diào)用函數(shù)后,則不能再使用該形參變量。5)實(shí)參對形參的數(shù)據(jù)傳送是單向的實(shí)參對形參的數(shù)據(jù)傳送是單向的,即只能把實(shí)參的值傳送給形參,而不能把形參的

19、值反向地傳送給實(shí)參。6)實(shí)參和形參占用不同的內(nèi)存單元,即使同名也互不影響。2 2、函數(shù)調(diào)用時的虛實(shí)結(jié)合、函數(shù)調(diào)用時的虛實(shí)結(jié)合參數(shù)是函數(shù)調(diào)用時進(jìn)行信息交換的載體。實(shí)參是調(diào)用函數(shù)中的變量,形參是被調(diào)函數(shù)中的變量。函數(shù)調(diào)用時實(shí)現(xiàn)了實(shí)參與形參的結(jié)合。這稱為“虛實(shí)結(jié)合”。#include float add( );int main(void)float x=1.5, y=-5.7;printf (%f+%f=%fn, x,y, add(x,y);float add (unsigned int a, unsigned int b) printf(a=%u, b=%un, a,b);return (a+b)

20、;3 3、傳值調(diào)用的虛實(shí)結(jié)合過程、傳值調(diào)用的虛實(shí)結(jié)合過程程序進(jìn)行編譯時,并不為形式參數(shù)分配存儲空間。只有在被調(diào)用時,形式參數(shù)才臨時地占有存儲空間,其過程如下:(1)調(diào)用開始,系統(tǒng)為形參開辟一個臨時存儲區(qū),形參與實(shí)參各占一個獨(dú)立的存儲空間。(2)將各實(shí)參之值傳遞給對應(yīng)形參,形參得到了實(shí)參的值。這種虛實(shí)結(jié)合方式稱為“值結(jié)合”。(3)函數(shù)返回時,臨時存儲區(qū)也被撤銷。特別注意:在C程序中實(shí)參與形參是傳值調(diào)用(call by value) 的特點(diǎn)。即實(shí)參與形參是“單向的值傳遞單向的值傳遞”即函數(shù)中對形參變量的操作不會影響到調(diào)用函數(shù)中的實(shí)參變量,即形參值不能傳回給實(shí)參。#include void swap

21、 (int x, int y);int main(void)int a=3, b=5;swap (a,b);printf (a=%d, b=%dn, a,b);return 0;void swap (int x, int y)int temp;temp=x, x=y, y=temp; /* 交換變量的值 */printf(x=%d,y=%dn,x,y);執(zhí)行結(jié)果:執(zhí)行結(jié)果:x=5,y=3a=3,b=5企圖交換變量企圖交換變量a,b的值,沒的值,沒有成功有成功五、五、函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用語言的函數(shù)定義是互相平行、獨(dú)立的函數(shù)不能嵌套定義可以嵌套調(diào)用函數(shù)調(diào)用一個函數(shù)的過程中,又可以調(diào)用另一個

22、函數(shù)。函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用的過程的過程main函數(shù)函數(shù)調(diào)用調(diào)用a函數(shù)函數(shù)結(jié)束結(jié)束a函數(shù)函數(shù)調(diào)用調(diào)用b函數(shù)函數(shù)b函數(shù)函數(shù)C語言程序設(shè)計例一個偶數(shù)為兩個素數(shù)之和。德國數(shù)學(xué)家哥德巴赫(GoLdbach)在1725年寫給歐拉(Euler)的信中寫下了以下猜想:任何不小于6的偶數(shù)都是兩個素數(shù)之和(俗稱為1+1)。如633,1257等等。 兩個多世紀(jì)過去了,這一猜想既無法證明也沒被推翻。試設(shè)計程序驗(yàn)證這一猜想是否成立。 對于一個偶數(shù),找出一個小于它的數(shù),判斷是否是素對于一個偶數(shù),找出一個小于它的數(shù),判斷是否是素數(shù)數(shù),如果是就計算該偶數(shù)與該素數(shù)的差并判斷它是否是素數(shù)。如果兩者都是素數(shù)則猜想得到驗(yàn)證。

23、問題表現(xiàn)為:任意輸入一個偶數(shù),可將其分解為兩個素數(shù)之和。5050C語言程序設(shè)計#include main()void even(int x);int a;printf(“請輸入一個偶數(shù):”);scanf(“%d”,&a);if (a%2=0) even(a); /*函數(shù)調(diào)用語句*/else printf(“所輸入的數(shù)不是偶數(shù)!n”);5151C語言程序設(shè)計void even(int x)int isprime(int a);int i;for(i=2;i=x/2;i+) if ( isprime(i) & isprime(x-i) ) printf(“%d=%d+%dn”,x,i,x-i);

24、return; C語言程序設(shè)計int isprime(int a)int i;for(i=2;i=a/2;i+) if(a%i=0) return 0;return 1; 注意兩個返回語句。C語言程序設(shè)計例輸入一個由若干個單詞組成的文本串,每個單詞之間用空格、換行符、跳格符(制表符)分隔,且分隔符可以不至一個(如連續(xù)的兩個空格),以作為輸入的結(jié)束標(biāo)志,統(tǒng)計此文本串單詞的個數(shù)? 如輸入:T This i is a a s student.分析:,所以從輸入的文本串中逐個讀取每一個字符,當(dāng)讀到每一個單詞的第一個字母時,計數(shù)器加1 。如何知道讀取到的字符是單詞的第一個字母呢?如何知道讀取到的字符是單

25、詞的第一個字母呢?如果讀取到的字符是分隔符,則不是單詞的一部分;如果讀取到的字符不是分隔符,且它的上一個字符是分隔符,則它是單詞的第一個字母,計數(shù)器加1。如果讀取到的字符不是分隔符,且它的上一個字符也不是分隔符,則它是單詞的非首字母,計數(shù)器不加1。C語言程序設(shè)計當(dāng)前讀取到的字符是否是單詞的一部分,可用一個狀態(tài)變量來表示,如果是單詞的一部分,則用1表示,反之用0表示。#include #define IN 1#define OUT 0int countword();main()int n;n=countword();printf(“單詞數(shù)為:%dn”,n);5555C語言程序設(shè)計int coun

26、tword() /*沒有形參*/int c,nw,state;state=OUT;nw=0;while(c=getchar()!=)if(c= |c=n|c=t) state=OUT;else if(state=OUT) state=IN; nw+; return(nw);六、遞歸函數(shù)六、遞歸函數(shù)一個函數(shù)可以調(diào)用另一個函數(shù)。遞歸函數(shù)一個函數(shù)自己調(diào)用自己(直接地或間接地調(diào)用自己)。前者稱為直接遞歸調(diào)用函數(shù),后者稱為間接遞歸調(diào)用函數(shù)。 1.遞歸調(diào)用次數(shù)有限 2.程序執(zhí)行有規(guī)律 3.有結(jié)束調(diào)用的條件C語言程序設(shè)計遞歸調(diào)用是指一個函數(shù)直接或間接地調(diào)用自己。這種函數(shù)稱為遞歸函數(shù)。自己調(diào)用自己自己調(diào)用自己

27、,即要解決一個問題,轉(zhuǎn)化為一個用同樣的方法解決的新問題,只是參數(shù)在不斷地遞增或者遞減。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身。 對于一些特定的問題,用遞歸算法來解決,可以簡化問題的復(fù)雜程度。3/8/2022583/8/202259C語言程序設(shè)計例:用遞歸調(diào)用求n!。要用遞歸法解決此問題,必須明確兩個問題:、遞歸算法n!=n*(n-1)!(n-1)!=(n-1)*(n-2)!;求n的階乘的問題,轉(zhuǎn)化為用同樣的方法求(n-1)的階乘。如:4!4*3! 3!3*2!如果編寫成一個函數(shù),則調(diào)用如下:f(n)=n*f(n-1);不斷地自己調(diào)用自己。C語言程序設(shè)計、遞歸終結(jié)條件遞

28、歸到一定的程度后,必須終止。如求階乘時,當(dāng)求到1!時,必須停止遞歸。f(1)=1這一條是必須的,否則將會沒完沒了的進(jìn)行下去。通常用條件判斷, 滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。C語言程序設(shè)計例如有函數(shù)f如下:int f(int x) z=f(x1); return z;上頁中的函數(shù)是一個遞歸函數(shù)。 但是運(yùn)行該函數(shù)將無休止地調(diào)用其自身,這當(dāng)然是不正確的。為了防止遞歸調(diào)用無終止地進(jìn)行, 必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。C語言程序設(shè)計例 用遞歸法計算n!。#include long f(int n) long y; if(n1) y=n*f(n-1); else y=1; return

29、(y);6464C語言程序設(shè)計main() int n; long y; printf(“input a inteager number:”); scanf(%d,&n); y=f(n); printf(%d!=%ldn,n,y);程序運(yùn)行情況如下:input a inteager number: 5 5!=120C語言程序設(shè)計程序說明:程序中給出的函數(shù)f是一個遞歸函數(shù)。主函數(shù)調(diào)用f 后即進(jìn)入函數(shù)f執(zhí)行,如果n0,n=0或n=1時都將結(jié)束函數(shù)的執(zhí)行,否則就遞歸調(diào)用f函數(shù)自身。由于每次遞歸調(diào)用的實(shí)參為n-1,即把n-1 的值賦予形參n,最后當(dāng)n-1的值為1時再作遞歸調(diào)用,形參n的值也為1,將使遞

30、歸終止。然后可逐層退回。C語言程序設(shè)計如求4!的過程分解如下:f(4)=4*f(3)f(3)=3*f(2)f(2)=2*f(1)f(1)=1f(4)=4*6=24f(3)=3*2=6f(2)=2*1=2C語言程序設(shè)計例:用遞歸法求菲波那契數(shù)列第40項(xiàng)的值,該數(shù)列為:1,1,2,3,5,8,13,21,規(guī)律:每一項(xiàng)為其前兩項(xiàng)的和。遞歸算法如下:fib(n)=fib(n-1)+fib(n-2);遞歸的終結(jié)條件如下:fib(1)=1;fib(2)=1;C語言程序設(shè)計#include main()int n;long fib(int); /*第40項(xiàng)的值很大*/printf(“請輸入項(xiàng)數(shù):”);sca

31、nf(“%d”,&n);printf(“第%d項(xiàng)的值為:%ldn”,n,fib(n);6969C語言程序設(shè)計long fib(int n)long result;if(n=1|n=2) result=1;else result=fib(n-1)+fib(n-2);return result;第二節(jié)第二節(jié) 變量的存儲屬性變量的存儲屬性變量是對程序中數(shù)據(jù)存儲的抽象。C語言程序中變量都有類型,數(shù)據(jù)類型是變量的運(yùn)算屬性的抽象,決定了該變量的取值范圍和可以施加的運(yùn)算種類。除此之外,變量還有一些屬性,例如:一個變量在程序的哪個范圍內(nèi)是可以使用的變量的變量的可用域可用域; 它什么時候生成以及什么時候被撤消變

32、量的生存變量的生存期期; 它存儲在什么哪種類型的存儲器中以及用什么機(jī)制進(jìn)行存儲變量的存儲區(qū)變量的存儲區(qū)。這些都稱為變量的存儲屬性。一、變量的作用域與生存期一、變量的作用域與生存期在函數(shù)中形參變量只在被調(diào)用期間才分配內(nèi)存單元,調(diào)用結(jié)束立即釋放。形參變量只有在函數(shù)內(nèi)才是有效的,離開該函數(shù)就不能再使用了。如:貨幣的使用范圍,校園卡的使用范圍。1. 1. 局部變量和全局變量局部變量和全局變量變量的可用域是指一個變量在程序的哪個域內(nèi)才是可以被識別的,也稱為可見(或可用)的。變量可分為兩種:全局可用全局可用全局變量全局變量局部可用局部可用局部變量局部變量。C語言程序設(shè)計局部變量局部變量:在一個函數(shù)在一個函

33、數(shù)或者復(fù)合語句或者復(fù)合語句( (如函數(shù)體、循環(huán)如函數(shù)體、循環(huán)體體) )內(nèi)部內(nèi)部定義定義的變量是的變量是局部變量局部變量,它只在該函數(shù)它只在該函數(shù)或者復(fù)合語或者復(fù)合語句句范圍內(nèi)有效。范圍內(nèi)有效。而在其它函數(shù)內(nèi)不能使用。而在其它函數(shù)內(nèi)不能使用。只有在包含變量定義的函數(shù)內(nèi)部,才能使用被定義的變量,在此函數(shù)之外就不能使用這些變量了。又稱為內(nèi)部變量。例如:int f1(int a) /*函數(shù)f1*/ int b,c; /*a,b,c作用域:僅限于函數(shù)f1()中*/C語言程序設(shè)計int f2(int x) /*函數(shù)f2*/ int y,z; /*x,y,z作用域:僅限于函數(shù)f2()中*/ main() i

34、nt m,n; /*m,n作用域:僅限于函數(shù)main()中*/由于局部變量只在一個局部范圍中使用,因此在不同的函數(shù)中可以定義同名的局部變量,它們互不干擾,各自分配不同的獨(dú)立存貯單元。這種特性便于進(jìn)行模塊化設(shè)計,不同的模塊由不同的程序員設(shè)計,各模塊中使用的變量名由用戶自己確定,即便相同也不會彼此影響。7575C語言程序設(shè)計#include main() void fun1(); void fun2(); int x=1; printf(“x=%dn”,x); int x=3; printf(“x=%dn”,x); printf(“x=%dn”,x); fun1(); printf(“x=%dn”

35、,x); fun2(); printf(“x=%dn”,x); fun1();C語言程序設(shè)計fun1() int x=5; printf(“x=%dn”,x); fun2() int x=7; printf(“x=%dn”,x); 說明:四個X分別分配了不同的存貯單元。同一函數(shù)的兩次調(diào)用分配了不同的單元。b b的作用域的作用域C語言程序設(shè)計全局變量全局變量:也稱為外部變量,是在函數(shù)外部定義的變量,作用域?yàn)閺亩x全局變量位置開始到源程序結(jié)束,是多個是多個函數(shù)間進(jìn)行數(shù)據(jù)傳遞的一種手段函數(shù)間進(jìn)行數(shù)據(jù)傳遞的一種手段。全局變量可以在其作用范圍內(nèi),由各函數(shù)所共用。 在函數(shù)中使用全局變量,一般應(yīng)作全局變量說

36、明。 只有在函數(shù)內(nèi)經(jīng)過說明的全局變量才能使用。全局變量的說明符為extern。 但在一個函數(shù)之前定義的全局變量,在該函數(shù)內(nèi)使用可不再加以說明。C語言程序設(shè)計例如:int a,b; /*外部變量*/void f1() /*函數(shù)f1*/float x,y; /*外部變量*/ int f2() /*函數(shù)f2*/C語言程序設(shè)計main() /*主函數(shù)*/ /*全局變量x,y作用域 全局變量a,b作用域*/從上例可以看出a、b、x、y 都是在函數(shù)外部定義的外部變量,都是全局變量。但x,y 定義在函數(shù)f1之后,而在f1內(nèi)又無對x,y的說明,所以它們在f1內(nèi)無效。 a,b定義在源程序最前面,因此在f1,f2

37、及main內(nèi)不加說明也可使用。8181C語言程序設(shè)計#include int a=3,b=5;main() void fun(); printf(“a=%d,b=%dn”,a,b); fun(); printf(“a=%d,b=%dn”,a,b); void fun() int c; c=a;a=b;b=c; printf(“a=%d,b=%dn”,a,b); C語言程序設(shè)計【例】輸入長方體的長寬高l,w,h。求體積及三個面x*y,x*z,y*z的面積。int s1,s2,s3;int vs( int a,int b,int c)int v;v=a*b*c;s1=a*b;s2=b*c;s3=a

38、*c;return v;C語言程序設(shè)計main()int v,l,w,h;printf(ninput length,width and height: );scanf(%d%d%d,&l,&w,&h);v=vs(l,w,h);printf(v=%d s1=%d s2=%d s3=%dn,v,s1,s2,s3);程序運(yùn)行結(jié)果如下:input length,width and height:4 5 6 v=120 s1=20 s2=30 s3=24C語言程序設(shè)計程序說明:本程序中定義了三個外部變量s1,s2,s3,用來存放三個面積,其作用域?yàn)檎麄€程序。函數(shù)vs用來求正方體體積和三個面積,函數(shù)的返回

39、值為體積v。由主函數(shù)完成長寬高的輸入及結(jié)果輸出。由于語言規(guī)定函數(shù)返回值只有一個,當(dāng)需要增加函數(shù)的返回數(shù)據(jù)時,用外部變量是一種很好的方式。本例中,如不使用外部變量,在主函數(shù)中就不可能取得v,s1,s2,s3四個值。而采用了外部變量,在函數(shù)vs中求得的s1,s2,s3值在main中仍然有效。因此外部變量是實(shí)現(xiàn)函數(shù)之間數(shù)據(jù)傳輸?shù)挠行侄?。C語言程序設(shè)計當(dāng)在函數(shù)外定義了一個全局變量后,定義點(diǎn)之后的函數(shù)都可以使用該變量.當(dāng)全局變量的值在一個函數(shù)中改變后,另一個函數(shù)使用的就是改變后的值.從定義開始到程序結(jié)束,全局變量自始至終占用存儲空間.全局變量的使用使函數(shù)間的聯(lián)系加強(qiáng),與程序設(shè)計”低耦合”的原則相違背,

40、所以很少使用。例同名局部變量例同名局部變量#include int main(void) int a=3; printf(a1=%d,a); int a=5; printf(a2=%d,a); return 0;例演示全局變量例演示全局變量#include void a() int a=1; printf(a1=%dn,a); printf(x1=%dn,x);int x=3; * 定義外部變量定義外部變量 */void b() printf(x2=%dn,x);int main(void) a(); b(); printf(x3=%dn,x); return 0;例演示全局變量與局部變量同名

41、例演示全局變量與局部變量同名#include int x=3; /* 定義外部變量定義外部變量 */int main(void) int x=5; printf(x=%dn,x); return 0;2. 2. 動態(tài)變量與靜態(tài)變量動態(tài)變量與靜態(tài)變量運(yùn)行中的程序,在內(nèi)存中被分成代碼區(qū)和數(shù)據(jù)區(qū)兩大部分。數(shù)據(jù)區(qū)又分為靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)、自動存儲區(qū)自動存儲區(qū)和動態(tài)分配區(qū)動態(tài)分配區(qū)三部分。自動存儲區(qū)是按棧組織的存儲區(qū)。除特別聲明的外,局部變量局部變量通常被存放在棧區(qū)。這些變量在進(jìn)入所在的塊時被創(chuàng)建,所在的塊結(jié)束時被撤銷,其值不再保留。并且,變量必須有程序員顯式地變量必須有程序員顯式地進(jìn)行初始化進(jìn)行初始

42、化,否則它們的初始值是不確定的。靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)是在程序編譯時就分配的存儲區(qū)。分配在靜態(tài)存儲區(qū)的變量在程序開始執(zhí)行時被創(chuàng)建并自動初始化(數(shù)值變量被初始化為0),當(dāng)程序結(jié)束時才被撤銷。所以常稱靜態(tài)變量的生存期是永久的靜態(tài)變量的生存期是永久的。全局變量就是被分配在靜態(tài)存儲區(qū)的。/* 企圖交換兩個變量的值*/#include void swap(void);/* 說明函數(shù) */int a=3, b=5;/* 聲明外部變量 */int main(void) printf (a=%d, b=%dn,a, b); swap(); printf (a=%d, b=%dn, a,b); return 0;

43、void swap(void) int c;/* 聲明自動變量*/ c=a; a=b; b=c;/* 交換變量的值 */二、二、C C語言中變量的存儲類型語言中變量的存儲類型根據(jù)可用域和生存期,變量有4種存儲類型:局部自動類型局部自動類型,在函數(shù)內(nèi)部用標(biāo)識符auto或register聲明。靜態(tài)局部類型靜態(tài)局部類型,在函數(shù)內(nèi)部,使用static聲明。靜態(tài)全局類型靜態(tài)全局類型,在函數(shù)外部,使用static聲明,也稱靜態(tài)外部變量。全局類型全局類型,不需要標(biāo)識符聲明。在函數(shù)外部直接聲明即可,通稱外部變量。1 1、autoauto存儲類型和存儲類型和registerregister存儲類型存儲類型使用a

44、uto聲明的變量是局部變量,編譯器將其分配在自動存儲區(qū)。其格式為:auto 數(shù)據(jù)類型變量名=初值表達(dá)式,;其中方括號表示可省略,省略auto,系統(tǒng)隱含認(rèn)為此變量為auto。函數(shù)的參數(shù)(形參)也是一種自動變量。C語言程序設(shè)計自動變量的類型說明符為auto;語言規(guī)定,函數(shù)內(nèi)凡未加存儲類型說明的變量均視為函數(shù)內(nèi)凡未加存儲類型說明的變量均視為自動變量,也就是說自動變量可省去說明符自動變量,也就是說自動變量可省去說明符autoauto。在前面所學(xué)的程序中定義的變量凡未加存儲類型說明符的都是自動變量。C語言程序設(shè)計例如: int a,b,k; char c;等價于: auto int a,b,k; aut

45、o char c;C語言程序設(shè)計自動變量自動變量的的特點(diǎn):特點(diǎn):自動變量的作用域僅限于定義該變量的函數(shù)或復(fù)合語句內(nèi)。自動變量存貯在自動存貯區(qū),只有在使用它,即定義該變量的函數(shù)被調(diào)用時才給它分配存儲單元,開始它的生存期。函數(shù)調(diào)用結(jié)束,釋放存儲單元,結(jié)束生存期。因此函數(shù)調(diào)用結(jié)束之后,自動變量的值不能保留。未初始化時,自動變量的值是不確定的。未初始化時,自動變量的值是不確定的。由于自動變量的作用域和生存期都局限于定義它的函數(shù)或復(fù)合語句內(nèi),因此不同的函數(shù)中允許使用同名的變量而不會混淆。C語言程序設(shè)計寄存器變量的說明符是寄存器變量的說明符是registerregister。存放在CPU的寄存器中,使用時

46、,不需要訪問內(nèi)存,而直接從寄存器中讀寫, 這樣可提高訪問效率。特點(diǎn):加快運(yùn)算速度,函數(shù)運(yùn)行完即消失、使用有限。如定義一個頻繁使用的變量為寄存器類型:register int i;C語言程序設(shè)計2 2、靜態(tài)局部類型、靜態(tài)局部類型類型說明符:類型說明符:staticstatic,屬于靜態(tài)存儲方式;在一個函數(shù)內(nèi)部,可以用static定義一個變量,稱為靜靜態(tài)局部變量態(tài)局部變量。其作用域仍在定義它的函數(shù)內(nèi)部,但其生存期卻程序運(yùn)行期。函數(shù)調(diào)用結(jié)束后,并不釋放所占用的存貯空間(總是占用固定的存貯空間),在程序運(yùn)行期間,始終存在,但除了定義它的函數(shù)以外,別的函數(shù)不能使用。整個程序運(yùn)行結(jié)束后,才釋放占用的空間。

47、C語言程序設(shè)計靜態(tài)局部變量的特點(diǎn):靜態(tài)局部變量的特點(diǎn):(1)靜態(tài)局部變量在每次調(diào)用函數(shù)結(jié)束后能夠保留調(diào)用結(jié)束后的值不變,留待下一次調(diào)用,變量值具有繼承性繼承性。 (2)靜態(tài)局部變量只限于被本函數(shù)使用,不能被其他函數(shù)使用 (3)靜態(tài)局部變量屬于靜態(tài)存儲類別,在整個程序運(yùn)行期間都不釋放;而動態(tài)存儲變量屬于動態(tài)存儲類別,函數(shù)調(diào)用結(jié)束即釋放,再次調(diào)用又將重新分配空間。(4)在定義靜態(tài)局部變量時,如果不賦初值不賦初值,系統(tǒng)自動賦值為0或空字符(對字符型變量)。 9999C語言程序設(shè)計#include func() static int b=10; b=b+2; return b;main() int i

48、; for(i=1;i4;i+) printf(“%d,b=%dn”,i,func();#include void increment(void);int main(void)increment ( );increment ( );increment ( );return 0;void increment(void)int x=0; /*auto*/x+;printf (%dn,x);#include void increment(void);int main(void)increment ( );increment ( );increment ( );return 0;void increm

49、ent(void)static int x=0; /*使用了static說明符 */x+;printf (%dn,x);3 3、靜態(tài)全局類型、靜態(tài)全局類型在多文件程序中,用用staticstatic聲明外部變量聲明外部變量,使該外部,使該外部變量的作用域僅限于所在的文件變量的作用域僅限于所在的文件,而不用而不用staticstatic聲明的外聲明的外部變量的作用域?yàn)檎麄€程序。部變量的作用域?yàn)檎麄€程序。例如:某個程序中要用到大量函數(shù),而有幾個函數(shù)需要共同使用幾個全局變量時,可以將這幾個函數(shù)組織在一個文件中,而將這幾個全局變量用static定義為靜態(tài)的,以保證它們不會與其他文件中的變量發(fā)生名字沖突

50、,保證文件的獨(dú)立性。static unsigned int r;int random(void) r=(r*123+59)%65536; return(r); /*產(chǎn)生r的初值*/unsigned randomstart(unsigned int seed)r=seed; #include int main(void) int i, n; printf (please enter the seed:); scanf(%d, &n); randomstart(n); for(i=1; i10; i+) printf(%u , random(); return 0; C語言程序設(shè)計4 4、外部變量

51、的定義與聲明、外部變量的定義與聲明外部變量的類型說明符為外部變量的類型說明符為externextern。外部變量的特點(diǎn):外部變量的特點(diǎn):(1) 外部變量和全局變量是對同一類變量的兩種不同角度的提法。全局變量是從它的作用域提出的,外部變量從它的存儲方式提出的,表示了它的生存期。(2)當(dāng)一個源程序由若干個源文件組成時, 在一個源文件中定義的外部變量在其它的源文件中也有效。一個變量被定義點(diǎn)之前的函數(shù)使用或者被別的文件中的一個變量被定義點(diǎn)之前的函數(shù)使用或者被別的文件中的函數(shù)使用時,應(yīng)用函數(shù)使用時,應(yīng)用externextern聲明。聲明。對外部變量(靜態(tài)全局變量除外),除可以定義一次外,還可以多次進(jìn)行聲

52、明(引用性聲明)。(1)通過聲明將外部變量的作用域在本文件范圍內(nèi)擴(kuò)充向前引用通常,一個外部變量的作用域是從其定義點(diǎn)到本文件末尾。對于位于定義點(diǎn)之前的函數(shù),可以用extern聲明使變量的作用域擴(kuò)充到需要用到它的函數(shù)。#include void gx(), gy ();void main(void) extern int x,y; /*聲明聲明x,y是外部變量,作用域擴(kuò)充至此是外部變量,作用域擴(kuò)充至此*/ printf (1:x=%dt y=%dn, x, y); y=246; gx(); gy(); void gx() extern int x, y; /*聲明聲明x,y是外部變量是外部變量*/

53、 x=135; printf(2:x=%dt y=%dn, x, y);int x, y; /*定義定義x,y是外部變量是外部變量 */void gy() printf(3:x=%dt y=%dn, x, y);(2)利用聲明語句將作用域擴(kuò)大到其他文件建立對象的外部鏈接假設(shè)一個程序由兩個以上的文件組成。當(dāng)一個全局變量定義在文件file1中時,在另外的文件中使用extern聲明,可以通知編譯系統(tǒng)一個信息:“此變量到外部去找”?;蛘哒f在鏈接時,告訴鏈接器:“到別的文件中找這個變量的定義”。* file1.c */#include int x, y; char ch;void main(void)

54、x=12; y=24; f1(); printf(%cn, ch);* file2.c */extern int x,y; extern char ch; f1( ) printf (%d, %dn, x,y); ch=a; (3) 全局變量的副作用如果沒有外部變量,函數(shù)只能通過參數(shù)與外界發(fā)生數(shù)據(jù)聯(lián)系,有了外部變量以后,增加了一條與外界傳遞數(shù)據(jù)的渠道,但也會產(chǎn)生一些副作用. /* 例能否輸出5行 *?*/#include int i; void main(void) void prt(); for(i=0; i5; i+) /* 輸出5行 */ prt();void prt() /* 輸出一行

55、5個* */ for(i=0; i5; i+) printf (%c, *); printf(n);三、通過const聲明將變量存儲在只讀區(qū)C語言可以開辟一個只讀區(qū)。數(shù)據(jù)是以變量形式存儲的,只讀的,不可修改。也就是把變量定義為只讀變量。定義只讀變量的方法是在聲明變量時使用修飾符const。格式為:const 數(shù)據(jù)類型 變量1=初始表達(dá)式1,變量2=初始表達(dá)式2,如:const double X=3.14159265;C語言程序設(shè)計第三節(jié)第三節(jié) 模塊的編譯與鏈接模塊的編譯與鏈接一、分別編譯一、分別編譯 C語言是一種支持模塊化程序設(shè)計的語言,它允許將一個大型程序分成多個程序文件分別進(jìn)行編譯。這樣的

56、好處在于:當(dāng)程序的一個局部有錯誤或?qū)植窟M(jìn)行了修改時,可以只重新編譯該局部,不需要將整個程序都重新編譯。 某些經(jīng)過考驗(yàn)的函數(shù)的目標(biāo)代碼可以添加為的庫函數(shù),供其他程序中使用。C語言程序設(shè)計二、用項(xiàng)目管理多文件程序的編譯與鏈接過程二、用項(xiàng)目管理多文件程序的編譯與鏈接過程多文件程序的編譯、鏈接過程是比較麻煩的。為了方便用戶進(jìn)行多文件程序的編譯、鏈接,各種程序開發(fā)軟件都提供了用項(xiàng)目(project)管理多文件程序的編譯和鏈接過程。其使用方法因開發(fā)工具而異,請參考有關(guān)手冊。C語言程序設(shè)計三、頭文件三、頭文件用戶顯式地保證程序一致性的基本方法是保持聲明的一致性。保持聲明一致性的簡單辦法是提供一個頭文件,讓

57、頭文件中的信息作為各模塊之間的接口信息,有利于提供可重用的模塊。使用頭文件將把程序分為程序頭和程序體兩部分。好的頭文件應(yīng)包含如下一些內(nèi)容:類型定義如定義一個枚舉類型:enum color RED,BLUE,GREEN,YELLOW;函數(shù)聲明如: extern int strlen const char*;嵌入函數(shù)聲明如:inline char get() return *p+;數(shù)據(jù)聲明如:extern int a;常量定義如: const float pi=3.141593;包含指令如: #include 宏定義如:#define case break; case注釋好的頭文件不能包含以下內(nèi)容

58、:一般函數(shù)定義數(shù)據(jù)定義 如: int a;常量聚集定義 如: const tbl=/* */;用戶頭文件是由用戶自己定義的頭文件。系統(tǒng)將用雙引號方式進(jìn)行搜索。#include 頭文件名.h程序員可以用它們建立各文件之間的信息窗口。應(yīng)當(dāng)注意,修改了頭文件時,所有涉及該頭文件的程序都應(yīng)重新編譯,所以在編制頭文件時應(yīng)盡量考慮周全。當(dāng)使用很多頭文件時,常有重復(fù)嵌入的情形發(fā)生,在這種情形下,應(yīng)防止標(biāo)識符重復(fù)定義的錯誤。為避免錯誤,應(yīng)使用條件編譯來測試有無重復(fù)定義。C語言程序設(shè)計第四節(jié)第四節(jié) 宏定義與宏替換宏定義與宏替換編譯預(yù)處理是以“#”開頭的一些命令,它通知編譯系統(tǒng):在進(jìn)行正式編譯前應(yīng)當(dāng)先進(jìn)行一些前期

59、工作(即編譯預(yù)處理)。目前,C語言的編譯預(yù)處理功能主要有如下一些:(1)文件包含,使用命令:#include。(2)宏定義,使用命令:#define、#undef。(3)條件編譯,使用命令:#if、#ifdef、#ifndef、#else、#endif、#elif、defind。(4)提供行號信息,使用命令:#line。(5)編譯雜注,使用命令:#progma。(6)錯誤信息,使用命令:#error。在這些編譯預(yù)處理中,應(yīng)用最多的就是對宏的處理。它允許程序員使用define定義并應(yīng)用宏名字書寫C語言程序,同時也指示編譯器在正式編譯前通過宏替換,使程序能按照C語言的語法進(jìn)行編譯。一、字符串宏定義

60、及其基本格式一、字符串宏定義及其基本格式define命令最簡單的應(yīng)用就是定義一個符號常量。格式為: define 宏名 字符串編譯預(yù)處理時,預(yù)處理程序?qū)殉绦蛭募性谠摵甓x之后的所有宏名,用#define命令中定義的字符串(稱為宏體)替換,這個過程稱為宏替換。符號常數(shù)的定義就是這種宏定義的一種應(yīng)用。#define PI 3.14159265#define RADIUS 2.0使用宏定義的好處是:(1) 提高了程序的可讀性。如果人們看到以下語句 return (2.0*3.1415926536*2.0); 和 return (3.1415926536*2.0*2.0);是否能很快地看出它們在計

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論