版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
文本編輯器
文本編輯器是最常用日勺文檔創(chuàng)立和編輯工具。伴隨計(jì)算機(jī)科學(xué)與技術(shù)的發(fā)展,用來處
理文本的編輯器隨地可見,并且形式多樣。例如,Windows下口勺記事本,寫字板,
EditPlus,UltraEdit等都是十分優(yōu)秀日勺文本編輯器和處理工具。在本章中,我們將向讀者講解
怎樣運(yùn)用C語言來發(fā)展開發(fā)一種簡(jiǎn)易口勺文本編輯器。
1設(shè)計(jì)目的
運(yùn)用C語言口勺單鏈表數(shù)據(jù)構(gòu)造及有關(guān)函數(shù),本章編程實(shí)現(xiàn)了一種與DOS操作系統(tǒng)下的I
Edit相似的J文本編輯器。再次文本編輯器中,顧客可以逍過快捷和選擇菜單項(xiàng),完畢基本日勺
文本編輯器和文獻(xiàn)處理T作。
通過文章曰勺簡(jiǎn)介,讀者可以理解文本編輯器口勺開發(fā)過程,掌握菜單口勺開發(fā)技巧,加深而
文獻(xiàn)操作的理解。更重要的是,但愿此程序能拋磚引玉,引領(lǐng)讀者掌握編程日勺措施和技巧,
開發(fā)出更優(yōu)秀日勺程序。
2功能描述
如圖.1所示,文本編輯器重要由五大功能模塊構(gòu)成,它們分別是文獻(xiàn)操作模塊,文本編
輯模塊,剪切操作模塊,菜單控制模塊和協(xié)助及其他模塊。下面分別簡(jiǎn)要簡(jiǎn)介功能模塊口勺功
能。
(1)文獻(xiàn)操作模塊。在文獻(xiàn)操作模塊中,重要完畢文獻(xiàn)的創(chuàng)立,打開,保留和另存操
作。顧客可以選擇File菜單上的New子菜單來完畢新建文本文獻(xiàn)操作;選擇File菜單上的
Save子菜單來完畢保留文獻(xiàn)操作選擇File菜單上的Open子菜單來完畢打開文獻(xiàn)操作;選擇
Flie菜單上的Saveas子菜單來完畢文獻(xiàn)日勺另存為操作。在文獻(xiàn)的J打開,保留和另存為操作
中,系統(tǒng)會(huì)提醒顧客輸入文獻(xiàn)途徑及文獻(xiàn)名。值得?提時(shí)是,當(dāng)顧客打開?種文獻(xiàn)時(shí),指定
的文獻(xiàn)必須存在,否則系統(tǒng)會(huì)報(bào)錯(cuò)。
(2)文本編輯器模塊。在文本編輯器模塊中,重要完畢在編輯窗口中以添加或插入的
方式輸入字符,刪除光標(biāo)所在目前位置日勺單個(gè)字符或前一種位置H勺單個(gè)字符,朝上下左右4
個(gè)方向口勺光標(biāo)移動(dòng)操作。當(dāng)光標(biāo)所在位置及背面口勺位置沒有字符時(shí),系統(tǒng)會(huì)以添加口勺方式輸
入字符;當(dāng)光標(biāo)所在位置及背面的位置有字符時(shí),系統(tǒng)會(huì)已插入的方式輸入字符。顧客可以
使用Backspace鍵刪除光標(biāo)前一種字符,也可以使用Del鍵刪除目前位置的字符或刪除Ctrl+
左移(右移)鍵i選定了的多種字符。顧客可以使用左移?。ㄒ唬?右移鍵(一),上移鍵(t)
和下移鍵(I)來移動(dòng)光標(biāo)位置。
(3)剪貼板操作模塊。在剪貼板操作模塊中,重要完畢對(duì)已選定文本的剪切,復(fù)制,
粘貼工作。假如顧客要剪切文本以便可以將它移動(dòng)到其他位置,可通過CtH+X左移鍵(右
移鍵)先選定文本,然后選擇Edit菜單上的Cut子菜單或按Ctrl+X快捷鍵來完畢剪切任務(wù)。
假如顧客要復(fù)制文本以便可以將它黏貼到其他位置,必須先選定文本,然后選擇Edit菜單
上的Copy紫菜單或按Ctrl+C快捷鍵來完畢豆制任務(wù)。假如顧客要粘貼剪切或復(fù)制的I文本,
必須將光標(biāo)置于要粘貼文本的位置,然后選擇Edit菜單上的Paste子菜單或按Ctrl+V快捷
鍵來完畢粘貼任務(wù)。
(4)菜單控制模塊。在菜單控制模塊中,重要完畢菜單時(shí)顯示。光帶條在子菜單之間
的上下移動(dòng)或菜單之間的左右移動(dòng)和子菜單項(xiàng)I)勺選用。本文本編輯器共有Flie,Edit和Help3
個(gè)子菜單項(xiàng),顧客可以分別按F1,F2和F3功能鍵來完畢這3個(gè)菜單項(xiàng)的調(diào)用,即顯示某項(xiàng)
菜單。顧客可按光標(biāo)上移或下移鍵在某菜單項(xiàng)的子菜單之間循環(huán)移動(dòng),也可使用光標(biāo)區(qū)左移
或右移鍵在3個(gè)菜單項(xiàng)之間循環(huán)移動(dòng)。當(dāng)光帶移動(dòng)到某個(gè)字菜單項(xiàng)上時(shí),顧客此時(shí)可使川
Enter鍵來選用有關(guān)菜單項(xiàng)選擇項(xiàng)。
(5)協(xié)助及其他模塊。在協(xié)助及其他模塊中,重要完畢系統(tǒng)功能及按鍵的I簡(jiǎn)要簡(jiǎn)介。
其他模塊包括文本的迅速預(yù)覽和窗II的顯示。顧客可按F10功能鍵來打開迅速預(yù)覽窗口,
在迅速預(yù)覽窗口中沒有功能菜單條。主窗II要有菜單欄,文本編輯區(qū)和狀態(tài)欄三大部分構(gòu)成,
菜單欄用來顯示菜單項(xiàng),文本編輯區(qū)重要用來文本字符的輸入,刪除等操作,狀態(tài)欄重要用
來顯示目前光標(biāo)在文本窗口中口勺坐標(biāo)值。
注意:TurboC2.默認(rèn)定義的文本窗口為整個(gè)屏幕,共有80列(或40列),25行的文本單元,每
個(gè)單元包括一種字符和一種屬性,字符即ASCH碼字符,屬性規(guī)定該字符的顏色和強(qiáng)度。同步,他還規(guī)定
整個(gè)屏幕的左上角坐標(biāo)為(1,1),右下角坐標(biāo)為(80,25)。并規(guī)定沿水平方向?yàn)閄軸,方向朝右:眼垂
直方向?yàn)閅軸,方向朝卜。
3總體設(shè)計(jì)
3.1功能模塊設(shè)計(jì)
在.2節(jié)中,簡(jiǎn)樸描述了各功能模塊的作用,下面分別簡(jiǎn)介各功能模塊的詳細(xì)設(shè)計(jì)。在簡(jiǎn)
介各功能模塊的詳細(xì)設(shè)計(jì)之前,有必要先描述一下主程序的執(zhí)行流程。
1.程序執(zhí)行主流程
文本編輯器程序執(zhí)行主流程如圖.2所示,它是在main()函數(shù)中實(shí)現(xiàn)的。他首先初始
化某此全局變量及構(gòu)造數(shù)組,接著調(diào)用drawmain()函數(shù)來顯示主窗口,然后調(diào)用while。)進(jìn)
入主循環(huán),等待顧客按鍵,最終程序根據(jù)顧客的按鍵值,進(jìn)行對(duì)應(yīng)的處理,完畢文本編輯U勺
有關(guān)工作。下面對(duì)圖.2中的按鍵判斷和有關(guān)處理作補(bǔ)充闡明。
(1)若按鍵為常規(guī)字符,即其ASCII碼不小于32不不小于127,則繼續(xù)判斷在文本編
輯區(qū)的H前光標(biāo)位置有無字符,若有字符,則調(diào)用insert。函數(shù),將此字符插入在目前位置,
否則在判斷沒有滿行后,將此字符添加在單鏈表的數(shù)據(jù)域中,若此行已滿,則執(zhí)行添加新行
保留數(shù)據(jù)的數(shù)據(jù)構(gòu)造。在此程序中,共有兩種類型的單鏈表,我們稱其為行單鏈表和列單鏈
表,一種列單鏈表用來保留一行的字符,有多少行即有多少個(gè)這樣的單鏈表。行單鏈表只有
一種,它的每個(gè)節(jié)點(diǎn)口勺數(shù)裾域用來保留不一樣列單鏈表的首節(jié)點(diǎn)的地址。例如,第4行第4
列歐J字符保留在行單鏈表的第4個(gè)節(jié)點(diǎn)的數(shù)據(jù)域所指H勺列單鏈表的第4個(gè)節(jié)點(diǎn)的數(shù)據(jù)域中。
有關(guān)詳細(xì)數(shù)據(jù)構(gòu)造的定義,在背面口勺小節(jié)中會(huì)有詳細(xì)簡(jiǎn)介。
1)打開文獻(xiàn)
文獻(xiàn)H勺打開流程如圖.3所示,它首先提醒顧客輸入要打開文獻(xiàn)日勺文獻(xiàn)名,若該文獻(xiàn)不存在
或由于其他原因打開失敗,則會(huì)結(jié)束文獻(xiàn)打開操作。若文獻(xiàn)成功打開并且文獻(xiàn)指針沒有到文
獻(xiàn)尾,則從文獻(xiàn)中一次讀取一種字符,并將該字符添加到一列單鏈表節(jié)點(diǎn)中,直至碰到換行
符(ASCII碼10)或持續(xù)瀆取字符個(gè)數(shù)不小于76(在此文獻(xiàn)編輯器中,每行最多為76個(gè)字
符)。當(dāng)列單鏈表形成后,它的首地址將被保留至行單鏈表的對(duì)應(yīng)節(jié)點(diǎn)日勺數(shù)據(jù)域中,如此動(dòng)
作,直至文獻(xiàn)指針指向文獻(xiàn)尾部而結(jié)束。
注意:由于本程序中每行以回車符(ASCH碼為13)結(jié)束,而當(dāng)用Windows的記事本創(chuàng)
立?利文本文獻(xiàn),打開此文獻(xiàn)并用fgetc()函數(shù)讀取時(shí),程序?qū)懭肓袉捂湵砉?jié)點(diǎn)中時(shí)值是ASCII
碼為13的回車符。
2)保留文獻(xiàn)
保留文獻(xiàn)操作重要完畢將單鏈表中的數(shù)據(jù)寫入文獻(xiàn)中的任務(wù),它口勺詳細(xì)實(shí)現(xiàn)流程如下。
(1)顧客輸入一種保留此單鏈表數(shù)據(jù)的文獻(xiàn)名。
(2)以只寫方式打開此文獻(xiàn),若成功打開此文獻(xiàn),見執(zhí)行環(huán)節(jié)(3);否則退出。
(3)讀取行單鏈表中的節(jié)點(diǎn)數(shù)據(jù)域的值,若值不為空,則執(zhí)行環(huán)節(jié)(4);否則執(zhí)行環(huán)節(jié)
(6)o
(4)依次讀取行單鏈表節(jié)點(diǎn)中保留的首地址日勺對(duì)應(yīng)列單鏈表節(jié)點(diǎn)的數(shù)據(jù)域H勺值,若其值
為回車符,則用換行符替代后將其寫入文獻(xiàn)中:否則直接將其值寫入文獻(xiàn)中,直至
該列單鏈表中指針域?yàn)镹ULL時(shí)最終一種元素結(jié)束。
(5)讀取行單鏈表中的下一種節(jié)點(diǎn),并跳至環(huán)節(jié)(3〕。
(6)關(guān)閉文獻(xiàn),退出。
3.文獻(xiàn)編輯模塊
在文獻(xiàn)編輯模塊中,重要完畢以添加或插入的方式輸入字符、刪除光標(biāo)所在的目前位置或前
一種位置的單個(gè)字符、朝上下左右4個(gè)方向的光標(biāo)U勺移動(dòng)操作。下面簡(jiǎn)介這4個(gè)功能的詳細(xì)
設(shè)計(jì)與實(shí)現(xiàn)。
1)添加字符
當(dāng)光標(biāo)處在文本編輯時(shí)最終一行的位置且光標(biāo)背面沒有字符時(shí),若此時(shí)輸入字符,程序會(huì)判
斷一行中字符的個(gè)數(shù),若字符個(gè)數(shù)不等于76,則在目前的列單鏈表的最終一種節(jié)點(diǎn)中保留
輸入的字符,然后添加一種新的節(jié)點(diǎn)來保留下一種輸入的字符:若等于76,則在H前的列
單鏈表的最終一種節(jié)點(diǎn)中保留輸入的字符,然后在行單鏈表中添加種新節(jié)點(diǎn)用來保留下一
行的列單鏈表IJ勺首地址,添加一種新的列單鏈表節(jié)點(diǎn)來保留下一種顧客輸入的字符。
2)插入字符
若光標(biāo)所在處已經(jīng)存在字符,當(dāng)顧客在H前位置輸入字符時(shí),程序會(huì)調(diào)用insert。函數(shù)將輸
入的字符在光標(biāo)所在的位置處在列單鏈表中插入,插入完畢后,會(huì)調(diào)用lest。函數(shù)來檢查各
行與否滿足只有76個(gè)字符的條件,若不滿足此條件,則在此函數(shù)中會(huì)對(duì)多出的字符進(jìn)行處
理。下面分別對(duì)列單鏈表中字符的插入過程和單鏈表的檢查過程進(jìn)行簡(jiǎn)介。
若在第m行,第n列的位置插入一種字符,其insert。過程描述如下:
(I)定位至行單鏈表中日勺第m個(gè)節(jié)點(diǎn),得到這個(gè)節(jié)點(diǎn)日勺數(shù)據(jù)域的J值,其值為對(duì)應(yīng)列單鏈
表中第一種節(jié)點(diǎn)的地址。
(2)定位至列單鏈表中日勺第n-1個(gè)節(jié)點(diǎn)。
(3)創(chuàng)立一種新的列單鏈表節(jié)點(diǎn),用其數(shù)據(jù)域保留輸入的字符。
(4)若字符插入在第m行第1歹人則直接將行單鏈表中第m個(gè)節(jié)點(diǎn)的數(shù)據(jù)域的值變化為
新口勺列單鏈表節(jié)點(diǎn)的地址,新的列單鏈表節(jié)點(diǎn)的指針域指向列單鏈表中本來的第1
個(gè)節(jié)點(diǎn)。若字符不是插入在第m行第1列,則執(zhí)行簡(jiǎn)樸的單鏈表中插入節(jié)點(diǎn)的操作。
(5)插入此字符后,調(diào)用test。函數(shù),從第m行開始檢查各行與否滿足每行只容許有76
個(gè)字符的條件,若不滿足此條件,則必須進(jìn)行處埋。
其test()檢查處理過程描述如下:
(1)用指針tail指向已經(jīng)插入了新節(jié)點(diǎn)的列單鏈表中的最終一種節(jié)點(diǎn)。
(2)若此單鏈表中節(jié)點(diǎn)數(shù)超過76個(gè),則指針pl會(huì)指向此列單鏈表中的第76個(gè)節(jié)點(diǎn),指
針p2指向第77個(gè)節(jié)點(diǎn),并將pl所指節(jié)點(diǎn)的指針域設(shè)置為NULLo
(3)若tail所指節(jié)點(diǎn)的數(shù)據(jù)域?yàn)镋nter鍵(ASCII為13)且在行單鏈表中只有m個(gè)節(jié)點(diǎn),
則在此行單鏈表中添加一種新的節(jié)點(diǎn),新節(jié)點(diǎn)U勺數(shù)據(jù)域?yàn)閜2的值,指針域?yàn)榭眨?/p>
將m節(jié)點(diǎn)的指針域指向它;若tail所指節(jié)點(diǎn)反而數(shù)據(jù)域?yàn)镋nter鍵(ASCH為13〕且在
行單鏈表中有多于m個(gè)節(jié)點(diǎn),與上面不一樣的是,它執(zhí)行的是在行單鏈表插入一種
新口勺節(jié)點(diǎn)的操作。
(4)若tail所指節(jié)點(diǎn)的數(shù)據(jù)域不是回車符,pl的數(shù)據(jù)域?yàn)榛剀嚪⑶倚袉捂湵碇兄挥衜
個(gè)節(jié)點(diǎn),則在行單鏈表中添加一種新的節(jié)點(diǎn),新節(jié)點(diǎn)的數(shù)據(jù)域?yàn)閜2的值,指針域?yàn)?/p>
空,并將第m節(jié)點(diǎn)口勺指針域指向它;若tail所指節(jié)點(diǎn)的數(shù)據(jù)域不為回車符并且行單
鏈表中有多于m節(jié)點(diǎn),則將tailH勺指針域指向行單鏈表中第m+1個(gè)節(jié)點(diǎn)所指的列單
鏈表的首節(jié)點(diǎn),并將行單鏈表中第m+1個(gè)節(jié)點(diǎn)的數(shù)據(jù)域修改成指針p2的值,并對(duì)
行單鏈表中第m+1個(gè)節(jié)點(diǎn)所指的列單鏈表進(jìn)行tcst()檢杳,相似的處理過程至行單
鏈表中的最終一種節(jié)點(diǎn)結(jié)束。
3)刪除字符
當(dāng)顧客按下Del鍵時(shí),系統(tǒng)會(huì)調(diào)用del()函數(shù)在單鏈表中刪除目前光標(biāo)所在處的字符:當(dāng)顧
客按下Backspace鍵時(shí),系統(tǒng)也會(huì)調(diào)用這個(gè)函數(shù)在單鏈表中刪除目前光標(biāo)所在處前一種位置
的J字符。
若在第m行、第n列的位.置刪除一種字符,其在列單鏈表中刪除一種十點(diǎn)的操作域插入_L
作十分相似,因此這里重點(diǎn)簡(jiǎn)介刪除該字符后,單鏈表中數(shù)據(jù)的前移工作過程。
(1)在對(duì)應(yīng)的列單鏈表中刪除第n個(gè)節(jié)點(diǎn)。
(2)判斷第m行與否存在并且判斷在此行中與否有字符,若第m行不存在,或此行中沒
有字符,則結(jié)束字符刪除過程,否則執(zhí)行環(huán)節(jié)(3)。
(3)用tail保留第m行對(duì)應(yīng)列單鏈表中最終?種節(jié)點(diǎn)的地址,并將最終一種節(jié)點(diǎn)的指針
域保留為第m+1行中對(duì)應(yīng)列單鏈表的第一種元素的地址。
(4)計(jì)算出第m行中沒有字符I向位置的個(gè)數(shù)num,然后在第m+1行的對(duì)應(yīng)列單鏈表中
截取num個(gè)節(jié)點(diǎn),并將行單鏈表中U勺第m+1節(jié)點(diǎn)的數(shù)據(jù)域改為對(duì)應(yīng)列單鏈表中的第
num個(gè)節(jié)點(diǎn)后H勺節(jié)點(diǎn)的地址。
(5)調(diào)用m++語句,是變量m增1,跳至環(huán)節(jié)(3),開始對(duì)下一行進(jìn)行處理。
4)移動(dòng)光標(biāo)
移動(dòng)光標(biāo)的操作重要運(yùn)用goloxyO函數(shù)來實(shí)現(xiàn),過程非常簡(jiǎn)樸,只需對(duì)目前的光標(biāo)位置和移
動(dòng)方向進(jìn)行判斷后,即可執(zhí)行g(shù)otoxy()過程。例如,假如目前光標(biāo)在第m行第1列,且按F
了光標(biāo)左移鍵,只需將光標(biāo)移至第m-1行,第76列。
4.剪貼板操作模塊
在剪切板操作模塊中,重要完畢對(duì)已選定文本日勺剪切、復(fù)制和粘貼工作,因此剪貼板操作與
文本選定工作親密有關(guān)。下面分別簡(jiǎn)介文本的選定和對(duì)選定文本的剪切、復(fù)制和粘貼操作的
詳細(xì)實(shí)現(xiàn)。
1)選定文本
顧客可按Ctrl+v■或CtH+,來選定文本,就詳細(xì)實(shí)現(xiàn)而言,兩者基本相似。在簡(jiǎn)介選定文本
的實(shí)現(xiàn)過程之前,先簡(jiǎn)要海介一種全局的構(gòu)造數(shù)組川,它的元素的類型為record構(gòu)造體類
型,每一種元素可保留一種字符的x坐標(biāo)、y坐標(biāo)和字符值。其文本選定的實(shí)現(xiàn)過程如下:
(1)當(dāng)顧客按下Ctrl+《或CtH+->鍵時(shí),程序?qū)⒛壳肮鈽?biāo)位置向左或向右移動(dòng)一種位置。
(2)目前光標(biāo)所在位置的字符的x坐標(biāo)、y坐標(biāo)和字符值保留在數(shù)組元素「[value]中value
從0開始,若按減為CtrI+<-,value值在本來基礎(chǔ)上每次加1;若按鍵為Ctrl+->.value
值在本來基礎(chǔ)上每次減1.
(3)調(diào)用Colorview。函數(shù),用不一樣的顏色來顯示已經(jīng)選定的目前文本,以到達(dá)突出選
定文本的效果。
2)剪切
顧客可按Qrl+X鍵或通過Edit菜單項(xiàng)選擇項(xiàng)來剪切選定的文本,若之前沒有選定的文本,
此按鍵無效。它的實(shí)現(xiàn)過程如下:
(1)若全局變量value時(shí)值不小于0(不小于。表達(dá)已經(jīng)有文本選定),則執(zhí)行下面操作。
(7)
(2)保留目前位置H勺坐標(biāo),運(yùn)用循環(huán)語句,依次運(yùn)用x|0]至xlvahic-ll數(shù)組元素保留已選定
字符的坐標(biāo),調(diào)用del()函數(shù)在單鏈表中一次刪除一種選定的字符。
(3)運(yùn)用全局變量backup保留value時(shí)值后,將value賦值為0。
(4)重新在文本編輯器中顯示單鏈表中保留口勺所有字符,并將光標(biāo)置位到本來日勺位置。
3)復(fù)制
顧客可按Ctrl+C鍵或通過Edit菜單項(xiàng)選擇項(xiàng)來復(fù)制選定的文本,復(fù)制操作的實(shí)現(xiàn)比剪切操
作簡(jiǎn)樸,它的實(shí)現(xiàn)過程如下:
(1)保留目前位置的坐標(biāo)。
(2)運(yùn)用全局變量backup保留value時(shí)值后,將value賦值為0。
(3)重新在文本編輯器中顯示單鏈表中保留的所有字符,并將光標(biāo)置位到本來的位置。
4)粘貼
顧客可按CtH+V鍵或通過Edit菜單項(xiàng)選擇項(xiàng),完畢粘貼操作。這一操作必須在剪切或復(fù)制
操作之后出現(xiàn)。它的詳細(xì)實(shí)現(xiàn)過程如下:
(1)若全局變量backup時(shí)值不小于0(不小于0表達(dá)已經(jīng)有字符放入了剪貼板數(shù)組)中,
則執(zhí)行下面的操作。
(2)保留目前位置的坐標(biāo),運(yùn)用循環(huán)語句,依次運(yùn)用x[0]至x[backup-l]數(shù)組元素保留已
選定字符的坐標(biāo)和字符值,調(diào)用insert()函數(shù)在單鏈表中一次插入一種字符。
(3)重新在文本編輯器中顯示單鏈表中保留的所有字符,并將光標(biāo)置位到本來的位置。
5.菜單控制模塊
在菜單控制模塊中,重要完畢菜單時(shí)顯示、光帶條在子菜單之間日勺上下移動(dòng)或菜單之間日勺左
右移動(dòng)以及子菜單項(xiàng)的I選項(xiàng)T.作。下面分別簡(jiǎn)介這3項(xiàng)功能的I詳細(xì)實(shí)現(xiàn)。
1)顯示菜單
顧客可按Fl、F2和F3功能鍵來分別調(diào)用File、Edit和Help菜單,即完畢菜單時(shí)顯示。當(dāng)
按卜這3個(gè)功能鍵中的某個(gè)功能鍵時(shí),程序會(huì)調(diào)用mcnuctrl()函數(shù)來完畢菜單口勺調(diào)用操作。
在mcnuctrl()函數(shù)中,會(huì)根據(jù)功能鍵口勺鍵值調(diào)用drawmenu(value,flag)函數(shù),參數(shù)value>
flag都為局部變量,分別用來保留調(diào)用某個(gè)菜單、某個(gè)菜單下的第幾種菜單項(xiàng)選擇項(xiàng)。例如,
按F1鍵后,它的默認(rèn)值為drawmenu(0,0),表達(dá)繪制File菜單及其5個(gè)菜單項(xiàng)選擇項(xiàng),并
將菜單項(xiàng)選擇擇光帶條置于第一種菜單項(xiàng)選擇項(xiàng)上。下面簡(jiǎn)要描述一下draw(value,flag)
函數(shù)的過程。
(1)先取value除以3的余數(shù)m(由于有3個(gè)菜單項(xiàng),因此除數(shù)選擇3),根據(jù)m的值來
繪制不一樣的菜單。m的取值為。、1、2、。當(dāng)m等于。時(shí),表達(dá)繪制File菜單;具
他類推。
(2)然后繪制菜單的邊框及菜單項(xiàng)選擇項(xiàng)值。
(3)取File除以x的余數(shù)t,x的取值視m的取值而定,如當(dāng)m=5時(shí),x=5,由于File
菜單下有5個(gè)選項(xiàng)。
(4)根據(jù)t的值,用不一樣的前景色和背景色在本來的位置重新顯示菜單項(xiàng)選擇項(xiàng),以
到達(dá)光帶條的效果。
2)移動(dòng)菜單光帶條
當(dāng)顧客按Fl、F2和F3中的某個(gè)功能鍵調(diào)用了某個(gè)菜單后,可繼續(xù)按光標(biāo)左移、右移、上
移和下移鍵來實(shí)現(xiàn)菜單之旬的切換和菜單項(xiàng)選擇項(xiàng)之間H勺切換。
(1)若為左移鍵,則調(diào)用drawmenu(-value?flag)函數(shù),將切換至某個(gè)菜單的左邊鄰
居菜單。若忖前菜單為最左邊的File菜單,則切換至最右邊的Help菜單。若為右移
鍵,則調(diào)用drawmenu(++value,flag)函數(shù)。
(2)若為上移犍,則調(diào)用drawmenu(value,-flag)函數(shù);若為卜移鍵,則調(diào)用drawmenu
(value,++flag)函數(shù)。
3)選用菜單
當(dāng)顧客將光帶選擇條置于某個(gè)菜單項(xiàng)選擇項(xiàng)上時(shí),可按Enter鍵來選用該菜單項(xiàng)選擇項(xiàng)。選
用菜單操作的I實(shí)現(xiàn)比較簡(jiǎn)樸,它重要運(yùn)用a=(value%3)*10+flag%b來計(jì)算Hl選擇的I菜單項(xiàng)
選擇項(xiàng)的編號(hào)。選用不一樣菜單項(xiàng)選擇項(xiàng)后,aU勺值不一樣。這樣,程序可根據(jù)a的值,返
回給main()函數(shù)不一樣的標(biāo)識(shí),在main()函數(shù)中,可根據(jù)標(biāo)識(shí)的不一樣來執(zhí)行有關(guān)功
能。
6.協(xié)助及其他模塊
協(xié)助模塊重要用于提醒顧客怎樣使用本軟件,它日勺實(shí)現(xiàn)非常簡(jiǎn)樸。同樣,文本的迅速預(yù)覽模
塊是在本來主窗口顯示模塊的基礎(chǔ)上,清除了菜單日勺顯示。
主窗口重要由菜單欄、文本編輯區(qū)和狀態(tài)欄3大部分構(gòu)成。菜單欄用來顯示菜單項(xiàng),文本編
輯區(qū)重要用來完畢文本字符的輸入、刪除等操作,狀態(tài)欄重要用來顯示目前光標(biāo)在文本窗口
中的坐標(biāo)值。它重要運(yùn)用文本窗口小Jgotoxy()函數(shù)和cprintf()函數(shù)來實(shí)現(xiàn),這里需要對(duì)
文本窗口口勺坐標(biāo)進(jìn)行仔細(xì)設(shè)計(jì)。
.3.2數(shù)據(jù)構(gòu)造設(shè)計(jì)
本程序定義了3個(gè)構(gòu)造體,分別與剪貼板、列單鏈表和行單鏈表有關(guān)。下面分別簡(jiǎn)介這3
個(gè)構(gòu)造體及幾種全局變量。
1.與剪貼板有關(guān)的record構(gòu)造體
typedefstructrecord
charch;
intcol,line;
}record;
record構(gòu)造體表達(dá)一種字符所具有的屬性,當(dāng)顧客使用有關(guān)按鍵選定文本后,選定日勺文本保
留在record構(gòu)造體類型的數(shù)組中。構(gòu)造體中各字段表達(dá)II勺意義如bo
charch:保留一種選定日勺文本字符。
intcol,line:分別保留選定字符所在位置的lx軸坐標(biāo)和y軸坐標(biāo)。
2.與列單鏈表有關(guān)的node構(gòu)造體
typedefstructnode
(
charch;
structnode*next;
Jnode;
node構(gòu)造體定義了在一種單鏈表中保留行中的單個(gè)字符的構(gòu)造,我們稱由node類型的節(jié)點(diǎn)
構(gòu)成的單鏈表為列單鏈表,構(gòu)造體中各字段表達(dá)的意義如下。
charch:數(shù)據(jù)域,保留一種字符。
structnode*next:指針域,指向列單鏈表中的下一種節(jié)點(diǎn)。
3.與行單鏈表有關(guān)的Hnode構(gòu)造體
typedefstructHnode
node*next;
structHnodc*ncxtl;
}record;
Hnodc構(gòu)造體定義了在一種單鏈表中保留列單鏈表首節(jié)點(diǎn)地址的I構(gòu)造,我們稱由Hnodc類
型的節(jié)點(diǎn)構(gòu)成口勺單鏈表為行單鏈表。構(gòu)造體中各字段表達(dá)的I意義如下。
node*ncxt:數(shù)據(jù)域,。指向列單鏈表的首節(jié)點(diǎn)口勺地址
structHnode*ncxtl:指針域,指向列單鏈表中的J下一種節(jié)點(diǎn)。
4.全局變量及數(shù)組
intvalue,backup,NUM:value保留有值數(shù)組元素的最大下標(biāo)值,backup保留value歐|副本,
NUM保留目前行中顧客輸入的字符個(gè)數(shù)。
recordr[500]:定義-?種有500個(gè)元素的構(gòu)造體數(shù)組,每個(gè)數(shù)組元素可保留一種選定的文本
字符及其坐標(biāo)值。
.3.3函數(shù)功能描述
1)drawmainO
函數(shù)原型:voiddrawmainO
drawmainO函數(shù)用于在程序中會(huì)只包括菜單欄,編輯區(qū)和狀態(tài)欄在內(nèi)U勺主窗口。
2)qview()
函數(shù)原型:voidqview(Hnode*q)
qview()函數(shù)用于迅速預(yù)覽文本。q為指向行單鏈表中第一種節(jié)點(diǎn)的指針。
3)view()
函數(shù)原型:viodview(Hnode*q)
view。函數(shù)用于按行顯示保留在單鏈表中的文本字符,q為指向行單鏈表中第一種節(jié)點(diǎn)的指
針。
4)chcck()
函數(shù)原型:intcheck(Hnodc*Hhead,intm,intn)
函數(shù)用于在單鏈表中檢查第m行,第n列位置H勺字符,若為常規(guī)字符,則返回該字符:否
則返回0或
5)judgc()
函數(shù)原型:intjudjc(Hnodc*Hhead,intm)
judge。函數(shù)用于返回第m行中不包括回車符在內(nèi)的常規(guī)字符的個(gè)數(shù)。
6)del()
函數(shù)原型:intdcl(Hnode*HheadJntni,intn)
del。函數(shù)用于在單鏈表中刪除第m行,第n列位置的字符。
7)test()
函數(shù)原型:inttest(Hnode*Hn)
test。函數(shù)用于執(zhí)行后,檢查第n行及背面的數(shù)據(jù),使其滿足每行不多于76個(gè)字符的規(guī)則。
8)insert()
函數(shù)原型:viodinsert(Hnode*Hheadintn,chara)
insert。函數(shù)用于在第m行,第n列位置的前一種位置插入單個(gè)字符。
9)control()
函數(shù)原型:voidcontrol(intA,Hnode*Hhead)
control。函數(shù)用于對(duì)左移鍵(右移鍵)進(jìn)行響應(yīng),A為按鍵的整數(shù)值,Hhead為行單鏈表的
首地址。
10)colorvicw()
函數(shù)原型:voicolorvicw(Hnodc*Hhcad,intx,inty)
colorview()函數(shù)用于用不一樣H勺前、背景色現(xiàn)實(shí)選擇的字符。
11)drawmcnu()
函數(shù)原型:voiddrawmcnu(intm,intn)
drawmenu函數(shù)用于畫菜單,m表達(dá)第幾項(xiàng)菜單,n表達(dá)第m項(xiàng)的第n個(gè)子菜單項(xiàng)。
12)mcnuctrl()
函數(shù)原型:intmenuctrl(Hnode*Hhcad,intA)
mcnuctHO函數(shù)用于菜單控制。
13)save()
函數(shù)原型:voidsavc(Hnodc*hcad)
save。函數(shù)用于將head所指的行單鏈表中所指的各個(gè)列單鏈表中的數(shù)據(jù)域口勺值寫入文獻(xiàn),文
獻(xiàn)途徑和文獻(xiàn)名由顧客指定。
14)saveas()
函數(shù)原型:voidsaveas(Hnode*head)
saveas()函數(shù)用于實(shí)現(xiàn)文獻(xiàn)另存工作,文獻(xiàn)途徑和文獻(xiàn)名由顧客指定。
15)opens()
函數(shù)原型:voidopens(Hnode*Hp)
opens。函數(shù)用于從任意文本文獻(xiàn)中讀取文獻(xiàn)內(nèi)容,保留至行單鏈表形式的數(shù)據(jù)構(gòu)造中。
)main()
函數(shù)原型:voidmain()
main()函數(shù)為程序的主控函數(shù),對(duì)它的描述可參見.3.1小節(jié)。
.4程序?qū)崿F(xiàn)
.4.1源碼分析
1.程序預(yù)處理
程序預(yù)處理包括頭文獻(xiàn)的加載,以及構(gòu)造體,常量和全局變量的定義。
/*文本編輯器editor源代碼*/
#include<stdio.h>
#include<conio.h>
#iDelude<bios.h>
#include<math.h>
#defineLEFT0x4b00/**-:光標(biāo)左移*/
#defineRIGHT0x4d00/*f:光標(biāo)右移*/
#defineDOWN0x5000伸1鍵:光標(biāo)下移*/
#defineUP0x4800/*t鍵:光標(biāo)上移*/
#defineESC0x01lb/*ESC鍵:取消菜單打開操作*/
#defineENTEROxlcOd/*回車鍵:換行*/
#defineDEL21248/*DEL鍵:刪除目前字符*/
#defineBACK3592/*Backspace鍵:刪除目前光標(biāo)位置前一種字符*/
#defineCL29440/*ctrl+一鍵:從右至左,選定文本*/
#defineCR29696/*ctrl+f鍵:從左到右,選定文本*7
#defineCc11779/*ctrl+c鍵:將選定文本,復(fù)制一份到剪貼板中引
#dcfincCv12054/*ctrl+v鍵:將剪貼板中的內(nèi)容復(fù)制到目前位置*/
#dcfincCx11544/*ctrl+x鍵:對(duì)選定文本,執(zhí)行剪切操作*/
#dcfincFl15104/*F1鍵:打開文獻(xiàn)菜單*/
#dcfineF215360/*F2鍵:打開編輯菜單*/
#dcfineF3156/*F3鍵:打開協(xié)助菜單*/
#defineF1017408/*F10鍵:進(jìn)入文本迅速預(yù)覽模式》/
intvalue,backup,NUM;
/"value保留有值數(shù)組元素II勺最大下標(biāo)值,backup保留valueII勺副本,NUM保留目前行中的J
顧客輸入的字符個(gè)數(shù)刃
typedefstructrecord
(
charch;/*保留一字符*/
intcol.line;/*x軸和y軸坐標(biāo)*7
}record;
recordr[500];/*定義一種有500個(gè)元素的構(gòu)造體數(shù)組,保留選定的文本字符的屬性*/
typcdcfstructnode/*定義保留行中W、J單個(gè)字符F、J構(gòu)造*/
(
charch;/*數(shù)據(jù)域:保留一字符*/
structnode*next;/*指針域:指向F一種結(jié)點(diǎn)的指針*/
}node;/*由此類型節(jié)點(diǎn)構(gòu)成的單鏈表,命名為:列單鏈表*/
typcdcfstructHnode/*定義保留所有列單鏈表首節(jié)點(diǎn)的指針的構(gòu)造*/
node*ncxt;/*指向列單鏈表日勺首節(jié)點(diǎn)的地址*/
structHnodc*ncxtl;/*指向下一種節(jié)點(diǎn)的I指針*/
}Hnode;/*由此類型節(jié)點(diǎn)構(gòu)成的單鏈表,命名為:行單鏈表*/
2.繪制主窗口
繪制文本編輯器主窗口由drawmain()函數(shù)來完畢,通過精確定位有關(guān)輸出對(duì)象的坐標(biāo)來完畢
主窗口的繪制。主窗口共分為3個(gè)區(qū)域:菜單區(qū),文本編輯去和狀態(tài)欄區(qū)。
voiddrawmainO/*畫主窗U函數(shù)*/
(
inti,j;
gotoxy(l,l);產(chǎn)在文本窗口中設(shè)置光標(biāo)至(11)處*/
textbackground(7):/*選擇新"勺文本背景顏色.7為L(zhǎng)IGHTGRAY淡灰色*/
textcolor(O);/*在文本模式中選擇新的字符顏色0為BLACK黑*/
insline();/*在文本窗口的(1,1)位置處中插入一種空行*/
for(i=l;i<=24;i++)
(
gotoxy(l,l+i);/*(x,y)中x不變,y++*/
cprintf(“%c”[96);/*在窗口左邊輸出-抑畫出主窗口的左邊界*/
gotoxy(80,l+i);
cprintf("%c”,196);/*在窗口右邊,輸出即畫出主窗口的右邊界*/
for(i=l;i<=79;i++)
gotoxy(l+i,2);/*在第2行,第2列開始*/
cprintf("%c”[96);/*在窗口頂端,輸出?*/
gotoxy(l+i,25);/*在第25行,第2列開始*/
cprintf("%cM96);/*在窗口底端,輸出-*/
gotoxy(l,l);cprintf("%c';l96);六在窗口左上角,愉出力
gotoxy(l,24);cprintf(“%c”[96);/*在窗口左下角,輸出力
gotoxy(80,l);cprintf(”%c”,196);/*在窗口右上角,輸出?*/
gotoxy(80,24);cprintf(M%cM,196);/*在窗口右下角,輸出-*/
gotoxy(7.1):cprintf(M%c%cFile%c%c".l79,17..179):/*|<>|*/
gotoxy(27,1);cprintf("%c%cEdit%c%c",179,17?179);/*|<>|*/
gotoxy(47,l);cprintf("%c%cHelp%c%cH,179,17,,179);/*|<>|*/
gotoxy(5,25);/*跳至窗口底端*/
textcolor(1);
cprintfC"Row:lCol:l");
gotoxy(68,25);
cprintf("Version2.0");
3.文本字符顯示輸出
文本字符顯示輸出模塊的作用是通過循環(huán)讀取各單鏈表,醬爆錯(cuò)在單鏈表眾多的字符在文本
編輯區(qū)中顯示輸出。
(I)通過qview(hnodexq)函數(shù),可實(shí)現(xiàn)文本字符的I迅速預(yù)覽。
(2)通過view(hondc*q)函數(shù),可實(shí)現(xiàn)文本字符在編輯區(qū)域日勺顯示。
voidqview(Hnode*q)/*迅速預(yù)覽文本:開頭:#,回車:**/
{
voidview(Hnode水q);/*view()函數(shù)申明*/
node*p;
inti;
window、,1,80,25);/*定義文本窗口大小*/
clrscr。;/*清屏*/
產(chǎn)循環(huán)讀取兩個(gè)單鏈表中的值:q是一種指向行單鏈表首節(jié)點(diǎn)的指針,
此單鏈表數(shù)據(jù)域的值為實(shí)際保留各行字符的列單鏈表p中的首節(jié)點(diǎn)地址*/
do{
p=q->next;/*p指向保留行數(shù)據(jù)的列單鏈表區(qū)J首節(jié)點(diǎn)的地址*/
cprintf("#");/*每行開頭,打印此字符,不管前面與否有回車符號(hào)
while(p!:NULL)/*循環(huán)讀取單鏈表p中時(shí)值*/
(
if(p->ch==13)putch('*');/*若為回車鍵,打印出水號(hào)*/
else
putch(p->ch);/*輸出各行中的字符到預(yù)覽窗口*/
p=p->next;/*指向下一種節(jié)點(diǎn)*/
}
q=q->nextl:/*指向下一種節(jié)點(diǎn)*/
printf("\n"):/*輸出一種回車*/
}while(q!=NULL);
getch();
clrscr();
drawmain。;/*按任意鍵后,回到主窗口界面*/
window(2,2,79,23);
textbackground(9);
for(i=0;i<24;i++)
insline();/*插入24個(gè)空行*/
window(3,3,78,23);
textcolor(lO);
I
voidview(Hnode*q)/*按行顯示保留在單鏈表中H勺文本字符,q為指向行單鏈表中第一種節(jié)
點(diǎn)的指針*/
node*p;/*p為保留列單鏈表節(jié)點(diǎn)元素地址的指針*/
clrscr();/*清屏*/
/*雙重循環(huán),讀取并顯示保留在單鏈表中字符*/
do{
p=q->next;
while(p!=NULL&&p->ch>=32&&p->ch<l27&&p->ch!=13&&p->ch!=-l)/*
指針p不能為空,且數(shù)據(jù)域必須為常規(guī)字符號(hào)
(
puich(p->ch);/*在文本窗口中輸出該字符列
p=p->next;/*指向下一種節(jié)點(diǎn)*/
)
q二q->nextl;/*指向下一種節(jié)點(diǎn)*/
if((p->ch==13||p->ch==-1)&&q!=NULL)gotoxy(1.wherey()+1);/*若ch為回
車或EOF標(biāo)識(shí),光標(biāo)跳至下行的開始處*/
}while(q!=NULL);/*逐行逐列顯示文本字符*/
)
4.刪除字符
程序調(diào)用del(Honde*Hhead,intm,intn)函數(shù)來完畢刪除第行、笫列位置的字符。它的詳細(xì)過
程在功能模塊設(shè)計(jì)部分已經(jīng)詳細(xì)簡(jiǎn)介。下面簡(jiǎn)介此外兩個(gè)對(duì)字符進(jìn)行檢測(cè)的函數(shù),它在字符
的刪除、插入等許多操作中均有用到。
(1)調(diào)用check(Hnode*Head,intm,intn)函數(shù),在單鏈表中檢查笫m行、第n列位置口勺字
符,若為常規(guī)字符,則返回該字符;否則返回?;?L,
(2)調(diào)用judge(Hnode*Hm)函數(shù),在單鏈表中記錄第m行中的J常規(guī)字符的總個(gè)
數(shù),并返回記錄值。
intdcl(Hnodc*Hhead,intm,intn)/*dcl():刪除第m行,第n列位置口勺字符*/
(
Hnodc*q,*ql;
node?pl,*p2,*tail;
inti,num=0,j,flag=0;
q=Hhcad;
if(n==0&&m==l)return;/*第1行,第0列不存在力
if(n=0&&m>l)/*若為第0列字符,但行必須不小于1,執(zhí)行向上行移處理*/
{
n=76:
m=m-1;
gotoxy(n,m);/*移至第m-1行,第76列*/
flag=l;/*移位的標(biāo)志置1*/
}
for(i=l;i<m;i++)嚴(yán)定位至行單鏈表中日勺第in個(gè)元素*/
q=q->nextl;
pl=q->next;
for(i=l;i<n-l;i++)/*定位至列單鏈表中的I第n-1個(gè)元素*/
pl=pl->ncxt;
p2=pl->next;/*p2指向列單鏈表中H勺第n個(gè)元素*/
if(n==l)/*若是刪除第m行第1列的字符*/
{
q->next=pl->next;
free(pl);
I
else
(
pl->nexl=p2->nex【;/*在單鏈表中刪除第m行第n列%I元素*/
free(p2);
)
/*刪除掉第m行第n列II勺元素后,處理行單鏈表中第m個(gè)節(jié)點(diǎn)后的數(shù)據(jù)
向前移的任務(wù)*/
while((num=judge(Hhead,m++))>O)/*執(zhí)行一次judge(Head,m)后,m才加
1.這里必須滿足行常規(guī)字符數(shù)不為0的條件*/
(
pl=q->next;ql=q;
if(pl!=NULL)/*若目前行非空列
\vhilc(p1->ncxt!=NULL)
pl=pl->ncxt;
tail=p1;/*tai1保留列單鏈表最終一種元素/、J地址*/
q=q->nextl;/*指向F一行的元素歐I地址*/
pl=p2=q->ncxt;
tailoncxt=pl;/*tail的指針域指向卜.一4J訥第一種元素
的地址*/
)
else/*若目前行日勺字符個(gè)數(shù)為0,即刪除該字符后,只剩余回
車符,則將下一種行單鏈表中節(jié)點(diǎn)H勺數(shù)據(jù)域移至前一下節(jié)點(diǎn)的數(shù)據(jù)域*/
(
q=q->nextl:p1=p2=q->ncxt:
qlonext=pl;/*ql->next指向下?行的J第?種元素日勺地
址*/
)
tor(i=U;K76-num;i++)
/*目前行尚有76-num個(gè)空位沒有字符,在下一行的單鏈表中讀
取字符,直至碰到回車符為止*/
pl=p2;/*pl指向p2%J前一種節(jié)點(diǎn),p2指向行單鏈表中
下一種節(jié)點(diǎn)*/
p2=p2->ncxt;
if(p2->ch==13)break;/*若為回車,跳出循環(huán)*/
)
q->next=p2;/*在列單鏈表中去掉移至上行口勺元素*/
pl-〉next=NULL;/*下行移至上行的最終一種元素,指針置空*/
)
returnflag;/*返回0:表達(dá)沒有換位,返回1:表達(dá)有換位*/
}
intchcck(Hnode*Hhead,intm,intn)/*check():在單鏈表中檢查第in行第n列位置的字符,若
為常規(guī)字符,則返回該字符*/
{
inti;
Hnodc木q;
node*p;
q二Hhead;
for(i=l;i<m;i++)產(chǎn)定位至行單鏈表中歐)第in個(gè)元素*/
q=q->nextl;
p=qonext;/*獲取第m個(gè)節(jié)點(diǎn)的數(shù)據(jù)域號(hào)
for(i=l;ivn;i++)/*定位至列單鏈表中U勺第n個(gè)元素*/
p=p->next;
if(p->ch==13)return-1;/*若第m行:,第n列的字符為回車鍵,則返回-1*/
if(p->ch>=32&&p->ch<127)returnp->ch;/*若第m行,第n列/口字符為常規(guī)字符,
則返回該字符*/
elsereturn。;/*若第m行,第n列的J字符既非回車符又非常規(guī)字符,則返回0*/
intjudge(Hnode*Hhead,in(m)/*judge():返回第m行中於J常規(guī)字符總H勺個(gè)數(shù),不包括回車符*/
(
Hnode*q;
node*p;
inti,num=0;
q=Hhead;
for(i=l;i<m;i++);*定位至行單鏈表中日勺第m個(gè)元素*/
q=q->nextl;
if(q==NULL)return-1;/*返回-1,表達(dá)第m行不存在*/
p=q->next;
while(p->next!=NULL)
{
p=p->next;
num++;/*記錄第m行口勺字符個(gè)數(shù)*/
/*行尾字符還沒有判斷,接下來判斷行尾字符*/
if(p->ch==13&&num==0)return0;/*返回0,表達(dá)目前行只有一種回車字符*/
if(p->ch>=32&&p->ch<127)returnnum+1;/*返回num+1,表達(dá)目前行的最終一種
字符為常規(guī)字符*/
if(p->ch==13&&num!=0)returnnum;/*返回num,表達(dá)目前行的J最終一種字符為回
車符,不計(jì)算在內(nèi)*/
elsereturn1;/*返回num,表達(dá)目前行中只有一種字符,且沒有回車符*/
}
5.插入字符
在文本編輯區(qū)中插入字符的工作由insert(Hnode,*Hhead,intm,intn,chara)函數(shù)和
test(Hnode*Hhead,intn)函數(shù)配合完畢。
(1)通過inserKHnodexHn.chara)函數(shù),在第m行、第n列的位置之前歐J一
種位置,在單鏈表中插入字符a。
⑵通過test(Hnode*n)函數(shù),檢查和處理第n行及背面的數(shù)據(jù),使其滿足每行
不超過76個(gè)字符的規(guī)則voidinsert(Hnode*Hhead,intm,intn,chara)/*第m行,第n列的位
置之前一種位置,插入單字符*/
{
inti;
Hnode*q;
node*p,*pl,*p2;
q=Hhcad;
for(i=l;i<m:i++);*定位至行單鏈表中日勺第m個(gè)元素*/
q=q->ncxtl;
p1=q->next;
for(i=l;i<n-l;i++j/*定位至列單鏈表中的J第n-1個(gè)元素*/
pl=pl->ncxt;
p=(nodc*)malloc(sizeof(node));/*創(chuàng)立一種新的)列單鏈表節(jié)點(diǎn)*/
p->ch=a;/*給此節(jié)點(diǎn)次)數(shù)據(jù)域賦值*/
if(n==l)/*插入之前,若只有一種字符在行中,則插在此節(jié)力、之前刃
{
p->next=q->next;
q->next=p;
}
else
(
p->next二pl->next;/*在第m行,第n列U勺字符前,插入一字符*/
p1->next=p;
)
test(Hhead,m);/*在插入新元素后,檢查并處理單鏈表中第m行開始I向元素,使其滿足
規(guī)則*/
/*執(zhí)行insert。后,檢查第n行及背面的數(shù)據(jù),使其滿足規(guī)則*/
inttest(Hnodc*Hhcad,intn)
{
inti=O,numl=l;
node*pl,*p2,*tail.*templ,*temp2;
Hnodc*q;
q=Hhcad;
for(i=l;i<n;i++)/*定位至行單鏈表中的第n個(gè)元素*/
q=q->nextl;
tail=pl=q->next;
if(pl==NULL)retum;/*若此行沒有任何字符,則返回*/
while(tail->next!:NULL)/*定位至列單鏈表中II勺最終一種元素可
tail=tail->next:
/*若此單鏈表中沒有回車符且有超過76個(gè)節(jié)點(diǎn)時(shí),則pl會(huì)指向此列單鏈表中日勺第
76個(gè)節(jié)點(diǎn)*/
for(i=0;i<75;i++)
(
if(p1->ch==13||p1->next==NULL)break;
pl=pl->ncxt;
p2=pl->next;
pl->next=NULL;/*在此行的最終一種字符的前一種字符處斷行,由于插入在此行插
入了一種新日勺字符*/
if(tail->ch!=13)/*若此行行尾不是回車鍵*/
{
if(p1->ch==13&&q->nextl==NULL)/*若p1的)數(shù)據(jù)域?yàn)榛剀嚪倚袉捂湵碇兄?/p>
有n個(gè)節(jié)點(diǎn)*/
(
q->nextl=(Hnode*)malloc(sizeot(Hnodc));/*新建?種行單鏈表節(jié)
點(diǎn),相稱于添加一種新行*/
q->nextl->nextl=NULL;
tail->next=(node*)malloc(sizeof(node));/*izttail所指節(jié)點(diǎn)位置開始
繼續(xù)準(zhǔn)備添加字符*/
tail->next->ch=13;tail->next->next=NULL;
q->nextl->next=p2;/*新行單鏈表節(jié)點(diǎn)保留此行多出的字符*/
)
else/*若此行行尾和行中都沒有回車鍵,或者q->nextl不為空*/
(
q=q->nextl;/*q->nextl有也許為空號(hào)
tail->next=q->next;/*4^多出IJ勺字符與下一行U勺字符相連*/
q->next=p2;/**/
if(q!=NULL)test(Hhead,++n);/*若行單鏈表第n個(gè)節(jié)點(diǎn)后尚有節(jié)點(diǎn),
繼續(xù)tcst()H勺相似處理*/
else/*若此列單德表最終一種元素為同車符為
{
temp2=p2;/*p2指向第77個(gè)字符,或者為空(為空表達(dá)此行插入一種字符后,
沒有超過范圍*/
while(q!=NULL&&p2;=NULL)/*q指向行列表中的第n個(gè)節(jié)點(diǎn).條件:行單鏈表
中第n個(gè)節(jié)點(diǎn)存中且有第77個(gè)字符*/
{/*條件:在行單鏈表中只有n個(gè)節(jié)點(diǎn),且字符超過了一行規(guī)定的76個(gè),且
numl標(biāo)志為I*/
if((q->nextl==NULL)&&(p1!=tail||p2!=NULL)&&(numl==l))
{
numl++;
q->ncxtl=(Hnode*)malloc(sizcof(Hnodc));/*新建一種行單鏈表節(jié)
點(diǎn),準(zhǔn)備存儲(chǔ)此行中多出的字符*/
q->ncxtl->ncxtl=NULL;q->nextl->ncxt=NULL;/*初始化值*/
/*行單鏈表中第n+1個(gè)節(jié)點(diǎn)已經(jīng)存在,下面為在行單鏈表中插入一種新H勺
節(jié)點(diǎn)*/
q=q->ncxtl;/*q指向行歹lj表中H勺第n+1個(gè)節(jié)點(diǎn)*/
tcmpl=q->ncxt;
q->ncxt=temp2;/*q的I數(shù)據(jù)域?yàn)榇诵兄卸喑鯤勺字符所在的列單鏈表中的
節(jié)點(diǎn)地址可
tcmp2=tcmp1;
6.選定文本
在文本編輯區(qū)選定文本的工作由control(intA,Hnode*Hhead)函數(shù)和
colorview(Hnode*Hhead,intx,inty)函數(shù)配合完畢。
(1)通過controKintA.Hnode*Hhead)函數(shù),對(duì)控制鍵進(jìn)行響應(yīng),移動(dòng)光標(biāo)后并將光標(biāo)所
在位置的字符保留在數(shù)組中。
(2)通過colorview(Hnode*Hhead,intx,inty)函數(shù),用不
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《稅收優(yōu)惠政策解析》課件
- 2025屆江西省臨川一中中考試題猜想生物試卷含解析
- 二零二五版商業(yè)地產(chǎn)抵押貸款登記服務(wù)合同3篇
- 2025年上半年鄭州第七人民醫(yī)院招考合同制護(hù)士易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 二零二五年度酒店式物業(yè)前期托管服務(wù)合同3篇
- 2025年上半年遵義市習(xí)水縣招考研究生(緊缺專業(yè)人員)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 二零二五年裝卸搬運(yùn)服務(wù)人員勞動(dòng)合同示范文本2篇
- 2025年上半年遼寧省沈陽市遼中區(qū)城管執(zhí)法局招聘60人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年遼寧省交通建設(shè)投資集團(tuán)招聘48人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年水泥行業(yè)信用擔(dān)保購銷補(bǔ)充協(xié)議3篇
- 神經(jīng)外科進(jìn)修匯報(bào)課件
- 2024老年人靜脈血栓栓塞癥防治中國專家共識(shí)(完整版)
- 騰訊營銷師認(rèn)證考試題庫(附答案)
- 鄰近鐵路營業(yè)線施工安全監(jiān)測(cè)技術(shù)規(guī)程 (TB 10314-2021)
- 四年級(jí)上冊(cè)脫式計(jì)算100題及答案
- 資本市場(chǎng)與財(cái)務(wù)管理
- 河南近10年中考真題數(shù)學(xué)含答案(2023-2014)
- 八年級(jí)上學(xué)期期末家長(zhǎng)會(huì)課件
- 2024年大學(xué)試題(宗教學(xué))-佛教文化歷年考試高頻考點(diǎn)試題附帶答案
- HGE系列電梯安裝調(diào)試手冊(cè)(ELS05系統(tǒng)SW00004269,A.4 )
- 尤文肉瘤的護(hù)理查房
評(píng)論
0/150
提交評(píng)論