![C語(yǔ)言高級(jí)編程技術(shù)[紀(jì)鋼][1](1).doc_第1頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb171.gif)
![C語(yǔ)言高級(jí)編程技術(shù)[紀(jì)鋼][1](1).doc_第2頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb172.gif)
![C語(yǔ)言高級(jí)編程技術(shù)[紀(jì)鋼][1](1).doc_第3頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb173.gif)
![C語(yǔ)言高級(jí)編程技術(shù)[紀(jì)鋼][1](1).doc_第4頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb174.gif)
![C語(yǔ)言高級(jí)編程技術(shù)[紀(jì)鋼][1](1).doc_第5頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb175.gif)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語(yǔ)言高級(jí)編程技術(shù)8 .1 遞歸程序設(shè)計(jì)C語(yǔ)言支持函數(shù)的遞歸調(diào)用。遞歸就是函數(shù)直接或間接地自己調(diào)用自己。常見的遞歸算法有兩種,即算術(shù)遞歸與操作遞歸。遞歸的基本思想是,將問(wèn)題P求解的運(yùn)算規(guī)?;虿僮鞑襟E進(jìn)行分解,使求解問(wèn)題P的運(yùn)算規(guī)?;虿僮鞑襟E可以由求解一個(gè)簡(jiǎn)單問(wèn)題以及在更小規(guī)模或更小步驟上求解相同的問(wèn)題P來(lái)組成。當(dāng)運(yùn)算規(guī)?;虿僮鞑襟E減少到一定程度時(shí),如果問(wèn)題P的求解算法可簡(jiǎn)單實(shí)現(xiàn),就可以采用遞歸算法來(lái)實(shí)現(xiàn)問(wèn)題P的求解。比如,求n!與求(n-1)!的運(yùn)算方法是一樣的;當(dāng)n=0時(shí),0!=1。8.1.1 算術(shù)遞歸算術(shù)遞歸是指一切形式的遞歸算式都可以用遞歸方法求解。例81:用遞歸方法求n!。#include long fact(int n) if(n=0) return 1; return n*fact(n-1);void main() int n; scanf(%d,&n); printf(%d!=%ldn,n,fact(n);例8.2:用遞歸函數(shù)計(jì)算兩個(gè)正整數(shù)的最大公約數(shù)。#include int gcd(int m,int n) if(!n) return m; return gcd(n,m%n);void main() int a,b,gcd1; scanf(%d%d,&a,&b); gcd1=gcd(a,b); printf(%dn,gcd1);8.1.2 操作遞歸操作遞歸是指實(shí)現(xiàn)某種操作的遞歸。例8.3:用遞歸算法實(shí)現(xiàn)一維整型數(shù)組元素由小到大冒泡排序。#include void sort(int a,int n) int i,temp; if(n=0) return; for(i=0;iai+1) temp=ai;ai=ai+1;ai+1=temp; sort(a,n-1);void main() int array10,i; for(i=0;i10;i+) scanf(%d,&arrayi); sort(array,9); for(i=0;i10;i+) printf(%d ,arrayi);例8.4:用遞歸算法求一正長(zhǎng)整型數(shù)的各位數(shù)字之和。#include int sum(long i) if(i=0) return 0; return i%10+sum(i/10);void main() long i; scanf(%ld,&i); printf(%dn,sum(i);8.1.3 遞歸算法的優(yōu)缺點(diǎn)遞歸函數(shù)的主要優(yōu)點(diǎn)是可以把算法寫的比使用非遞歸函數(shù)時(shí)更清晰更簡(jiǎn)潔,而且某些問(wèn)題,特別是與人工智能有關(guān)的問(wèn)題,更適宜用遞歸方法。遞歸算法的缺點(diǎn),一是需要額外的內(nèi)存開銷,特別是當(dāng)遞歸層次較大時(shí),遞歸函數(shù)需要占用的堆棧內(nèi)存空間相當(dāng)大。二是函數(shù)的頻繁調(diào)用會(huì)降低程序的執(zhí)行效率??傊f歸算法要比解決同樣問(wèn)題的非遞歸算法效率低一些。內(nèi)存空間需求更多一些。大多數(shù)用遞歸算法解決的問(wèn)題,都可以找到相應(yīng)的非遞歸算法,只有少數(shù)問(wèn)題的求解只有遞歸算法。由于遞歸算法具有效率低、內(nèi)存消耗大等缺點(diǎn),在設(shè)計(jì)程序時(shí),若有比較好的非遞歸算法,應(yīng)盡量采用非遞歸算法。82 文本的屏幕輸出和鍵盤輸入8.2.1 文本的屏幕輸出顯示器的屏幕顯示方式有兩種:文本方式和圖形方式。文本方式就是顯示文本的模式,它的顯示單位是字符而不是圖形方式下的象素,因而在屏幕上顯示字符的位置坐標(biāo)就用行和列表示。Turbo C 的字符屏幕函數(shù)主要包括文本窗口大小的設(shè)定、窗口顏色的設(shè)置、窗口文本的清除和輸入輸出等函數(shù)。這些函數(shù)的有關(guān)信息(如宏定義等)均包含在conio.h 頭文件中,因此在用戶程序中使用這些函數(shù)時(shí),必須用include 將conio.h 包含進(jìn)程序。1 文本窗口的定義Turbo C 默認(rèn)定義的文本窗口為整個(gè)屏幕,共有80 列25 行的文本單元。如圖8-1 所示,規(guī)定整個(gè)屏幕的左上角坐標(biāo)為(1,1),右下角坐標(biāo)為(80,25),并規(guī)定沿水平方向?yàn)閄軸,方向朝右;沿垂直方向?yàn)閅 軸,方向朝下。每個(gè)單元包括一個(gè)字符和一個(gè)屬性,字符即ASCII 碼字符,屬性規(guī)定該字符的顏色和強(qiáng)度。除了這種默認(rèn)的80 列25 行的文本顯示方式外,還可由用戶通過(guò)函數(shù):void textmode(int newmode);來(lái)顯式地設(shè)置Turbo C 支持的5種文本顯示方式。該函數(shù)將清除屏幕,以整個(gè)屏幕為當(dāng)前窗口,并移光標(biāo)到屏幕左上角。newmode 參數(shù)的取值見表8-1,既可以用表中指出的方式代碼,又可以用符號(hào)常量。LASTMODE 方式指上一次設(shè)置的文本顯示方式,它常用于在圖形方式到文本方式的切換。圖8-1表8-1方式符號(hào)常量顯示列行數(shù)和顏色0BW404025黑白顯示1C404025彩色顯示2BW808025黑白顯示3C808025彩色顯示7MONO8025單色顯示-1LASTMODE上一次的顯示方式Turbo C 也可以讓用戶根據(jù)自己的需要重新設(shè)定顯示窗口,也就是說(shuō),通過(guò)使用窗口設(shè)置函數(shù)window()定義屏幕上的一個(gè)矩形域作為窗口。window()函數(shù)的函數(shù)原型為:void window(int left, int top, int right, int bottom);函數(shù)中形參(int left,int top)是窗口左上角的坐標(biāo),(int right,int bottom)是窗口的右下角坐標(biāo),其中(left,top)和(right,bottom)是相對(duì)于整個(gè)屏幕而言的。例如,要定義一個(gè)窗口左上角在屏幕(20,5)處,大小為30 列15 行的窗口可寫成:window(20, 5, 50, 25);若window()函數(shù)中的坐標(biāo)超過(guò)了屏幕坐標(biāo)的界限,則窗口的定義就失去了意義,也就是說(shuō)定義將不起作用,但程序編譯鏈接時(shí)并不出錯(cuò)。窗口定義之后,用有關(guān)窗口的輸入輸出函數(shù)就可以只在此窗口內(nèi)進(jìn)行操作而不超出窗口的邊界。一個(gè)屏幕可以定義多個(gè)窗口,但現(xiàn)行窗口只能有一個(gè)(因?yàn)镈OS 為單任務(wù)操作系統(tǒng))。當(dāng)需要用另一窗口時(shí),可將定義該窗口的window()函數(shù)再調(diào)用一次, 此時(shí)該窗口便成為現(xiàn)行窗口了。2 文本窗口顏色和其它屬性的設(shè)置文本窗口顏色的設(shè)置包括背景顏色的設(shè)置和字符顏色(既前景色)的設(shè)置,使用的函數(shù)及其原型為:設(shè)置背景顏色函數(shù):void textbackground(int color);設(shè)置字符顏色函數(shù):void textcolor(int color);有關(guān)顏色的定義見表8-2。表中的符號(hào)常數(shù)與相應(yīng)的數(shù)值等價(jià),二者可以互換。例如設(shè)定藍(lán)色背景可以使用textbackground(1),也可以使用textbackground(BLUE),兩者沒有任何區(qū)別,只不過(guò)后者比較容易記憶,一看就知道是藍(lán)色。表8-2 顏色表符號(hào)常數(shù)數(shù)值含義背景或背景BLACK0黑前景、背景色BLUE1藍(lán)前景、背景色GREEN2綠前景、背景色CYAN3青前景、背景色RED4紅前景、背景色MAGENTA5洋紅前景、背景色BROWN6棕前景、背景色LIGHTGRAY7淡灰前景、背景色DARKGRAY8深灰用于前景色LIGHTBLUE9淡藍(lán)用于前景色LIGHTGREEN10淡綠用于前景色LIGHTCYAN11淡青用于前景色LIGHTRED12淡紅用于前景色LIGHTMAGENTA13淡洋紅用于前景色YELLOW14黃用于前景色WHITE15白用于前景色BLINK128閃爍用于前景色Turbo C 另外還提供了一個(gè)函數(shù),可以同時(shí)設(shè)置文本的字符和背景顏色,這個(gè)函數(shù)是文本屬性設(shè)置函數(shù):void textattr(int attr);參數(shù)attr 的值表示顏色形式編碼的信息,每一位代表的含義如下:位76543210Bbbbcccc閃爍背景顏色字符顏色字節(jié)低四位cccc 設(shè)置字符顏色,46 三位bbb 設(shè)置背景顏色,第7位B 設(shè)置字符是否閃爍。假如要設(shè)置一個(gè)藍(lán)底黃字,定義方法如下:textattr(YELLOW+(BLUE4);若再要求字符閃爍,定義變?yōu)椋簍extattr(128+YELLOW+(BLUE4);注意:(1) 對(duì)于背景只有0到7共八種顏色,取大于7小于15 的數(shù),則代表的顏色與減7 后的值對(duì)應(yīng)的顏色相同;(2) 用textbackground()和textcolor()函數(shù)設(shè)置了窗口的背景與字符顏色后,在沒有用clrscr()函數(shù)清除窗口之前,顏色不會(huì)改變,直到使用了函數(shù)clrscr(),整個(gè)窗口和隨后輸出到窗口中的文本字符才會(huì)變成新顏色。(3) 用textattr()函數(shù)時(shí)背景顏色應(yīng)左移4 位,才能使3 位背景顏色移到正確位置;3 窗口內(nèi)文本的輸入輸出函數(shù). 窗口內(nèi)文本的輸出函數(shù)前面介紹過(guò)的printf(),putc(),puts(),putchar()等輸出函數(shù)以整個(gè)屏幕為窗口的,它們不受由window 設(shè)置的窗口限制,也無(wú)法用函數(shù)控制它們輸出的位置,但Turbo C 提供了三個(gè)文本輸出函數(shù),它們受窗口的控制,窗口內(nèi)顯示光標(biāo)的位置,就是它開始輸出的位置。當(dāng)輸出行右邊超過(guò)窗口右邊界時(shí),自動(dòng)移到窗口內(nèi)的下一行開始輸出,當(dāng)輸出到窗口底部邊界時(shí),窗口內(nèi)的內(nèi)容將自動(dòng)產(chǎn)生上卷,直到完全輸出完為止,這三個(gè)函數(shù)均受當(dāng)前光標(biāo)的控制,每輸出一個(gè)字符光標(biāo)后移一個(gè)字符位置。這三個(gè)輸出函數(shù)原型為:int cprintf(char *format,表達(dá)式表);int cputs(char *str);int putch(int ch);它們的使用格式同printf(),puts()和putc(),其中cprintf()是將按格式化串定義的字符串或數(shù)據(jù)輸出到定義的窗口中,其輸出格式串同printf 函數(shù),不過(guò)它的輸出受當(dāng)前光標(biāo)控制,且輸出特點(diǎn)如上所述,cputs 同puts,是在定義的窗口中輸出一個(gè)字符串,而putch()則是輸出一個(gè)字符到窗口,它實(shí)際上是函數(shù)putc 的一個(gè)宏定義,即將輸出定向到屏幕。. 窗口內(nèi)文本的輸入函數(shù)可直接使用stdio.h 中的getch()或getche()函數(shù)。需要說(shuō)明的是,getche()函數(shù)從鍵盤上獲得一個(gè)字,在屏幕上顯示的時(shí)候,如果字符超過(guò)了窗口右邊界,則會(huì)被自動(dòng)轉(zhuǎn)移到下一行的開始位置。4 有關(guān)屏幕操作的函數(shù)void clrscr(void);該函數(shù)將清除窗口中的文本,并將光標(biāo)移到當(dāng)前窗口的左上角,即(1, 1)處。void clreol(void);該函數(shù)將清除當(dāng)前窗口中從光標(biāo)位置開始到本行結(jié)尾的所有字符,但不改變光標(biāo)原來(lái)的位置。void delline(void);該函數(shù)將刪除一行字符,該行是光標(biāo)所在行。void gotoxy(int x, int y);該函數(shù)很有用,用來(lái)定位光標(biāo)在當(dāng)前窗口中的位置。這里x,y 是指光標(biāo)要定位處的坐標(biāo)(相對(duì)于窗口而言)。當(dāng)x, y 超出了窗口的大小時(shí),該函數(shù)就不起作用了。int movetext(int x1, int y1, int x2, int y2, int x3, int y3);該函數(shù)將把屏幕上左上角為(xl,y1),右下角為(x2,y2)的矩形內(nèi)文本拷貝到左上角為(x3,y3)的一個(gè)新矩形區(qū)內(nèi)。這里x,y 坐標(biāo)是以整個(gè)屏幕為窗口坐標(biāo)系,即屏幕左上角為(1,1)。該函數(shù)與開設(shè)的窗口無(wú)關(guān),且原矩形區(qū)文本不變。int gettext(int xl, int yl, int x2, int y2, void *buffer);該函數(shù)將把左上角為(xl,y1),右下角為(x2,y2)的屏幕矩形區(qū)內(nèi)的文本存到由指針buffer指向的一個(gè)內(nèi)存緩沖區(qū)內(nèi),當(dāng)操作成功,返回1;否則,返回0。因一個(gè)在屏幕上顯示的字符需占顯示存儲(chǔ)器VRAM 的兩個(gè)字節(jié),即第一個(gè)字節(jié)是該字符的ASCII 碼,第二個(gè)字節(jié)為屬性字節(jié),即表示其顯示的前景、背景色及是否閃爍,所以buffer 指向的內(nèi)存緩沖區(qū)的字節(jié)總數(shù)的計(jì)算為:字節(jié)總數(shù)=矩形內(nèi)行數(shù)每行列數(shù)2其中:矩形內(nèi)行數(shù)=y2-y1+l,每行列數(shù)=x2-xl+1(每行列數(shù)是指矩形內(nèi)每行的列數(shù))。矩形內(nèi)文本字符在緩沖區(qū)內(nèi)存放的次序是從左到右,從上到下,每個(gè)字符占連續(xù)兩個(gè)字節(jié)并依次存放。int puttext(int x1, int y1, int x2, int y2, void *buffer);該函數(shù)則是將gettext()函數(shù)存入內(nèi)存buffer 中的文字內(nèi)容拷貝到屏幕上指定的位置。注意:(1) gettext()函數(shù)和puttext()函數(shù)中的坐標(biāo)是對(duì)整個(gè)屏幕而言的,即是屏幕的絕對(duì)坐標(biāo),而不是相對(duì)窗口的坐標(biāo);(2) movetext()函數(shù)是拷貝而不是移動(dòng)窗口區(qū)域內(nèi)容,即使用該函數(shù)后,原位置區(qū)域的文本內(nèi)容仍然存在。例8.5:下面的程序首先定義了一個(gè)字符數(shù)組,下標(biāo)為64,表示用來(lái)存四行八列的文本。由于沒有用window 函數(shù)設(shè)置窗口,因而用缺省值,即全屏幕為一個(gè)窗口,程序開始設(shè)置80列25 行文本顯示方式(C80),背景色為藍(lán)色,前景色為紅色,經(jīng)clrscr 函數(shù)清屏后,設(shè)置的背景色才使屏幕背景變藍(lán)。gotoxy(10,10)使光標(biāo)移到第10 行10 列,然后在(10,10)開始位置顯示L:load,接著在下面三行相同的列位置顯示另外三條信息,13 行10 列顯示的E:exit 后面帶有回車換行符,為的是將光標(biāo)移到下一行開始處,好顯示press any key to continue。當(dāng)按任一鍵后,gettext 函數(shù)將(10,l0,18,13)矩形區(qū)的內(nèi)容存到ch 緩存區(qū)內(nèi)。ch 即上述的四行八列信息,接著設(shè)置一個(gè)窗口,并縱向?qū)懮?,2,3,4,然后用movetext(),將此窗口內(nèi)容復(fù)制到另一區(qū)域,由于此區(qū)域包括背景色和顯示的字符,所以被復(fù)制到另一區(qū)域的內(nèi)容也是相同的背景色和文本。當(dāng)按任一鍵后,又出現(xiàn)提示信息,再按鍵,則存在ch緩沖區(qū)內(nèi)的文本由puttext()又復(fù)制到開設(shè)的窗口內(nèi)了,注意上述的函數(shù)movetext(),gettext(),puttext()均與開設(shè)的窗口內(nèi)坐標(biāo)無(wú)關(guān),而是以整個(gè)屏幕為參考系的。#include #include void main()int i;char ch4*8*2; /* 定義ch 字符串?dāng)?shù)組作為緩存區(qū)*/textmode(C80);textbackground(BLUE);textcolor(RED);clrscr();gotoxy(10,10);cprintf(L:load);gotoxy(10,11);cprintf(S:save);gotoxy(10,12);cprintf(D:delete);gotoxy(10,13);cprintf(E:exitrn);cprintf(Press any key to continue);getch();gettext(10,10,18,13,ch); /* 存矩形區(qū)文存到ch 緩存區(qū)*/clrscr();textbackground(1);textcolor(3);window(20,9,34,14); /* 開一個(gè)窗口*/clrscr();cprintf(1.rn2.rn3.rn4.rn);/* 縱向?qū)?,2,3,4 */movetext(20,9,34,14,40,10); /* 將矩形區(qū)文本復(fù)制到另一區(qū)域*/puts(hit any key);getch();clrscr();cprintf(press any key to put text);getch();clrscr();puttext(23,10,31,13,ch); /* 將ch 緩存區(qū)所存文本在屏上顯示*/getch();5 狀態(tài)查詢函數(shù)有時(shí)需要知道當(dāng)前屏幕的顯示方式,當(dāng)前窗口的坐標(biāo)、當(dāng)前光標(biāo)的位置,文本的顯示屬性等,Turbo C 提供了一些函數(shù)得到屏幕文本顯示有關(guān)信息的函數(shù):void gettextinfo(struct text_info *f);這里的text_info 是在conio.h 頭文件中定義的一個(gè)結(jié)構(gòu),該結(jié)構(gòu)的定義是struct text_infounsigned char winleft; /* 窗口左上角x 坐標(biāo)*/unsigned char wintop; /* 窗口左上角y 坐標(biāo)*/unsigned char winright; /* 窗口右下角x 坐標(biāo)*/unsigned char winbottom; /* 窗口右下角y 坐標(biāo)*/unsigned char attributes; /* 文本屬性*/unsigned char normattr; /* 通常屬性*/unsigned char currmode; /* 當(dāng)前文本方式*/unsigned char screenheight; /* 屏高*/unsigned char screenwidth; /* 屏寬*/unsigned char curx; /* 當(dāng)前光標(biāo)的x 值*/unsigned char cury; /* 當(dāng)前光標(biāo)的y 值*/;例8.6:下面的程序?qū)⑵聊辉O(shè)置成80列彩色文本方式,并開了一個(gè)window(1,5,70,20)的窗口,在窗口中顯示了current information of window,然后用gettextinfo 函數(shù)得到當(dāng)前窗口的信息,后面的cprintf()函數(shù)將分別顯示出結(jié)構(gòu)text_info 各分量的數(shù)值來(lái)。#include #include void main()struct text_info current;textmode(C80);textbackground(1);textcolor(13);window(1,5,70,20);clrscr();cputs(Current information of windowrn);gettextinfo(¤t);cprintf(Left corner of window is %d,%d ,current.winleft,current.wintop);cprintf(Right corner of window is %d,%d ,current.winright,current.winbottom);cprintf(Text window attribute is%d ,current.attribute);cprintf(Text window normal attribute is %d ,current.normattr);cprintf(Current video mode is %d ,current.currmode);cprintf(Window height and width is %d,%d ,current.screenheight,current.screenwidth);cprintf(Row cursor pos is %d,Column pos is %d ,current.cury,current.curx);getch();8.2.2 鍵盤輸入當(dāng)我們?cè)阪I盤上按下某鍵時(shí),系統(tǒng)是怎樣知道是哪一個(gè)鍵被按下呢?它的奧妙在于計(jì)算機(jī)鍵盤內(nèi)有一個(gè)微處理器,它用來(lái)掃描和檢測(cè)每個(gè)鍵的按下和拾起狀態(tài)。然后以程序中斷的方式(INT 9)與主機(jī)通信。ROM 中BIOS 內(nèi)的鍵盤中斷處理程序,會(huì)將一個(gè)字節(jié)的按鍵掃描碼(掃描碼的06 位標(biāo)識(shí)了每個(gè)鍵在鍵盤上的位置,最高位標(biāo)識(shí)按鍵的狀態(tài),0 對(duì)應(yīng)該鍵是被按下;1 對(duì)應(yīng)松開。它并不能區(qū)別大小寫字母,而且一些特殊鍵如PrintScreen 等不產(chǎn)生掃描碼直接引起中斷調(diào)用)翻譯成對(duì)應(yīng)的ASCII 碼。由于ASCII 碼僅有256 個(gè)(28),它不能將PC 鍵盤上的鍵全部包括,因此有些控制鍵如CTRL,ALT,END,HOME,DEL 等用擴(kuò)充的ASCII 碼表示,擴(kuò)充碼用兩個(gè)字節(jié)的數(shù)表示。第一個(gè)字節(jié)是0,第二個(gè)字節(jié)是0255 的數(shù),鍵盤中斷處理程序?qū)艳D(zhuǎn)換后的擴(kuò)充碼存放在Ax 寄存器中,存放格式如表8-3 所示。對(duì)字符鍵,其擴(kuò)充碼就是其ASCII 碼。表8-3 鍵盤掃描碼鍵名AHAL字符鍵擴(kuò)充碼=ASCII 碼ASCII 碼功能鍵/組合鍵擴(kuò)充碼0是否有鍵按下,何鍵按下,簡(jiǎn)單的應(yīng)用中可采用兩種辦法:一是直接使用Turbo C 提供的鍵盤操作函數(shù)bioskey()來(lái)識(shí)別,二是通過(guò)int86()函數(shù),調(diào)用BIOS的INT 16H,功能號(hào)為0 的中斷。它將按鍵的掃描碼存放在Ax 寄存器的高字節(jié)中。函數(shù)bioskey()的原型為:int bioskey(int cmd);它在bios.h 頭文件中進(jìn)行了說(shuō)明,參數(shù)cmd 用來(lái)確定bioskey()如何操作:cmd操作0bioskey()返回按健的鍵值,該值是2 個(gè)字節(jié)的整型數(shù)。若沒有鍵按下,則該函數(shù)一直等待,直到有鍵按下。當(dāng)按下時(shí),若返回值的低8 位為非零,則表示為普通鍵,其值代表該鍵的ASCII 碼。若返回值的低8 位為0,則高8 位表示為擴(kuò)展的ASCII碼,表示按下的是特殊功能鍵。1bioskey()查詢是否有鍵按下。若返回非0 值,則表示有鍵按下,若為0 表示沒鍵按下。2bioskey()將返回一些控制鍵是否被按過(guò),按過(guò)的狀態(tài)由該函數(shù)返回的低8 位的各位值來(lái)表示:字節(jié)位對(duì)應(yīng)的16 進(jìn)制數(shù)含義00x01右邊的shift 鍵被按下10x02左邊的shift 鍵被按下20x04Ctrl鍵被按下30x08Alt 鍵被按下40x10Scroll Lock 已打開50x20Num Lock 已打開60x40Caps Lock 已打開70x80Insert 已打開當(dāng)某位為l 時(shí),表示相應(yīng)的鍵已按,或相應(yīng)的控制功能已有效,如選參數(shù)cmd 為2,若key 值為0x09,則表示右邊的shift 鍵被按,同時(shí)又按了Alt 鍵。函數(shù)int86 ()的原型為:int int86(int intr_num,union REGS *inregs,union REGS *outregs);這個(gè)函數(shù)在bios.h 頭文件中進(jìn)行了說(shuō)明,它的第一個(gè)參數(shù)intr_num 表示BIOS 調(diào)用類型號(hào),相當(dāng)于int n 調(diào)用的中斷類型號(hào)n,第二個(gè)參數(shù)表示是指向聯(lián)合類型REGS 的指針,它用于接收調(diào)用的功能號(hào)及其它一些指定的入口參數(shù),以便傳給相應(yīng)的寄存器,第三個(gè)參數(shù)也是一個(gè)指向聯(lián)合類型REGS 的指針,它用于接收功能調(diào)用后的返回值,即出口參數(shù),如調(diào)用的結(jié)果,狀態(tài)信息,這些值從相關(guān)寄存器中得到。例8.7 bioskey()函數(shù)的使用。#include #include void main() int k1,k2,k; do k=bioskey(0); k1=k & 0x00FF; /*得到低8位的值*/ k2=k 8; /*得到高8位的值*/ switch(k2) case 71: printf(你按下了Home鍵!n); break; case 79: printf(你按下了End鍵!n); break; case 73: printf(你按下了PgUp鍵!n); break; case 81: printf(你按下了PgDn鍵!n); break; default: printf(你按下了Home,End,PgUp,PgDn之外的鍵!n); while(k1!=27);/*ESC鍵才退出*/83 圖形程序設(shè)計(jì)計(jì)算機(jī)圖形程序設(shè)計(jì)是程序設(shè)計(jì)中比較難但吸引人的部分。因在ANSI C中沒有對(duì)圖形庫(kù)的要求,所以不同版本的C語(yǔ)言編譯程序提供的圖形函數(shù)不一樣。本節(jié)以Turbo C的圖形庫(kù)來(lái)介紹圖形程序設(shè)計(jì)。8.3.1 圖形模式的初始化要進(jìn)行圖形程序設(shè)計(jì),就要將屏幕顯示模式設(shè)置為圖形模式。要設(shè)置圖形模式,可以用Turbo C提供的圖形初始化函數(shù): void far initgraph(int far *gdriver,int far *gmode,char far *pathtodriver);其中,gdriver表示圖形驅(qū)動(dòng)器,gmode表示圖形模式,pathtodriver表示圖形驅(qū)動(dòng)程序所在的目錄路徑,若圖形驅(qū)動(dòng)程序在Turbo C的默認(rèn)目錄下,可將參數(shù)pathtodriver設(shè)置為空字符串( )。若不知道所用的圖形顯示器適配器的種類,在調(diào)用圖形初始化函數(shù)時(shí),設(shè)置參數(shù)gdriver的值為0或DETECT,由系統(tǒng)自動(dòng)進(jìn)行硬件檢測(cè)。Turbo C提供的圖形驅(qū)動(dòng)器、模式的符號(hào)常量及數(shù)值的意義參見Turbo C提供的graphics.h文件。Turbo C提供的圖形與字形驅(qū)動(dòng)文件見表8-4 表8-4 Turbo C 圖形與字形驅(qū)動(dòng)文件表文件名用途ATT.BGIAT&T圖形驅(qū)動(dòng)文件CGA.BGICGA圖形驅(qū)動(dòng)文件EGAVGA.BGIEGA和VGA圖形驅(qū)動(dòng)文件IBM8514.BGIIBM8514圖形驅(qū)動(dòng)文件GOTH.CHR歌特筆劃字形文件LITT.CHR小號(hào)筆劃字形文件SANS.CHR無(wú)襯線矢量筆劃字形文件TRIP.CHR三重矢量筆劃字形文件如在程序的開始部分可進(jìn)行如下的描述:#include#includevoid main( ) int gd=DETECT,gm; /* 自動(dòng)檢測(cè) */initgraph(&gd,& gm, ); /* 圖形模式初始化 */ 8.3.2 圖形模式下的坐標(biāo)系坐標(biāo)系下每一個(gè)點(diǎn),就是一個(gè)圖形象素點(diǎn)。CGA 320320 2色EGA 640480 16色VGA 640480 16色在640480模式下,其屏幕坐標(biāo)點(diǎn)的表示為:屏幕原點(diǎn)坐標(biāo)(0,0),最大坐標(biāo)(639,479) (0,0) (639,479)8.3.3 屏幕圖形的色彩與相關(guān)操作在C語(yǔ)言中,圖形模式的屏幕顏色設(shè)置分為背景色的設(shè)置和作圖色的設(shè)置。背景色的設(shè)置通過(guò)對(duì)函數(shù)setbkcolor (int color ), 作圖色的設(shè)置通過(guò)對(duì)函數(shù)setcolor (int color )的調(diào)用來(lái)實(shí)現(xiàn)。其中int color為整型數(shù)據(jù),取值范圍為015,數(shù)字的表示的顏色見前面的顏色參數(shù)表。背景和前景色可以有16種顏色。(這種方式成為調(diào)色板方式)圖形屏幕相關(guān)的操作的主要函數(shù)如表8-5所示:表8-5 屏幕圖形的色彩與相關(guān)操作的函數(shù)函數(shù)功能cleardevice( ) 清除圖形屏幕clearriwport( ) 清除當(dāng)前視區(qū)setbkcolor( )設(shè)置圖形背景顏色setcolor( )設(shè)置圖形前顏色setfillstyle( )設(shè)置填充模式和填充顏色settextstyle( )設(shè)置文本字符的顯示模式closegraph( )關(guān)閉圖形系統(tǒng),返回文本方式幾個(gè)函數(shù)的說(shuō)明如下:(1)setfillstyle()為填充函數(shù),其作用是對(duì)圖形內(nèi)部填充顏色,函數(shù)原型為:void far setfillstyle(int pattern, int color);其中,pattern表示填充模式,color表示顏色參數(shù)。 pattern的取值見表8-6表8-6 圖形填充模式表符號(hào)數(shù)值描述EMPTY_FILL0用背景色填充SOLID_FILL1單色填充LIN_FILL2用一填充LTSLASH_FILL3用/填充SLASH_FILL4用粗填充BKSLASH_FILL5用粗/填充LIBKSLASH_FILL6用填充HATCH_FILL7用淡影線填充XHATCH_FILL8用交叉線填充INTERLEAVE_FILL9用間隔線填充WIND_EDOT_FILL10用稀疏空白點(diǎn)填充CLOSEDOT_FILL11用密集空的點(diǎn)填充USER_FILL12用戶定義的填充模式(2)settextstyle()函數(shù),用于設(shè)置文本字符串的字型、輸出方向和字符大小。函數(shù)原型為:void far settextstyle(int font, int direction, int charsize);其中,font用于設(shè)置字符的字體,其取值見表8-7direction用于設(shè)置字符輸出方向,其取值見表8-8charsize用于設(shè)置字符大小,其取值見表8-9表8-7 font的取值符號(hào)常量數(shù)值含義DEFAULT_FONT08*8點(diǎn)陣字(缺省值)TRIPLEX_FONT13倍筆劃字體SMALL_FONT2小號(hào)筆劃字體SANS_SERIF_FONT3無(wú)襯線筆劃字體GOTHIC_FONT4黑體筆劃字體表8-8 direction的取值符號(hào)常量數(shù)值含義HORIZ_DIR0從左到右VERT_DIR1從底到頂表8-9 charsize的取值符號(hào)常量或數(shù)值含義符號(hào)常量或數(shù)值含義18*8點(diǎn)陣756*56點(diǎn)陣216*16點(diǎn)陣864*64點(diǎn)陣324*24點(diǎn)陣972*72點(diǎn)陣432*320點(diǎn)陣1080*80點(diǎn)陣540*40點(diǎn)陣USER_CHAR_SIZE=0用戶定義的字符大小648*48點(diǎn)陣8.3.4 基本繪圖函數(shù)圖形由點(diǎn)、線、面組成,Turbo C 提供了一些函數(shù),以完成這些操作,而所謂面則可由對(duì)封閉圖形填上顏色來(lái)實(shí)現(xiàn)。1) 畫點(diǎn)函數(shù)void far putpixel(int x,int y,int color);該函數(shù)表示在指定的x,y 位置畫一點(diǎn),點(diǎn)的顯示顏色由設(shè)置的color值決定,關(guān)于顏色的設(shè)置,將在設(shè)置顏色函數(shù)中介紹。int far getpixel(int x,int y);該函數(shù)與putpixel()相對(duì)應(yīng),它得到在(x,y)點(diǎn)位置上的象素的顏色值。例88:下面是一個(gè)畫點(diǎn)的程序,它將在y=20 的恒定位置上,沿x 方向從x=200 開始,連續(xù)畫兩個(gè)點(diǎn)(間距為4 個(gè)象素位置),又間隔16 個(gè)點(diǎn)位置,再畫兩個(gè)點(diǎn),如此循環(huán),直到x=300 為止,每畫出的兩個(gè)點(diǎn)中的第一個(gè)由putpixel(x,20,1)所畫,第二個(gè)則由putplxel(x+4,20,2)畫出,顏色值分別設(shè)為1 和2。#include void main()int graphdriver=DETECT, graphmode,x;initgraph(&graphdriver,&graphmode,);cleardevice();for(x=20;x=300;x+=16)putpixel(x,20,1);putpixel(x+4,20,2);getch();closegraph();2) 有關(guān)畫圖坐標(biāo)位置的函數(shù)在屏幕上畫線時(shí),如同在紙上畫線一樣。畫筆要放在開始畫圖的位置,并經(jīng)常要抬筆移動(dòng),以便到另一位置再畫。我們也可想象在屏上畫圖時(shí),有一無(wú)形的畫筆,可以控制它的定位、移動(dòng)(不畫),也可知道它能移動(dòng)的最大位置限制等。完成這些功能的函數(shù)是:移動(dòng)畫筆到指定的(x,y)位置,移動(dòng)過(guò)程不畫:void far moveto(int x,int y);畫筆從現(xiàn)行位置(x,y)處移到一位置增量處(x+dx,y+dx),移動(dòng)過(guò)程不畫:void far moverel(int dx,int dy);得到當(dāng)前畫筆所在位置int far getx(void);得到當(dāng)前畫筆的x 位置int far gety(void);得到當(dāng)前畫筆的y 位置3) 畫線函數(shù)這類函數(shù)提供了從一個(gè)點(diǎn)到另一個(gè)點(diǎn)用設(shè)定的顏色畫一條直線的功能,起始點(diǎn)的設(shè)定方法不同,因而有下面不同的畫線函數(shù):兩點(diǎn)之間畫線函數(shù)。void far line(int x0,int y0,int x1,int y1);從(x0,y0)點(diǎn)到(x1,y1)點(diǎn)畫一直線。從現(xiàn)行畫筆位置到某點(diǎn)畫線函數(shù)。void far lineto(int x,int y);將從現(xiàn)行畫筆位置到(x,y)點(diǎn)畫一直線。從現(xiàn)行畫筆位置到一增量位置畫線函數(shù)void far linerel(int dx,int dy);將從現(xiàn)行畫筆位置(x,y)到位置增量處(x+dx,y+dy)畫一直線。例8.9:下面的程序?qū)⒂胢oveto 函數(shù)將畫筆移到(100,20)處,然后從(100,20)到(100,80)用1ineto 函數(shù)畫一直線。再將畫筆移到(200,20)處,用lineto 畫一直線到(100,80)處,再用line 函數(shù)在(100,90)到(200,90)間連一直線。接著又從上次1ineto 畫線結(jié)束位置開始(它是當(dāng)前畫筆的位置),即從(100,80)點(diǎn)開始到x 增量為0,y 增量為20 的點(diǎn)(100,100)為止用linerel 函數(shù)畫一直線。moverel(-100,0)將使畫筆從上次用1inerel(0,20)畫直線時(shí)的結(jié)束位置(100,100)處開始移到(100-100,100-0),然后用linerel(30,20)從(0,100)處再畫直線至(0+30,100+20)處。用line 函數(shù)畫直線時(shí),將不考慮畫筆位置,它也不影響畫筆原來(lái)的位置,lineto 和1inerel要求畫筆位置,畫線起點(diǎn)從此位置開始,而結(jié)束位置就是畫筆畫線完后停留的位置,故這兩個(gè)函數(shù)將改變畫筆的位置。#include void main()int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,);cleardevice();moveto(100,20);lineto(100,80);moveto(200,20);lineto(100,80);line(100,90,200,90);linerel(0,20);moverel(-100,0);linerel(30,20);getch();closegraph();4) 畫矩形和條形圖函數(shù)畫矩形函數(shù)rectangle 將畫出一個(gè)矩形框,而畫條形函數(shù)bar 將以給定的填充模式和填充顏色畫出一個(gè)條形圖,而不是一個(gè)條形框,關(guān)于填充模式和顏色將在后面介紹。畫矩形函數(shù)void far rectangle(int xl,int y1,int x2,int y2);該函數(shù)將以(x1,y1)為左上角,(x2,y2)為右下角畫一矩形框。畫條形圖函數(shù)void bar(int x1,int y1,int x2,int y2);該函數(shù)將以(xl,y1)為左上角,(x2,y2)為右下角畫一實(shí)形條狀圖,沒有邊框,圖的顏色和填充模式可以設(shè)定。若沒有設(shè)定,則使用缺省模式。例8.10:下面的程序?qū)⒂蓃ectangle 函數(shù)以(100,20)為左上角,(200,50)為右下角畫一矩形,接著又由bar 函數(shù)以(100,80)為左上角,(150,180)為右下角畫一實(shí)形條狀圖,用缺省顏色(白色)填充。#include void main()int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,);cleardevice();rectangle(100,20,200,50);bar(100,80,150,180);getch();closegraph();5) 畫橢圓、圓和扇形圖函數(shù)在畫圖的函數(shù)中,有關(guān)于角的概念。在Turbo C 中是這樣規(guī)定的:屏的x 軸方向?yàn)? 度,當(dāng)半徑從此處逆時(shí)針?lè)较蛐D(zhuǎn)時(shí),則依次是90 度、180 度、270 度,當(dāng)360 度時(shí),則和x軸正向重合,即旋轉(zhuǎn)了一周。如圖8-2 所示。圖8-2 起始角和終止角畫橢圓函數(shù)void ellipse(int x,int y,int stangle,int endangel,int xradius,int yradius);該函數(shù)將以(x,y)為中心,以xradius 和yradius 為x 軸和y 軸半徑,從起始角stangle開始到endangle 角結(jié)束,畫一橢圓線。當(dāng)stangle=0,endangle=360 時(shí),則畫出的是一個(gè)完整的橢圓,否則畫出的將是橢圓弧。關(guān)于起始角和終止角規(guī)定如圖8-2 所示。畫圓函數(shù)void far circle(int x,int y,int radius);該函數(shù)將以(x,y)為圓心,radius 為半徑畫個(gè)圓。畫圓弧函數(shù)void far arc(int x,int y,int stangle,int endangle,int radius);該函數(shù)將以(x,y)為圓心,radius 為半徑,從stangle 為起始角開始,到endangle 為結(jié)束角畫一圓弧。畫扇形圖函數(shù)void far pieslice(int x,int y,int stangle,int endangle,int radius);該函數(shù)將以(x,y)為圓心,radius 為半徑,從stangle 為起始角,endangle 為結(jié)束角,畫一扇形圖,扇形圖的填充模式和填充顏色可以事先設(shè)定,否則以缺省模式進(jìn)行。例8.11:該程序?qū)⒂胑11ipse 函數(shù)畫橢圓,從中心為(320,100),起始角為0 度,終止角為360 度,x 軸半徑為75,y 軸半徑為50 畫一橢圓,接著用circle 函數(shù)以(320,220)為圓心以半徑為50 畫圓。然后分別用pieslice 和e11ipse 及arc 函數(shù)在下方面出了一扇形圖和橢圓弧及圓弧。#include void main()int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,);cleardevice();ellipse(320,100,0,360,75,50);circle(320,220,50);pieslice(320,340,30,150,50);ellipse(320,400,0,180,100,35);arc(320,400,180,360,50);getch();closegraph();8.3.5 圖形設(shè)計(jì)舉例例8.12:編寫程序,該程序?qū)⒃诜毙屈c(diǎn)綴的黑色背景中顯示一個(gè)經(jīng)緯線為藍(lán)色的并圍繞著一紅色光環(huán)的地球,光環(huán)時(shí)隱時(shí)現(xiàn),地球也在自西向東轉(zhuǎn)動(dòng),一藍(lán)色宇宙飛船從左自右緩緩飛過(guò),周而復(fù)始。屏幕下方顯示AROUND THE WORLD 字樣。問(wèn)題分析:在上面的問(wèn)題中,我們已能解決的是在圖形模式下畫靜態(tài)的圖形,例如產(chǎn)生星空背景。當(dāng)然,若地球、光環(huán)甚至宇宙飛船不是動(dòng)態(tài)的,我們同樣可以完成。一旦一個(gè)圖形畫在了屏幕上就成為整個(gè)屏幕圖象的一部分。那么如何產(chǎn)生動(dòng)態(tài)的畫面呢?我們知道電影或動(dòng)畫片是由一張張圖象組成的,利用人眼不能
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 轉(zhuǎn)運(yùn)協(xié)議書范本
- 中通快遞倉(cāng)庫(kù)培訓(xùn)體系
- 無(wú)租租車協(xié)議書
- 【課件】探討現(xiàn)代企業(yè)培訓(xùn)與員工持續(xù)發(fā)展的重要性
- 人自愿離婚協(xié)議書
- 《嬰幼兒早期教育》課件
- 專有技術(shù)合作協(xié)議與技術(shù)轉(zhuǎn)讓條款說(shuō)明
- 農(nóng)村牧場(chǎng)畜群托管及護(hù)理協(xié)議
- 配送勞務(wù)分包合同協(xié)議
- 退休合同聘用合同協(xié)議
- GB/T 14315-2008電力電纜導(dǎo)體用壓接型銅、鋁接線端子和連接管
- 《民法》全冊(cè)精講課件
- 小學(xué)語(yǔ)文五年級(jí)知識(shí)競(jìng)賽課件
- 護(hù)理人員業(yè)務(wù)技術(shù)檔案 模板
- 工藝管道儀表流程圖PID基礎(chǔ)知識(shí)入門級(jí)培訓(xùn)課件
- 人音版小學(xué)一年級(jí)音樂(lè)下冊(cè)教案 全冊(cè)
- 草皮鋪種施工方案
- 中醫(yī)養(yǎng)生穴位保健按摩課件
- 回旋鏢運(yùn)動(dòng)軌跡的模擬
- (完整)高血壓病歷以及全套臨床病歷
- 標(biāo)準(zhǔn)溶液配制與標(biāo)定原始記錄(氫氧化鈉)
評(píng)論
0/150
提交評(píng)論