版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 一、需求分析</b></p><p> 由于被編輯的文本文件可能很大,全部讀入編輯程序的數(shù)據(jù)空間(內(nèi)存)的作法既不經(jīng)濟(jì),也不總能實(shí)現(xiàn)。而用行編輯把待編輯文件的一段放進(jìn)內(nèi)存,稱(chēng)為活區(qū)。本行編輯程序是以每行不超過(guò)320個(gè)字符為前提的。每次編輯會(huì)讀入80行,活區(qū)每次只顯示20行。</p><p> 該程序要實(shí)現(xiàn)以下基本編輯命令和一些相關(guān)的命
2、令:</p><p> 行插入。格式:i<回車(chē)><行號(hào)><回車(chē)><文本><回車(chē)>。</p><p> 將<文本>插入活區(qū)第<行號(hào)>行之后。</p><p> 行刪除。格式:d<回車(chē)><行號(hào)1>,<行號(hào)2><回車(chē)>。</p&g
3、t;<p> 刪除活區(qū)中第<行號(hào)1>行到第<行號(hào)2>行。</p><p> 活區(qū)切換。格式:n<回車(chē)><頁(yè)數(shù)><回車(chē)>。</p><p> 由于每次從輸入文件讀入80行,而活區(qū)每頁(yè)顯示20行,而活區(qū)切換就是要切換到需編輯的頁(yè)面上去。</p><p> 活區(qū)顯示。格式p<回車(chē)>
4、;。</p><p> 顯示當(dāng)前要編輯的活區(qū)內(nèi)容。印出的每一行都有一個(gè)前置行號(hào)和一個(gè)空格符,行號(hào)固定為2位,增量為1。</p><p> (5)清屏。 格式:c<回車(chē)>。</p><p> (6)獲得幫助。格式:h<回車(chē)>。</p><p> ?。?)退出。 格式:e<回車(chē)>。</p
5、><p><b> 二、概要設(shè)計(jì)</b></p><p><b> 程序結(jié)構(gòu)流程圖:</b></p><p> 存儲(chǔ)結(jié)構(gòu)的定義如下:</p><p> typedef struct text</p><p><b> {</b></p>
6、<p> char string[80];//存儲(chǔ)每一行的元素</p><p> struct text *next;//指向后一個(gè)節(jié)點(diǎn)的指針</p><p> int flat;//確定此行是否被刪除的標(biāo)志</p><p> }text,*textp;</p><p><b> 功能函數(shù):</b>
7、;</p><p> Status Createlist(textp &head);</p><p> 功能:建立一個(gè)80個(gè)節(jié)點(diǎn)的鏈表,是整個(gè)活區(qū)的大小</p><p> int del(textp head);</p><p> 功能:刪除顯示的活區(qū)的任意一行。</p><p> int displ
8、ay(textp &head);</p><p> 功能:按照每頁(yè)20行的規(guī)格顯示活區(qū)的內(nèi)容。</p><p> void freemem(textp &head);</p><p> 功能:銷(xiāo)毀鏈表,釋放內(nèi)存。</p><p> int insert(textp &head);</p><
9、p> 功能:在顯示的活區(qū)插入一行內(nèi)容。</p><p> Status SaveFile(textp head,FILE *out);</p><p> 功能:將活區(qū)的內(nèi)容保存到輸出文件。</p><p> Status LoadFile(textp head,FILE *fp);</p><p> 功能:從輸入文件讀取內(nèi)容到
10、活區(qū)。</p><p> void HELP();</p><p> 功能:提供命令的格式。</p><p><b> 主函數(shù):</b></p><p> void main()</p><p><b> {</b></p><p><
11、b> 初始化;</b></p><p><b> 輸入命令;</b></p><p><b> Switch(c)</b></p><p><b> {</b></p><p> case ‘e’: 退出并保存編輯的內(nèi)容</p><
12、;p> case ‘p’: 顯示活區(qū)</p><p> case ‘n’: 活區(qū)切換</p><p> case ‘d’: 刪除一行</p><p> case ‘i’: 插入一行</p><p> case ‘c’: 清屏</p><p> case ‘h’: 獲得幫助</p>
13、<p><b> }</b></p><p><b> }</b></p><p><b> 三、詳細(xì)設(shè)計(jì)</b></p><p> #include<string.h></p><p> #include<stdio.h><
14、;/p><p> #include<stdlib.h></p><p> #include<io.h></p><p> #include<process.h></p><p> #define TRUE 1</p><p> #define FALSE 0</p>
15、<p> #define OK 1</p><p> #define ERROR 0</p><p> #define INFEASIBLE -1</p><p> #define OVERFLOW -2</p><p> typedef int Status;</p><p> typede
16、f struct text</p><p><b> {</b></p><p> char string[80];//存儲(chǔ)每一行的元素</p><p> struct text *next;//指向后一個(gè)節(jié)點(diǎn)的指針</p><p> int flat;//確定此行是否被刪除的標(biāo)志</p><
17、p> }text,*textp;</p><p><b> //函數(shù)聲明</b></p><p> Status Createlist(textp &head);</p><p> int del(textp head);</p><p> int display(textp &head)
18、;</p><p> void freemem(textp &head);</p><p> int insert(textp &head);</p><p> Status SaveFile(textp head,FILE *out);</p><p> Status LoadFile(textp head,FILE
19、 *fp);</p><p> void HELP();</p><p> void main()//主函數(shù),用來(lái)接受命令</p><p> //編輯函數(shù),用來(lái)接受處理編輯命令</p><p> {textp head,q,p,p1;</p><p> int page=0;</p><p
20、> FILE *fp,*out;</p><p> char c,inname[30],outname[30];</p><p> printf("################################歡迎使用行編輯程序#############################\n");</p><p><b>
21、 HELP();</b></p><p> printf("按任意鍵開(kāi)始。。。。。");</p><p> c=getchar();</p><p> /*打開(kāi)輸入、輸出文件*/</p><p> printf("Enter the infile name:"); </p
22、><p> scanf("%s",inname);</p><p> printf("Enter the outfile name:");</p><p> scanf("%s",outname);</p><p> if((fp=fopen(inname,"r&quo
23、t;))==NULL)</p><p> { printf("can't open the file! \n");</p><p><b> exit(0);}</b></p><p> if((out=fopen(outname,"w"))==NULL)</p><p&
24、gt; { printf("can't open the file!\n");</p><p> exit(0);} </p><p> Createlist(head); /*創(chuàng)建一個(gè)80個(gè)結(jié)點(diǎn)的鏈表*/</p><p><b> p=head;</b></p><p>
25、LoadFile( head,fp); </p><p><b> do</b></p><p><b> {</b></p><p> printf("input order:");</p><p> fflush(stdin);</p><p&
26、gt; c=getchar();</p><p><b> switch(c)</b></p><p><b> { </b></p><p> case 'e':SaveFile(head,out); /* 退出并保存編輯的內(nèi)容*/</p><p> fclos
27、e(fp);</p><p> fclose(out); </p><p><b> break;</b></p><p> case 'p': q=p;</p><p> display(p);</p><p><b> page++;</b>
28、</p><p> if(page>4)page=1;</p><p> printf("**********************page%d************************\n",page); if(page==4){p=head;page=0;}</p><p><b> break; &l
29、t;/b></p><p> case 'n': /*活區(qū)切換 */ </p><p> SaveFile(head,out);</p><p> LoadFile(head,fp);</p><p><b> page=1;</b></p
30、><p><b> q=p=head;</b></p><p> display(p);</p><p> printf("**********************page%d************************\n",page);</p><p><b> break
31、;</b></p><p> case 'd':p=q; /*顯示活區(qū)*/</p><p><b> del(p);</b></p><p> display(p);</p><p> printf("********************
32、**page%d************************\n",page);</p><p><b> break;</b></p><p> case 'i': /*插入行*/</p><p><b> p=q;</b></p>
33、<p> insert(p);</p><p> if(head->flat==1)</p><p> fputs(head->string,out);</p><p> p=q=q->next;</p><p><b> p1=head;</b></p><p
34、> head=head->next;</p><p><b> free(p1);</b></p><p> display(p);</p><p> printf("**********************page%d************************\n",page);</p&
35、gt;<p><b> break;</b></p><p><b> case 'c':</b></p><p> system("cls");</p><p><b> break;</b></p><p><
36、b> case 'h':</b></p><p><b> HELP();</b></p><p><b> break;</b></p><p> default:printf("\n\n\n!!!input error!!!"); /*命令格式非法提示*/
37、</p><p><b> }</b></p><p> }while(c!='e');</p><p> freemem(head);}</p><p> Status Createlist(textp &head)//建立一個(gè)80個(gè)節(jié)點(diǎn)的鏈表,是整個(gè)活區(qū)的大小</p>&
38、lt;p><b> {int n=0;</b></p><p> textp p1,p2;</p><p> p1=p2=(textp)malloc(sizeof(text));</p><p> head=NULL;</p><p> while(n<80)</p><p>
39、;<b> {</b></p><p><b> n=n+1;</b></p><p> if(n==1){ head=p1;head->flat=0;}</p><p><b> else </b></p><p><b> {</b>&
40、lt;/p><p> p2->next=p1;</p><p> p1->flat=0;</p><p><b> }</b></p><p><b> p2=p1;</b></p><p> p1=(text *)malloc(sizeof(text));
41、 </p><p><b> }</b></p><p> p2->next=NULL;</p><p> return OK;}</p><p> int del(textp head)//刪除d命令對(duì)應(yīng)的函數(shù),用來(lái)刪max-min中的行,用結(jié)構(gòu)體中的flat表示是否被刪除</p>&l
42、t;p><b> {</b></p><p> text *p1,*p2;</p><p> int min,max,i;</p><p> scanf("%d %d",&min,&max);</p><p> if(head==NULL)</p><
43、;p><b> {</b></p><p> printf("\nlist null!\n");</p><p> return OK;</p><p><b> }</b></p><p> p1=p2=head;</p><p> f
44、or(i=0;i<min-1;i++)/*找到要?jiǎng)h除的第一行*/</p><p> p1=p1->next;</p><p> for(i=0;i<max;i++)/*找到要?jiǎng)h除的最后一行*/</p><p> p2=p2->next;</p><p> for(;p1!=p2;p1=p1->next)/
45、*刪除中間的節(jié)點(diǎn),將flat賦值0*/</p><p> {p1->flat=0;}</p><p> return OK;</p><p><b> }</b></p><p> int display(textp &head)//顯示P命令對(duì)應(yīng)的函數(shù),用來(lái)顯示活區(qū)的內(nèi)容</p>&
46、lt;p><b> {</b></p><p><b> int i;</b></p><p><b> textp p;</b></p><p> for(i=1,p=head;i<=20&&p;p=p->next)</p><p>
47、 if(p->flat==1)</p><p> {printf("%2d",i); /*輸出每一行的行號(hào)*/</p><p><b> i++;</b></p><p> printf(" %s",p->string);</p><p><b>
48、 }</b></p><p><b> head=p;</b></p><p> return 0;}</p><p> void freemem(textp &head)//釋放鏈表所占的內(nèi)存</p><p><b> {</b></p><p&g
49、t;<b> text *p;</b></p><p> for(p=head;head!=NULL;)</p><p><b> {</b></p><p> head=p->next;</p><p><b> free(p);</b></p>
50、<p><b> p=head;</b></p><p><b> }}</b></p><p> int insert(textp &head)//插入i命令對(duì)應(yīng)的函數(shù)</p><p><b> {</b></p><p> int hang,i
51、;</p><p> textp p,p1;</p><p> scanf("%d",&hang);</p><p> p=(textp)malloc(sizeof(text));//為插入行分配空間</p><p> p->flat=1;</p><p> fflush(s
52、tdin);</p><p> fgets(p->string,80,stdin); /*輸入插入行的內(nèi)容*/</p><p><b> p1=head;</b></p><p> if(hang==1)</p><p> { if(!head->flat) /*頭結(jié)點(diǎn)已被刪除
53、*/</p><p> for(;p1&&!p1->flat;p1=p1->next); /*找到第一個(gè)flat=1的點(diǎn)*/</p><p> p->next=p1->next;</p><p> p1->next=p;}</p><p><b> else{</b>
54、;</p><p> for(i=1,p1=head;i<hang;p1=p1->next)//找到要插入行的后一行</p><p> if(p1->flat==1)i++;</p><p> p->next=p1->next;//從此行向下將插入行插入到鏈表中</p><p> p1->next=
55、p;}</p><p> return OK;}</p><p> Status LoadFile(textp head,FILE *fp) /*從文件讀內(nèi)容到活區(qū)*/</p><p><b> {textp p;</b></p><p> for(p=head;p&&(!feof(fp));p=
56、p->next)</p><p> { if(!fgets(p->string,80,fp))break;</p><p> p->flat=1;}</p><p> return 0;}</p><p> Status SaveFile(textp head,FILE *out) /*存儲(chǔ)活區(qū)的函數(shù)*/<
57、/p><p> { textp p;</p><p> for(p=head;p;p=p->next)</p><p> if(p->flat==1)</p><p> {fputs(p->string,out); /*輸出活區(qū)的內(nèi)容到指定的文件*/</p><p> p->f
58、lat=0;</p><p><b> }</b></p><p> return OK;</p><p><b> }</b></p><p> void HELP()//幫助函數(shù),顯示一些命令的格式</p><p><b> {</b>&l
59、t;/p><p> printf("\n\t **********************************************************\n");</p><p> printf("\t ** 行插入格式: i<行號(hào)><回車(chē)><文本><回車(chē)> **\n");</p>
60、;<p> printf("\t ** 行刪除格式: d<回車(chē)><行號(hào)1>[<空格><行號(hào)2>]<回車(chē)> **\n");</p><p> printf("\t ** 活區(qū)切換格式: n<回車(chē)> **\n");</p><p> printf(&qu
61、ot;\t ** 活區(qū)顯示格式: p<回車(chē)> **\n");</p><p> printf("\t ** 清屏格式: c<回車(chē)> **\n");</p><p> printf("\t ** 幫助格式: h<回車(chē)> **\n");</p>&l
62、t;p> printf("\t **********************************************************\n");</p><p><b> }</b></p><p><b> 四、調(diào)試分析</b></p><p><b> 測(cè)試數(shù)據(jù)
63、:</b></p><p> 任意的TXT文件,只要每行不超過(guò)80個(gè)字符。</p><p> 調(diào)試遇到的問(wèn)題與解決方法:</p><p> 在調(diào)試的過(guò)程中為了使刪除行操作不把開(kāi)辟出來(lái)的內(nèi)存空間結(jié)構(gòu)破壞,我設(shè)置了一個(gè)標(biāo)志位Flat,當(dāng)某一行被刪除時(shí),只要將這個(gè)標(biāo)志置0即可,而不用將這個(gè)結(jié)點(diǎn)刪除,下一次載入新的活區(qū),只要將它重新置1,載入的內(nèi)容便可有效
64、。同時(shí)由于我對(duì)某些函數(shù)庫(kù)的使用不是很熟悉,從而令到程序出現(xiàn)各種意想不到的結(jié)果。后來(lái)與同學(xué)一起討論才找出其中的錯(cuò)誤。</p><p><b> 經(jīng)驗(yàn)與體會(huì):</b></p><p> 在本次實(shí)驗(yàn)的行編輯程序中,我認(rèn)真分析了行編輯的各種功能模塊,從而確定單鏈表的數(shù)據(jù)結(jié)構(gòu)。單鏈表的每個(gè)結(jié)點(diǎn)開(kāi)辟一個(gè)數(shù)組存儲(chǔ)行的內(nèi)容。該結(jié)構(gòu)能夠輕易地插入行和刪除行。 通過(guò)本次實(shí)驗(yàn),我對(duì)編程
65、有了更進(jìn)一步的了解,自己的編輯能力也得到了一定的提高,鞏固了課本的知識(shí),加強(qiáng)了我敏銳的洞察能力。</p><p><b> 五、 用戶(hù)使用說(shuō)明</b></p><p> ?。?)進(jìn)入程序的界面,出現(xiàn)命令的幫助信息,按任意鍵開(kāi)始程序編輯。</p><p> (2)輸入INPUT文件與OUTPUT文件的名字打開(kāi)相應(yīng)的文件 。</p>
66、<p> ?。?)輸入P命令顯示活區(qū)的內(nèi)容。</p><p> ?。?)其它的命令操作如下:</p><p> 行插入格式: i<行號(hào)><回車(chē)><文本><回車(chē)> </p><p> 行刪除格式: d<回車(chē)><行號(hào)1>[<空格><行號(hào)2>]<回車(chē)&g
67、t; </p><p> 活區(qū)切換格式: n<回車(chē)> </p><p> 清屏格式: c<回車(chē)> </p><p> 幫助格式: h<回車(chē)> </p><p> ?。?)最后輸入e命令退出程序。 </p><p><b> 六、測(cè)試
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)——簡(jiǎn)單行編輯程序
- 文章編輯(數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì))
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---文章編輯
- 文章編輯_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 文章編輯_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-文章編輯
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--文章編輯系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--文章編輯
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)—文章編輯設(shè)計(jì)報(bào)告
- 簡(jiǎn)單行編輯系統(tǒng)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- c語(yǔ)言數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---文章編輯
- c語(yǔ)言數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-文章編輯
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--文章編輯集合運(yùn)算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--文本編輯器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--文字編輯器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--校園導(dǎo)游程序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-- 校園導(dǎo)游程序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論