![C語言高級編程技術[紀鋼][1](1).doc_第1頁](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb171.gif)
![C語言高級編程技術[紀鋼][1](1).doc_第2頁](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb172.gif)
![C語言高級編程技術[紀鋼][1](1).doc_第3頁](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb173.gif)
![C語言高級編程技術[紀鋼][1](1).doc_第4頁](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb174.gif)
![C語言高級編程技術[紀鋼][1](1).doc_第5頁](http://file.renrendoc.com/FileRoot1/2020-1/20/9a549bc0-a556-4e63-bef6-af6c6150eb17/9a549bc0-a556-4e63-bef6-af6c6150eb175.gif)
已閱讀5頁,還剩40頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言高級編程技術8 .1 遞歸程序設計C語言支持函數的遞歸調用。遞歸就是函數直接或間接地自己調用自己。常見的遞歸算法有兩種,即算術遞歸與操作遞歸。遞歸的基本思想是,將問題P求解的運算規模或操作步驟進行分解,使求解問題P的運算規模或操作步驟可以由求解一個簡單問題以及在更小規模或更小步驟上求解相同的問題P來組成。當運算規模或操作步驟減少到一定程度時,如果問題P的求解算法可簡單實現,就可以采用遞歸算法來實現問題P的求解。比如,求n!與求(n-1)!的運算方法是一樣的;當n=0時,0!=1。8.1.1 算術遞歸算術遞歸是指一切形式的遞歸算式都可以用遞歸方法求解。例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:用遞歸函數計算兩個正整數的最大公約數。#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 操作遞歸操作遞歸是指實現某種操作的遞歸。例8.3:用遞歸算法實現一維整型數組元素由小到大冒泡排序。#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:用遞歸算法求一正長整型數的各位數字之和。#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 遞歸算法的優缺點遞歸函數的主要優點是可以把算法寫的比使用非遞歸函數時更清晰更簡潔,而且某些問題,特別是與人工智能有關的問題,更適宜用遞歸方法。遞歸算法的缺點,一是需要額外的內存開銷,特別是當遞歸層次較大時,遞歸函數需要占用的堆棧內存空間相當大。二是函數的頻繁調用會降低程序的執行效率。總之,遞歸算法要比解決同樣問題的非遞歸算法效率低一些。內存空間需求更多一些。大多數用遞歸算法解決的問題,都可以找到相應的非遞歸算法,只有少數問題的求解只有遞歸算法。由于遞歸算法具有效率低、內存消耗大等缺點,在設計程序時,若有比較好的非遞歸算法,應盡量采用非遞歸算法。82 文本的屏幕輸出和鍵盤輸入8.2.1 文本的屏幕輸出顯示器的屏幕顯示方式有兩種:文本方式和圖形方式。文本方式就是顯示文本的模式,它的顯示單位是字符而不是圖形方式下的象素,因而在屏幕上顯示字符的位置坐標就用行和列表示。Turbo C 的字符屏幕函數主要包括文本窗口大小的設定、窗口顏色的設置、窗口文本的清除和輸入輸出等函數。這些函數的有關信息(如宏定義等)均包含在conio.h 頭文件中,因此在用戶程序中使用這些函數時,必須用include 將conio.h 包含進程序。1 文本窗口的定義Turbo C 默認定義的文本窗口為整個屏幕,共有80 列25 行的文本單元。如圖8-1 所示,規定整個屏幕的左上角坐標為(1,1),右下角坐標為(80,25),并規定沿水平方向為X軸,方向朝右;沿垂直方向為Y 軸,方向朝下。每個單元包括一個字符和一個屬性,字符即ASCII 碼字符,屬性規定該字符的顏色和強度。除了這種默認的80 列25 行的文本顯示方式外,還可由用戶通過函數:void textmode(int newmode);來顯式地設置Turbo C 支持的5種文本顯示方式。該函數將清除屏幕,以整個屏幕為當前窗口,并移光標到屏幕左上角。newmode 參數的取值見表8-1,既可以用表中指出的方式代碼,又可以用符號常量。LASTMODE 方式指上一次設置的文本顯示方式,它常用于在圖形方式到文本方式的切換。圖8-1表8-1方式符號常量顯示列行數和顏色0BW404025黑白顯示1C404025彩色顯示2BW808025黑白顯示3C808025彩色顯示7MONO8025單色顯示-1LASTMODE上一次的顯示方式Turbo C 也可以讓用戶根據自己的需要重新設定顯示窗口,也就是說,通過使用窗口設置函數window()定義屏幕上的一個矩形域作為窗口。window()函數的函數原型為:void window(int left, int top, int right, int bottom);函數中形參(int left,int top)是窗口左上角的坐標,(int right,int bottom)是窗口的右下角坐標,其中(left,top)和(right,bottom)是相對于整個屏幕而言的。例如,要定義一個窗口左上角在屏幕(20,5)處,大小為30 列15 行的窗口可寫成:window(20, 5, 50, 25);若window()函數中的坐標超過了屏幕坐標的界限,則窗口的定義就失去了意義,也就是說定義將不起作用,但程序編譯鏈接時并不出錯。窗口定義之后,用有關窗口的輸入輸出函數就可以只在此窗口內進行操作而不超出窗口的邊界。一個屏幕可以定義多個窗口,但現行窗口只能有一個(因為DOS 為單任務操作系統)。當需要用另一窗口時,可將定義該窗口的window()函數再調用一次, 此時該窗口便成為現行窗口了。2 文本窗口顏色和其它屬性的設置文本窗口顏色的設置包括背景顏色的設置和字符顏色(既前景色)的設置,使用的函數及其原型為:設置背景顏色函數:void textbackground(int color);設置字符顏色函數:void textcolor(int color);有關顏色的定義見表8-2。表中的符號常數與相應的數值等價,二者可以互換。例如設定藍色背景可以使用textbackground(1),也可以使用textbackground(BLUE),兩者沒有任何區別,只不過后者比較容易記憶,一看就知道是藍色。表8-2 顏色表符號常數數值含義背景或背景BLACK0黑前景、背景色BLUE1藍前景、背景色GREEN2綠前景、背景色CYAN3青前景、背景色RED4紅前景、背景色MAGENTA5洋紅前景、背景色BROWN6棕前景、背景色LIGHTGRAY7淡灰前景、背景色DARKGRAY8深灰用于前景色LIGHTBLUE9淡藍用于前景色LIGHTGREEN10淡綠用于前景色LIGHTCYAN11淡青用于前景色LIGHTRED12淡紅用于前景色LIGHTMAGENTA13淡洋紅用于前景色YELLOW14黃用于前景色WHITE15白用于前景色BLINK128閃爍用于前景色Turbo C 另外還提供了一個函數,可以同時設置文本的字符和背景顏色,這個函數是文本屬性設置函數:void textattr(int attr);參數attr 的值表示顏色形式編碼的信息,每一位代表的含義如下:位76543210Bbbbcccc閃爍背景顏色字符顏色字節低四位cccc 設置字符顏色,46 三位bbb 設置背景顏色,第7位B 設置字符是否閃爍。假如要設置一個藍底黃字,定義方法如下:textattr(YELLOW+(BLUE4);若再要求字符閃爍,定義變為:textattr(128+YELLOW+(BLUE4);注意:(1) 對于背景只有0到7共八種顏色,取大于7小于15 的數,則代表的顏色與減7 后的值對應的顏色相同;(2) 用textbackground()和textcolor()函數設置了窗口的背景與字符顏色后,在沒有用clrscr()函數清除窗口之前,顏色不會改變,直到使用了函數clrscr(),整個窗口和隨后輸出到窗口中的文本字符才會變成新顏色。(3) 用textattr()函數時背景顏色應左移4 位,才能使3 位背景顏色移到正確位置;3 窗口內文本的輸入輸出函數. 窗口內文本的輸出函數前面介紹過的printf(),putc(),puts(),putchar()等輸出函數以整個屏幕為窗口的,它們不受由window 設置的窗口限制,也無法用函數控制它們輸出的位置,但Turbo C 提供了三個文本輸出函數,它們受窗口的控制,窗口內顯示光標的位置,就是它開始輸出的位置。當輸出行右邊超過窗口右邊界時,自動移到窗口內的下一行開始輸出,當輸出到窗口底部邊界時,窗口內的內容將自動產生上卷,直到完全輸出完為止,這三個函數均受當前光標的控制,每輸出一個字符光標后移一個字符位置。這三個輸出函數原型為:int cprintf(char *format,表達式表);int cputs(char *str);int putch(int ch);它們的使用格式同printf(),puts()和putc(),其中cprintf()是將按格式化串定義的字符串或數據輸出到定義的窗口中,其輸出格式串同printf 函數,不過它的輸出受當前光標控制,且輸出特點如上所述,cputs 同puts,是在定義的窗口中輸出一個字符串,而putch()則是輸出一個字符到窗口,它實際上是函數putc 的一個宏定義,即將輸出定向到屏幕。. 窗口內文本的輸入函數可直接使用stdio.h 中的getch()或getche()函數。需要說明的是,getche()函數從鍵盤上獲得一個字,在屏幕上顯示的時候,如果字符超過了窗口右邊界,則會被自動轉移到下一行的開始位置。4 有關屏幕操作的函數void clrscr(void);該函數將清除窗口中的文本,并將光標移到當前窗口的左上角,即(1, 1)處。void clreol(void);該函數將清除當前窗口中從光標位置開始到本行結尾的所有字符,但不改變光標原來的位置。void delline(void);該函數將刪除一行字符,該行是光標所在行。void gotoxy(int x, int y);該函數很有用,用來定位光標在當前窗口中的位置。這里x,y 是指光標要定位處的坐標(相對于窗口而言)。當x, y 超出了窗口的大小時,該函數就不起作用了。int movetext(int x1, int y1, int x2, int y2, int x3, int y3);該函數將把屏幕上左上角為(xl,y1),右下角為(x2,y2)的矩形內文本拷貝到左上角為(x3,y3)的一個新矩形區內。這里x,y 坐標是以整個屏幕為窗口坐標系,即屏幕左上角為(1,1)。該函數與開設的窗口無關,且原矩形區文本不變。int gettext(int xl, int yl, int x2, int y2, void *buffer);該函數將把左上角為(xl,y1),右下角為(x2,y2)的屏幕矩形區內的文本存到由指針buffer指向的一個內存緩沖區內,當操作成功,返回1;否則,返回0。因一個在屏幕上顯示的字符需占顯示存儲器VRAM 的兩個字節,即第一個字節是該字符的ASCII 碼,第二個字節為屬性字節,即表示其顯示的前景、背景色及是否閃爍,所以buffer 指向的內存緩沖區的字節總數的計算為:字節總數=矩形內行數每行列數2其中:矩形內行數=y2-y1+l,每行列數=x2-xl+1(每行列數是指矩形內每行的列數)。矩形內文本字符在緩沖區內存放的次序是從左到右,從上到下,每個字符占連續兩個字節并依次存放。int puttext(int x1, int y1, int x2, int y2, void *buffer);該函數則是將gettext()函數存入內存buffer 中的文字內容拷貝到屏幕上指定的位置。注意:(1) gettext()函數和puttext()函數中的坐標是對整個屏幕而言的,即是屏幕的絕對坐標,而不是相對窗口的坐標;(2) movetext()函數是拷貝而不是移動窗口區域內容,即使用該函數后,原位置區域的文本內容仍然存在。例8.5:下面的程序首先定義了一個字符數組,下標為64,表示用來存四行八列的文本。由于沒有用window 函數設置窗口,因而用缺省值,即全屏幕為一個窗口,程序開始設置80列25 行文本顯示方式(C80),背景色為藍色,前景色為紅色,經clrscr 函數清屏后,設置的背景色才使屏幕背景變藍。gotoxy(10,10)使光標移到第10 行10 列,然后在(10,10)開始位置顯示L:load,接著在下面三行相同的列位置顯示另外三條信息,13 行10 列顯示的E:exit 后面帶有回車換行符,為的是將光標移到下一行開始處,好顯示press any key to continue。當按任一鍵后,gettext 函數將(10,l0,18,13)矩形區的內容存到ch 緩存區內。ch 即上述的四行八列信息,接著設置一個窗口,并縱向寫上1,2,3,4,然后用movetext(),將此窗口內容復制到另一區域,由于此區域包括背景色和顯示的字符,所以被復制到另一區域的內容也是相同的背景色和文本。當按任一鍵后,又出現提示信息,再按鍵,則存在ch緩沖區內的文本由puttext()又復制到開設的窗口內了,注意上述的函數movetext(),gettext(),puttext()均與開設的窗口內坐標無關,而是以整個屏幕為參考系的。#include #include void main()int i;char ch4*8*2; /* 定義ch 字符串數組作為緩存區*/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); /* 存矩形區文存到ch 緩存區*/clrscr();textbackground(1);textcolor(3);window(20,9,34,14); /* 開一個窗口*/clrscr();cprintf(1.rn2.rn3.rn4.rn);/* 縱向寫1,2,3,4 */movetext(20,9,34,14,40,10); /* 將矩形區文本復制到另一區域*/puts(hit any key);getch();clrscr();cprintf(press any key to put text);getch();clrscr();puttext(23,10,31,13,ch); /* 將ch 緩存區所存文本在屏上顯示*/getch();5 狀態查詢函數有時需要知道當前屏幕的顯示方式,當前窗口的坐標、當前光標的位置,文本的顯示屬性等,Turbo C 提供了一些函數得到屏幕文本顯示有關信息的函數:void gettextinfo(struct text_info *f);這里的text_info 是在conio.h 頭文件中定義的一個結構,該結構的定義是struct text_infounsigned char winleft; /* 窗口左上角x 坐標*/unsigned char wintop; /* 窗口左上角y 坐標*/unsigned char winright; /* 窗口右下角x 坐標*/unsigned char winbottom; /* 窗口右下角y 坐標*/unsigned char attributes; /* 文本屬性*/unsigned char normattr; /* 通常屬性*/unsigned char currmode; /* 當前文本方式*/unsigned char screenheight; /* 屏高*/unsigned char screenwidth; /* 屏寬*/unsigned char curx; /* 當前光標的x 值*/unsigned char cury; /* 當前光標的y 值*/;例8.6:下面的程序將屏幕設置成80列彩色文本方式,并開了一個window(1,5,70,20)的窗口,在窗口中顯示了current information of window,然后用gettextinfo 函數得到當前窗口的信息,后面的cprintf()函數將分別顯示出結構text_info 各分量的數值來。#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 鍵盤輸入當我們在鍵盤上按下某鍵時,系統是怎樣知道是哪一個鍵被按下呢?它的奧妙在于計算機鍵盤內有一個微處理器,它用來掃描和檢測每個鍵的按下和拾起狀態。然后以程序中斷的方式(INT 9)與主機通信。ROM 中BIOS 內的鍵盤中斷處理程序,會將一個字節的按鍵掃描碼(掃描碼的06 位標識了每個鍵在鍵盤上的位置,最高位標識按鍵的狀態,0 對應該鍵是被按下;1 對應松開。它并不能區別大小寫字母,而且一些特殊鍵如PrintScreen 等不產生掃描碼直接引起中斷調用)翻譯成對應的ASCII 碼。由于ASCII 碼僅有256 個(28),它不能將PC 鍵盤上的鍵全部包括,因此有些控制鍵如CTRL,ALT,END,HOME,DEL 等用擴充的ASCII 碼表示,擴充碼用兩個字節的數表示。第一個字節是0,第二個字節是0255 的數,鍵盤中斷處理程序將把轉換后的擴充碼存放在Ax 寄存器中,存放格式如表8-3 所示。對字符鍵,其擴充碼就是其ASCII 碼。表8-3 鍵盤掃描碼鍵名AHAL字符鍵擴充碼=ASCII 碼ASCII 碼功能鍵/組合鍵擴充碼0是否有鍵按下,何鍵按下,簡單的應用中可采用兩種辦法:一是直接使用Turbo C 提供的鍵盤操作函數bioskey()來識別,二是通過int86()函數,調用BIOS的INT 16H,功能號為0 的中斷。它將按鍵的掃描碼存放在Ax 寄存器的高字節中。函數bioskey()的原型為:int bioskey(int cmd);它在bios.h 頭文件中進行了說明,參數cmd 用來確定bioskey()如何操作:cmd操作0bioskey()返回按健的鍵值,該值是2 個字節的整型數。若沒有鍵按下,則該函數一直等待,直到有鍵按下。當按下時,若返回值的低8 位為非零,則表示為普通鍵,其值代表該鍵的ASCII 碼。若返回值的低8 位為0,則高8 位表示為擴展的ASCII碼,表示按下的是特殊功能鍵。1bioskey()查詢是否有鍵按下。若返回非0 值,則表示有鍵按下,若為0 表示沒鍵按下。2bioskey()將返回一些控制鍵是否被按過,按過的狀態由該函數返回的低8 位的各位值來表示:字節位對應的16 進制數含義00x01右邊的shift 鍵被按下10x02左邊的shift 鍵被按下20x04Ctrl鍵被按下30x08Alt 鍵被按下40x10Scroll Lock 已打開50x20Num Lock 已打開60x40Caps Lock 已打開70x80Insert 已打開當某位為l 時,表示相應的鍵已按,或相應的控制功能已有效,如選參數cmd 為2,若key 值為0x09,則表示右邊的shift 鍵被按,同時又按了Alt 鍵。函數int86 ()的原型為:int int86(int intr_num,union REGS *inregs,union REGS *outregs);這個函數在bios.h 頭文件中進行了說明,它的第一個參數intr_num 表示BIOS 調用類型號,相當于int n 調用的中斷類型號n,第二個參數表示是指向聯合類型REGS 的指針,它用于接收調用的功能號及其它一些指定的入口參數,以便傳給相應的寄存器,第三個參數也是一個指向聯合類型REGS 的指針,它用于接收功能調用后的返回值,即出口參數,如調用的結果,狀態信息,這些值從相關寄存器中得到。例8.7 bioskey()函數的使用。#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 圖形程序設計計算機圖形程序設計是程序設計中比較難但吸引人的部分。因在ANSI C中沒有對圖形庫的要求,所以不同版本的C語言編譯程序提供的圖形函數不一樣。本節以Turbo C的圖形庫來介紹圖形程序設計。8.3.1 圖形模式的初始化要進行圖形程序設計,就要將屏幕顯示模式設置為圖形模式。要設置圖形模式,可以用Turbo C提供的圖形初始化函數: void far initgraph(int far *gdriver,int far *gmode,char far *pathtodriver);其中,gdriver表示圖形驅動器,gmode表示圖形模式,pathtodriver表示圖形驅動程序所在的目錄路徑,若圖形驅動程序在Turbo C的默認目錄下,可將參數pathtodriver設置為空字符串( )。若不知道所用的圖形顯示器適配器的種類,在調用圖形初始化函數時,設置參數gdriver的值為0或DETECT,由系統自動進行硬件檢測。Turbo C提供的圖形驅動器、模式的符號常量及數值的意義參見Turbo C提供的graphics.h文件。Turbo C提供的圖形與字形驅動文件見表8-4 表8-4 Turbo C 圖形與字形驅動文件表文件名用途ATT.BGIAT&T圖形驅動文件CGA.BGICGA圖形驅動文件EGAVGA.BGIEGA和VGA圖形驅動文件IBM8514.BGIIBM8514圖形驅動文件GOTH.CHR歌特筆劃字形文件LITT.CHR小號筆劃字形文件SANS.CHR無襯線矢量筆劃字形文件TRIP.CHR三重矢量筆劃字形文件如在程序的開始部分可進行如下的描述:#include#includevoid main( ) int gd=DETECT,gm; /* 自動檢測 */initgraph(&gd,& gm, ); /* 圖形模式初始化 */ 8.3.2 圖形模式下的坐標系坐標系下每一個點,就是一個圖形象素點。CGA 320320 2色EGA 640480 16色VGA 640480 16色在640480模式下,其屏幕坐標點的表示為:屏幕原點坐標(0,0),最大坐標(639,479) (0,0) (639,479)8.3.3 屏幕圖形的色彩與相關操作在C語言中,圖形模式的屏幕顏色設置分為背景色的設置和作圖色的設置。背景色的設置通過對函數setbkcolor (int color ), 作圖色的設置通過對函數setcolor (int color )的調用來實現。其中int color為整型數據,取值范圍為015,數字的表示的顏色見前面的顏色參數表。背景和前景色可以有16種顏色。(這種方式成為調色板方式)圖形屏幕相關的操作的主要函數如表8-5所示:表8-5 屏幕圖形的色彩與相關操作的函數函數功能cleardevice( ) 清除圖形屏幕clearriwport( ) 清除當前視區setbkcolor( )設置圖形背景顏色setcolor( )設置圖形前顏色setfillstyle( )設置填充模式和填充顏色settextstyle( )設置文本字符的顯示模式closegraph( )關閉圖形系統,返回文本方式幾個函數的說明如下:(1)setfillstyle()為填充函數,其作用是對圖形內部填充顏色,函數原型為:void far setfillstyle(int pattern, int color);其中,pattern表示填充模式,color表示顏色參數。 pattern的取值見表8-6表8-6 圖形填充模式表符號數值描述EMPTY_FILL0用背景色填充SOLID_FILL1單色填充LIN_FILL2用一填充LTSLASH_FILL3用/填充SLASH_FILL4用粗填充BKSLASH_FILL5用粗/填充LIBKSLASH_FILL6用填充HATCH_FILL7用淡影線填充XHATCH_FILL8用交叉線填充INTERLEAVE_FILL9用間隔線填充WIND_EDOT_FILL10用稀疏空白點填充CLOSEDOT_FILL11用密集空的點填充USER_FILL12用戶定義的填充模式(2)settextstyle()函數,用于設置文本字符串的字型、輸出方向和字符大小。函數原型為:void far settextstyle(int font, int direction, int charsize);其中,font用于設置字符的字體,其取值見表8-7direction用于設置字符輸出方向,其取值見表8-8charsize用于設置字符大小,其取值見表8-9表8-7 font的取值符號常量數值含義DEFAULT_FONT08*8點陣字(缺省值)TRIPLEX_FONT13倍筆劃字體SMALL_FONT2小號筆劃字體SANS_SERIF_FONT3無襯線筆劃字體GOTHIC_FONT4黑體筆劃字體表8-8 direction的取值符號常量數值含義HORIZ_DIR0從左到右VERT_DIR1從底到頂表8-9 charsize的取值符號常量或數值含義符號常量或數值含義18*8點陣756*56點陣216*16點陣864*64點陣324*24點陣972*72點陣432*320點陣1080*80點陣540*40點陣USER_CHAR_SIZE=0用戶定義的字符大小648*48點陣8.3.4 基本繪圖函數圖形由點、線、面組成,Turbo C 提供了一些函數,以完成這些操作,而所謂面則可由對封閉圖形填上顏色來實現。1) 畫點函數void far putpixel(int x,int y,int color);該函數表示在指定的x,y 位置畫一點,點的顯示顏色由設置的color值決定,關于顏色的設置,將在設置顏色函數中介紹。int far getpixel(int x,int y);該函數與putpixel()相對應,它得到在(x,y)點位置上的象素的顏色值。例88:下面是一個畫點的程序,它將在y=20 的恒定位置上,沿x 方向從x=200 開始,連續畫兩個點(間距為4 個象素位置),又間隔16 個點位置,再畫兩個點,如此循環,直到x=300 為止,每畫出的兩個點中的第一個由putpixel(x,20,1)所畫,第二個則由putplxel(x+4,20,2)畫出,顏色值分別設為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) 有關畫圖坐標位置的函數在屏幕上畫線時,如同在紙上畫線一樣。畫筆要放在開始畫圖的位置,并經常要抬筆移動,以便到另一位置再畫。我們也可想象在屏上畫圖時,有一無形的畫筆,可以控制它的定位、移動(不畫),也可知道它能移動的最大位置限制等。完成這些功能的函數是:移動畫筆到指定的(x,y)位置,移動過程不畫:void far moveto(int x,int y);畫筆從現行位置(x,y)處移到一位置增量處(x+dx,y+dx),移動過程不畫:void far moverel(int dx,int dy);得到當前畫筆所在位置int far getx(void);得到當前畫筆的x 位置int far gety(void);得到當前畫筆的y 位置3) 畫線函數這類函數提供了從一個點到另一個點用設定的顏色畫一條直線的功能,起始點的設定方法不同,因而有下面不同的畫線函數:兩點之間畫線函數。void far line(int x0,int y0,int x1,int y1);從(x0,y0)點到(x1,y1)點畫一直線。從現行畫筆位置到某點畫線函數。void far lineto(int x,int y);將從現行畫筆位置到(x,y)點畫一直線。從現行畫筆位置到一增量位置畫線函數void far linerel(int dx,int dy);將從現行畫筆位置(x,y)到位置增量處(x+dx,y+dy)畫一直線。例8.9:下面的程序將用moveto 函數將畫筆移到(100,20)處,然后從(100,20)到(100,80)用1ineto 函數畫一直線。再將畫筆移到(200,20)處,用lineto 畫一直線到(100,80)處,再用line 函數在(100,90)到(200,90)間連一直線。接著又從上次1ineto 畫線結束位置開始(它是當前畫筆的位置),即從(100,80)點開始到x 增量為0,y 增量為20 的點(100,100)為止用linerel 函數畫一直線。moverel(-100,0)將使畫筆從上次用1inerel(0,20)畫直線時的結束位置(100,100)處開始移到(100-100,100-0),然后用linerel(30,20)從(0,100)處再畫直線至(0+30,100+20)處。用line 函數畫直線時,將不考慮畫筆位置,它也不影響畫筆原來的位置,lineto 和1inerel要求畫筆位置,畫線起點從此位置開始,而結束位置就是畫筆畫線完后停留的位置,故這兩個函數將改變畫筆的位置。#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) 畫矩形和條形圖函數畫矩形函數rectangle 將畫出一個矩形框,而畫條形函數bar 將以給定的填充模式和填充顏色畫出一個條形圖,而不是一個條形框,關于填充模式和顏色將在后面介紹。畫矩形函數void far rectangle(int xl,int y1,int x2,int y2);該函數將以(x1,y1)為左上角,(x2,y2)為右下角畫一矩形框。畫條形圖函數void bar(int x1,int y1,int x2,int y2);該函數將以(xl,y1)為左上角,(x2,y2)為右下角畫一實形條狀圖,沒有邊框,圖的顏色和填充模式可以設定。若沒有設定,則使用缺省模式。例8.10:下面的程序將由rectangle 函數以(100,20)為左上角,(200,50)為右下角畫一矩形,接著又由bar 函數以(100,80)為左上角,(150,180)為右下角畫一實形條狀圖,用缺省顏色(白色)填充。#include void main()int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,);cleardevice();rectangle(100,20,200,50);bar(100,80,150,180);getch();closegraph();5) 畫橢圓、圓和扇形圖函數在畫圖的函數中,有關于角的概念。在Turbo C 中是這樣規定的:屏的x 軸方向為0 度,當半徑從此處逆時針方向旋轉時,則依次是90 度、180 度、270 度,當360 度時,則和x軸正向重合,即旋轉了一周。如圖8-2 所示。圖8-2 起始角和終止角畫橢圓函數void ellipse(int x,int y,int stangle,int endangel,int xradius,int yradius);該函數將以(x,y)為中心,以xradius 和yradius 為x 軸和y 軸半徑,從起始角stangle開始到endangle 角結束,畫一橢圓線。當stangle=0,endangle=360 時,則畫出的是一個完整的橢圓,否則畫出的將是橢圓弧。關于起始角和終止角規定如圖8-2 所示。畫圓函數void far circle(int x,int y,int radius);該函數將以(x,y)為圓心,radius 為半徑畫個圓。畫圓弧函數void far arc(int x,int y,int stangle,int endangle,int radius);該函數將以(x,y)為圓心,radius 為半徑,從stangle 為起始角開始,到endangle 為結束角畫一圓弧。畫扇形圖函數void far pieslice(int x,int y,int stangle,int endangle,int radius);該函數將以(x,y)為圓心,radius 為半徑,從stangle 為起始角,endangle 為結束角,畫一扇形圖,扇形圖的填充模式和填充顏色可以事先設定,否則以缺省模式進行。例8.11:該程序將用e11ipse 函數畫橢圓,從中心為(320,100),起始角為0 度,終止角為360 度,x 軸半徑為75,y 軸半徑為50 畫一橢圓,接著用circle 函數以(320,220)為圓心以半徑為50 畫圓。然后分別用pieslice 和e11ipse 及arc 函數在下方面出了一扇形圖和橢圓弧及圓弧。#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 圖形設計舉例例8.12:編寫程序,該程序將在繁星點綴的黑色背景中顯示一個經緯線為藍色的并圍繞著一紅色光環的地球,光環時隱時現,地球也在自西向東轉動,一藍色宇宙飛船從左自右緩緩飛過,周而復始。屏幕下方顯示AROUND THE WORLD 字樣。問題分析:在上面的問題中,我們已能解決的是在圖形模式下畫靜態的圖形,例如產生星空背景。當然,若地球、光環甚至宇宙飛船不是動態的,我們同樣可以完成。一旦一個圖形畫在了屏幕上就成為整個屏幕圖象的一部分。那么如何產生動態的畫面呢?我們知道電影或動畫片是由一張張圖象組成的,利用人眼不能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 煙草設備智能制造與大數據分析考核試卷
- 鹽行業競爭戰略與發展方向考核試卷
- 小學四年級數學四則運算練習題50道
- 7-3寄存器傳輸語言
- 洛陽商業職業學院《實驗診斷E》2023-2024學年第二學期期末試卷
- 四川省遂寧蓬溪縣聯考2024-2025學年初三5月中考模擬試題英語試題試卷含答案
- 四川輕化工大學《智能微電網控制技術》2023-2024學年第二學期期末試卷
- 內蒙古呼和浩特市賽罕區2025屆初三3月月考語文試題含解析
- 江西省鷹潭市余江區2024-2025學年三下數學期末檢測試題含解析
- 江西省彭澤縣湖西中學2024-2025學年普通高中教育教學質量監測考試(1月)生物試題含解析
- 數字圖像處理在航空航天中的應用
- 中水回用機房設備安裝
- 2024年初級統計師《統計專業知識和實務》真題
- (新版)制絲操作工(二級)理論考試復習題庫-上(單選題匯總)
- 手術室實踐指南術中輸血操作護理課件
- 食品投訴處理培訓課件
- 郵政快遞員工培訓課件
- 《臨床營養學》課件
- 被執行人生活費申請書范文
- 2024年江蘇省鐵路集團有限公司招聘筆試參考題庫含答案解析
- 社區成人血脂管理中國專家共識2024(完整版)
評論
0/150
提交評論