參考簡單行編輯程序報告.doc_第1頁
參考簡單行編輯程序報告.doc_第2頁
參考簡單行編輯程序報告.doc_第3頁
參考簡單行編輯程序報告.doc_第4頁
參考簡單行編輯程序報告.doc_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

沈陽航空工業(yè)學院課 程 設(shè) 計簡單的行編輯程序班級 / 學號 6402103/077_學 生 姓 名 趙 壯 指 導 教 師 張 雷 沈陽航空工業(yè)學院課 程 設(shè) 計 任 務(wù) 書課 程 名 稱 軟件技術(shù)基礎(chǔ)課程設(shè)計 院(系) 電子信息工程學院 專業(yè) 電子信息工程 班級 6402103 學號 200604021077 姓名 趙 壯 課程設(shè)計題目 簡單行編輯程序 課程設(shè)計時間: 2008 年 7 月 14 日至 2008 年 7 月 27 日課程設(shè)計的內(nèi)容及要求:問題描述 文本編輯程序是利用計算機進行文字加工的基本軟件工具,實現(xiàn)對文本文件的插入、刪除等修改操作。限制這些操作以行為單位進行的編輯程序稱為行編輯程序。 被編輯的文本文件可能很大,全部讀入編輯程序的數(shù)據(jù)空間(內(nèi)存)的作法既不經(jīng)濟,也不總能實現(xiàn)。一種解決方法是逐段地編輯。任何時刻只把待編輯文件的一段放在內(nèi)存,稱為活區(qū)。試按照這種方法實現(xiàn)一個簡單的行編輯程序。設(shè)文件每行下超過320字符,很少超過80字符。 基本要求 實現(xiàn)以下4條基本編輯命令: (1)行插入。格式:i行號回車文本.回車 將文本插入活區(qū)中第行號行之后。(2)行刪除。格式:d行號l空格行號2回車 刪除活區(qū)中第行號1行(到第行號2行。例如:“d10”和d1014”(3)活區(qū)切換。格式: n回車 將活區(qū)寫入輸出文件,并從輸入文件中讀入下一段,作為新的活區(qū)。(4)活區(qū)顯示。格式:p回車 逐頁地(每頁20行)顯示活區(qū)內(nèi)容,每顯示一頁之后請用戶決定是否繼續(xù)顯示以后各頁(如果存在)。印出的每一行要前置以行號和一個空格符,行號固定占4位增量為l。 各條命令中的行號均須在活區(qū)中各行行號范圍之內(nèi),只有插入命令的行號可以等于活區(qū)第一行行號減l,表示插入當前屏幕中第一行之前,否則命令參數(shù)非法。 指導教師 年 月 日負責教師 年 月 日學生簽字 年 月 日簡單的行編輯一、題目分析通過對該軟件課設(shè)的分析,了解到該課設(shè)要求設(shè)計一個程序,能夠?qū)崿F(xiàn)行插入、行刪除、活區(qū)顯示、活區(qū)切換四項功能。分別設(shè)計出四個模塊,用主函數(shù)集中調(diào)度,這樣就可以方便快捷的實現(xiàn)各個函數(shù)以及整體函數(shù)的功能。其具體做法是,先在程序的開始定義一個結(jié)構(gòu)體,其中包括五個數(shù)據(jù)項,分別是存儲每一行元素的項char string80、指向前一個結(jié)點的指針struct text *pre、指向后一個結(jié)點的指針struct text *next、記錄每一行元素的長度int num以及判斷是否刪除的標志int flat。當flat=0時,該行被刪除;當flat=1時,該行不刪除。對文本的編輯,每次都采用先打開文本文件的形式,因為這樣可以更直觀的看出編輯后文本的變化。實現(xiàn)活區(qū)顯示的做法是建立一個鏈表,該鏈表有20個結(jié)點,在一頁中放不下的部分為活區(qū),執(zhí)行p后可以顯示出第一頁的部分,在continue之后選擇Y便可以顯示出活區(qū)的部分,即第二頁的內(nèi)容。實現(xiàn)活區(qū)切換的做法是執(zhí)行n后,先判斷活區(qū)的內(nèi)容,如果沒被刪除就把文本中內(nèi)容讀入到鏈表中,便可以直接顯示出獲取部分,即第二頁的內(nèi)容。實現(xiàn)刪除的做法是執(zhí)行d,定義兩個指針分別指向要刪除的結(jié)點,刪除兩個結(jié)點之間的內(nèi)容,最后將刪除后的結(jié)果存盤并顯示下一頁內(nèi)容。實現(xiàn)插入的做法是執(zhí)行i,定義一個指針變量插入行的前一行,然后給插入行分配存儲空間,將插入行的內(nèi)容插入到鏈表中,便實現(xiàn)行插入的功能。程序還定義了一個函數(shù)來釋放所占鏈表的內(nèi)存,在退出程序后利用保存函數(shù)將內(nèi)容存盤.二、設(shè)計過程(程序流程圖)1.主函數(shù)的設(shè)計主函數(shù)采用dowhile循環(huán),循環(huán)體主要調(diào)用三個子函數(shù):1 EDIT(),2 HELP(),3 EXIT()。行編輯程序的四種主要功能都在EDIT()編輯函數(shù)中執(zhí)行。HELP()函數(shù)是提示用戶各種功能的執(zhí)行方式,主函數(shù)通過給字符變量cmd賦初值來選擇是結(jié)束程序還是繼續(xù)執(zhí)行循環(huán)體中的內(nèi)容。主程序流程圖如1所示。cmd=1 開始定義字符變量cmd給cmd賦初值switch(cmd)1編輯函數(shù)EDTT()2幫助函數(shù)HELP()3退出結(jié)束cmd=2cmd=3開始 結(jié)束圖1 主函數(shù)流程圖2.幫助函數(shù)HELP()子程序設(shè)計幫助函數(shù)的主要作用是在用戶忘記如何操作的情況下在屏幕上給用戶顯示提示操作的信息,使行插入,行刪除,活區(qū)顯示,活區(qū)切換的執(zhí)行方式,其流程圖如圖2所示。 返 回 開 始輸出提示信息 返 回 開 始輸出提示信息圖2 幫助函數(shù)HELP()流程圖3.編輯函數(shù)EDIT()子程序設(shè)計簡單行編輯程序的各種功能在編輯函數(shù)中實現(xiàn)。首先給字符型變量cmd賦初值,通過switch(cmd)來選擇執(zhí)行哪種功能。退出編輯函數(shù):E(e),調(diào)用save all()函數(shù)將內(nèi)容存盤,然后調(diào)用freemem()釋放鏈表空間。打開文件:O(o),調(diào)用openfiles()函數(shù)打開文件。執(zhí)行活區(qū)顯示:P(p)。執(zhí)行行刪除:D(d)。執(zhí)行行插入:I(i)。執(zhí)行活區(qū)切換顯示:N(n)。程序流程圖如圖3所示。圖3 編輯函數(shù)流程圖4.活區(qū)顯示函數(shù)display()子程序設(shè)計在活區(qū)顯示中首先把文本內(nèi)容鏈入鏈表,函數(shù)中用page來實現(xiàn)頁碼的自增。函數(shù)種定義了一個指向struct text結(jié)構(gòu)體的指針變量p ,在文件fp非空和行號小于20的情況下,利用fgets函數(shù)使p-string從打開的文件fp中得到字符的值,然后輸出每一行的行號和每一行的內(nèi)容,在此函數(shù)的最后還可以利用Y和N來決定是否繼續(xù)顯示下一個活區(qū)的內(nèi)容。其程序流程圖如圖4所示。開 始定義變量 i,coint,text *p打開的文件fp非空且coint=y|coint=Y定義page(頁數(shù) )輸出頁數(shù)從文件中讀入數(shù)組元素p-string輸出行號和行的內(nèi)容給conti賦值Y或N判斷文件是否非空輸出file end!返 回YYYNNN圖4 活區(qū)顯示函數(shù)流程圖5.活區(qū)切換函數(shù)saveanddisplay(20)子函數(shù)設(shè)計活區(qū)切換函數(shù)實現(xiàn)活區(qū)之間的切換,把文本的每一頁(20行)作為一個活區(qū),可以逐頁的把活區(qū)內(nèi)容顯示出來。在活區(qū)切換函數(shù)中定義了一個指向struct text結(jié)構(gòu)體的指針變量p賦初值*p=NULL,當i小于20時,如果行沒有被刪除(flag=1)就通過fputs函數(shù)把活區(qū)內(nèi)容寫入到文件(out).打開文件fp,如果文件非空,用fgets函數(shù)從文件fp讀入字符串,并用puts函數(shù)輸出。如果文件fp為空就輸出file end!。程序流程圖如圖5所示。NYYN定義變量 i;text *p=NULL ,page+行沒有被刪除p-flat=1判斷文件fp是否 非空輸出活區(qū)內(nèi)容輸出file end!返 回1利用指針變量p找到hang 的具體位置將行的內(nèi)容寫入到文件outN返回 0 返 回1 返 回0 開 始圖5 活區(qū)切換函數(shù)流程圖6行刪除函數(shù)del()子程序設(shè)計在函數(shù)的開始定義了三個指向struct text結(jié)構(gòu)體的指針變量p1,p2,p3。輸入要刪除的兩個行號(比如1 3),表示刪除從第1行到第3行的數(shù)據(jù)。程序流程圖如圖6所示。輸出要刪除的行 返 回定義指針變量text *p1,*p2,*p3給min和max賦初值定義整型變量min,max,i通過指針變量p1,找到min行在活區(qū)中的位置通過指針變量p1找到max行在活區(qū)中的位置刪除行min到max的內(nèi)容保存顯示刪除后的內(nèi)容saveanddisplay() 開 始圖6 行刪除函數(shù)流程圖7行插入行數(shù)insert()子程序的設(shè)計行插入函數(shù)的開始定義了三個指向struct text結(jié)構(gòu)體的指針變量p,p1,p2,在給hang賦初值后使p1指向頭結(jié)點,利用for循環(huán),找到要插入行的前一行hang-1,然后給插入的行分配內(nèi)存空間。輸入文本內(nèi)容并連入鏈表。行程序流程圖如7所示。定義三個類型的指針變量p,p1,p2 開 始輸出“請輸入要插入的行”給變量行賦初始值令p1=頭結(jié)點,找到行插入要插入的文本內(nèi)容輸出修改后的鏈表(文本內(nèi)容)將修改后的鏈表存盤(savveandedisplay)返 回圖7 行插入函數(shù)流程圖三、調(diào)試過程及實驗結(jié)果(1)調(diào)試過程 在程序編寫好之后,便開始在VC中編譯執(zhí)行程序,雖然程序沒有錯誤,但是執(zhí)行過程中插入可以實現(xiàn),刪除卻實現(xiàn)不了,在仔細檢驗程序后,發(fā)現(xiàn)在執(zhí)行過程中沒有先打開文件,因此無法繼續(xù)執(zhí)行。再改正之后便可以得到正確的運行結(jié)果了。(2)實驗結(jié)果1幫助函數(shù)HELP()調(diào)試結(jié)果在執(zhí)行過程中按2鍵便可進入到幫助菜單中,其中有四種功能,其結(jié)果如下圖。圖8 HELP()函數(shù)的內(nèi)容2打開文件函數(shù)openfiles()調(diào)試結(jié)果在命令窗口輸入1調(diào)用EDIT()函數(shù),輸入O,回車后,輸入你想打開的文本名,回車后,輸入你想寫入的文本名。結(jié)果如圖9所示。圖9 打開文件命令調(diào)試結(jié)果3.活區(qū)顯示函數(shù)display()調(diào)試結(jié)果 打開文件后輸入P,回車后顯示每一頁的內(nèi)容(即活區(qū)內(nèi)容),輸入Y是繼續(xù)顯示下一頁的內(nèi)容,調(diào)試結(jié)果如下面圖所示。圖10 第一頁活區(qū)的內(nèi)容圖11 第2頁活區(qū)的內(nèi)容4活區(qū)切換函數(shù)saveanddisplay()調(diào)試結(jié)果例如在活區(qū)顯示完第1頁后,輸入N,程序等待你輸入下一個命令,這時輸入n,回車后顯示下一活區(qū)內(nèi)容,也就是第二頁的內(nèi)容。調(diào)試結(jié)果如下圖所示。圖12 輸入命令n圖13 第2頁活區(qū)的內(nèi)容5行刪除函數(shù)del()調(diào)試結(jié)果先進入EDIT,打開文件,觀察原始數(shù)據(jù)。輸入d后,根據(jù)提示信息輸入最小行號和最大行號(例如 1 3),回車后顯示刪除后的內(nèi)容。如下圖所示。圖14 觀察原始數(shù)據(jù)結(jié)果圖15 行刪除函數(shù)調(diào)試結(jié)果6行插入函數(shù)insert()調(diào)試結(jié)果接著在行刪除函數(shù)執(zhí)行后輸入命令i,回車,然后輸入你想插入的行號(例如3),回車后輸入你想插入的文本內(nèi)容(如00000000000000000000,“”是文本結(jié)束的標志),回車后會顯示修改后的鏈表,即插入行后的文本內(nèi)容,如圖16所示。圖26 行插入調(diào)試結(jié)果四、結(jié)論通過對該題目的編寫調(diào)試以及結(jié)果顯示可以看出,本程序可以滿足任務(wù)書的要求,實現(xiàn)了對行的插入、刪除、活區(qū)顯示、活區(qū)轉(zhuǎn)換的各項要求。在執(zhí)行插入命令的過程中,要檢驗活區(qū)的大小,如果插入這一行之后,仍保持不超的話,就將其插入。在輸入未讀完時,可將未讀完的內(nèi)容保持在活區(qū)的頂部。此外,也實現(xiàn)了一些簡單的操作,例如,創(chuàng)建了一個鏈表,實現(xiàn)文本文件的打開,實現(xiàn)以行為單位是很合理的。通過這次課設(shè),了解簡單行編輯程序應(yīng)用的廣泛性。本課程設(shè)計的簡單行編輯程序各功能的運行操作十分快捷,能滿足用戶的需要。5、 程序清單#define NULL 0#define OK 0#include #include #include #include #include typedef struct text char string80;/存儲每一行的元素 struct text *next;/指向后一個節(jié)點的指針 struct text *pre;/指向前一個節(jié)點的指針 int num;/每一行元素的長度 int flat;/確定此行是否被刪除的標志text;FILE *fp,*out;/fp是執(zhí)行被打開的文件,out指向被寫入的文件text *head;/鏈表的頭指針int n=0,sum,delnum,xiugai=0,page=0;/修改用來指示文件是否被修改過,如果修改過才回存盤。page用來計算顯示的/頁數(shù).delnum用來存儲被刪除的字節(jié)數(shù),sum存儲一頁的總字節(jié)數(shù)void HELP()/幫助函數(shù),顯示一些命令的格式printf(nt*n); printf(t* 打開文件: o *n); printf(t* 行插入格式: i *n); printf(t* 行刪除格式: d *n); printf(t* 活區(qū)切換格式: n *n); printf(t* 活區(qū)顯示格式:p *n); printf(t* 注意:在執(zhí)行所有命令前必須先用o命令打開文件,并 *n); printf(t* 用p命令顯示出來! *n);printf(t*n); printf(nnn); system(pause);void Createlist()/建立一個二十個節(jié)點的鏈表,是文本中的一頁 text *p1,*p2; p1=p2=(text *)malloc(sizeof(text);/分配空間 head=NULL; while(nnext=p1;/p2-pre=p1;p1-next=p2;p1=p2; p1-pre=p2; p1-flat=0; p2=p1; p1=(text *)malloc(sizeof(text); p2-next=NULL;void freemem()/釋放鏈表所占的內(nèi)存 text *p; for(p=head;head!=NULL;) head=p-next; free(p); p=head; int EDIT()/編輯函數(shù),用來接受處理編輯命令 char cmd; do cmd=getchar(); printf(n請輸入命令(按E鍵退出):n); cmd=getchar(); switch(cmd) case e: case E: if(xiugai=1) saveall(); freemem(); if(fp)fclose(fp); if(out) fclose(out);system(cls); return 0; case o: /打開文件 case O: Openfiles(); break; case p: /活區(qū)顯示 case P: Createlist();display();break; case n: /活區(qū)轉(zhuǎn)換 case N: saveanddisplay(10); break; case d: /刪除行 case D: del(); break; case i: /插入行 case I: insert(); break; default:printf(nnn!輸入錯誤!); while(cmd!=e&cmd!=E); return 0;int Openfiles()/打開文件的函數(shù) char name30,outname30; puts(請輸入要打開的文件名:); scanf(%s,name); if(fp=fopen(name,r+)=NULL) printf(打不開原文件! n); exit(0); puts(請輸入要寫入的文件名:); scanf(%s,outname); if(out=fopen(outname,w+)=NULL) printf(打不開目標文件!n); exit(0); return 0;int display()/從文件中讀入到鏈表中,并顯示出來 int i; char conti=y; text *p; while(!feof(fp)&(conti=y|conti=Y) page+; printf(n第%d頁n,page); for(i=0,p=head,sum=0;(inext) fgets(p-string,sizeof(p-string),fp); puts(p-string); p-flat=1; p-num=strlen(p-string); sum=sum+p-num; puts(Continue?(Y/N):); conti=getche(); if(feof(fp) puts(n文件已經(jīng)結(jié)束!); return 0; return 0;int saveanddisplay(int hang)/命令n執(zhí)行的函數(shù),用來將活區(qū)的內(nèi)容顯示并讀入下一頁內(nèi)容 int i,endflat=0; char conti=y; text *p=NULL; page+; for(i=0,p=head;inext) /將活區(qū)寫入文件 if(p-flat=1) fputs(p-string,out); p-flat=0; if(!feof(fp) printf(tt第%d頁n,page); for(i=0,p=head,sum=0;(inext)/從文件讀入活區(qū) if(fgets(p-string,sizeof(p-string),fp) puts(p-string); p-flat=1; p-num=strlen(p-string); sum=sum+p-num; if(feof(fp) printf(文件已經(jīng)結(jié)束!); return 0;int saveall()/退出編輯函數(shù)后執(zhí)行的函數(shù),將所有的內(nèi)容存盤 int i,endflat=0; char conti=y; text *p; for(i=0,p=head;inext) /將活區(qū)寫入文件 if(p-flat=1) fputs(p-string,out); p-flat=0; while(!feof(fp)/將其余的內(nèi)容寫入文件 fputc(fgetc(fp),out); return 0;int del()/刪除d命令對應(yīng)的函數(shù),用來刪minmax中的行,用結(jié)構(gòu)體中的flat表示是否被刪除 text *p1,*p2,*p3; int min,max,i; xiugai=1; scanf(%d %d,&min,&max); if(head=NULL) printf(nlist null!n); return 0; p1=p2=head; for(i=0;inext; for(i=0;inext; for(delnum=0;p1!=p2;p1=p1-next)/*刪除中間的節(jié)點,將flat賦值0*/ p1-flat=0; delnum=delnum+p1-num; for(i=0,p3=head;inext)/顯示刪除后的結(jié)果 if(p3-flat=1) puts(p3-string); saveanddisplay(10);/將刪除后的結(jié)果存盤并顯示下一頁內(nèi)容(十行) xiugai=1; return 0;int insert()/插入i命令對應(yīng)的函數(shù),在i行后插入文本 int hang,i,increhang=1,number=1; text *p,*p1,*p2; xiugai=1; printf(輸入要插入的行號n); scanf(%d,&hang); p=NULL; p1=NULL; for(i=0,p1=head;inext);/找到要插入行的前一列 p=(text *)malloc(sizeof(text);/為插入行分配空間 p-fl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論