




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。C語言高級編程1C語言高級編程技術(shù)8.1遞歸程序設(shè)計8.1.1遞歸與遞歸程序設(shè)計遞歸技術(shù)在算法和程序設(shè)計中是一種十分有用的技術(shù),C語言提供了支持遞歸定義的機制和手段。遞歸有直接遞歸和間接遞歸兩種。在一個函數(shù)的定義中出現(xiàn)了對自身的調(diào)用,稱之為直接遞歸;一個函數(shù)f的定義中包含了對函數(shù)g的調(diào)用,而g的實現(xiàn)過程又調(diào)用了f,即函數(shù)調(diào)用形成了一個環(huán)狀調(diào)用鏈,這種方式稱之為間接遞歸。PAGE#頁:#例8.1編寫一個遞歸函數(shù),求n的階乘值n!。若用fact(n)表示n的階乘值,根據(jù)階乘的數(shù)學(xué)定義可知:顯然,當(dāng)n0時,f
2、act(n)是建立在fact(n-1)的基礎(chǔ)上。由于求解fact(n-1)的過程與求解fact(n)的過程完全相同,只是具體實參不同,因而在進行程序設(shè)計時,不必再仔細考慮fact(n-1)的具體實現(xiàn),只需借助遞歸機制進行自身調(diào)用即可。于是求n的階乘值fact(n)的具體實現(xiàn)為:longfact(intn)longm;if(n=0)return(1);elsem=n*fact(n-1);return(m);例8.2編寫一個遞歸函數(shù),求Fibonacci數(shù)列第n項的值。若用Fibona(n)表示Fibonacci數(shù)列第n項的值,根據(jù)Fibonacci數(shù)列的計算公式:可知當(dāng)n2時,F(xiàn)ibonacci
3、數(shù)列第n項的值等于第n-1項的值與第n-2項的值相加之和,而Fibonacci數(shù)列第n-1項和第n-2項值的求解又分別取決于它們各自前兩項之和。總之,F(xiàn)ibona(n-1)和Fibona(n-2)的求解過程與Fibona(n)的求解過程相同,只是具體實參不同。利用以上這種性質(zhì),我們在進行程序設(shè)計時便可以使用遞歸技術(shù),F(xiàn)ibona(n-1)和Fibona(n-2)的求解只需調(diào)用函數(shù)Fibona自身加以實現(xiàn)即可。具體實現(xiàn)為:intFibona(intn)intm;if(n=1|n=2)return(1);elsem=Fibona(n-1)+Fibona(n-2);return(m);從上面兩個實例
4、可以看出,要使用遞歸技術(shù)進行程序設(shè)計,首先必須將要求解的問題分解成若干子問題,這些子問題的結(jié)構(gòu)與原問題的結(jié)構(gòu)相同,但規(guī)模較原問題小。由于子問題與原問題結(jié)構(gòu)相同,因而它們的求解過程相同,在進行程序設(shè)計時,不必再仔細考慮子問題的求解,只需借助遞歸機制進行函數(shù)自身調(diào)用加以實現(xiàn),然后利用所得到的子問題的解組合成原問題的解即可;而遞歸程序在執(zhí)行過程中,通過不斷修改參數(shù)進行自身調(diào)用,將子問題分解成更小的子問題進行求解,直到最終分解成的子問題可以直接求解為止。綜上所述,遞歸程序設(shè)計具有以下兩個特點:(1)具備遞歸出口。遞歸出口定義了遞歸的終止條件,當(dāng)程序的執(zhí)行使它得到滿足時,遞歸執(zhí)行過程便終止。有些問題的遞
5、歸程序可能存在幾個遞歸出口;(2)在不滿足遞歸出口的情況下,根據(jù)所求解問題的性質(zhì),將原問題分解成若干子問題,子問題的求解通過以一定的方式修改參數(shù)進行函數(shù)自身調(diào)用加以實現(xiàn),然后將子問題的解組合成原問題的解。遞歸調(diào)用時,參數(shù)的修改最終必須保證遞歸出口得以滿足。8.1.2遞歸程序執(zhí)行過程的分析遞歸程序的執(zhí)行過程分為遞推和回歸兩個階段。在遞推階段,把較復(fù)雜的問題(規(guī)模為n)的求解推到比原問題簡單一些的問題(規(guī)模小于n)的求解。例如例8.2中,求解Fibona(n),把它推到求解Fibona(n-1)和Fibona(n-2)。即是說,為計算Fibona(n),必須先計算Fibona(n-1)和Fibon
6、a(n-2),而計算Fibona(n-1)和Fibona(n-2),又必須先計算Fibona(n-3)和Fibona(n-4)。依次類推,直至計算Fibona(1)和Fibona(2),分別能立即得到結(jié)果1和1。在遞推階段,必須要有終止遞歸的情況。例如在函數(shù)Fibona中,當(dāng)n為1和2的情況。在回歸階段,當(dāng)獲得最簡單情況的解后,逐級返回,依次得到稍復(fù)雜問題的解,例如得到Fibona(1)和Fibona(2)后,返回得到Fibona(3)的結(jié)果,在得到了Fibona(n-1)和Fibona(n-2)的結(jié)果后,返回得到Fibona(n)的結(jié)果。在編寫遞歸函數(shù)時要注意,函數(shù)中的局部變量和參數(shù)知識局限
7、于當(dāng)前調(diào)用層,當(dāng)遞推進入“簡單問題”層時,原來層次上的參數(shù)和局部變量便被隱蔽起來。在一系列“簡單問題”層,它們各有自己的參數(shù)和局部變量。由于遞歸引起一系列的函數(shù)調(diào)用,并且可能會有一系列的重復(fù)計算,遞歸算法的執(zhí)行效率相對較低。當(dāng)某個遞歸算法能較方便地轉(zhuǎn)換成遞推算法時,通常按遞推算法編寫程序。例如上例計算斐波那契數(shù)列的第n項的函數(shù)Fibona(n)應(yīng)采用遞推算法,即從斐波那契數(shù)列的前兩項出發(fā),逐次由前兩項計算出下一項,直至計算出要求的第n項。由于遞歸調(diào)用是對函數(shù)自身的調(diào)用,在一次函數(shù)調(diào)用未結(jié)束之前又開始了另一次函數(shù)調(diào)用。這時為函數(shù)的運行所分配的空間在結(jié)束之前是不能回收的,必須保留。這也意味著函數(shù)自
8、身的每次不同調(diào)用,就需要分配不同的空間。只有當(dāng)最后一次調(diào)用結(jié)束后,才釋放最后一次調(diào)用所分配的空間,然后返回上一層調(diào)用,調(diào)用結(jié)束后,釋放調(diào)用所分配的空間,再返回它的上一層調(diào)用,這樣逐層返回,直至返回到第一次調(diào)用,當(dāng)?shù)谝淮握{(diào)用結(jié)束后,釋放調(diào)用所分配的空間,整個遞歸調(diào)用才完成。在例8.1中,給出了一個求階乘的函數(shù)。下面以求4!為例,其調(diào)用過程如圖8-1所示。要求4!,即要求的fact(4)值。圖8-1遞歸函數(shù)調(diào)用的執(zhí)行過程8.1.3遞歸算法的優(yōu)缺點遞歸函數(shù)的主要優(yōu)點是可以把算法寫的比使用非遞歸函數(shù)時更清晰更簡潔,而且某些問題,特別是與人工智能有關(guān)的問題,更適宜用遞歸方法。遞歸算法的缺點,一是需要額外
9、的內(nèi)存開銷,特別是當(dāng)遞歸層次較大時,遞歸函數(shù)需要占用的堆??臻g相當(dāng)大。二是遞歸引起一系列的函數(shù)調(diào)用,并且可能會有一系列的重復(fù)計算,遞歸算法的執(zhí)行效率相對較低??傊?,遞歸算法要比解決同樣問題的非遞歸算法效率低一些。內(nèi)存空間需求更多一些。大多數(shù)用遞歸算法解決的問題,都可以找到相應(yīng)的非遞歸算法,只有少數(shù)問題的求解只有遞歸算法。由于遞歸算法具有效率低、內(nèi)存消耗大等缺點,在設(shè)計程序時,若有比較好的非遞歸算法,應(yīng)盡量采用非遞歸算法。8.1.4遞歸程序設(shè)計的應(yīng)用實例例8.3編程實現(xiàn)將正整數(shù)轉(zhuǎn)換為字符串。要求在主函數(shù)中輸入正整數(shù),轉(zhuǎn)換以及輸出編一遞歸函數(shù)完成。本例的關(guān)鍵在于設(shè)計一個遞歸函數(shù)完成正整數(shù)n到字符串
10、的轉(zhuǎn)換,實現(xiàn)該函數(shù)的一個基本思想為:從高位到低位分別取出n的每一位上的數(shù)字,將它們轉(zhuǎn)換成對應(yīng)的字符后,按其原有的順序輸出;而在此轉(zhuǎn)換過程中,將n前面的若干位(除個位外)對應(yīng)的整數(shù)轉(zhuǎn)換成字符串的過程與將整個整數(shù)轉(zhuǎn)換成字符串的過程完全相同,只是處理的對象不同,因此可以通過遞歸調(diào)用實現(xiàn),然后在此基礎(chǔ)上再將n的個位數(shù)字轉(zhuǎn)換成字符輸出即可。顯然,若n前面的若干位(除個位外)對應(yīng)的整數(shù)為0時,遞歸調(diào)用應(yīng)該終止。程序為:#includevoidconvert(intn)inti,c;if(i=n/10)!=0)convert(i);c=n%10+0;putchar(c);voidmain()inta;sca
11、nf(%d,&a);convert(a);例8.4編程求兩個正整數(shù)的最大公約數(shù)。要求編寫一個遞歸函數(shù)求最大公約數(shù)。求最大公約數(shù)gcd(m,n)的求解公式為:由于以上最大公約數(shù)的定義本身即為遞歸定義,因此采用遞歸方式實現(xiàn)求m和n的最大公約數(shù)問題十分方便,將n=0作為遞歸的終止條件,其它情況只需按公式進行遞歸調(diào)用即可。程序為:#includeintgcd(intm,intn)intk;if(n=0)return(m);elseif(nm)return(gcd(n,m);elsek=m%n;return(gcd(n,k);voidmain()inta,b;scanf(%d%d,&a,&b);prin
12、tf(%d,gcd(a,b);例8.5漢諾塔(Hanoi)問題。漢諾塔問題是一個著名的問題。約十九世紀末,在歐洲的商店中出售一種智力玩具,在一塊銅板上有三根桿,最左邊的桿上自上而下、由小到大順序串著由64個圓盤構(gòu)成的塔,游戲的目的是將最左邊A桿上的圓盤,借助最右邊的C桿,全部移到中間的B桿上,條件是一次僅能移動一個盤,且不允許大盤放在小盤的上面。如圖8-2所示。圖8-2漢諾塔由于問題中給出的圓盤移動條件是:一次僅能移動一個盤,且不允許大盤放在小盤的上面,這樣64個盤子的移動次數(shù)是:18,446,744,073,709,551,616。這是一個天文數(shù)字,若每一微秒可能計算(并不輸出)一次移動,那
13、么也需要幾乎一百萬年。我們僅能找出問題的解決方法并解決較小n值時的漢諾塔,但目前由于計算機的速度還不夠快,尚不可能用計算機解決64層的漢諾塔。按照上面給出的方法分析問題,找出移動圓盤的遞歸算法。設(shè)要解決的漢諾塔共有n個圓盤,對A桿上的全部n個圓盤從小到大順序編號,最小的圓盤為1號,次之為2號,依次類推,則最下面最大的圓盤的編號為n。第1步,先將問題簡化。假設(shè)A桿上只有一個圓盤,即漢諾塔只有一層n=1,則只要將1號盤從A桿上移到B桿上即可。第2步,對于一個有n(n1)個圓盤的漢諾塔,將n個圓盤分為兩部分:上面的n-1個圓盤和最下面的n號圓盤。第3步,將上面的n-1個圓盤看成一個整體,為了解決n個
14、圓盤的漢諾塔,可以按如下方式進行操作:A桿上面的n-1個盤子,借助B桿,移到C桿上(如圖8-3所示);圖8-3A桿上剩下的n號盤子移到B桿上(如圖8-4所示);圖8-4整理上述分析結(jié)果,把第1步中化簡問題的條件作為遞歸結(jié)束條件,將第3步分析得到的算法作為遞歸算法,可以寫出如下完整的遞歸算法描述。定義一個函數(shù)movedisc(n,Aneedle,Bneedle,Cneedle)。該函數(shù)的功能是:將Aneedle桿上的n個圓盤,借助Cneedle桿,移動到Bneedle桿上。這樣移動n個圓盤的遞歸算法描述如下:movedisc(n,Aneedle,Bneedle,Cneedle)if(n=1)將n
15、號圓盤從Aneedle上移到Bneedle;elsemovedisc(n-1,Aneedle,Cneedle,Bneedle)將n號圓盤從Aneedle上移到Bneedle;movedisc(n-1,Cneedle,Bneedle,Aneedle)按照上述算法可以編出如下程序。#includeinti=0;/*移動圓盤數(shù)量計數(shù)器*/voidmovedisc(unsignedintn,charAneedle,charBneedle,charCneedle)if(n=1)printf(%2d-(%2d):%c=%cn,+i,n,Aneedle,Bneedle);/*將Aneedle上的一個圓盤移到
16、Bneedle上*/elsemovedisc(n-1,Aneedle,Cneedle,Bneedle);/*將Aneedle上的n-1個圓盤借助Bneedle移到Cneedle上*/printf(%2d-(%2d):%c=%cn,+i,n,Aneedle,Bneedle);/*將Aneedle上的一個圓盤移到Bneedle上*/movedisc(n-1,Cneedle,Bneedle,Aneedle);/*將Cneedle上的n-1個圓盤借助Aneedle移到Bneedle上*/voidmain()unsignedn;printf(Pleaseenterthenumberofdiscs:);s
17、canf(%d,&n);/*輸入n值*/movedisc(n,a,b,c);/*將A上的n個圓盤借助C將移動到B上*/printf(tTotal:%dn,i);8.2文本的屏幕輸出和鍵盤輸入8.2.1文本的屏幕輸出顯示器的屏幕顯示模式有兩種:文本方式和圖形方式。文本方式就是只能顯示字符的方式,在文本模式下屏幕上可以顯示的最小單位是字符。在文本模式下,坐標(biāo)原點在屏幕左上角,其坐標(biāo)為(1,1),X軸為水平方向,Y軸為垂直方向。TurboC的字符屏幕函數(shù)主要包括文本窗口大小的設(shè)定、窗口顏色的設(shè)置、窗口文本的清除和輸入輸出等函數(shù)。這些函數(shù)的有關(guān)信息均包含在conio.h頭文件中,因此在用戶程序中使用這
18、些函數(shù)時,必須用include預(yù)處理命令將conio.h包含進程序。1)文本窗口的定義TurboC默認定義的文本窗口為整個屏幕,共有80列25行的文本單元。除了這種默認的80列25行的文本顯示方式外,還可由用戶通過textmode()函數(shù)來顯式地設(shè)置TurboC支持的文本顯示方式。Textmode()函數(shù)的函數(shù)原型為:voidtextmode(intnewmode);該函數(shù)將清除屏幕,以整個屏幕為當(dāng)前窗口,并移光標(biāo)到屏幕左上角。newmode參數(shù)的取值見表8-1,既可以用表中指出的方式代碼,又可以用符號常量。LASTMODE方式指上一次設(shè)置的文本顯示方式,它常用于在圖形方式到文本方式的切換。方
19、式符號常量顯示列行數(shù)和顏色0BW404025黑白顯示1C404025彩色顯示2BW808025黑白顯示3C808025彩色顯示7MONO8025單色顯示-1LASTMODE上一次的顯示方式表8-1TurboC支持的6種顯示方式TurboC也允許用戶根據(jù)自己的需要通過使用窗口設(shè)置函數(shù)window()重新設(shè)定顯示窗口。window()函數(shù)的函數(shù)原型為:voidwindow(intleft,inttop,intright,intbottom);函數(shù)中形參(intleft,inttop)是窗口左上角的坐標(biāo),(intright,intbottom)是窗口的右下角坐標(biāo),其中(left,top)和(righ
20、t,bottom)是相對于整個屏幕而言的。例如,要定義一個窗口左上角在屏幕(20,5)處,大小為30列15行的窗口可寫成:window(20,5,50,25);若window()函數(shù)中的坐標(biāo)超過了屏幕坐標(biāo)的界限,則窗口的定義就失去了意義,也就是說定義將不起作用,但程序編譯連接時并不出錯。窗口定義之后,用有關(guān)窗口的輸入輸出函數(shù)就可以只在此窗口內(nèi)進行操作而不超出窗口的邊界。一個屏幕可以定義多個窗口,但現(xiàn)行窗口只能有一個(因為DOS為單任務(wù)操作系統(tǒng))。當(dāng)需要用另一窗口時,可將定義該窗口的window()函數(shù)再調(diào)用一次,此時該窗口便成為現(xiàn)行窗口了。2)文本窗口顏色和其它屬性的設(shè)置文本窗口顏色的設(shè)置包括
21、背景顏色的設(shè)置和字符顏色(即前景色)的設(shè)置,使用的函數(shù)及其原型為:設(shè)置背景顏色函數(shù):voidtextbackground(intcolor);設(shè)置字符顏色函數(shù):voidtextcolor(intcolor);有關(guān)顏色的定義見表8-2。表中的符號常數(shù)與相應(yīng)的數(shù)值等價,二者可以互換。例如設(shè)定藍色背景可以使用textbackground(1),也可以使用textbackground(BLUE),兩者沒有任何區(qū)別。符號常數(shù)數(shù)值含義背景或背景BLACK0黑前景、背景色BLUE1藍前景、背景色GREEN2綠前景、背景色CYAN3青前景、背景色RED4紅前景、背景色MAGENTA5洋紅前景、背景色BROWN
22、6棕前景、背景色LIGHTGRAY7淡灰前景、背景色DARKGRAY8深灰用于前景色LIGHTBLUE9淡藍用于前景色LIGHTGREEN10淡綠用于前景色LIGHTCYAN11淡青用于前景色LIGHTRED12淡紅用于前景色LIGHTMAGENTA13淡洋紅用于前景色YELLOW14黃用于前景色WHITE15白用于前景色BLINK128閃爍用于前景色表8-2顏色表TurboC另外還提供了一個函數(shù),可以同時設(shè)置文本的字符和背景顏色,這個函數(shù)是文本屬性設(shè)置函數(shù),其函數(shù)原型為:voidtextattr(intattr);參數(shù)attr的值表示顏色形式編碼的信息,每一位代表的含義如下:位7654321
23、0Bbbbcccc閃爍背景顏色字符顏色字節(jié)低四位cccc設(shè)置字符顏色,46三位bbb設(shè)置背景顏色,第7位B設(shè)置字符是否閃爍。假如要設(shè)置一個藍底黃字,定義方法如下:textattr(YELLOW+(BLUE4);若再要求字符閃爍,定義變?yōu)椋簍extattr(128+YELLOW+(BLUE4);注意:(1)對于背景只有0到7共八種顏色,取大于7小于15的數(shù),則代表的顏色與減8后的值對應(yīng)的顏色相同;(2)用textbackground()和textcolor()函數(shù)設(shè)置了窗口的背景與字符顏色后,在沒有用clrscr()函數(shù)清除窗口之前,顏色不會改變,直到使用了函數(shù)clrscr(),整個窗口和隨后輸
24、出到窗口中的文本字符才會變成新顏色。(3)用textattr()函數(shù)時背景顏色應(yīng)左移4位,才能使3位背景顏色移到正確位置。3)窗口內(nèi)文本的輸入輸出函數(shù)(1)窗口內(nèi)文本的輸出函數(shù)前面介紹過的printf(),putc(),puts(),putchar()等輸出函數(shù)以整個屏幕為窗口的,它們不受由window設(shè)置的窗口限制,也無法用函數(shù)控制它們輸出的位置,但TurboC提供了三個文本輸出函數(shù),它們受窗口的控制,窗口內(nèi)顯示光標(biāo)的位置,就是它開始輸出的位置。當(dāng)輸出行右邊超過窗口右邊界時,自動移到窗口內(nèi)的下一行開始輸出,當(dāng)輸出到窗口底部邊界時,窗口內(nèi)的內(nèi)容將自動產(chǎn)生上卷,直到完全輸出完為止,這三個函數(shù)均受
25、當(dāng)前光標(biāo)的控制,每輸出一個字符光標(biāo)后移一個字符位置。這三個輸出函數(shù)原型為:intcprintf(char*format,表達式表);intcputs(char*str);intputch(intch);它們的使用格式同printf(),puts()和putc(),其中cprintf()是將按格式化串定義的字符串或數(shù)據(jù)輸出到定義的窗口中,其輸出格式串同printf函數(shù),不過它的輸出受當(dāng)前光標(biāo)控制,且輸出特點如上所述,cputs同puts,是在定義的窗口中輸出一個字符串,而putch()則是輸出一個字符到窗口,它實際上是函數(shù)putc的一個宏定義,即將輸出定向到屏幕。(2)窗口內(nèi)文本的輸入函數(shù)可直接
26、使用stdio.h中的getch()或getche()函數(shù)。需要說明的是,getche()函數(shù)從鍵盤上獲得一個字,在屏幕上顯示的時候,如果字符超過了窗口右邊界,則會被自動轉(zhuǎn)移到下一行的開始位置。4)有關(guān)屏幕操作的函數(shù)voidclrscr(void);該函數(shù)將清除窗口中的文本,并將光標(biāo)移到當(dāng)前窗口的左上角處。voidclreol(void);該函數(shù)將清除當(dāng)前窗口中從光標(biāo)位置開始到本行結(jié)尾的所有字符,但不改變光標(biāo)原來的位置。voiddelline(void);該函數(shù)將刪除光標(biāo)所在行的所有字符。voidgotoxy(intx,inty);該函數(shù)用于定位光標(biāo)在當(dāng)前窗口中的位置。這里x,y是指光標(biāo)要定位
27、處的坐標(biāo)(相對于窗口而言)。當(dāng)x,y超出了窗口的大小時,該函數(shù)不起作用。intmovetext(intx1,inty1,intx2,inty2,intx3,inty3);該函數(shù)將把屏幕上左上角為(xl,y1),右下角為(x2,y2)的矩形內(nèi)文本拷貝到左上角為(x3,y3)的一個新矩形區(qū)內(nèi)。這里x,y坐標(biāo)是以整個屏幕為窗口坐標(biāo)系,即屏幕左上角為(1,1)。該函數(shù)與開設(shè)的窗口無關(guān),且原矩形區(qū)文本不變。intgettext(intxl,intyl,intx2,inty2,void*buffer);該函數(shù)將把左上角為(xl,y1),右下角為(x2,y2)的屏幕矩形區(qū)內(nèi)的文本存到由指針buffer指向的
28、一個內(nèi)存緩沖區(qū)內(nèi),當(dāng)操作成功,返回1;否則,返回0。因一個在屏幕上顯示的字符需占顯示存儲器VRAM的兩個字節(jié),即第一個字節(jié)是該字符的ASCII碼,第二個字節(jié)為屬性字節(jié),即表示其顯示的前景、背景色及是否閃爍,所以buffer指向的內(nèi)存緩沖區(qū)的字節(jié)總數(shù)的計算為:字節(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)存放的次序是從左到右,從上到下,每個字符占連續(xù)兩個字節(jié)并依次存放。intputtext(intx1,inty1,intx2,inty2,void*buffer);該函數(shù)則是將gettext()函數(shù)
29、存入內(nèi)存buffer中的文字內(nèi)容拷貝到屏幕上指定的位置。注意:(1)gettext()函數(shù)和puttext()函數(shù)中的坐標(biāo)是對整個屏幕而言的,即是屏幕的絕對坐標(biāo),而不是相對窗口的坐標(biāo);(2)movetext()函數(shù)是拷貝而不是移動窗口區(qū)域內(nèi)容,即使用該函數(shù)后,原位置區(qū)域的文本內(nèi)容仍然存在。例8.6:下面的程序首先定義了一個字符數(shù)組,下標(biāo)為64,表示用來存四行八列的文本。由于沒有用window函數(shù)設(shè)置窗口,因而用缺省值,即全屏幕為一個窗口,程序開始設(shè)置80列25行文本顯示方式(C80),背景色為藍色,前景色為紅色,經(jīng)clrscr函數(shù)清屏后,設(shè)置的背景色才使屏幕背景變藍。gotoxy(10,10)
30、使光標(biāo)移到第10行10列,然后在(10,10)開始位置顯示L:load,接著在下面三行相同的列位置顯示另外三條信息,13行10列顯示的E:exit后面帶有回車換行符,為的是將光標(biāo)移到下一行開始處,好顯示pressanykeytocontinue。當(dāng)按任一鍵后,gettext函數(shù)將(10,l0,18,13)矩形區(qū)的內(nèi)容存到ch緩存區(qū)內(nèi)。ch即上述的四行八列信息,接著設(shè)置一個窗口,并縱向?qū)懮?,2,3,4,然后用movetext(),將此窗口內(nèi)容復(fù)制到另一區(qū)域,由于此區(qū)域包括背景色和顯示的字符,所以被復(fù)制到另一區(qū)域的內(nèi)容也是相同的背景色和文本。當(dāng)按任一鍵后,又出現(xiàn)提示信息,再按鍵,則存在ch緩沖區(qū)
31、內(nèi)的文本由puttext()又復(fù)制到開設(shè)的窗口內(nèi)了,注意上述的函數(shù)movetext(),gettext(),puttext()均與開設(shè)的窗口內(nèi)坐標(biāo)無關(guān),而是以整個屏幕為參考系的。#include#includevoidmain()inti;charch4*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)
32、;gotoxy(10,13);cprintf(E:exitrn);cprintf(Pressanykeytocontinue);getch();gettext(10,10,18,13,ch);/*存矩形區(qū)文存到ch緩存區(qū)*/clrscr();textbackground(1);textcolor(3);window(20,9,34,14);/*開一個窗口*/clrscr();cprintf(1.rn2.rn3.rn4.rn);/*縱向?qū)?,2,3,4*/movetext(20,9,34,14,40,10);/*將矩形區(qū)文本復(fù)制到另一區(qū)域*/puts(hitanykey);getch();clr
33、scr();cprintf(pressanykeytoputtext);getch();clrscr();puttext(23,10,31,13,ch);/*將ch緩存區(qū)所存文本在屏上顯示*/getch();5)狀態(tài)查詢函數(shù)有時需要知道當(dāng)前屏幕的顯示方式,當(dāng)前窗口的坐標(biāo)、當(dāng)前光標(biāo)的位置,文本的顯示屬性等,TurboC提供了一些函數(shù)得到屏幕文本顯示有關(guān)信息的函數(shù):voidgettextinfo(structtext_info*f);這里的text_info是在conio.h頭文件中定義的一個結(jié)構(gòu),該結(jié)構(gòu)的定義是structtext_infounsignedcharwinleft;/*窗口左上角x
34、坐標(biāo)*/unsignedcharwintop;/*窗口左上角y坐標(biāo)*/unsignedcharwinright;/*窗口右下角x坐標(biāo)*/unsignedcharwinbottom;/*窗口右下角y坐標(biāo)*/unsignedcharattributes;/*文本屬性*/unsignedcharnormattr;/*通常屬性*/unsignedcharcurrmode;/*當(dāng)前文本方式*/unsignedcharscreenheight;/*屏高*/unsignedcharscreenwidth;/*屏寬*/unsignedcharcurx;/*當(dāng)前光標(biāo)的x值*/unsignedcharcury;/
35、*當(dāng)前光標(biāo)的y值*/;例8.7下面的程序?qū)⑵聊辉O(shè)置成80列彩色文本方式,并開了一個window(1,5,70,20)的窗口,在窗口中顯示了currentinformationofwindow,然后用gettextinfo函數(shù)得到當(dāng)前窗口的信息,后面的cprintf()函數(shù)將分別顯示出結(jié)構(gòu)text_info各分量的數(shù)值來。#include#includevoidmain()structtext_infocurrent;textmode(C80);textbackground(1);textcolor(13);window(1,5,70,20);clrscr();cputs(Currentinfo
36、rmationofwindowrn);gettextinfo(¤t);cprintf(Leftcornerofwindowis%d,%d,current.winleft,current.wintop);cprintf(Rightcornerofwindowis%d,%d,current.winright,current.winbottom);cprintf(Textwindowattributeis%d,current.attribute);cprintf(Textwindownormalattributeis%d,current.normattr);cprintf(Current
37、videomodeis%d,current.currmode);cprintf(Windowheightandwidthis%d,%d,current.screenheight,current.screenwidth);cprintf(Rowcursorposis%d,Columnposis%d,current.cury,current.curx);getch();8.2.2鍵盤輸入當(dāng)我們在鍵盤上按下某鍵時,系統(tǒng)是怎樣知道是哪一個鍵被按下呢?它的奧妙在于計算機鍵盤內(nèi)有一個微處理器,它用來掃描和檢測每個鍵的按下和拾起狀態(tài)。然后以程序中斷的方式(INT9)與主機通信。ROM中BIOS內(nèi)的鍵盤中斷處
38、理程序,會將一個字節(jié)的按鍵掃描碼(掃描碼的06位標(biāo)識了每個鍵在鍵盤上的位置,最高位標(biāo)識按鍵的狀態(tài),0對應(yīng)該鍵是被按下;1對應(yīng)松開。它并不能區(qū)別大小寫字母,而且一些特殊鍵如PrintScreen等不產(chǎn)生掃描碼直接引起中斷調(diào)用)翻譯成對應(yīng)的ASCII碼。由于ASCII碼僅有256個,它不能將PC鍵盤上的鍵全部包括,因此有些控制鍵如CTRL,ALT,END,HOME,DEL等用擴充的ASCII碼表示,擴充碼用兩個字節(jié)的數(shù)表示。第一個字節(jié)是0,第二個字節(jié)是0255的數(shù),鍵盤中斷處理程序?qū)艳D(zhuǎn)換后的擴充碼存放在Ax寄存器中,存放格式如表8-3所示。對字符鍵,其擴充碼就是其ASCII碼。鍵名AHAL字符鍵
39、擴充碼=ASCII碼ASCII碼功能鍵/組合鍵擴充碼0表8-3鍵盤掃描碼是否有鍵按下,何鍵按下,簡單的應(yīng)用中可采用兩種辦法:一是直接使用TurboC提供的鍵盤操作函數(shù)bioskey()來識別,二是通過int86()函數(shù),調(diào)用BIOS的INT16H,功能號為0的中斷。它將按鍵的掃描碼存放在Ax寄存器的高字節(jié)中。函數(shù)bioskey()的原型為:intbioskey(intcmd);它在bios.h頭文件中進行了說明,參數(shù)cmd用來確定bioskey()如何操作,其含義見表8-4。cmd操作0bioskey()返回按健的鍵值,該值是2個字節(jié)的整型數(shù)。若沒有鍵按下,則該函數(shù)一直等待,直到有鍵按下。當(dāng)按
40、下時,若返回值的低8位為非零,則表示為普通鍵,其值代表該鍵的ASCII碼。若返回值的低8位為0,則高8位表示為擴展的ASCII碼,表示按下的是特殊功能鍵。1bioskey()查詢是否有鍵按下。若返回非0值,則表示有鍵按下,若為0表示沒鍵按下。2bioskey()將返回一些控制鍵是否被按過,按過的狀態(tài)由該函數(shù)返回的低8位的各位值來表示:字節(jié)位對應(yīng)的16進制數(shù)含義00 x01右邊的shift鍵被按下10 x02左邊的shift鍵被按下20 x04Ctrl鍵被按下30 x08Alt鍵被按下40 x10ScrollLock已打開50 x20NumLock已打開60 x40CapsLock已打開70 x
41、80Insert已打開表8-4函數(shù)bioskey(intcmd)中cmd的取值及含義當(dāng)某位為l時,表示相應(yīng)的鍵已按,或相應(yīng)的控制功能已有效,如選參數(shù)cmd為2,若key值為0 x09,則表示右邊的shift鍵被按,同時又按了Alt鍵。函數(shù)int86()的原型為:intint86(intintr_num,unionREGS*inregs,unionREGS*outregs);這個函數(shù)在bios.h頭文件中進行了說明,它的第一個參數(shù)intr_num表示BIOS調(diào)用類型號,相當(dāng)于intn調(diào)用的中斷類型號n,第二個參數(shù)表示是指向聯(lián)合類型REGS的指針,它用于接收調(diào)用的功能號及其它一些指定的入口參數(shù),以
42、便傳給相應(yīng)的寄存器,第三個參數(shù)也是一個指向聯(lián)合類型REGS的指針,它用于接收功能調(diào)用后的返回值,即出口參數(shù),如調(diào)用的結(jié)果,狀態(tài)信息,這些值從相關(guān)寄存器中得到。例8.8bioskey()函數(shù)的使用。#include#includevoidmain()intk1,k2,k;dok=bioskey(0);k1=k&0 x00FF;/*得到低8位的值*/k2=k8;/*得到高8位的值*/switch(k2)case71:printf(你按下了Home鍵!n);break;case79:printf(你按下了End鍵!n);break;case73:printf(你按下了PgUp鍵!n);break;c
43、ase81:printf(你按下了PgDn鍵!n);break;default:printf(你按下了Home,End,PgUp,PgDn之外的鍵!n);while(k1!=27);/*ESC鍵才退出*/8.3圖形程序設(shè)計計算機圖形程序設(shè)計是程序設(shè)計中比較難,但又吸引人的部分。因在ANSIC中沒有對圖形庫的要求,所以不同版本的C語言編譯程序提供的圖形函數(shù)不一樣。本節(jié)以TurboC的圖形庫來介紹圖形程序設(shè)計。8.3.1圖形模式的初始化要進行圖形程序設(shè)計,就要將屏幕顯示模式設(shè)置為圖形模式。要設(shè)置圖形模式,可以用TurboC提供的圖形初始化函數(shù):voidfarinitgraph(intfar*gdr
44、iver,intfar*gmode,charfar*pathtodriver);其中,gdriver表示圖形驅(qū)動器,gmode表示圖形模式,pathtodriver表示圖形驅(qū)動程序所在的目錄路徑,若圖形驅(qū)動程序在TurboC的默認目錄下,可將參數(shù)pathtodriver設(shè)置為空字符串()。若不知道所用的圖形顯示器適配器的種類,在調(diào)用圖形初始化函數(shù)時,設(shè)置參數(shù)gdriver的值為0或DETECT,由系統(tǒng)自動進行硬件檢測。TurboC提供的圖形驅(qū)動器、模式的符號常量及數(shù)值的意義參見TurboC提供的graphics.h文件。例如在程序的開始部分可進行如下的描述來自動檢測圖形顯示器適配器。#incl
45、ude#includevoidmain()intgd=DETECT,gm;/*自動檢測*/initgraph(&gd,&gm,);/*圖形模式初始化*/TurboC提供的圖形與字形驅(qū)動文件見表8-5文件名用途ATT.BGIAT&T圖形驅(qū)動文件CGA.BGICGA圖形驅(qū)動文件EGAVGA.BGIEGA和VGA圖形驅(qū)動文件IBM8514.BGIIBM8514圖形驅(qū)動文件GOTH.CHR歌特筆劃字形文件LITT.CHR小號筆劃字形文件SANS.CHR無襯線矢量筆劃字形文件TRIP.CHR三重矢量筆劃字形文件表8-5TurboC圖形與字形驅(qū)動文件表8.3.2圖形模式下的坐標(biāo)系在圖形模式下,屏幕上每個像
46、素的顯示位置用點坐標(biāo)來描述。圖形模式下的坐標(biāo)系如圖8-5所示。坐標(biāo)原點在屏幕左上角,其坐標(biāo)為(0,0),X軸為水平方向,Y軸為垂直方向。圖8-5圖形模式下的坐標(biāo)系8.3.3屏幕圖形的色彩與相關(guān)操作在C語言中,圖形模式的屏幕顏色設(shè)置分為背景色的設(shè)置和作圖色的設(shè)置。背景色的設(shè)置通過對函數(shù)setbkcolor(intcolor),作圖色的設(shè)置通過對函數(shù)setcolor(intcolor)的調(diào)用來實現(xiàn)。其中intcolor為整型數(shù)據(jù),取值范圍為015,數(shù)字的表示的顏色見表8-2。背景和前景色可以有16種顏色。(這種方式成為調(diào)色板方式)圖形屏幕相關(guān)的操作的主要函數(shù)如表8-6所示:函數(shù)功能cleardev
47、ice()清除圖形屏幕clearriwport()清除當(dāng)前視區(qū)setbkcolor()設(shè)置圖形背景顏色Setcolor()設(shè)置圖形前顏色setfillstyle()設(shè)置填充模式和填充顏色settextstyle()設(shè)置文本字符的顯示模式closegraph()關(guān)閉圖形系統(tǒng),返回文本方式表8-6屏幕圖形的色彩與相關(guān)操作的函數(shù)幾個函數(shù)的說明如下:(1)setfillstyle()為填充函數(shù),其作用是對圖形內(nèi)部填充顏色,函數(shù)原型為:voidfarsetfillstyle(intpattern,intcolor);其中,pattern表示填充模式,color表示顏色參數(shù)。pattern的取值見表8-7
48、符號數(shù)值描述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用戶定義的填充模式表8-7圖形填充模式表(2)settextstyle()函數(shù),用于設(shè)置文本字符串的字型、輸出方向和字符大小。函數(shù)原
49、型為:voidfarsettextstyle(intfont,intdirection,intcharsize);其中,font用于設(shè)置字符的字體,其取值見表8-8direction用于設(shè)置字符輸出方向,其取值見表8-9charsize用于設(shè)置字符大小,其取值見表8-10符號常量數(shù)值含義DEFAULT_FONT08*8點陣字(缺省值)TRIPLEX_FONT13倍筆劃字體SMALL_FONT2小號筆劃字體SANS_SERIF_FONT3無襯線筆劃字體GOTHIC_FONT4黑體筆劃字體表8-8font的取值符號常量數(shù)值含義HORIZ_DIR0從左到右VERT_DIR1從底到頂表8-9direc
50、tion的取值符號常量或數(shù)值含義符號常量或數(shù)值含義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-10charsize的取值8.3.4基本繪圖函數(shù)圖形由點、線、面組成,TurboC提供了一些函數(shù),以完成這些操作,而所謂面則可由對封閉圖形填上顏色來實現(xiàn)。1)畫點函數(shù)voidfarputpixel(intx,inty,intcolor);該函數(shù)表示在指定的x,y位置畫一點,點的顯示顏色由設(shè)置的color值決定,關(guān)于顏色的設(shè)置,將在設(shè)
51、置顏色函數(shù)中介紹。intfargetpixel(intx,inty);該函數(shù)與putpixel()相對應(yīng),它得到在(x,y)點位置上的象素的顏色值。例89:下面是一個畫點的程序,它將在y=20的恒定位置上,沿x方向從x=200開始,連續(xù)畫兩個點(間距為4個象素位置),又間隔16個點位置,再畫兩個點,如此循環(huán),直到x=300為止,每畫出的兩個點中的第一個由putpixel(x,20,1)所畫,第二個則由putplxel(x+4,20,2)畫出,顏色值分別設(shè)為1和2。#includevoidmain()intgraphdriver=DETECT,graphmode,x;initgraph(&gra
52、phdriver,&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ù)在屏幕上畫線時,如同在紙上畫線一樣。畫筆要放在開始畫圖的位置,并經(jīng)常要抬筆移動,以便到另一位置再畫。我們也可想象在屏上畫圖時,有一無形的畫筆,可以控制它的定位、移動(不畫),也可知道它能移動的最大位置限制等。完成這些功能的函數(shù)是:voidfarmoveto(intx,inty);移動畫筆到指定的(x,y)位置,移動過程不畫。voidfarmov
53、erel(intdx,intdy);畫筆從現(xiàn)行位置(x,y)處移到一位置增量處(x+dx,y+dx),移動過程不畫。intfargetx(void);得到當(dāng)前畫筆的x位置。intfargety(void);得到當(dāng)前畫筆的y位置3)畫線函數(shù)這類函數(shù)提供了從一個點到另一個點用設(shè)定的顏色畫一條直線的功能,起始點的設(shè)定方法不同,因而有下面不同的畫線函數(shù):voidfarline(intx0,inty0,intx1,inty1);從(x0,y0)點到(x1,y1)點畫一直線。voidfarlineto(intx,inty);從現(xiàn)行畫筆位置到(x,y)點畫一直線。voidfarlinerel(intdx,i
54、ntdy);從現(xiàn)行畫筆位置(x,y)到位置增量處(x+dx,y+dy)畫一直線。例8.10:下面的程序?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)點開始到x增量為0,y增量為20的點(100,100)為止用linerel函數(shù)畫一直線。moverel(-100,0)將使畫筆從上次用1inerel(0,2
55、0)畫直線時的結(jié)束位置(100,100)處開始移到(100-100,100-0),然后用linerel(30,20)從(0,100)處再畫直線至(0+30,100+20)處。用line函數(shù)畫直線時,將不考慮畫筆位置,它也不影響畫筆原來的位置,lineto和1inerel要求畫筆位置,畫線起點從此位置開始,而結(jié)束位置就是畫筆畫線完后停留的位置,故這兩個函數(shù)將改變畫筆的位置。#includevoidmain()intgraphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,);cleardevice();moveto(100,20
56、);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將畫出一個矩形框,而畫條形函數(shù)bar將以給定的填充模式和填充顏色畫出一個條形圖,而不是一個條形框,關(guān)于填充模式和顏色將在后面介紹。voidfarrectangle(intxl,inty1,intx2,inty2);該函數(shù)將以(x1,y1)為左上角,(x2,y2)為右下角畫一矩形框。v
57、oidbar(intx1,inty1,intx2,inty2);該函數(shù)將以(xl,y1)為左上角,(x2,y2)為右下角畫一實形條狀圖,沒有邊框,圖的顏色和填充模式可以設(shè)定。若沒有設(shè)定,則使用缺省模式。5)畫橢圓、圓和扇形圖函數(shù)在畫圖的函數(shù)中,有關(guān)于角的概念。在TurboC中是這樣規(guī)定的:屏的x軸方向為0度,當(dāng)半徑從此處逆時針方向旋轉(zhuǎn)時,則依次是90度、180度、270度,當(dāng)360度時,則和x軸正向重合,即旋轉(zhuǎn)了一周。如圖8-6所示。圖8-6起始角和終止角voidellipse(intx,inty,intstangle,intendangel,intxradius,intyradius);該函
58、數(shù)將以(x,y)為中心,以xradius和yradius為x軸和y軸半徑,從起始角stangle開始到endangle角結(jié)束,畫一橢圓線。當(dāng)stangle=0,endangle=360時,則畫出的是一個完整的橢圓,否則畫出的將是橢圓弧。關(guān)于起始角和終止角規(guī)定如圖8-2所示。voidfarcircle(intx,inty,intradius);該函數(shù)將以(x,y)為圓心,radius為半徑畫個圓。voidfararc(intx,inty,intstangle,intendangle,intradius);該函數(shù)將以(x,y)為圓心,radius為半徑,從stangle為起始角開始,到endang
59、le為結(jié)束角畫一圓弧。voidfarpieslice(intx,inty,intstangle,intendangle,intradius);該函數(shù)將以(x,y)為圓心,radius為半徑,從stangle為起始角,endangle為結(jié)束角,畫一扇形圖,扇形圖的填充模式和填充顏色可以事先設(shè)定,否則以缺省模式進行。例8.11:該程序?qū)⒂胑11ipse函數(shù)畫橢圓,從中心為(320,100),起始角為0度,終止角為360度,x軸半徑為75,y軸半徑為50畫一橢圓,接著用circle函數(shù)以(320,220)為圓心以半徑為50畫圓。然后分別用pieslice和e11ipse及arc函數(shù)在下方面出了一扇形
60、圖和橢圓弧及圓弧。#includevoidmain()intgraphdriver=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è)計舉例例812:繪制鉆石圖案。將一圓周進行n等分,然后將所有的等
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度投資理財代理服務(wù)合同
- 二零二五年度吊車安全操作規(guī)程制定及執(zhí)行合同
- 二零二五年度冬季勞務(wù)掃雪環(huán)境保護協(xié)議
- 2025年度正規(guī)貨車駕駛員勞動合同及貨運業(yè)務(wù)操作規(guī)范合同
- 二零二五年度扶貧項目風(fēng)險防范與應(yīng)急處理合作協(xié)議
- 二零二五年度合同糾紛賠償調(diào)解服務(wù)協(xié)議
- 二零二五年度名人房產(chǎn)銷售代理合同范本
- 2025年度智能制造股權(quán)抵押貸款合同
- 2025年度電子商務(wù)平臺合作解除終止范本
- 二零二五年度企業(yè)勞動合同解除與離職員工就業(yè)援助服務(wù)協(xié)議
- JTGT F20-2015 公路路面基層施工技術(shù)細則
- 7S培訓(xùn)管理教材課件(-28張)
- 產(chǎn)學(xué)研合作的模式和成效
- 新綱要云南省實驗教材第二版三年級信息技術(shù)第二冊教案-
- 公安基礎(chǔ)知識900題庫
- GB/T 15558.2-2023燃氣用埋地聚乙烯(PE)管道系統(tǒng)第2部分:管材
- YB-4001.1-2007鋼格柵板及配套件-第1部分:鋼格柵板(中文版)
- 慢病管理課件-高血壓、糖尿病等慢性病的護理和管理
- 267條表情猜成語【動畫版】
- 四川師范大學(xué)本科學(xué)生課程免修申請表2
- 第4章:理賠額和理賠次數(shù)的分布
評論
0/150
提交評論