《函數(shù)與程序結(jié)構(gòu)》PPT課件.ppt
第5章 函數(shù)與程序結(jié)構(gòu),本章要點(diǎn) 1. C程序的一般結(jié)構(gòu),函數(shù)的定義方法及函數(shù)的類型和返回值。 2. 函數(shù)實(shí)參與形參的對(duì)應(yīng)關(guān)系,以及參數(shù)傳遞的方式。 3. 函數(shù)的正確調(diào)用,嵌套與遞歸調(diào)用。 4. 局部變量和全局變量的概念和使用方法。 5. 變量的存儲(chǔ)類別(自動(dòng)、靜態(tài)、寄存器、外部)、變量的作用域和生存期。 6. 宏定義及文件包含處理的方法。 本章難點(diǎn) 1. 函數(shù)參數(shù)的傳遞。 2. 函數(shù)遞歸調(diào)用的執(zhí)行過程。 3. 變量的作用域和生存期。,5.1 C程序的一般結(jié)構(gòu),5.1.1 模塊化程序設(shè)計(jì) 自頂向下,逐步細(xì)化,5.1.2 C程序的一般結(jié)構(gòu),函數(shù)是構(gòu)成C語言程序的基本功能模塊,是一段程序,它完成一項(xiàng)相對(duì)獨(dú)立的任務(wù)。 一個(gè)較大的程序一般應(yīng)分為若干個(gè)程序模塊,每一個(gè)模塊用來實(shí)現(xiàn)一個(gè)特定的功能。在c語言中,用函數(shù)來實(shí)現(xiàn)模塊的功能。一個(gè)c程序由一個(gè)主函數(shù)和若干個(gè)函數(shù)組成,由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)之間也可以相互調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。,特點(diǎn):, 一個(gè)源文件程序由一個(gè)或多個(gè)函數(shù)以及其他有關(guān)內(nèi)容(如命令行、數(shù)據(jù)定義等)組成。 一個(gè)c程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。 C程序的執(zhí)行總是從主函數(shù)開始,又從主函數(shù)結(jié)束,其他函數(shù)只有通過調(diào)用關(guān)系發(fā)生作用。 一個(gè)c程序有且僅有一個(gè)主函數(shù)main()。 所有的函數(shù)在定義時(shí)是相互獨(dú)立的,一個(gè)函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義,不過函數(shù)之間可以相互調(diào)用,但不能調(diào)用main函數(shù)。 不同源文件的組裝可以通過工程文件實(shí)現(xiàn)。,函數(shù)的分類,1. 從用戶使用的角度看,函數(shù)有兩種: (1) 標(biāo)準(zhǔn)函數(shù),即庫函數(shù) 這是由系統(tǒng)提供的,用戶不必自己定義這些函數(shù),可以直接使用它們。應(yīng)該說明,每個(gè)系統(tǒng)提供的庫函數(shù)的數(shù)量和功能不同,當(dāng)然有一些基本的函數(shù)是共同的。 (2) 用戶自己定義的函數(shù) 用以解決用戶的專門需要。 2. 從函數(shù)的形式看,函數(shù)分兩類: (1) 無參函數(shù) 在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)并不將數(shù)據(jù)傳送給被調(diào)用函數(shù),一般用來執(zhí)行指定的一組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,但一般以不帶回函數(shù)值的居多。 (2) 有參函數(shù) 在調(diào)用函數(shù)時(shí),在主調(diào)函數(shù)和被調(diào)用函數(shù)之間有參數(shù)傳遞,也就是說,主調(diào)函數(shù)可以將數(shù)據(jù)傳給被調(diào)用函數(shù)使用,被調(diào)用函數(shù)中的數(shù)據(jù)也可以帶回來供主調(diào)函數(shù)使用。,【例5.1】一個(gè)函數(shù)簡(jiǎn)單應(yīng)用的例子。 void main() void p_star(); /*說明p_star函數(shù)*/ void p_message(); /*說明p_message函數(shù)*/ p_star(); /*調(diào)用p_staar函數(shù)*/ p_message(); /*調(diào)用p_message函數(shù)*/ p_star(); /*調(diào)用p_star函數(shù)*/ void p_star() /*定義p_star函數(shù)*/ printf("*n"); void p_message() /*定義p_message函數(shù)*/ printf("Good morning!n"); ,5.2 函數(shù)的定義與調(diào)用,5.2.1 函數(shù)的定義 正如變量使用前應(yīng)先定義一樣,函數(shù)也應(yīng)該先定義后使用。函數(shù)定義后,這個(gè)函數(shù)才存在,然后才能調(diào)用它。 1. 函數(shù)定義的一般形式 (1)無參函數(shù)的定義 其定義形式如下: 類型標(biāo)識(shí)符 函數(shù)名( ) 說明部分 語句部分 說明:其中的類型標(biāo)識(shí)符用于指定函數(shù)值的類型;若函數(shù)無返回值,應(yīng)用void說明。 函數(shù)名的命名方法與標(biāo)識(shí)符相同,不能和關(guān)鍵字、庫函數(shù)名等同名 函數(shù)名后的圓括號(hào)是函數(shù)的象征,不能省略。(在函數(shù)定義時(shí),圓括號(hào)后無分號(hào)),例:void p_star( ) printf("*n"); 說明:其中的void在TC中可以省掉。 p_message( ) printf("Good morning!n"); ,(2)有參函數(shù)的定義 其定義形式為: 類型標(biāo)識(shí)符 函數(shù)名(形式參數(shù)說明表) 說明部分 語句部分 說明: 對(duì)于有參函數(shù),函數(shù)的參數(shù)是主調(diào)函數(shù)和被調(diào)用函數(shù)的數(shù)據(jù)通道。參數(shù)可分為形式參數(shù)(形參)和實(shí)際參數(shù)(實(shí)參)兩種。,例如: int max(int x,int y) /*形式參數(shù)說明*/ int z; /*函數(shù)體中的說明部分*/ z=x>y?x:y; return(z); main( ) int a=3,b=4; printf(“%d”,max(a,b); return語句的作用是將z的值作為函數(shù)值帶回到主調(diào)函數(shù)中。return后面的括弧中的值作為函數(shù)帶回的值(或稱函數(shù)返回值)。 在一個(gè)函數(shù)的函數(shù)體內(nèi),不能再定義另一個(gè)函數(shù),即函數(shù)不能嵌套定義。,形參:定義函數(shù)時(shí)的參數(shù),實(shí)參:調(diào) 用函數(shù)時(shí)的參數(shù),例編寫一個(gè)通用過程(函數(shù)或子程序),該過程可以實(shí)現(xiàn)判斷一個(gè)整數(shù)是否為素?cái)?shù)。編寫主程序調(diào)用該過程,統(tǒng)計(jì)所有三位數(shù)中素?cái)?shù)的個(gè)數(shù)。,int ss(int n) int flag,i; flag=1; for(i=2;i<=n-1;i+) if (n%i=0) flag=0; break; return flag; main() int gs,i; gs=0; for (i=100;i<=999;i+) if(ss(i) gs+; printf("gs=%d",gs); ,2. 函數(shù)的返回值,函數(shù)的數(shù)據(jù)類型就是函數(shù)返回值的類型,稱為函數(shù)類型。 (1)函數(shù)的返回值通過函數(shù)中的返回語句return將被調(diào)用函數(shù)中的一個(gè)確定的值帶回到主調(diào)函數(shù)中去。 return語句的用法如下: return(表達(dá)式); return 表達(dá)式; return; return語句的作用: 使程序控制從被調(diào)用函數(shù)返回到主調(diào)函數(shù)中,同時(shí)把返回值帶給主調(diào)函數(shù);釋放在函數(shù)的執(zhí)行過程中分配的所有內(nèi)存空間。,【例5.2】在屏幕上顯示計(jì)算結(jié)果時(shí),有時(shí)會(huì)因?yàn)轱@示的速度太快,還沒有看清楚結(jié)果,屏幕上的內(nèi)容就已經(jīng)滾出屏幕。為了解決這個(gè)問題,可以讓屏幕每顯示一定的行數(shù)后就自動(dòng)暫停一個(gè),待用戶看清屏幕后按鍵盤上的任意鍵后。屏幕會(huì)繼續(xù)顯示以后的計(jì)算結(jié)果。,#include #include /*顯示數(shù)字1到100,每顯示20行時(shí)暫停一次*/ void pause(void) /*函數(shù)定義,函數(shù)形式參數(shù)為空*/ getchar(); void main() int i,j=0; for(i=1;i<=100;i+) printf("%dn",i); if(+j=20) j=0; pause(); ,5.2.2 函數(shù)的調(diào)用,一般形式為: 函數(shù)名(實(shí)參表列); 說明: (1)調(diào)用函數(shù)時(shí),函數(shù)名稱必須與具有該功能的自定義函數(shù)名稱完全一致。 (2)實(shí)際參數(shù)表中的參數(shù)(簡(jiǎn)稱實(shí)參),可以是常數(shù)、變量或表達(dá)式。如果實(shí)參不止1個(gè),則相鄰實(shí)參之間用逗號(hào)分隔。 (3)實(shí)參的個(gè)數(shù)、類型和順序,應(yīng)該與被調(diào)用函數(shù)所要求的參數(shù)個(gè)數(shù)、類型和順序一致,才能正確地進(jìn)行數(shù)據(jù)傳遞。,(4)對(duì)實(shí)參表求值的順序并不是確定的,有的系統(tǒng)按自左至右順序求實(shí)參的值,有的系統(tǒng)則按自右至左順序。 Turbo C規(guī)定是自右至左順序求值。 main() int i=2; printf(“%d %d %d”,+i,+i,+i); 輸出為: 5 4 3 為了避免這種影響,可以用: main() int i=2,j,k,a; j=+i; k=+i; a=+i; printf(“%d %d %d”,j,k,a); ,按照函數(shù)在程序中出現(xiàn)的位置劃分,調(diào)用函數(shù)方式有以下3種:,(1)函數(shù)語句 C語言中的函數(shù)可以只進(jìn)行某些操作而不返回函數(shù)值,這時(shí)的函數(shù)調(diào)用作為一條獨(dú)立的語句。如例8.1中的 p_star( ); (2)函數(shù)表達(dá)式 函數(shù)作為表達(dá)式的一項(xiàng),出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求函數(shù)是有返回值的。例如 m=5*max(a,b); (3)函數(shù)實(shí)參 函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的。 printf("%d",max(a,b);,函數(shù)調(diào)用的執(zhí)行過程,main() int n; scanf(“%d“, ,int ss(int n) int flag,i; flag=1; for(i=2;i<=n-1;i+) if (n%i=0) flag=0; break; return flag; ,1,2,3,4,5,其中的2稱為函數(shù)調(diào)用;4稱為函數(shù)返回。,2. 對(duì)被調(diào)用函數(shù)的說明和函數(shù)原型,在調(diào)用自定義函數(shù)之前,應(yīng)對(duì)該函數(shù)(稱為被調(diào)用函數(shù))進(jìn)行說明,其般格式如下: 函數(shù)類型 函數(shù)名(數(shù)據(jù)類型1 參數(shù)名1, 數(shù)據(jù)類型2 參數(shù)名2); 語言同時(shí)又規(guī)定,在以下兩種情況下,可以省去對(duì)被調(diào)用函數(shù)的說明。 (1)函數(shù)的返回值是整型或字符型,可以不必進(jìn)行說明,系統(tǒng)對(duì)它們自動(dòng)按整型說明。但為清晰起見,建議都加以說明為好。 (2)被調(diào)用函數(shù)的函數(shù)定義出現(xiàn)在調(diào)用函數(shù)之前時(shí)。因?yàn)樵谡{(diào)用之前,編譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)的函數(shù)類型、參數(shù)個(gè)數(shù)、類型和順序。 所以,養(yǎng)成這樣的習(xí)慣:先定義子函數(shù),最后寫主函數(shù)。這樣的話,可以省掉所有的函數(shù)說明。,注意: 函數(shù)的“定義”和“說明”是兩個(gè)不同的內(nèi)容。 “定義”是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)返回值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。在一個(gè)程序中,一個(gè)函數(shù)只能被定義一次,而且是在其他任何函數(shù)之外進(jìn)行。 而 “說明”(有的書上也稱為“聲明”)則是把函數(shù)的名稱、函數(shù)返回值的類型、參數(shù)的個(gè)數(shù)、類型和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)對(duì)函數(shù)名稱正確與否、參數(shù)的類型、數(shù)量及順序是否一致等進(jìn)行對(duì)照檢查。在一個(gè)程序中,除上述可以缺省函數(shù)說明的情況外,所有調(diào)用函數(shù)都必須對(duì)被調(diào)用函數(shù)進(jìn)行說明,而且是在調(diào)用函數(shù)的函數(shù)體內(nèi)進(jìn)行。 對(duì)庫函數(shù)的調(diào)用不需要再作說明,但必須把該函數(shù)的頭文件用#include命令包含在源文件前部。,5.2.3 函數(shù)的參數(shù)傳遞,在調(diào)用函數(shù)時(shí),大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。 形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。 實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。 發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。 在c語言中,實(shí)參向形參傳送數(shù)據(jù)的方式是“值傳遞”。 值傳遞的優(yōu)點(diǎn)就在于:被調(diào)用的函數(shù)不可能改變調(diào)用函數(shù)中變量的值,而只能改變它的局部的臨時(shí)副本。這樣就可以避免被調(diào)用函數(shù)的操作對(duì)調(diào)用函數(shù)中的變量可能產(chǎn)生的副作用。,調(diào)用過程如下: (1)給形參分配內(nèi)存空間; (2)將實(shí)參a的值傳遞給形參; (3)執(zhí)行函數(shù)體。給函數(shù)體內(nèi)的變量分配存儲(chǔ)空間,執(zhí)行算法實(shí)現(xiàn)部分 函數(shù)返回的過程如下: 將返回值返回主函數(shù), 釋放函數(shù)調(diào)用過程中分配的所有內(nèi)存空間, 結(jié)束函數(shù)調(diào)用,將流程控制權(quán)交給主調(diào)函數(shù)。 舉例說明:本講義17頁的例子。,5.3 局部變量與全局變,變量的作用域 :變量有效性的范圍稱變量的作用域 。 語言中的變量,按作用域范圍可分為兩種,即局部變量和全局變量。,5.3.1 局部變量,在一個(gè)函數(shù)或復(fù)合語句內(nèi)定義的變量,稱為局部變量,局部變量也稱為內(nèi)部變量。 局部變量僅在定義它的函數(shù)或復(fù)合語句內(nèi)有效。 編譯時(shí),編譯系統(tǒng)不為局部變量分配內(nèi)存單元,而是在程序的運(yùn)行中,當(dāng)局部變量所在的函數(shù)被調(diào)用時(shí),編譯系統(tǒng)根據(jù)需要臨時(shí)分配內(nèi)存,函數(shù)調(diào)用結(jié)束,局部變量的空間被釋放。,對(duì)局部變量的說明: (1)主函數(shù)中定義的變量只能在主函數(shù)中使用,不能在其它函數(shù)中使用。 (2)形參變量是屬于被調(diào)函數(shù)的局部變量,實(shí)參變量是屬于主調(diào)函數(shù)的局部變量。 (3)允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對(duì)象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。例如,形參和實(shí)參的變量名都為n,是完全允許的。 (4)在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)。,5.3.2 全局變量,全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。它不屬于哪一個(gè)函數(shù),它屬于一個(gè)源程序文件。其作用域是整個(gè)源程序文件,可以被本文件中的所有函數(shù)共用。 在函數(shù)中使用全局變量,一般應(yīng)作全局變量說明。 但在一個(gè)函數(shù)之前定義的全局變量,在該函數(shù)內(nèi)使用可不再加以說明。,對(duì)外部變量的說明:,(1)外部變量定義必須在所有的函數(shù)之外,且只能定義一次。 (2)設(shè)全局變量的作用是增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道。由于同一文件中的所有函數(shù)都能引用全局變量的值,因此如果在一個(gè)函數(shù)中改變了全局變量的值,就能影響到其它函數(shù),相當(dāng)于各個(gè)函數(shù)間有直接的傳遞通道。 int x,y; /*定義全局變量*/ void swap( ) /*定義函數(shù)swap()*/ int t; t=x;x=y;y=t; return; void main( ) printf(“input x,y:”); scanf(“%d,%d”, ,(3)雖然外部變量可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但是又使函數(shù)要依賴這些變量,因而使得函數(shù)的獨(dú)立性降低。從模塊化程序設(shè)計(jì)的觀點(diǎn)來看這是不利的,因此在不必要時(shí)盡量不要使用全局變量。 (4)在同一源文件中,允許全局變量和局部變量同名。但在局部變量的作用域內(nèi),全局變量被“屏蔽”不起作用,即局部變量優(yōu)先。,5.4 變量的存儲(chǔ)類型,1. 自動(dòng)變量 2. 靜態(tài)變量 (1) 靜態(tài)局部變量 (2) 靜態(tài)全局變量 3. 外部變量 4. 寄存器變量,5.5 函數(shù)的嵌套與遞歸調(diào)用,5.5.1 函數(shù)的嵌套調(diào)用 C語句不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),所謂函數(shù)的嵌套調(diào)用,是指在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又調(diào)用另一個(gè)函數(shù)。,【例5.7】計(jì)算s=1k+2k+3k+Nk。,#include #define K 4 #define N 5 long f1(int n,int k) long p=n; int i; for(i=1;i<k;i+) p *= n; return (p); ,long f2 (int n,int k) long sum=0; int i; for(i=1;i<=n;i+) sum += f1(i, k); return sum; void main() printf("%dn",f2(N,K); ,5.5.2 函數(shù)的遞歸調(diào)用,1遞歸函數(shù)的概念 遞歸是在連續(xù)執(zhí)行某一個(gè)處理過程時(shí),該過程中的某一步要用到它自身的上一步(或上幾步)的結(jié)果。在一個(gè)程序中,若存在程序自己調(diào)用自己的現(xiàn)象就是構(gòu)成了遞歸。 遞歸又分為直接遞歸和間接遞歸。 一個(gè)函數(shù)在它的函數(shù)體內(nèi)直接或間接地調(diào)用它自身,稱為遞歸調(diào)用。,【例5.8】用遞歸法計(jì)算n!。,float ff(int n) float f; if(n<0) printf("n<0,input error"); else if(n=0|n=1) f=1; else f=ff(n-1)*n; return(f); void main() int n; float y; scanf("%d", ,5.7 編譯預(yù)處理,編譯預(yù)處理是指在系統(tǒng)對(duì)源程序進(jìn)行編譯之前,對(duì)程序中某些特殊的命令行的處理,預(yù)處理程序?qū)⒏鶕?jù)源代碼中的預(yù)處理命令修改程序,使用預(yù)處理功能,可以改善程序的設(shè)計(jì)環(huán)境,提高程序的通用性、可讀性、可修改性、可調(diào)試性、可移植性和方便性,易于模塊化。 預(yù)處理程序的位置在主函數(shù)之前,定義一次,可在程序中多處展開和調(diào)用,它的取舍決定于實(shí)際程序的需要。預(yù)處理程序一般包括:宏定義和宏替換、文件包含(又稱頭文件)、條件編譯。 預(yù)處理命令是一種特殊的命令,為了區(qū)別一般的語句,必須以#開頭,結(jié)尾不加分號(hào)。預(yù)處理命令可以放在程序中的任何位置,其有效范圍是從定義開始到文件結(jié)束。,5.7.1 宏定義,宏定義可以分為符號(hào)常量(不帶參數(shù))和帶參數(shù)的兩種。也可以使用#undef命令終止宏定義的作用域。 1符號(hào)常量(不帶參數(shù))的宏定義 用一個(gè)指定的標(biāo)識(shí)符(即名字)來代表一個(gè)字符串,其一般形式為: #define 標(biāo)識(shí)符 字符串 宏定義的功能:在進(jìn)行編譯前,用字符串原樣替換程序中的標(biāo)識(shí)符。 宏定義的作用: (1)便于對(duì)程序進(jìn)行修改。 (2)提高源程序的可移植性。 (3)減少源程序中重復(fù)書寫字符串的工作量。,【例5.10】 輸入圓的半徑,求圓的周長、面積和球的體積。要求使用無參宏定義圓周率。,#include #define PI 3.1415926 /*PI是宏名,3.1415926用來替換宏名的常數(shù)*/ void main() double radius,length,area,volume; printf ("Input a radius: "); scanf ("%lf", ,對(duì)宏的說明:,(1)為了和變量名加以區(qū)別,宏名一般用大寫字母表示 (2)宏定義是用宏名替換一個(gè)字符串,不管該字符串的詞法和語法是否正確,也不管它的數(shù)據(jù)類型,即不作任何檢查。如果有錯(cuò)誤,只能由編譯程序在編譯宏展開后的源程序時(shí)發(fā)現(xiàn)。 (3)在宏定義時(shí),可以使用已經(jīng)定義的宏名。即宏定義可以嵌套,可以層層替換。例如 #define R 3.0 #define PI 3.14159 #define L 2*PI*R #define S PI*R*R void main() printf(“L=%fnS=%fn”,L,S); 替換為 printf(“L=%fnS=%fn”, 2*PI*R, PI*R*R); printf(“L=%fnS=%fn”,2*3.14159*3.0,3.14159*3.0*3.0); (4)在程序中,用雙引號(hào)括起來的宏名被認(rèn)為是一般字符,并不進(jìn)行替換。 #define PAI 3.1415 printf(“ PAI * r * r = %f ”,s); /*并不用3.1415替換PAI*/,2帶參數(shù)的宏定義,對(duì)帶參數(shù)的宏,在調(diào)用中,不是進(jìn)行簡(jiǎn)單的字符串替換,還要進(jìn)行參數(shù)替換。 帶參宏定義的一般形式為 #define 宏名(形參表) 字符串 帶參宏調(diào)用的一般形式為 宏名(實(shí)參表); 例如, #define M(y) (y)*(y)+3*(y) /*宏定義*/ k=M(5); /*宏調(diào)用*/ 在宏調(diào)用時(shí),用實(shí)參5去替換形參y,經(jīng)預(yù)處理宏展開后的語句為:k=(5)*(5)+3*(5); 其中的括號(hào)是必要的。,(1)在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是表達(dá)式。 #define SQ(y) (y)*(y) void main() int a,sq; printf("input a number: n"); scanf("%d",(4)定義帶參宏時(shí),宏名與左圓括號(hào)之間不能留有空格。否則,編譯系統(tǒng)將空格以后的所有字符均作為替換字符串,而將該宏視為無參宏。 (5)帶參的宏和帶參函數(shù)很相似,但有本質(zhì)上的不同。 (6)宏定義也可用來定義多個(gè)語句,在宏調(diào)用時(shí),把這些語句又替換到源程序內(nèi)。例如, #define SSSV(s1,s2,s3,v) s1=l*w;s2=l*h;s3=w*h;v=w*l*h; void main() int l=3,w=4,h=5,sa,sb,sc,vv; SSSV(sa,sb,sc,vv); printf("sa=%dnsb=%dnsc=%dnvv=%dn",sa,sb,sc,vv); (7)較長的定義在一行中寫不下時(shí),可在本行末尾使用反斜杠表示續(xù)行。宏替換不占運(yùn)行時(shí)間,只占編譯時(shí)間。而函數(shù)調(diào)用則占運(yùn)行時(shí)間。,3取消宏定義(#undef),宏定義的作用范圍是從宏定義命令開始到程序結(jié)束。如果需要在源程序的某處終止宏定義,則需要使用#undef命令取消宏定義。取消宏定義命令#undef的用法格式為: #undef 標(biāo)識(shí)符 其中的標(biāo)識(shí)符是指定義的宏名。 #define PI 3.14159 void main( ) float r=10.0; float b,c,d; b=PI*r; #undef PI /*取消了宏定義*/ c=PI*r*r; d=PI*r*r*r; printf(“r=%6.2fn”,r); ,5.7.2 文件包含,文件包含是指,一個(gè)源文件可以將另一個(gè)源文件的全部內(nèi)容包含進(jìn)來,即將另外的文件包含到本文件之中。C語言提供了#include命令用來實(shí)現(xiàn)文件包含的操作。文件包含命令行的一般形式為 include “包含文件名” 或 include 其中:(1)使用雙引號(hào):包含文件名中可以包含文件路徑,系統(tǒng)首先到當(dāng)前目錄下查找被包含文件,如果沒找到,再到系統(tǒng)指定的“包含文件目錄”(由用戶在配置環(huán)境時(shí)設(shè)置)去查找。 (2)使用尖括號(hào):直接到系統(tǒng)指定的“包含文件目錄”去查找。一般地說,使用雙引號(hào)比較保險(xiǎn)。 文件包含命令的功能是把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當(dāng)前的源程序文件連成一個(gè)源文件。,5.7.3 條件編譯,但如果用戶希望某一部分程序在滿足某條件時(shí)才進(jìn)行編譯,否則不編譯或按條件編譯另一組程序,這時(shí)就要用到條件編譯。 可以按不同的條件去編譯不同的程序部分,因而產(chǎn)生不同的目標(biāo)代碼文件。這對(duì)于程序的移植和調(diào)試是很有用的。,5.8 程序舉例,【例5.13】寫兩個(gè)函數(shù),分別求兩個(gè)整數(shù)的最大公約數(shù)和最小公倍數(shù),用主函數(shù)調(diào)用這兩個(gè)函數(shù),并輸出結(jié)果,兩個(gè)整數(shù)由鍵盤輸入。 【例5.14】編寫一個(gè)判別素?cái)?shù)的函數(shù),在主函數(shù)中輸入一個(gè)整數(shù),然后輸出其是否是素?cái)?shù)的信息。,