《新編C語言程序設(shè)計教程》課件第12章_第1頁
《新編C語言程序設(shè)計教程》課件第12章_第2頁
《新編C語言程序設(shè)計教程》課件第12章_第3頁
《新編C語言程序設(shè)計教程》課件第12章_第4頁
《新編C語言程序設(shè)計教程》課件第12章_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第12章編譯預(yù)處理12.1宏定義12.2文件包含

12.3條件編譯12.4圖形處理12.1宏定義12.1.1不帶參數(shù)的宏定義

定義形式: #define宏名宏體宏名是一自定義標(biāo)識符,宏體是一字符串,在程序中可用宏名代表宏體。

例如,用PI代表3.1415926,用PR代表printf,宏定義如下:

(1)#definePI3.1415926(2)#defineePRprintf

程序中凡是出現(xiàn)3.1415926的地方,都可以以PI出現(xiàn),凡是出現(xiàn)printf的地方,都可以以PR出現(xiàn)。例12-1

利用宏定義求圓的周長和面積。/*程序12-1,利用宏定義求圓的周長和面積*/#definePI3.1415926#defineR1.0main(){floatl,s;

l=2.0*PI*R;

s=PI*R*R;

PR(″周長=%f,面積=%f\n″,l,s);}

上面程序在編譯前將進(jìn)行宏展開,宏展開以后變?yōu)椋?/p>

main()

{floatl,s;

l=2.0*3.1415926*1.0;

s=3.1415926*1.0*1.0;

printf(″周長=%f,面積=%f\n″,l,s);

}

說明:

(1)宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別。當(dāng)然可以使用小寫字母。

(2)宏定義是用宏名簡單替換宏體,也就是作簡單的置換,不作語法檢查,出現(xiàn)錯誤也不會報告,只有在宏展開后編譯時才會報告錯誤。

(3)程序中雙引號中與宏名相同的內(nèi)容不被替換。

(4)宏展開后源程序?qū)⒆冮L。(5)使用宏名,可以減少程序中重復(fù)書寫某些宏體的工作量。

(6)宏定義一般放在程序的開頭,宏名的有效范圍為定義位置到文件結(jié)束。

(7)宏定義可以嵌套,后定義的宏可使用已定義的宏。12.1.2帶參數(shù)的宏定義

定義形式: #define宏名(參數(shù)表)宏體帶參數(shù)的宏展開時要從左至右進(jìn)行參數(shù)的簡單替換,使用起來較無參數(shù)宏定義復(fù)雜。例如:

(1)#define S(n)(n)*(n)*(n)

(2)#define T(n)1/(n)第一個式子代表n的立方,第二個式子代表n的倒數(shù)。

說明:

(1)列出的參數(shù)必須在宏體中用到。

(2)帶參數(shù)的宏展開只是將實參簡單替換形參。如有宏定義: #defineS(n)n*n*n

若將形參n用實參a+b替換,S(a+b)會變成a+b*a+b*a+b,顯然與原意不相符。如將宏定義改成:

#defineS(n)(n)*(n)*(n) S(a+b)才被替換為需要的(a+b)*(a+b)*(a+b)。因此,在帶參的宏定義中,參數(shù)一般應(yīng)加括號來描述。(3)宏定義時,在宏名與帶參數(shù)的括號之間不應(yīng)加空格,否則將空格以后的部分都作為宏體。例如:#defineS(n)(n)*(n)*(n)S被認(rèn)為是不帶參數(shù)的宏名,它代表“(n)(n)*(n)*(n)”這樣的宏體。

(4)如在宏體中的參數(shù)前加上“?!保瑒t在宏展開后該實參前后會加上雙引號,變成字符串。例12–2

利用帶參數(shù)的宏定義求圓的周長和面積/*程序12-2,利用帶參數(shù)的宏定義求圓的周長和面積*/#defineR1.0#definePI3.14159#defineC(r)2*PI*(r)#defineS(r)PI*(r)*(r)main(){printf(″周長=%f,面積=%f\n″,C(R),S(R));}

上面程序宏展開后如下:main(){printf(″周長=%f,面積=%f\n″,2*3.14159*1.0,3.14159*1.0*1.0);}

帶參數(shù)的宏又稱為函數(shù)宏,函數(shù)宏不是函數(shù),這是因為:

(1)函數(shù)調(diào)用要求形參和實參類型一致,如實參是表達(dá)式,則必須先計算出值;宏名無類型,宏體也無類型,宏展開只進(jìn)行參數(shù)的簡單替換。(2)函數(shù)調(diào)用是在程序運行時處理的,分配臨時的內(nèi)存單元,有返回值;而宏展開是在編譯前進(jìn)行的,展開時并不分配內(nèi)存單元,不進(jìn)行值的傳遞,無返回值。

(3)宏展開將使源程序變長;而函數(shù)調(diào)用不增加源程序的長度。

(4)宏替換不占用運行時間,只占用編譯時間;而函數(shù)調(diào)用則占用運行時間(分配單元、保留現(xiàn)場、值傳遞、返回)。

(5)一般用宏代表簡單的表達(dá)式比較合適。有些問題用宏和函數(shù)都可以解決。12.1.3預(yù)定義宏預(yù)定義宏由系統(tǒng)提供,宏名的開始和結(jié)尾均為下劃線。_TURBOC_:當(dāng)前TURBOC的版本號。_LINE_:源程序行號,第一行定義為1。_FILE_:源程序文件名。_DATE_:當(dāng)前編譯日期。

_TIME_:當(dāng)前編譯時間。12.1.4取消宏定義

形式一: #undef宏名取消前面定義的宏名,使宏名局部化,取消以后不能再使用。12.2文件包含

文件包含是指一個C語言源程序中將另一個C語言源程序包含進(jìn)來,通過include預(yù)處理指令實現(xiàn)。一般形式: #include″被包含文件名″或 #include<被包含文件名>(1)被包含的文件一般指定為頭文件(*.h),也可為C程序等文件。

(2)一個include指令只能指定一個被包含文件,如果要包含n個文件,則要用到n條include指令。

(3)不能包含OBJ文件。文件包含是在編譯前進(jìn)行處理,不是在連接時進(jìn)行處理。

作用:將指定文件包含在當(dāng)前文件中或插入至文件包含指令的相應(yīng)位置處。使用文件包含指令,可以減少程序設(shè)計人員的重復(fù)勞動,提高程序的開發(fā)效率。(4)當(dāng)文件名用雙引號括起來時,系統(tǒng)先在當(dāng)前目錄中尋找包含的文件,若找不到,再在系統(tǒng)指定的標(biāo)準(zhǔn)方式檢索其它目錄。而用尖括號時,系統(tǒng)直接按指定的標(biāo)準(zhǔn)方式檢索。一般系統(tǒng)提供的頭文件,用尖括號。自定義的文件,用雙引號。

(5)被包含文件與當(dāng)前文件,在預(yù)編譯后變成同一個文件,而非兩個文件。

(6)文件包含可以嵌套,但必須按順序包含。12.3條件編譯1.

#ifdef標(biāo)識符程序段1

#else

程序段2

#endif

若標(biāo)識符已經(jīng)被定義過,則對程序段1進(jìn)行編譯,否則對程序段2進(jìn)行編譯。和if-else語句一樣,#else子句可以缺省,缺省后的形式為:

#ifdef標(biāo)識符程序段1#endif還可增加#elif子句構(gòu)成嵌套。(2)#ifndef標(biāo)識符程序段1#else

程序段2#endif

與第一種形式正好相反,若標(biāo)識符未被定義過,則對程序段1進(jìn)行編譯,否則對程序段2進(jìn)行編譯。3.#if表達(dá)式程序段1

#else

程序段2

#endif

當(dāng)表達(dá)式之值為真(非零)時,編譯程序段1,否則編譯程序段2。例如:#ifDEBUG==1

調(diào)試代碼#endif

例12—3

根據(jù)給定的條件編譯,使給定的字符串以小寫字母或大寫字母形式輸出。

/*程序12—3,條件編譯實例*/

#defineLETTER1main()

{inti=0;

char*str=″HuNanComputer″;

charc;

while((c=str[i])!=′\0′)

{#ifLETTERif(c>=′a′&&c<=′z′)

c-=32;#elseif(c>=′A′&&c<=′Z′)

c+=32;#endif;

printf(″c%″,c);

}}運行結(jié)果:HUNANCOMPUTER

如將LETTER定義為0,將編譯另一條if語句,運行結(jié)果將變?yōu)椋篽unancomputer。

例12—4

假設(shè)某程序使用與國別有關(guān)的信息,每個國家的信息存于一頭文件中,采用條件編譯識別與國別有關(guān)的信息。#ifCHINA==1#include″china.h″#elifUSA==1#include″usa.h″#elifENGLAND==1#include″england.h″#elifFRANCE==1#include″france.h″#else#include″italy.h″#endif12.4圖形處理12.4.1圖形處理流程最簡單的圖形處理可以借用文本方式完成,而真正的圖形處理要進(jìn)入圖形工作方式。圖形處理的第一步是初始化,可通過調(diào)用initgraph()函數(shù)完成;初始化后就可調(diào)用相應(yīng)的圖形處理函數(shù)繪圖;處理完成調(diào)用closegraph()函數(shù)關(guān)閉圖形模式,退出圖形處理。

初始化函數(shù)原型為:

voidinitgraph(int*gdriver,int*gmode,char*pdrive);

(1)參數(shù)gdriver:圖形驅(qū)動程序的地址值。*gdriver取值為0~10,與對應(yīng)的顯卡關(guān)系為:0—DETECT(自動檢測)、1—CGA、3—EGA、9—VGA、……,一般選0即可。

(2)參數(shù)gmode:圖形處理模式。*gmode取值為0~5,具體取值與顯卡有關(guān)。在VGA顯卡下:0—640×200像素、1—640×350像素、2—640×480像素、……,詳細(xì)情況請參考相關(guān)手冊。(3)參數(shù)pdrive:圖形驅(qū)動程序BGI文件的路徑。初始化成功后,函數(shù)intgraphresult()返回0。圖形處理完畢后,需調(diào)用函數(shù)closegraph()關(guān)閉圖形模式。2.4.2圖形處理函數(shù)圖形處理函數(shù)包含在頭文件graphics.h中。這里介紹幾個基本處理函數(shù),更多的圖形處理函數(shù)可參見附錄C。

(1)顏色設(shè)置函數(shù):

voidsetcolor(intcolor);

(2)背景顏色設(shè)置函數(shù):

voidsetbkcolor(intcolor);

color取值與顏色的主要關(guān)系為:0—BLACK、1—BLUE、2—GREEN、4—RED、14—YELLOW、15—WHITE。(3)獲取當(dāng)前x坐標(biāo):

intgetx();(4)獲取當(dāng)前y坐標(biāo):

intgety();(5)畫線函數(shù):

voidline(intx1,inty1,intx2,inty2);其中:(x1,y1)與(x2,y2)為要畫線的端點。(6)畫圓函數(shù):

voidcricle(intx,inty,intr);其中:(x,y)為要畫圓的圓心,r為要畫圓的半徑。

(7)畫弧函數(shù):

voidarc(intx,inty,inta1,inta2,intr);其中:(x,y)為要畫弧的中心,a1、a2分別為弧的開始角和終止角。

例12-5

在屏幕上畫10條不同顏色的線和10個不同顏色的圓。程序如下:/*例12-5,畫線和圓*/#include"graphics.h"main(){inti,x,y,r;

intgdriver=DETECT,gmode;

/*初始化*/initgraph(&gdriver,&gmode,"C:\TC\BGI");

/*畫10條不同顏色的線*/for(i=1;i<=10;i++){setcolor(i);

line(10*i,i,400,400);

}/*畫10個不同顏色的圓*/for(i=1;i<=10;i++){setcolor(i);

cricle(100*i,100*i,100);

}}習(xí)題十二1.寫出下面的程序經(jīng)宏展開后的源程序,并寫出程序的運行結(jié)果。#definePRprintf("sum=%d\n",sum)#defineADDsum+=imain(){inti,sum=0;for(i=10;i<20;i++)ADD;

PR;}2.定義一個宏,用于判斷某年是否為閏年。

3.定義一個宏,求一元二次方程根的判別式的值。

4.根據(jù)個人習(xí)慣,定義一組自己常用的輸入/輸出格式宏,并存入一個文件中,然后設(shè)計一程序加以驗證。

5.用宏定義方式說明數(shù)組的類型及大小,編寫輸出a[0]至a[7]數(shù)組元素值的程序。假設(shè)a[0]='C'、a[1]='H'

溫馨提示

  • 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

提交評論