簡單文本編輯器-數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告._第1頁
簡單文本編輯器-數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告._第2頁
簡單文本編輯器-數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告._第3頁
簡單文本編輯器-數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告._第4頁
簡單文本編輯器-數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告._第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、合肥學(xué)院計算機科學(xué)與技術(shù)系課程設(shè)計報告2009 2010 學(xué)年第 二 學(xué)期課程 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計名稱簡單文本編輯器學(xué)生姓名何云龍學(xué)號0804012022專業(yè)班級08計科(2)班指導(dǎo)教師王昆侖、張冠紅2010 年 6 月實驗題目:簡單的文本編輯器1、 題目及要求名稱:簡單的文本編輯器內(nèi)容:輸入一頁文字,程序可以統(tǒng)計出文字、數(shù)字、空格的個數(shù)。靜態(tài)存儲一頁文章,每行最多不超過80個字符,共N行。要求:(1)分別統(tǒng)計出其中英文字母數(shù)和空格數(shù)及整篇文章總字?jǐn)?shù);(2)統(tǒng)計某一字符串在文章中出現(xiàn)的次數(shù),并輸出該次數(shù);(3)刪除某一字符或者子串,并將后面的字符前移。(4)插入某一字符或者子串。(5)查找

2、某一字符或者子串。存儲結(jié)構(gòu)使用線性表,分別用幾個子函數(shù)實現(xiàn)相應(yīng)的功能;輸入數(shù)據(jù)的形式和范圍:可以輸入大寫、小寫的英文字母、任何數(shù)字及標(biāo)點符號。輸出形式:(1)分行輸出用戶輸入的各行字符;(2)分4行輸出"全部字母數(shù)"、"數(shù)字個數(shù)"、"空格個數(shù)"、"文章總字?jǐn)?shù)"(3)輸出刪除某一字符串后的文章。2、對題目的大概理解:本程序應(yīng)實現(xiàn)以下功能:(1) 文章內(nèi)容的輸入:包括字母、標(biāo)點符號、數(shù)字、空格等;(2) 文章內(nèi)容的統(tǒng)計:包括文章中大寫字母、小寫字母、數(shù)字、標(biāo)點符號、空格以 及文章所有字?jǐn)?shù)的個數(shù)的統(tǒng)計;(3) 文章內(nèi)容的

3、處理:包括對文章內(nèi)容的查找、刪除以及對指定位置進(jìn)行插入操作, 其中在查找的過程中統(tǒng)計出該字符或字符串在文章中出現(xiàn)的次數(shù);1、 問題分析本程序是對一段英文文章的內(nèi)容進(jìn)行處理,存儲方式采用鏈?zhǔn)酱鎯?,沒有文件操作,故本程序?qū)ζ湮谋緝?nèi)容的所有操作都是在鏈表中進(jìn)行的。對于文本的輸入,采用頭插法將文本信息存儲到鏈表已申請好的存儲空間中,在此部分設(shè)計中最大的問題在于輸入文章過程中輸入的字符數(shù)大于80時如何換行;對于文本內(nèi)容的統(tǒng)計,使用循環(huán)對已存儲的文章進(jìn)行匹配,大寫字母數(shù)、小寫字母數(shù)、空格數(shù)、數(shù)字?jǐn)?shù)直接通過比較即可得到,標(biāo)點符號通過ASC比較即可得到;對于文本內(nèi)容的處理,查找部分仍是使用循環(huán)對已存儲的文章進(jìn)

4、行匹配,判斷需要查找的字符或者字符串是否與文章中某部分內(nèi)容相同,如果存在相同的記錄相同的個數(shù)及位置并輸出個數(shù)及位置。刪除部分先使用程序的查找功能對文章中需要刪除的字符或者字符串進(jìn)行查找,然后對其進(jìn)行刪除。插入部分為通過輸入的插入位置(行、列)將字符或者字符串插入到文章制定位置。本人對此程序的功能的擴展與完善: 本程序為簡單文本編輯器,如果加入磁盤文件的操作會使得該程序更加合理與完美。因此,在輸入文本時可以分為:從鍵盤直接輸入英文文本從磁盤文件中讀取英文文本 經(jīng)過文本的輸入后,可以把經(jīng)過處理過的文本保存到原來的或新建的磁盤文件中去!加入文件的操作后,使該程序的可用性更加滿足用戶的需求!一、 數(shù)據(jù)

5、結(jié)構(gòu)選擇和概要設(shè)計數(shù)據(jù)結(jié)構(gòu)選擇:本程序是對輸入的文字進(jìn)行操作,并要求靜態(tài)存儲一頁文本。由于是一頁文本,包括多行,而且相鄰兩行的字符內(nèi)容是依次讀入該頁的。因此,兩行之間的內(nèi)容要建立相應(yīng)的聯(lián)系。通過一個單鏈表,來控制該文本的行數(shù),并額外設(shè)置一個前驅(qū)指針Linklist *pre來與上一行進(jìn)行有效連接,通過Linklist *next來指向下取得與下一行的連接。為了控制每行的字符個數(shù),在該鏈表的數(shù)據(jù)結(jié)構(gòu)中設(shè)置一字符數(shù)組 data80,來存儲每行的字符。設(shè)置row和length分別記錄行數(shù)與列數(shù);使用的數(shù)據(jù)結(jié)構(gòu)為單鏈表操作。根據(jù)第一部分的問題分析有該鏈表操作有3部分:PreTempNext另有全局變量

6、*head,作為文章的頭指針。故創(chuàng)建了以下結(jié)構(gòu)體: typedef struct _node char data80;/記錄一行字符int length;/記錄一行字符長度 struct _node *next;/ 后繼指針struct _node *pre;/前趨指針int row;/記錄整篇文章的行數(shù)LinkList;在文章內(nèi)容創(chuàng)建部分中使用線性表的鏈?zhǔn)酱鎯韺崿F(xiàn)對行的操作,實用行指針?biāo)赶虻淖址麛?shù)組對每行應(yīng)輸入的字符進(jìn)行存儲,并使用全局變量對文本的各種信息進(jìn)行存儲;文章的內(nèi)容統(tǒng)計、刪除、查找、插入都通過對行指針?biāo)赶虻囊痪S字符數(shù)組的操作來完成。概要設(shè)計:程序框架:* 簡單文本編輯器運行界

7、面 * 主菜單 * 1、文本內(nèi)容輸入 * 2、顯示當(dāng)前文本內(nèi)容 * 3、文本內(nèi)容統(tǒng)計菜單 * 4、文本內(nèi)容處理菜單 * 5、退出本系統(tǒng) *判 斷圖文本內(nèi)容的輸入,Build(),將文本內(nèi)容輸入到已申請的存儲空間中顯示函數(shù),Displaytext(),將當(dāng)前文本中內(nèi)容顯示出來文章內(nèi)容統(tǒng)計菜單,Counttext(),以菜單形式顯示給用戶,對文章的內(nèi)容進(jìn)行各種方式的統(tǒng)計文章內(nèi)容處理菜單,Bmenu(),為一子菜單,使用了括Searchtext()、Deletetext()、Inserttext()三個函數(shù),對文章內(nèi)容進(jìn)行處理退出該系統(tǒng)12345如果選擇功能1,則有:* 文本內(nèi)容輸入菜單 * 1、從

8、磁盤文件中讀入 * 2、從鍵盤上直接輸入 * 3、返回主菜單 *判 斷123返回主菜單調(diào)用子函數(shù)Buildtext();實現(xiàn)從鍵盤上直接輸入文本調(diào)用子函數(shù)Textinput();實現(xiàn)從文件讀入文本內(nèi)容的操作 圖 2 簡單文本編輯器文本內(nèi)容輸入菜單* 文章內(nèi)容統(tǒng)計菜單 * 1、文章中大寫字母的個數(shù) * 2、文章中小寫字母的個數(shù) * 3、文章中數(shù)字的個數(shù) * 4、文章中標(biāo)點符號的個數(shù) * 5、文章中空格的個數(shù) * 6、文章中所有字?jǐn)?shù) * 7、退出返回主菜單 * 8、直接退出本系統(tǒng) * *判斷統(tǒng)計文本中大寫字母個數(shù)1統(tǒng)計文本中小寫字母個數(shù)2統(tǒng)計文本中數(shù)字的個數(shù)3統(tǒng)計文本中標(biāo)點符號的個數(shù)4統(tǒng)計文本中空

9、格的個數(shù)5統(tǒng)計文本所有字?jǐn)?shù)6返回到主菜單7直接退出系統(tǒng)8如選擇上圖中功能3,則有:圖3 簡單的文本編輯器-文本內(nèi)容統(tǒng)計菜單如選擇功能4,則有:* 文章內(nèi)容處理菜單 * 1、查找文章中的字符或者字符串 * 2、刪除文章中的字符或者字符串 * 3、向文章中插入字符或者字符串 * 4、顯示處理后的文本內(nèi)容 * 5、返回主菜單 * 6、直接退出系統(tǒng) *判斷123456使用子函數(shù)SearchWord(),對存儲在鏈表中的文本進(jìn)行字符或者字符串查找使用子函數(shù)DeleteWord(),對存儲在鏈表中文本進(jìn)行字符或者字符串的刪除使用子函數(shù)InsertWord(),對存儲在鏈表中的文本進(jìn)行字符或者字符串的插入使

10、用函數(shù)PrintWord()將當(dāng)前文本信息顯示出來返回到主菜單繼續(xù)其他菜單結(jié)束整個程序圖4 簡單的文本編輯器-文本內(nèi)容處理菜單根據(jù)以上各圖,本程序共設(shè)計了12個函數(shù)。1、Welcome() 標(biāo)題函數(shù),即一個輸出標(biāo)題,永遠(yuǎn)出現(xiàn)在程序的最頂端。2、Textinput() 從指定的磁盤文件讀入文本;3、Buildtext() 從鍵盤直接輸入文本內(nèi)容;4、Build() 文本輸入菜單;實現(xiàn)主菜單中的功能1,調(diào)用Textinput()和Buildtext()分兩種方式輸入文本5、Displaytext() 當(dāng)前文本內(nèi)容輸出函數(shù),實現(xiàn)上圖1菜單功能2以及圖4中功能4,將當(dāng)前存儲在鏈表中的文本內(nèi)容輸出;6、

11、Counttext() 文章內(nèi)容統(tǒng)計函數(shù),實現(xiàn)上圖1菜單功能3,對存儲在鏈表中文本內(nèi)容進(jìn)行統(tǒng)計,包括對文本內(nèi)容中的大寫字母、小寫字母、數(shù)字、標(biāo)點符號、空格以及文章所有字?jǐn)?shù)的個數(shù)的統(tǒng)計;圖2是對其完整描述;7、Searchtext() 文章內(nèi)容查找函數(shù),實現(xiàn)上圖4菜單功能1中查找部分;8、Deletetext() 文章內(nèi)容刪除函數(shù),實現(xiàn)上圖4菜單功能2中刪除部分;9、Inserttext() 文章內(nèi)容插入函數(shù),實現(xiàn)上圖4菜單功能3中插入部分;10、Bmenu() 第二子菜單函數(shù),實現(xiàn)上圖1菜單功能4,圖4是此函數(shù)實現(xiàn)的結(jié)果,它將7、8、9各子函數(shù)集合在此函數(shù)中;11、menu() 主菜單函數(shù),其

12、結(jié)果為圖1所顯示部分,將1、2、3、4、8、9等函數(shù)集合。12、main()主函數(shù)各函數(shù)關(guān)系用流程圖形式繪制如下:一、 詳細(xì)設(shè)計及編碼1、 定義單鏈表結(jié)點類型 typedef struct _list/行表結(jié)構(gòu) char data80;/記錄一行字符int length;/記錄一行字符長度 struct _list *next;/ 后繼指針struct _list *pre;/前趨指針int row;/記錄整篇文章的行數(shù)LinkList;2、 全局變量的定義int NUM,C,N; /定義全局變量,Num用來記錄行號,C用來記錄子串在主串中出現(xiàn)的總次數(shù)LinkList *head; /定義全局

13、變量*head,文章首行頭指針3、 各子函數(shù)的偽碼A) Textinput()讀文件文本內(nèi)容輸入函數(shù)具體創(chuàng)建過程如下:a、 定義LinkList指針變量*temp: LinkList *temp;b、 定義文本輸入變量ch,記錄文本行數(shù)變量j,記錄每行字符數(shù)變量i;c、 申請動態(tài)存儲空間:head->next=(LinkList *)malloc(sizeof(LinkList);d、 首行頭指針的前驅(qū)指針為空:head->pre=NULL;首行指針: temp=head->next;首行指針的前驅(qū)指針也為空: temp->pre=NULL;定義沒輸入字符時文章長度為0

14、: temp->length=0;初始化為字符串結(jié)束標(biāo)志,防止出現(xiàn)亂碼: for(i=0;i<80;i+) temp->datai='0'e、從文本“abc.txt”文本文件中讀取字符:if(fp=fopen("abc.txt","r")=NULL) /* 打開一個”abc.txt”文件*/ printf("not open"); exit(0); 利用循環(huán)進(jìn)行文本輸入for(j=0;j<LINK_INIT_SIZE;j+)/ 控制一頁 for(i=0;i<80;i+) /控制一行 ch=

15、fgetc(fp);putchar(ch);/輸出到屏幕temp->datai=ch; temp->datai=ch; /給temp指向的行賦值···· temp->length+;/行中字符長度加1 if(ch=EOF)/文本結(jié)束符 NUM=j; break; /文章結(jié)束時,Num來記錄整個文章的行數(shù) 在字符輸入的過程中,如果在單行輸入的字符超過了80個字符,則需要以下操作 :輸入字符數(shù)大于80,重新分配空間建立下一行temp->next=(LinkList *)malloc(sizeof(LinkList) ;給temp的前驅(qū)

16、指針賦值:temp->next->pre=temp;temp指向當(dāng)前行: temp=temp->next;將下一行初始化為字符串結(jié)束標(biāo)志,防止出現(xiàn)亂碼:for(i=0;i<80;i+) temp->datai='0'記錄整個文章的行數(shù):temp->row=NUM+1;返回指向最后一行指針:return temp;文本輸入部分到此結(jié)束。B) Buildtext()鍵盤輸入文本內(nèi)容輸入函數(shù)具體創(chuàng)建過程如下:a、 定義LinkList指針變量*temp: LinkList *temp;b、 定義文本輸入變量ch,記錄文本行數(shù)變量j,記錄每行字符數(shù)變

17、量i;c、 申請動態(tài)存儲空間:head->next=(LinkList *)malloc(sizeof(LinkList);d、 首行頭指針的前驅(qū)指針為空:head->pre=NULL;首行指針: temp=head->next;首行指針的前驅(qū)指針也為空: temp->pre=NULL;定義沒輸入字符時文章長度為0: temp->length=0;初始化為字符串結(jié)束標(biāo)志,防止出現(xiàn)亂碼: for(i=0;i<80;i+) temp->datai='0'e、 利用循環(huán)進(jìn)行文本輸入for(j=0;j<LINK_INIT_SIZE;j+)

18、/ 控制一頁 for(i=0;i<80;i+) /控制一行 ch=getchar(); /接收輸入字符 temp->datai=ch; /給temp指向的行賦值···· temp->length+;/行中字符長度加1 if(ch='#') NUM=j; break; /文章結(jié)束時,Num來記錄整個文章的行數(shù) 在字符輸入的過程中,如果在單行輸入的字符超過了80個字符,則需要以下操作 :輸入字符數(shù)大于80,重新分配空間建立下一行temp->next=(LinkList *)malloc(sizeof(LinkList)

19、 ;給temp的前驅(qū)指針賦值:temp->next->pre=temp;temp指向當(dāng)前行: temp=temp->next;將下一行初始化為字符串結(jié)束標(biāo)志,防止出現(xiàn)亂碼:for(i=0;i<80;i+) temp->datai='0'記錄整個文章的行數(shù):temp->row=NUM+1;返回指向最后一行指針:return temp;文本輸入部分到此結(jié)束。C)、Build()文本輸入菜單函數(shù) a、建立一個文本輸入菜單; b、通過調(diào)用文本輸入函數(shù)實現(xiàn)文本輸入的功能D)、Displaytext()當(dāng)前文本輸出并寫入到相應(yīng)磁盤文件函數(shù)本子函數(shù)功能為將

20、當(dāng)前存儲在鏈表中的文本信息輸出在屏幕上,具體偽碼算法如下:a、 定義文本行數(shù)變量j,每行字符數(shù)i:int i,j;b、 定義指針變量:LinkList *p;c、 將指針p指向鏈表表頭: p=head->next;d、 輸出鏈表中的信息,并寫入到“bcd.txt”文本文件中 if(fp=fopen("bcd.txt","w")=NULL)printf("No open!n");exit(0);利用循環(huán)輸出鏈表中信息: for(j=0;j<=NUM&&p!=NULL;j+)=for(i=0;(i<80)

21、&&(p->datai)!='#'i+)=printf("%c",p->datai);fprintf(fp,"%c",p->datai);/寫入到文件p=p->next; 文本輸出函數(shù)到此結(jié)束。E)、Counttext() 文本內(nèi)容統(tǒng)計函數(shù)本子函數(shù)是對文本中內(nèi)容進(jìn)行統(tǒng)計。具體偽碼算法如下:a、 定義指針變量temp:LinkList *temp;b、 定義記錄文本行數(shù)變量j,每行字符數(shù)i;c、 定義記錄文本大寫字母數(shù)、小寫字母數(shù)、空格數(shù)、數(shù)字?jǐn)?shù)、標(biāo)點數(shù)和總字?jǐn)?shù)的變量:int WORD=0,word=

22、0,space=0,num=0,punct=0,sum=0;d、 將指針temp指向鏈表表頭:temp=head->next;e、 利用循環(huán)對鏈表中信息進(jìn)行匹配判斷,將大寫字母數(shù)、小寫字母數(shù)、空格數(shù)、數(shù)字?jǐn)?shù)、標(biāo)點數(shù)和總字?jǐn)?shù)統(tǒng)計出來: for(j=0;j<=NUM;j+) for(i=0;(i<80)&&(temp->datai)!='#'i+) ch=temp->datai; if(ch>='A')&&(ch<='Z') WORD+; else if(ch>='

23、;a')&&(ch<='z') word+; else if(ch>='0')&&(ch<='9') num+; else if(ch=' ') space+; else if(ch=33|ch=34|ch=39|ch=44|ch=46|ch=58|ch=59|ch=63)punct+; sum=WORD+word+num; f、 本程序?qū)y(tǒng)計項目設(shè)計了菜單提供給用戶選擇。菜單的編寫使用do while語句進(jìn)行循環(huán)操作,此部分不再多談。F)Searchtext( ) 文本內(nèi)

24、容查找函數(shù) 本子函數(shù)是對文本內(nèi)容進(jìn)行查找并且對查找的內(nèi)容進(jìn)行統(tǒng)計其出現(xiàn)的次數(shù)。 具體偽碼算法如下:a、 定義一個數(shù)組,用來記錄需要查找的字符內(nèi)容:char Data20;b、 定義定義文本行數(shù)變量j,每行字符數(shù)i,記錄字符出現(xiàn)的次數(shù)變量:int i,j,m=0.,sum=0;c、 對形參中定義的指針變量進(jìn)行操作,使其指向鏈表表頭:temp=head->next;d、 使用VC+中的拷貝函數(shù),將形參中str1的值賦給Data:strcpy(Data,str1);e、 利用循環(huán)進(jìn)行查找操作,核心算法為:if(temp->dataj)=Datak) k+;/將輸入的查找字符與鏈表中信息比

25、較,找到第一個相同的字符 else if(Datak!='0')j=j-k; k=0; / /從主串第j-k個位置重新查找 if(Datak='0') sum+;/此字符出現(xiàn)的次數(shù)加1 j=j-k+1; /j記錄下該字符串出現(xiàn)的位置 printf("tt第%d次出現(xiàn)在第%d行第%d列n",l,i+1,j+1); l+; k=0;continue; temp=temp->next; /指向下一行 對文本內(nèi)容查找的部分完成。G)、Deletetext( ) 文本內(nèi)容刪除函數(shù) 此子函數(shù)是對文本內(nèi)容進(jìn)行刪除。具體偽碼算法如下:f、 定義一個數(shù)組

26、用來存儲需要刪除的字符或者字符串:char Data20;g、 定義指針變量:LinkList *temp,*term;h、 定義整形變量用來控制行數(shù)、字符數(shù):int i,j,k,m,y,num;i、 使用VC+中拷貝函數(shù)講形參中需要刪除的字符或字符串賦值給已定義的數(shù)組:strcpy(Data,str2);j、 使用循環(huán)進(jìn)行刪除操作:其核心算法為: for(i=0;i<=NUM;i+) for(j=0;j<80;j+) if(temp->dataj)=Datak) k+; else if(Datak!='0') j=j-k;k=0; if(Datak='

27、;0') num=j;break; if(num<80) break; 首先是使用循環(huán)查找到需要刪除字符或者字符串的字符數(shù)以及字符或者字符串的位置,以便于刪除; for(;i<=NUM;i+) for(;j<80;j+) if(j+1<k) term->data80-k+num=temp->dataj+1; /刪除的字符串不在最后一行,將下一行的字符(由temp指向)前移到前行else temp->dataj-k+1=temp->dataj+1; /當(dāng)要刪除的字符串在最后一行只要將最后一行的字符前移 term=temp; temp=tem

28、p->next; j=0;/在使用循環(huán),從查找到的字符或者字符串開始進(jìn)行刪除,在一行刪除完畢之后,轉(zhuǎn)至下一行進(jìn)行刪除。刪除部分到次完成。H)、Inserttext() 文本內(nèi)容插入函數(shù) 此函數(shù)為向文本中插入字符或者字符串。具體偽碼如下:a、 定義需要插入的字符或者字符串的輸入數(shù)組:char Data20;b、 定義需要插入的字符或者字符串的插入的行和列:int h,l;c、 進(jìn)行輸入操作,將上述兩個部分進(jìn)行輸入d、 定義一個整形變量,確定插入的具體位置: int i=(h-1)*80+l;e、 定義一指針變量:LinkList *a;f、 對輸入的字符進(jìn)行插入操作,具體核心算法如下: i

29、nt n=strlen(Data);int m ;int insertRow=i/80+1;/確定插入位置的行數(shù)int row=temp->row;/將全局變量記錄的行數(shù)賦值給rowint j;if(insertRow=row)/判斷插入位置是否在最后一行for(m=temp->length-1;m>=(i%80)&&n>0;m-)temp->datam+n=temp->datam;/將最后一行插入位置后面的所有字符向后移n位for(m=(i%80),j=0;m<n+(i%80);m+,j+)temp->datam=Dataj;/

30、將要插入的字符或者字符串賦值到要插入的位置 else/如果插入的位置不再最后一行int r=0;for(int p=insertRow; p<row;p+)if(p = insertRow) r=0;else r=n;for(m=temp->length-1-r;m>=0&&n>0;m-)temp->datam+n=temp->datam;/將最后一行整體后移n位a= temp;/p指向前一行temp = temp->pre;/temp指向前一位temp->length = 80;for(m = temp->length-n

31、,j=0;m<temp->length;m+,j+)a->dataj=temp->datam; /將前一行后n個字符移到下一行的前n個字符位置for(m=temp->length-n-1;m>=(i%80);m-) temp->datam+n=temp->datam;/插入行位置后的字符后移n位for(m=(i%80),j=0;m<(i%80)+n;m+,j+) temp->datam =Dataj;/將要插入的字符賦值到插入的位置return temp;I)、Bmenu()文本內(nèi)容處理菜單 本函數(shù)為文本內(nèi)容處理菜單,即使用循環(huán)語句對

32、文本內(nèi)容處理部分的子函數(shù)集中在此函數(shù)中。 J)、Welcome()是將一標(biāo)題輸出在DOS節(jié)面的最上端; K)、menu() main() 主菜單函數(shù)以及主函數(shù); 本人將主菜單單獨創(chuàng)建為一個子函數(shù),方便觀看。仍然是很簡單的循環(huán)語句實現(xiàn)。主函數(shù)為: void main()head=(LinkList *)malloc(sizeof(LinkList);LinkList *temp;menu(temp);先為head申請存儲空間,然后創(chuàng)建指針變量temp,然后直接在主菜單函數(shù)中進(jìn)行其他操作。四、 上機調(diào)試1、 上機調(diào)試過程中遇到的問題及解決方法:a) 由于本程序的操作大部分都為經(jīng)常使用的查找、刪除、

33、插入,基本的算法及代碼都可以通過查找資料得到,故沒有出現(xiàn)多大的問題。錯誤主要是在于刪除及插入等子函數(shù)中復(fù)雜操作過程中出現(xiàn)的小問題。b) 刪除及插入過程中需要在子函數(shù)中定義一個數(shù)組變量,用來存儲輸入的信息,然后用來與鏈表中的信息進(jìn)行比較以達(dá)到刪除或者插入。另為達(dá)到將輸入的信息賦值給子函數(shù)中定義的數(shù)組,特使用了c+中的strcpy()函數(shù)。c) 為了將程序界面更加的完美,做了3個菜單,還寫了一個子函數(shù)專門將標(biāo)題顯示在程序最上端。清屏函數(shù)使用system(“cls”)。2、 時間,空間性能分析:本算法的空間復(fù)雜度很低,只需要文本的行數(shù)(N1)*80+L(最后一行字符數(shù))的數(shù)組存放結(jié)果,因此空間復(fù)雜度

34、為O(N)。但是本算法的時間復(fù)雜度比較高,由于輸出函數(shù)、查找函數(shù)算法時間復(fù)雜度均為O(N),但是刪除函數(shù)、插入函數(shù)算法的時間復(fù)雜度較高。但是,我暫時還問想到時間復(fù)雜度更小的算法,因此在這里我無法對該算法進(jìn)行優(yōu)化。3、 經(jīng)驗和體會:得到文本編輯器這一課程設(shè)計題目時,自己還比較害怕是制作向windows系統(tǒng)中記事本一樣的程序。看了任務(wù)書之后自己有了些欣慰,任務(wù)書上要求是對輸入的信息進(jìn)行操作,這是我們經(jīng)常練習(xí)的內(nèi)容,雖然是比平時練習(xí)的更為難,更有深度,但自己畢竟知道該向什么方向去努力,自己應(yīng)該如何去編寫這個程序。所以自己在整個課程設(shè)計過程中還是比較輕松的,編寫過程中遇到的困難及問題都通過查閱資料、向

35、老師提問得以解決。這都是基于對課題有一個明確的了解,清楚向什么方向去寫。所以本次課程設(shè)計自己最大的體會就是不管寫什么程序,自己首先得對這個問題要分析透徹,要知道自己要干什么,然后才能讓自己干什么。五、 測試結(jié)果及分析在”abc.txt”中存有以下一段文本:How To Chat Someone Up On The Train, Bus Or TubeRemember that person you saw on the tube that you thought was devastatingly attractive but didn't have the nerve to talk

36、 to? With our help, you may never have to wonder if the one that got away was actually 'The One'. Follow these easy steps and you will have the confidence to chat someone up on public transport!開始在VC+6.0中運行此程序:根據(jù)提示,首先選擇輸入1,有如下結(jié)果:在這里我們選擇功能1,從“abc.txt”中讀取文本,并輸出到屏幕:經(jīng)與“abc.txt”文本中的內(nèi)容對照,讀取磁盤文件操作時

37、成功的,并把文本中的信息存儲到申請的由行指針指向的一維數(shù)組中!選擇3,返回主菜單后,選擇操作2,顯示當(dāng)前文本內(nèi)容:再次證明文本中的內(nèi)容存到所申請的空間中!返回到主菜單后,選擇功能3,進(jìn)入文本內(nèi)容統(tǒng)計菜單:分別選擇1、2、3、4、5、6,得如下結(jié)果:選擇7,退出統(tǒng)計界面,進(jìn)入主菜單,選擇操作4,有:選擇1操作,則有:選擇2操作,則有:進(jìn)行刪除操作后:可以看到,已經(jīng)將字符串ve刪除!選擇操作3有:插入操作:插入后的文本內(nèi)容:可見,插入操作的結(jié)果是正確的。選擇操作4,得:此刻“bcd.txt”中的內(nèi)容為:可見,成功的將處理后的結(jié)果存入到相應(yīng)的文件中!當(dāng)從鍵盤輸入時,與上述系列內(nèi)容相似,輸入相應(yīng)的文本

38、內(nèi)容即可得到相應(yīng)的結(jié)果!六、用戶使用說明本程序是在VC+ 6.0中編寫,程序運行環(huán)境:DOS根據(jù)程序的提示即可完成文本編輯器的各項功能。7、 參考文獻(xiàn)1.王昆侖、李紅。數(shù)據(jù)結(jié)構(gòu)與算法。北京:中國鐵道出版社。 2. 百度中查閱的一些有幫助的資料。八、附錄(源程序):#include"stdio.h" /標(biāo)準(zhǔn)輸入輸出頭文件#include"malloc.h"#include"string.h"#include"iostream.h"#include"stdlib.h" /提供一些函數(shù)和常量#incl

39、ude"conio.h" /基本輸入輸出庫#define Link_size 100/定義最大行數(shù)int NUM,C,N; /定義全局變量typedef struct list/定義單鏈表結(jié)點的數(shù)據(jù)結(jié)構(gòu)char data80;int length;struct list *next;struct list *pre; int row;Linklist;Linklist *head;/單鏈表的頭指針,全局變量void Welcome()/system("cls");printf("tt*-*n");printf("tt- 簡單

40、文本編輯器運行界面 -n");printf("tt*-*n");/文本的創(chuàng)建*Linklist *Textinput()Linklist *temp;char ch;int i,j;FILE *fp;head->next=(Linklist*)malloc(sizeof(Linklist);head->pre=NULL;temp=head->next;temp->pre=NULL;temp->length=0;for(i=0;i<80;i+)/初始化字符數(shù)組為'0'防止出現(xiàn)亂碼temp->datai=

41、9;0' printf("從磁盤文件中讀出的文本:n");if(fp=fopen("abc.txt","r")=NULL) /* 打開一個由argv1所指的文件*/ printf("not open"); exit(0); for(j=0;j<Link_size;j+)/控制行數(shù)for(i=1;i<=80;i+)/控制每行字?jǐn)?shù)即列數(shù)/ch=fgetc(fp);putchar(ch);temp->datai=ch;temp->length+;/if(ch='#')if(

42、ch=EOF)NUM=j;break;/記錄行數(shù) /if(ch='#')if(ch=EOF)temp->length=i;/記錄某行文本的長度temp->next=NULL;break;temp->next=(Linklist*)malloc(sizeof(Linklist);/換行temp->next->pre=temp;/與上一行連接temp=temp->next; for(i=0;i<80;i+)temp->datai='0'/fclose(fp);temp->row=NUM+1;return temp

43、; Linklist *Buildtext()Linklist *temp;char ch;int i,j;head->next=(Linklist*)malloc(sizeof(Linklist);head->pre=NULL;temp=head->next;temp->pre=NULL;temp->length=0;for(i=0;i<80;i+)/初始化字符數(shù)組為'0'防止出現(xiàn)亂碼temp->datai='0'printf("從鍵盤輸入文本(以#結(jié)束):n");for(j=0;j<Link

44、_size;j+)/控制行數(shù)for(i=0;i<80;i+)/控制每行字?jǐn)?shù)即列數(shù) ch=getchar(); temp->datai=ch; temp->length+; if(ch='#') NUM=j;break;/記錄行數(shù) if(ch='#')temp->length=i;/記錄某行文本的長度temp->next=NULL;break;temp->next=(Linklist*)malloc(sizeof(Linklist);/換行temp->next->pre=temp;/與上一行連接temp=temp-&

45、gt;next;for(i=0;i<80;i+) temp->datai='0' temp->row=NUM+1; return temp; void Build(Linklist *&temp)int i;do printf("tt*n"); printf("tt* 文本內(nèi)容輸入菜單 *n"); printf("tt*n");printf("tt* 1.從磁盤文件中讀入 *n");printf("tt* 2.從鍵盤上直接輸入 *n");printf(&

46、quot;tt* 3.返回主菜單 *n"); printf("tt*n"); printf("tt請在菜單中選擇需要的操作:");scanf("%d",&i);switch(i)case 1:system("cls");Welcome();temp=Textinput(); printf("按回車鍵繼續(xù)");getchar();getchar();system("cls");break;case 2:system("cls"); Welc

47、ome();temp=Buildtext(); printf("按回車鍵繼續(xù)");getchar();getchar();system("cls");break;if(i=3)system("cls");break;while(1);/文本的輸出*void Displaytext() int i,j;Linklist *p;p=head->next;system("cls");Welcome();printf("當(dāng)前文本的內(nèi)容是:n"); FILE *fp;if(fp=fopen(&quo

48、t;bcd.txt","w")=NULL)printf("No open!n");exit(0);for(j=0;j<=NUM&&p!=NULL;j+)/控制行for(i=0;(i<80)&&(p->datai)!='#'i+)/控制列printf("%c",p->datai);fprintf(fp,"%c",p->datai);p=p->next;fclose(fp);void Counttext()Linklist *

49、temp;char ch;int i,j,t;int WORD=0,word=0,space=0,num=0,punct=0,sum=0;temp=head->next;for(j=0;j<=NUM;j+)for(i=0;(i<80)&&(temp->datai)!='#'i+)ch=temp->datai;if(ch>='A')&&(ch<='Z')WORD+;/統(tǒng)計大寫字母數(shù)目if(ch>='a')&&(ch<='z')word+;/統(tǒng)計小寫字母個數(shù)if(ch>='0

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論