數(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頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、課程設(shè)計(jì)報(bào)告課程設(shè)計(jì)題目:文章編輯 專 業(yè):信息工程班 級: 學(xué)生姓名 : 指導(dǎo)教師 : 、實(shí)驗(yàn)?zāi)康募耙螅喝蝿?wù):輸入一頁文字,程序可以統(tǒng)計(jì)出文字、數(shù)字、空格的個(gè)數(shù)。靜態(tài)存儲(chǔ)一頁文章,每行最多不超過80個(gè)字符,共N行; 要求:(1)分別統(tǒng)計(jì)出其中英文字母數(shù)和空格數(shù)及整篇文章總字?jǐn)?shù); (2)統(tǒng)計(jì)某一字符串在文章中出現(xiàn)的次數(shù),并輸出該次數(shù); (3)刪除某一子串,并將后面的字符前移。存儲(chǔ)結(jié)構(gòu)使用線性表,分別用幾個(gè)子函數(shù)實(shí)現(xiàn)相應(yīng)的功能;輸入數(shù)據(jù)的形式和范圍:可以輸入大寫、小寫的英文字母、任何數(shù)字及標(biāo)點(diǎn)符號。 輸出形式:(1)分行輸出用戶輸入的各行字符; (2)分4行輸出全部字母數(shù)、數(shù)字個(gè)數(shù)、空格個(gè)數(shù)、

2、文章總字?jǐn)?shù)(3) 輸出刪除某一字符串后的文章;實(shí)驗(yàn)時(shí)間、地點(diǎn): 2013.6.16至6.20于軟件樓301一、概要設(shè)計(jì)(實(shí)驗(yàn)思路)1.問題分析本程序是對一段英文文章的內(nèi)容進(jìn)行處理,存儲(chǔ)方式采用鏈?zhǔn)酱鎯?chǔ)。對于文本的輸入,采用頭插法將文本信息存儲(chǔ)到鏈表已申請好的存儲(chǔ)空間中,在此部分設(shè)計(jì)中最大的問題在于輸入文章過程中輸入的字符數(shù)大于80時(shí)如何換行;對于文本內(nèi)容的統(tǒng)計(jì),使用循環(huán)對已存儲(chǔ)的文章進(jìn)行匹配,字母數(shù)、空格數(shù)、數(shù)字?jǐn)?shù)直接通過比較即可得到;對于文本內(nèi)容的處理,查找部分仍是使用循環(huán)對已存儲(chǔ)的文章進(jìn)行匹配,判斷需要查找的字符或者字符串是否與文章中某部分內(nèi)容相同,如果存在相同的記錄相同的個(gè)數(shù)及位置并輸出

3、個(gè)數(shù)及位置。刪除部分先使用程序的查找功能對文章中需要?jiǎng)h除的字符或者字符串進(jìn)行查找,然后對其進(jìn)行刪除。2. 數(shù)據(jù)結(jié)構(gòu)選擇本程序是對輸入的文字進(jìn)行操作,故使用的數(shù)據(jù)結(jié)構(gòu)為單鏈表操作。根據(jù)第一部分的問題分析有該鏈表操作有3部分:另有全局變量 *head,作為文章的頭指針。創(chuàng)建結(jié)構(gòu)體: typedef struct list char data80;/記錄一行字符int length;/記錄一行字符長度 struct _list *next;/后繼指針struct _list *pre;/前趨指針int row;/記錄整篇文章的行數(shù)LinkList;在文章內(nèi)容創(chuàng)建部分中使用線性表的鏈?zhǔn)酱鎯?chǔ),并使用全局

4、變量對文本的各種信息進(jìn)行存儲(chǔ);文章的讀取、內(nèi)容統(tǒng)計(jì)、刪除、查找都采用鏈表操作完成。3.流程圖(1)主框架:(2)文章內(nèi)容統(tǒng)計(jì)子菜單(3) 文章內(nèi)容處理子菜單文章內(nèi)容處理子菜單SearchWord()函數(shù)實(shí)現(xiàn)查找DeleteWord()函數(shù)內(nèi)容刪除Printword()顯示當(dāng)前內(nèi)容返回主菜單退出程序(4)使用函數(shù)列表及關(guān)系圖函數(shù)名:1、CreatWord() 文本輸入函數(shù),對文本的內(nèi)容進(jìn)行輸入2、PrintWord() 當(dāng)前文本內(nèi)容輸出函數(shù),將當(dāng)前存儲(chǔ)在鏈表中的文本內(nèi)容輸出5、CountWord() 文章內(nèi)容統(tǒng)計(jì)函數(shù),對存儲(chǔ)在鏈表中文本內(nèi)容進(jìn)行統(tǒng)計(jì)6、SearchWord() 文章內(nèi)容查找函數(shù)7

5、、DeleteWord() 文章內(nèi)容刪除函數(shù)8、Bmenu() 文本內(nèi)容處理菜單函數(shù)9、AboutWord() 顯示作者信息的函數(shù)10、menu() 主菜單函數(shù)11、main() 主函數(shù)關(guān)系圖:二、詳細(xì)設(shè)計(jì)(實(shí)驗(yàn)過程)1、數(shù)據(jù)結(jié)構(gòu)定義typedef struct list char data80;/*記錄一行字符*/ int length;/*記錄一行字符長度*/ struct list *next;/*后繼指針*/ struct list *pre;/*前趨指針*/ int row;/*記錄整篇文章的行數(shù)*/LinkList;2、全局變量定義LinkList *head;/*定義全局變量*h

6、ead,文章首行頭指針*/int NUM,C,N;/*定義全局變量,Num用來記錄行號,C用來記錄子串在主串中出現(xiàn)的總次數(shù)*/3、函數(shù)說明(1)CreatWord() 文本創(chuàng)建函數(shù)LinkList *CreatWord() 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;idatai=0;printf(tt*n);printf(tt* 創(chuàng)

7、建文本 *n);printf(tt*n);printf(tt請輸入文章(輸入#號結(jié)束):nn);for(j=0;jLink_Size;j+)for(i=0;idatai=ch;temp-length+;if(ch=#)NUM=j;break;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 (tem

8、p);說明:a、 定義LinkList指針變量*temp: LinkList *temp;b、 定義文本輸入變量ch,記錄文本行數(shù)變量j,記錄每行字符數(shù)變量i;c、 申請動(dòng)態(tài)存儲(chǔ)空間:head-next=(LinkList *)malloc(sizeof(LinkList);d、 首行頭指針的前驅(qū)指針為空:head-pre=NULL;首行指針: temp=head-next;首行指針的前驅(qū)指針也為空: temp-pre=NULL;定義沒輸入字符時(shí)文章長度為0: temp-length=0;初始化為字符串結(jié)束標(biāo)志,防止出現(xiàn)亂碼: for(i=0;idatai=0;e、 利用循環(huán)進(jìn)行文本輸入for

9、(j=0;jLINK_INIT_SIZE;j+)/ 控制一頁 for(i=0;idatai=ch; /給temp指向的行賦值 temp-length+;/行中字符長度加1 if(ch=#) NUM=j; break; /文章結(jié)束時(shí),Num來記錄整個(gè)文章的行數(shù) 在字符輸入的過程中,如果在單行輸入的字符超過了80個(gè)字符,則需要以下操作 :輸入字符數(shù)大于80,重新分配空間建立下一行:temp-next=(LinkList *)malloc(sizeof(LinkList) ;給temp的前驅(qū)指針賦值:temp-next-pre=temp;temp指向當(dāng)前行: temp=temp-next;將下一行初

10、始化為字符串結(jié)束標(biāo)志,防止出現(xiàn)亂碼:for(i=0;idatai=0;記錄整個(gè)文章的行數(shù):temp-row=NUM+1;返回指向最后一行指針:return temp;文本輸入部分到此結(jié)束。(2)PrintWord() 文章顯示函數(shù)void PrintWord()int i,j;LinkList *p;p=head-next;system(cls);printf(n);printf(tt*n);printf(tt* 文本顯示 *n);printf(tt*n);printf(n當(dāng)前文章的內(nèi)容是:n);for(j=0;j=NUM&p!=NULL;j+)for(i=0;(idatai)!=#;i+)p

11、rintf(%c,p-datai);p=p-next;說明:a、 定義文本行數(shù)變量j,每行字符數(shù)i:int i,j;b、 定義指針變量:LinkList *p;c、 將指針p指向鏈表表頭:p=head-next;d、 利用循環(huán)輸出鏈表中信息: for(j=0;j=NUM&p!=NULL;j+)=for(i=0;(idatai)!=#;i+)=printf(%c,p-datai);p=p-next; 文本顯示部分到此結(jié)束。(3)CountWord() 文章內(nèi)容統(tǒng)計(jì)函數(shù)void CountWord()LinkList *temp;char ch;int i,j,t;int WORD=0,word=

12、0,space=0,num=0,sum=0;temp=head-next;for(j=0;j=NUM;j+)for(i=0;(idatai)!=#;i+)ch=temp-datai;if(ch=A)&(ch=a)&(ch=0)&(chnext;利用循環(huán)對鏈表中信息進(jìn)行匹配判斷,將大寫字母數(shù)、小寫字母數(shù)、空格數(shù)、數(shù)字?jǐn)?shù)和總字?jǐn)?shù)統(tǒng)計(jì)出來:for(j=0;j=NUM;j+)for(i=0;(idatai)!=#;i+)ch=temp-datai;if(ch=A)&(ch=a)&(ch=0)&(chnext; strcpy(Data,str1); for(i=0;i=NUM;i+) for(j=0;j

13、dataj)=Datak) k+; else if(Datak!=0)j=j-k;k=0; if(Datak=0) sum+;j=j-k+1;printf(ttt第%d次出現(xiàn)在第%d行第%d列n,l,i+1,j);l+;k=0;continue; temp=temp-next; printf(nttt字符串總共出現(xiàn)次數(shù)為:%dnn,sum); C=sum;N=i*80+j;說明:a、 定義一個(gè)數(shù)組,用來記錄需要查找的字符內(nèi)容:char Data20;b、 定義定義文本行數(shù)變量j,每行字符數(shù)i,記錄字符出現(xiàn)的次數(shù)變量:int i,j,m=0.,sum=0;c、 對形參中定義的指針變量進(jìn)行操作,使

14、其指向鏈表表頭:temp=head-next;d、 使用拷貝函數(shù),將形參中str1的值賦給Data:strcpy(Data,str1);e、 利用循環(huán)進(jìn)行查找操作:for(i=0;i=NUM;i+) /*利用循環(huán)進(jìn)行查找操作*/ for(j=0;jdataj)=Datak) k+;/*將輸入的查找字符與鏈表中信息比較,找到第一個(gè)相同的字符*/ else if(Datak!=0)j=j-k;/*從主串第j-k個(gè)位置重新查找*/k=0; if(Datak=0) sum+;/*此字符出現(xiàn)的次數(shù)加1*/j=j-k+1;/*j記錄下該字符串出現(xiàn)的位置*/printf(ttt第%d次出現(xiàn)在第%d行第%d列

15、n,l,i+1,j);l+;k=0;continue; temp=temp-next;/*指向下一行*/ 文本內(nèi)容查找部分到此結(jié)束。(5)DeleteWord() 文章內(nèi)容刪除函數(shù)void DeleteWord(char *str2) char Data20; LinkList *temp,*term; int i,j,a,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;jdataj)=Datak) k+; else if(Datak!=0) j=j-k

16、;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; 說明:a、定義一個(gè)數(shù)組用來存儲(chǔ)需要?jiǎng)h除的字符或者字符串:char Data20;b、定義指針變量:LinkList *temp,*term;c、定義整形變量用來控制行數(shù)、字符數(shù):int i,j,k,m,y,num;d、使用拷貝函數(shù)講形參中需要?jiǎng)h除的字符

17、或字符串賦值給已定義的數(shù)組:strcpy(Data,str2);f、 使用循環(huán)進(jìn)行刪除操作:for(y=0;yC;y+) num=80;k=0,m=0; temp=head; for(i=0;inext; for(j=0;jdataj)=Datak) k+; else if(Datak!=0) j=j-k;k=0; if(Datak=0) num=j;break; if(num80) break; /*首先是使用循環(huán)查找到需要?jiǎng)h除字符或者字符串的字符數(shù)以及字符或者字符串的位置,以便于刪除*/for(;i=NUM;i+) for(;j80;j+) if(j+1data80-k+num=temp-

18、dataj+1;/*刪除的字符串不在最后一行,將下一行的字符(由temp指向)前移到前行*/ elsetemp-dataj-k+1=temp-dataj+1;/*當(dāng)要?jiǎng)h除的字符串在最后一行只要將最后一行的字符前移*/ term=temp; temp=temp-next;/*在使用循環(huán),從查找到的字符或者字符串開始進(jìn)行刪除,在一行刪除完畢之后,轉(zhuǎn)至下一行進(jìn)行刪除*/ j=0; 文本內(nèi)容刪除部分到此完成。(6)Bmenu() 文章內(nèi)容處理菜單函數(shù)void Bmenu(LinkList *temp) char str120;char str220;int t;do /*利用do while 循環(huán)來控

19、制主菜單顯示*/ printf(n);printf(ntt*n);printf(tt* 文章內(nèi)容處理子菜單 *n);printf(tt*n);printf(tt* 1、查找文章中的字符或者字符串 *n);printf(tt* 2、刪除文章中的字符或者字符串 *n);printf(tt* 3、顯示當(dāng)前文章內(nèi)容 *n);printf(tt* 4、返回主菜單 *n);printf(tt* 5、直接退出系統(tǒng) *n);printf(tt*n);printf(tt 請選擇:);scanf(%d,&t);if(t5)|(t6)|(t1) printf(tt 對不起,無此功能!請回車重新選擇!.n);prin

20、tf(tt);fflush(stdin);getchar();elseswitch(t) case 1: system(cls); printf(n);temp=CreatWord();break; case 2: system(cls); PrintWord();printf(n);printf(n);printf(ntt按回車鍵繼續(xù));getchar();getchar();system(cls);break;case 3:system(cls);CountWord();break;case 4: system(cls); Bmenu(temp);break;case 5:system(c

21、ls); AboutWord();printf(ntt按回車鍵繼續(xù));getchar();getchar();system(cls);break;if(t=6) break;while(1);說明:用do-while 語句來制作文章內(nèi)容處理菜單,用switch 語句來選擇實(shí)現(xiàn)功能。(9)main() 主函數(shù)void main()head=(LinkList *)malloc(sizeof(LinkList);menu();說明:/*先為head申請存儲(chǔ)空間,然后創(chuàng)建指針變量temp,然后直接在主菜單函數(shù)中進(jìn)行其他操作*/三、上機(jī)調(diào)試上機(jī)調(diào)試過程中遇到的問題及解決方法:a)由于本程序的操作大部分

22、都為經(jīng)常使用的查找、刪除,基本的算法及代碼都可以通過查找資料得到,故沒有出現(xiàn)多大的問題。錯(cuò)誤主要是在于刪除等子函數(shù)中復(fù)雜操作過程中出現(xiàn)的小問題。b)刪除及查找過程中需要在子函數(shù)中定義一個(gè)數(shù)組變量,用來存儲(chǔ)輸入的信息,然后用來與鏈表中的信息進(jìn)行比較以達(dá)到刪除或者查找。另為達(dá)到將輸入的信息賦值給子函數(shù)中定義的數(shù)組,特使用了strcpy()函數(shù)。c)為了將程序界面更加的完美,做了3個(gè)菜單。清屏函數(shù)使用system(“cls”),背景字體顏色編寫了一個(gè)color函數(shù)。d)一開始編寫程序時(shí),在保存、讀取這一部分考慮到方便就采用了以節(jié)點(diǎn)為單位來存儲(chǔ)。由于文件存儲(chǔ)的局限性,以節(jié)點(diǎn)存儲(chǔ)發(fā)生錯(cuò)誤。后來采用了單個(gè)

23、字符存儲(chǔ)和讀取來保證文本的保存和讀取。e)在程序中為了方便采用了全局變量來做頭結(jié)點(diǎn),同時(shí)還定義了幾個(gè)全局變量。在考慮到全局變量的穩(wěn)定性,建議采用局部變量。通過不斷調(diào)用頭結(jié)點(diǎn)來實(shí)現(xiàn)函數(shù)功能。四、測試結(jié)果及分析測試文章:Good evening,London.Allow me first to apologize I do,like many of you,appreciate the comforts of the everyday routine the security of the familiar,the tranquility of repetition.I enjoy them as much as any bloke.There are,of course,those

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論