數(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)行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

3、文章進(jìn)行匹配,判斷需要查找的字符或者字符串是否與文章中某部分內(nèi)容相同,如果存在相同的記錄相同的個數(shù)及位置并輸出個數(shù)及位置。刪除部分先使用程序的查找功能對文章中需要刪除的字符或者字符串進(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;/前趨

4、指針int row;/記錄整篇文章的行數(shù)LinkList;在文章內(nèi)容創(chuàng)建部分中使用線性表的鏈?zhǔn)酱鎯?,并使用全局變量對文本的各種信息進(jìn)行存儲;文章的讀取、內(nèi)容統(tǒng)計、刪除、查找都采用鏈表操作完成。3.流程圖(1)主框架:(2)文章內(nèi)容統(tǒng)計子菜單(3) 文章內(nèi)容處理子菜單文章內(nèi)容處理子菜單SearchWord()函數(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)前存儲在鏈表中的文本內(nèi)容輸出5、Count

5、Word() 文章內(nèi)容統(tǒng)計函數(shù),對存儲在鏈表中文本內(nèi)容進(jìn)行統(tǒng)計6、SearchWord() 文章內(nèi)容查找函數(shù)7、DeleteWord() 文章內(nèi)容刪除函數(shù)8、Bmenu() 文本內(nèi)容處理菜單函數(shù)9、AboutWord() 顯示作者信息的函數(shù)10、menu() 主菜單函數(shù)11、main() 主函數(shù)關(guān)系圖:二、詳細(xì)設(shè)計(實驗過程)1、數(shù)據(jù)結(jié)構(gòu)定義typedef struct list char data80;/*記錄一行字符*/ int length;/*記錄一行字符長度*/ struct list *next;/*后繼指針*/ struct list *pre;/*前趨指針*/ int row;

6、/*記錄整篇文章的行數(shù)*/LinkList;2、全局變量定義LinkList *head;/*定義全局變量*head,文章首行頭指針*/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-

7、>pre=NULL; temp->length=0; for(i=0;i<80;i+) temp->datai='0'printf("tt*n");printf("tt* 創(chuàng)建文本 *n");printf("tt*n");printf("tt請輸入文章(輸入#號結(jié)束):nn");for(j=0;j<Link_Size;j+)for(i=0;i<80;i+)ch=getchar();temp->datai=ch;temp->length+;if(ch=&

8、#39;#')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;i<80;i+)temp->datai='0'temp->row=NUM+1;system("cls");return (temp);說明:a、 定義LinkList指

9、針變量*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: temp->length=0;初始化為字符串結(jié)束標(biāo)志,防止出現(xiàn)亂碼: for(i=0;i<80;i+) temp->data

10、i='0'e、 利用循環(huán)進(jìn)行文本輸入for(j=0;j<LINK_INIT_SIZE;j+)/ 控制一頁 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,重新分

11、配空間建立下一行:temp->next=(LinkList *)malloc(sizeof(LinkList) ;給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é)束。(2)PrintWord() 文章顯示函數(shù)void PrintWord()i

12、nt 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;(i<80)&&(p->datai)!='#'i+)printf(&quo

13、t;%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;(i<80)&&(p->datai)!='#'i+)=printf("%c",p->datai);p=p->next; 文本顯示部分到此結(jié)束。(3)Count

14、Word() 文章內(nèi)容統(tǒng)計函數(shù)void CountWord()LinkList *temp;char ch;int i,j,t;int WORD=0,word=0,space=0,num=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+;else if(ch>='a&#

15、39;)&&(ch<='z')word+;else if(ch>='0')&&(ch<='9')num+;else if(ch=' ')space+;sum=WORD+word+num;while(1)printf("n");printf("n");printf("n");printf("tt*n");printf("tt* 文章內(nèi)容統(tǒng)計子菜單 *n");printf("t

16、t*n"); printf("tt* 文章中 字母 的個數(shù): %d n",WORD+word);printf("tt* 文章中 數(shù)字 的個數(shù): %d n",num);printf("tt* 文章中 空格 的個數(shù): %d n",space);printf("tt* 文章中 所有字 的個數(shù): %d n",sum);printf("tt* 1、退出返回主菜單 *n");printf("tt* 2、直接退出本系統(tǒng) *n");printf("tt*n");

17、printf("tt請選擇:");scanf("%d",&t);if(t=1)system("cls");break;else if(t=2)exit(0);else printf("tt 對不起,無此功能!請回車重新選擇!.n");printf("tt");fflush(stdin);getchar();說明:a、 定義指針變量temp:LinkList *temp;b、 定義記錄文本行數(shù)變量j,每行字符數(shù)i;c、 定義記錄文本大寫字母數(shù)、小寫字母數(shù)、空格數(shù)、數(shù)字?jǐn)?shù)和總字?jǐn)?shù)的變量:in

18、t WORD=0,word=0,space=0,num=0,sum=0;d、 將指針temp指向鏈表表頭:temp=head->next;利用循環(huán)對鏈表中信息進(jìn)行匹配判斷,將大寫字母數(shù)、小寫字母數(shù)、空格數(shù)、數(shù)字?jǐn)?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>='a'

19、)&&(ch<='z')word+;else if(ch>='0')&&(ch<='9')num+;else if(ch=' ')space+;sum=WORD+word+num;e、 本程序?qū)y(tǒng)計項目設(shè)計了菜單。菜單的編寫使用 while語句進(jìn)行循環(huán)操作。文本內(nèi)容統(tǒng)計部分到此結(jié)束。(4)SearchWord() 文章內(nèi)容查找函數(shù)void SearchWord(char *str1,LinkList* temp) char Data20 ; int i,j,k=0,sum=0;in

20、t l=1; temp=head->next; strcpy(Data,str1); 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='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)

21、次數(shù)為:%dnn",sum); C=sum;N=i*80+j;說明: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、 使用拷貝函數(shù),將形參中str1的值賦給Data:strcpy(Data,str1);e、 利用循環(huán)進(jìn)行查找操作:for(i=0;i<=NUM;i+) /*利用循環(huán)進(jìn)行查找操作*/ for(j=0;j<80;j+) if(temp-&

22、gt;dataj)=Datak) k+;/*將輸入的查找字符與鏈表中信息比較,找到第一個相同的字符*/ else if(Datak!='0')j=j-k;/*從主串第j-k個位置重新查找*/k=0; if(Datak='0') sum+;/*此字符出現(xiàn)的次數(shù)加1*/j=j-k+1;/*j記錄下該字符串出現(xiàn)的位置*/printf("ttt第%d次出現(xiàn)在第%d行第%d列n",l,i+1,j);l+;k=0;continue; temp=temp->next;/*指向下一行*/ 文本內(nèi)容查找部分到此結(jié)束。(5)DeleteWord() 文章內(nèi)

23、容刪除函數(shù)void DeleteWord(char *str2) char Data20; LinkList *temp,*term; int i,j,a,k,m,y,num; strcpy(Data,str2); for(y=0;y<C;y+) num=80;k=0,m=0; temp=head; for(i=0;i<=NUM;i+) term=temp; temp=temp->next; for(j=0;j<80;j+) if(temp->dataj)=Datak) k+; else if(Datak!='0') j=j-k;k=0; if(D

24、atak='0') num=j;break; if(num<80) break; for(;i<=NUM;i+) for(;j<80;j+) if(j+1<k) term->data80-k+num=temp->dataj+1; elsetemp->dataj-k+1=temp->dataj+1; term=temp; temp=temp->next; j=0; 說明:a、定義一個數(shù)組用來存儲需要刪除的字符或者字符串:char Data20;b、定義指針變量:LinkList *temp,*term;c、定義整形變量用來控制

25、行數(shù)、字符數(shù):int i,j,k,m,y,num;d、使用拷貝函數(shù)講形參中需要刪除的字符或字符串賦值給已定義的數(shù)組:strcpy(Data,str2);f、 使用循環(huán)進(jìn)行刪除操作:for(y=0;y<C;y+) num=80;k=0,m=0; temp=head; for(i=0;i<=NUM;i+)/*使用循環(huán)進(jìn)行刪除操作*/ term=temp; temp=temp->next; for(j=0;j<80;j+) if(temp->dataj)=Datak) k+; else if(Datak!='0') j=j-k;k=0; if(Datak

26、='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指向)前移到前行*/ elsetemp->dataj-k+1=temp->dataj+1;/*當(dāng)要刪除的字符串在最后一行只要將最后一行的字符前移*/ term=tem

27、p; 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)來控制主菜單顯示*/ printf("n");printf("ntt*n");printf("tt* 文章內(nèi)容處理子菜單 *n");printf("tt*n&q

28、uot;);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(t>5)|(t<

29、1) printf("tt 對不起,無此功能!請回車重新選擇!.n");printf("tt");fflush(stdin);getchar();elseswitch(t)case 1: system("cls"); printf("n");printf("ntt*n");printf("tt* 文章內(nèi)容處理子菜單 *n");printf("tt*n");printf("nttt請輸入您需要查找的字符或字符串:");getchar();

30、gets(str1);printf("n");SearchWord(str1,temp);printf("ntt按回車鍵繼續(xù)·····");getchar();getchar();system("cls");break;case 2:system("cls"); printf("n");printf("ntt*n");printf("tt* 文章內(nèi)容處理子菜單 *n");printf("tt*n&

31、quot;);printf("nttt請輸入您需要刪除的字符或字符串:");getchar();gets(str2);printf("n");SearchWord(str2,temp);DeleteWord(str2);printf("ttt刪除 %s 后的文章為:",str2);PrintWord();printf("ntt按回車鍵繼續(xù)·····");getchar();getchar();system("cls");break;case 3:

32、system("cls"); printf("nntt*n");printf("tt* 文章內(nèi)容處理子菜單 *n");printf("tt*n");PrintWord();printf("nntt按回車鍵繼續(xù)·····");getchar();getchar();system("cls");break;if(t=4) system("cls"); break;if(t=5) exit(0); while(1

33、); 說明:用do-while 語句來制作文章內(nèi)容處理菜單,用switch 語句來選擇實現(xiàn)功能。(7)AboutWord() 相關(guān)性息void AboutWord()printf("nnnnnnnn"); printf("t*n");printf("t* 本系統(tǒng)由 chevis 制作 部分功能則是仿照其他程序 能力有限 *n");printf("t* 謝謝使用! *n"); printf("t*n");printf("n");(8)menu() 主菜單void menu()i

34、nt t;LinkList *temp;doprintf("n");printf("n");printf("n");printf("tt*n");printf("tt* 簡單的文章編輯器 *n"); printf("tt*n");printf("tt* 主菜單 *n");printf("tt*n");printf("tt* 1、文章內(nèi)容輸入 *n");printf("tt* 2、顯示當(dāng)前文章內(nèi)容 *n&qu

35、ot;);printf("tt* 3、文章內(nèi)容統(tǒng)計子菜單 *n");printf("tt* 4、文章內(nèi)容處理子菜單 *n");printf("tt* 5、程序相關(guān) *n");printf("tt* 6、退出文章編輯器 *n");printf("tt*n");printf("tt! 注:第一次運(yùn)行本程序時請選擇1功能進(jìn)行輸入 !n");printf("tt*n");printf(" tt請輸入相應(yīng)數(shù)字:");scanf("%d&

36、quot;,&t);if(t>6)|(t<1) printf("tt 對不起,無此功能!請回車重新選擇!.n");printf("tt");fflush(stdin);getchar();elseswitch(t) case 1: system("cls"); printf("n");temp=CreatWord();break; case 2: system("cls"); PrintWord();printf("n");printf("n&q

37、uot;);printf("ntt按回車鍵繼續(xù)·····");getchar();getchar();system("cls");break;case 3:system("cls");CountWord();break;case 4: system("cls"); Bmenu(temp);break;case 5:system("cls"); AboutWord();printf("ntt按回車鍵繼續(xù)···

38、··");getchar();getchar();system("cls");break;if(t=6) break;while(1);說明:用do-while 語句來制作文章內(nèi)容處理菜單,用switch 語句來選擇實現(xiàn)功能。(9)main() 主函數(shù)void main()head=(LinkList *)malloc(sizeof(LinkList);menu();說明:/*先為head申請存儲空間,然后創(chuàng)建指針變量temp,然后直接在主菜單函數(shù)中進(jìn)行其他操作*/三、上機(jī)調(diào)試上機(jī)調(diào)試過程中遇到的問題及解決方法:a)由于本程序的操作大部分都為經(jīng)常使用的查找、刪除,基本的算法及代碼都可以通過查找資料得到,故沒有出現(xiàn)多大的問題。錯誤主要是在于刪除等子函數(shù)中復(fù)雜操作過程中出現(xiàn)的小問題。b)刪除及查找過程中需要在子函數(shù)中定義一個數(shù)組變量,用來存儲輸入的信息,然后用來與鏈表中的信息進(jìn)行比較以達(dá)到刪除或者查找。另為

溫馨提示

  • 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

提交評論