簡(jiǎn)易文本編輯器課程設(shè)計(jì)報(bào)告.doc
《簡(jiǎn)易文本編輯器課程設(shè)計(jì)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《簡(jiǎn)易文本編輯器課程設(shè)計(jì)報(bào)告.doc(24頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、中北大學(xué)數(shù) 據(jù) 結(jié) 構(gòu)課 程 設(shè) 計(jì) 說 明 書學(xué)生姓名:張興凱學(xué) 號(hào):1021011547學(xué) 院:軟件學(xué)院專 業(yè):軟件工程題 目: 簡(jiǎn)易文本編輯器成績(jī)指導(dǎo)教師何志英2011年12月20日 1設(shè)計(jì)目的簡(jiǎn)易文本編輯器2設(shè)計(jì)內(nèi)容和要求1)具有圖形菜單界面;2)查找,替換(等長(zhǎng),不等長(zhǎng)),插入(插串,文本塊的插入)、塊移動(dòng)(行塊,列塊移動(dòng)),刪除3)可正確存盤、取盤;4)正確顯示總行數(shù)。3本設(shè)計(jì)所采用的數(shù)據(jù)結(jié)構(gòu) 本程序是對(duì)輸入的文字進(jìn)行操作,故使用的數(shù)據(jù)結(jié)構(gòu)為單鏈表操作線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的特點(diǎn)是用一組任意的存儲(chǔ)單元存儲(chǔ)線性表的數(shù)據(jù)元素。它包括兩個(gè)域:其中存儲(chǔ)數(shù)據(jù)元素信息的域稱為數(shù)據(jù)域;存儲(chǔ)直接后繼
2、存儲(chǔ)位置的域稱為指針域。另有全局變量*head,作為文章的頭指針。 在文章內(nèi)容創(chuàng)建部分中使用線性表的鏈?zhǔn)酱鎯?chǔ),并使用全局變量對(duì)文本的各種信息進(jìn)行存儲(chǔ); 文章的內(nèi)容統(tǒng)計(jì)、刪除、查找、插入都采用鏈表操作完成。4功能模塊詳細(xì)設(shè)計(jì)4.1 詳細(xì)設(shè)計(jì)思想本程序所定義函數(shù)的設(shè)計(jì)思想:CreatWord()文本內(nèi)容輸入函數(shù)定義LinkList指針變量*temp: LinkList *temp;定義文本輸入變量ch,記錄文本行數(shù)變量j,記錄每行字符數(shù)變量i;申請(qǐng)動(dòng)態(tài)存儲(chǔ)空間:head-next=(LinkList *)malloc(sizeof(LinkList);首行頭指針的前驅(qū)指針為空:head-pre=N
3、ULL;利用循環(huán)進(jìn)行文本輸入PrintWord()當(dāng)前文本輸出函數(shù)定義文本行數(shù)變量j,每行字符數(shù)i:int i,j;定義指針變量:LinkList *p;將指針p指向鏈表表頭: p=head-next;利用循環(huán)輸出鏈表中信息: for(j=0;j=NUM&p!=NULL;j+)=for(i=0;(idatai)!=#;i+)=printf(%c,p-datai);p=p-next; SearchWord( ) 文本內(nèi)容查找函數(shù)定義一個(gè)數(shù)組,用來記錄需要查找的字符內(nèi)容:char Data20;定義定義文本行數(shù)變量j,每行字符數(shù)i,記錄字符出現(xiàn)的次數(shù)變量:利用循環(huán)進(jìn)行查找操作,核心算法為:if(t
4、emp-datai)=Datak) k+;/將輸入的查找字符與鏈表中信息比較,找到第一個(gè)相同的字符 else if(Datak!=0)i=i-k; k=0; / /從主串第i-k個(gè)位置重新查找 if(Datak=0) sum+;/此字符出現(xiàn)的次數(shù)加1 i=i-k+1; /i記錄下該字符串出現(xiàn)的位置 printf(tt第%d次出現(xiàn)在第%d行第%d列n,l,j+1,i); l+; k=0;continue; temp=temp-next; /指向下一行DeleteWord( ) 文本內(nèi)容刪除函數(shù)定義一個(gè)數(shù)組用來存儲(chǔ)需要?jiǎng)h除的字符或者字符串:char Data20;定義指針變量:LinkList *
5、temp,*term;使用VC+中拷貝函數(shù)講形參中需要?jiǎng)h除的字符或字符串賦值給已定義的數(shù)組:strcpy(Data,str2);使用循環(huán)進(jìn)行刪除操作:其核心算法為:for(j=0;j=NUM;j+) for(i=0;idatai)=Datak) k+; else if(Datak!=0) i=i-k;k=0; if(Datak=0) num=i;break; if(num80) break; 首先是使用循環(huán)查找到需要?jiǎng)h除字符或者字符串的字符數(shù)以及字符或者字符串的位置,以便于刪除; for(;j=NUM;j+) for(;i80;i+) if(i+1data80-k+num=temp-datai
6、+1; /刪除的字符串不在最后一行,將下一行的字符(由temp指向)前移到前行else temp-datai-k+1=temp-datai+1; /當(dāng)要?jiǎng)h除的字符串在最后一行只要將最后一行的字符前移 term=temp; temp=temp-next; j=0;/在使用循環(huán),從查找到的字符或者字符串開始進(jìn)行刪除,在一行刪除完畢之后,轉(zhuǎn)至下一行進(jìn)行刪除。本程序所定義的函數(shù):1、HeadWord() 標(biāo)題函數(shù),即一個(gè)輸出標(biāo)題,永遠(yuǎn)出現(xiàn)在程序的最頂端。2、save() 文件存儲(chǔ)函數(shù)3、load() 文件讀取函數(shù)4、CreatWord() 文本輸入函數(shù)5、PrintWord() 當(dāng)前文本內(nèi)容輸出函數(shù)6
7、、SearchWord() 文章內(nèi)容查找函數(shù)7、DelWord() 文章內(nèi)容刪除函數(shù)8、InsertWord() 文章內(nèi)容插入函數(shù)9、Replace() 文章內(nèi)容替換函數(shù)10、Bmenu() 第二子菜單函數(shù)11、menu() 主菜單函數(shù)12、main()主函數(shù)4.2 運(yùn)行結(jié)果(1)執(zhí)行完menu() 主菜單函數(shù)后的結(jié)果(2) 輸入文章內(nèi)容的結(jié)果(3)讀取當(dāng)前文本內(nèi)容信息(4) 進(jìn)入文本內(nèi)容處理菜單(5)查找文章中字符或者字符串(6)顯示當(dāng)前文章內(nèi)容(7)返回主菜單4.3 核心代碼#include stdafx.h#include stdio.h#include conio.h#includem
8、alloc.h#includestring.h#includeiostream.h#includestdlib.h#define Link_Size 100int NUM,C,N,hang; /*定義全局變量,Num用來記錄行號(hào),C用來記錄子串在主串中出現(xiàn)的總次數(shù)*/#define MAXLEN 80char bufferMAXLEN,fname120;char *lineptrLink_Size;FILE *fp;int modified=0,/*正文被修改標(biāo)志*/ last;/*當(dāng)前正文行數(shù)*/char *chpt;/*輸入命令行字符指針*/typedef struct _list/*行表
9、結(jié)構(gòu)*/ char data80;/*記錄一行字符*/int length;/*記錄一行字符長(zhǎng)度*/ struct _list *next;/* 后繼指針*/struct _list *pre;/*前趨指針*/int row;/*記錄整篇文章的行數(shù)*/LinkList;LinkList *head; /*定義全局變量*head,文章首行頭指針*/void HeadWord()printf(tt*n);printf(tt* 歡迎使用簡(jiǎn)單的文本編輯器 *n);printf(tt*n);int save(char *fname) int i; FILE *fp; char name80; if(!*
10、fname) printf(filename:); gets(name); else strcpy(name,fname); if(fp=fopen(name,wb)=NULL) return 0; for(i=0;ilast;i+) fputs(lineptri,fp); free(lineptri); fclose(fp); printf(file %s already saved.,name); getch(); return 1;int load(char *fname) FILE *fp; char ch,*p; int i; if(fp=fopen(fname,rb)=NULL)
11、return 0; while(!feof(fp) ch=getc(fp); if(ch=x09) for(i=0;inext=(LinkList *)malloc(sizeof(LinkList); head-pre=NULL;temp=head-next; temp-pre=NULL; temp-length=0; for(i=0;idatai=0;printf(開始創(chuàng)建文本,請(qǐng)輸入文章(按#結(jié)束):n);for(j=0;jLink_Size;j+) for(i=0;idatai=ch; temp-length+;if(ch=n)hang+; if(ch=#) NUM=j; break;
12、if(ch=#) temp-length=i; temp-next=NULL; break; temp-next=(LinkList *)malloc(sizeof(LinkList) ; temp-next-pre=temp; temp=temp-next; for(i=0;idatai=0;temp-row=NUM+1;system(cls);return temp;void PrintWord()int i,j;/*記錄文本行數(shù)變量j,記錄每行字符數(shù)變量i*/LinkList *p;p=head-next;system(cls); HeadWord();printf(n當(dāng)前文章的內(nèi)容是:
13、);for(j=0;j=NUM&p!=NULL;j+)for(i=0;(idatai)!=#;i+)printf(%c,p-datai);p=p-next; printf(n當(dāng)前文章行數(shù)為:%dn,hang);void SearchWord(char *str1,LinkList* temp) char Data20 ; int i,j,k=0,sum=0;int l=1; temp=head-next; strcpy(Data,str1); for(i=0;i=NUM;i+) for(j=0;jdataj)=Datak) k+; else if(Datak!=0)j=j-k;k=0; if(
14、Datak=0) sum+;j=j-k+1;printf(tt第%d次出現(xiàn)在第%d行第%d列n,l,i+1,j+1);l+;k=0;continue; temp=temp-next; printf(ttt字符串總共出現(xiàn)次數(shù)為:%dnn,sum); C=sum;N=i*80+j; void DelWord(char *str2) char Data20; LinkList *temp,*term; int i,j,k,m,y,num;strcpy(Data,str2);for(y=0;yC;y+) num=80;k=0,m=0; temp=head; for(i=0;inext; for(j=0
15、;jdataj)=Datak) k+; else if(Datak!=0) j=j-k;k=0; if(Datak=0) num=j;break; if(num80) break; for(;i=NUM;i+) for(;j80;j+) if(j+1data80-k+num=temp-dataj+1; elsetemp-dataj-k+1=temp-dataj+1; term=temp; temp=temp-next; j=0; LinkList * InsertWord(LinkList *temp) char Data20; int h,l;printf(ntt請(qǐng)輸入要插入的字符或字符串:
16、);getchar();gets(Data);printf(ntt當(dāng)前文章內(nèi)容為:);PrintWord();printf(ntt請(qǐng)輸入要插入的行:);scanf(%d,&h);printf(ntt請(qǐng)輸入要插入的列:);scanf(%d,&l); int i=(h-1)*80+l; LinkList *a;int n=strlen(Data);int m ;int insertRow=i/80+1;int row=temp-row;int j;if(insertRow=row)for(m=temp-length-1;m=(i%80)&n0;m-)temp-datam+n=temp-datam;
17、for(m=(i%80),j=0;mdatam=Dataj; elseint r=0;for(int p=insertRow; plength-1-r;m=0&n0;m-)temp-datam+n=temp-datam;a=temp;temp = temp-pre;temp-length = 80;for(m = temp-length-n,j=0;mlength;m+,j+)a-dataj=temp-datam;for(m=temp-length-n-1;m=(i%80);m-) temp-datam+n=temp-datam;for(m=(i%80),j=0;mdatam =Dataj;r
18、eturn temp;void Replace() int k,m,n,i,j; sscanf(chpt,%d%d%d,&k,&m,&n); /* 讀入?yún)?shù) */ if(mlast|n=Link_Size)/* 檢查參數(shù)合理性 */ printf(Error!n); return; /* 先完成刪除 */ if(nlast) n=last; /* 修正參數(shù) */ for(i=m;i=n;i+) /* 刪除正文 */ free(lineptri-1); for(i=m,j=n+1;j=m;i-) lineptri+k-1=lineptri-1; for(i=0;i6)&(t1) printf(對(duì)
19、不起,無此功能,請(qǐng)輸入正確的功能序號(hào)!n);elseswitch(t) case 1: system(cls); HeadWord(); temp=CreatWord(); break; case 2: save(name); break;case 3: load(name); break; case 4: PrintWord(); printf(n); printf(按回車鍵繼續(xù)); getchar(); getchar(); system(cls); break; case 5: system(cls); Bmenu(temp); break;if(t=6) break;while(1);
20、void main()head=(LinkList *)malloc(sizeof(LinkList);LinkList *temp;menu(temp);5課程設(shè)計(jì)心得及存在問題本程序是在線性表的基礎(chǔ)上改進(jìn)的,用到了雙向鏈表和一些c+里面的知識(shí)。線性表的操作數(shù)是浮點(diǎn)形,而文本編輯器的操作數(shù)是字符型,在線性表的程序上加進(jìn)插入刪除查找數(shù)據(jù)結(jié)構(gòu),然后建立一個(gè)文件保存線性表中的數(shù)據(jù),就是我寫的程序。本次課程設(shè)計(jì)還算順利,但是在設(shè)計(jì)過程中由于自己的不細(xì)心,忽略了一些關(guān)鍵的細(xì)節(jié),導(dǎo)致了在編寫過程中出現(xiàn)了一些錯(cuò)誤。例如:少了分號(hào),或忘了定義函數(shù),又如能運(yùn)行但輸出結(jié)果錯(cuò)誤,結(jié)果不正確。又由于自己打字時(shí)犯得小
21、錯(cuò)誤,導(dǎo)致出現(xiàn)不易發(fā)現(xiàn)的錯(cuò)誤,最終在老師及編程能力比較強(qiáng)的同學(xué)幫助下,查找到并及時(shí)改正。該程序不僅可以利用線性表還可以利用串、單鏈表司實(shí)現(xiàn),通過做該程序,我又對(duì)課本做了新的解讀,加深了對(duì)所學(xué)知識(shí)的印象及了解,同時(shí)也了解了我還有許多不足,對(duì)許多所學(xué)過的知識(shí)掌握得不夠透徹,不夠深入,應(yīng)用不夠靈活,今后我會(huì)彌補(bǔ)這方面的不足,加深理解課本知識(shí),同時(shí)注重應(yīng)用。 通過這次課程設(shè)計(jì)讓我又學(xué)到了很多東西,加深了對(duì)數(shù)據(jù)結(jié)構(gòu)這門課程的理解和學(xué)會(huì)了如何在實(shí)際中應(yīng)用數(shù)據(jù)結(jié)構(gòu)編程。讓我了解到自己在這門課程上還存在很多缺陷,尤其是對(duì)文件操作問題。通過對(duì)線性表的應(yīng)用,查找課本資料加深了對(duì)線性表的了解,并學(xué)會(huì)了靈活運(yùn)用。通過
22、調(diào)試,我學(xué)會(huì)了借助逐步調(diào)試功能和數(shù)據(jù)窗口,加快找到程序中的錯(cuò)誤點(diǎn),調(diào)試能力有所提高。 本程序中運(yùn)用了大量的循環(huán)結(jié)構(gòu)和條件結(jié)構(gòu),在編寫程序時(shí)要注意條件的判斷和循環(huán)條件的正確編寫。該程序中程序代碼較多,引用較多指針和定義的許多變量,理解起來較難。而且對(duì)于文件的存儲(chǔ)和讀取還是存在問題。有待于我自己進(jìn)一步再去研究這段程序,并且改進(jìn)它。我現(xiàn)在初步的解決辦法是定義一個(gè)類,類里包含一些靜態(tài)的屬性和動(dòng)態(tài)的函數(shù),然后在繼承這些函數(shù)。這樣可以簡(jiǎn)化程序代碼,然后精確存取的文件路徑,使之在文件的存取方面便于更好的理解,使程序功能更全面??傊?,通過本次課程設(shè)計(jì),不僅鍛煉了我的實(shí)際操作能力,而且培養(yǎng)了嚴(yán)密的思維能力和嚴(yán)謹(jǐn)?shù)膽B(tài)度。本次課程設(shè)計(jì)的確令我受益匪淺,而且增加了編程的興趣。23
- 溫馨提示:
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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案