




已閱讀5頁,還剩29頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
沈陽航空工業學院課 程 設 計簡單的行編輯程序班級 / 學號 6402103/077_學 生 姓 名 趙 壯 指 導 教 師 張 雷 沈陽航空工業學院課 程 設 計 任 務 書課 程 名 稱 軟件技術基礎課程設計 院(系) 電子信息工程學院 專業 電子信息工程 班級 6402103 學號 200604021077 姓名 趙 壯 課程設計題目 簡單行編輯程序 課程設計時間: 2008 年 7 月 14 日至 2008 年 7 月 27 日課程設計的內容及要求:問題描述 文本編輯程序是利用計算機進行文字加工的基本軟件工具,實現對文本文件的插入、刪除等修改操作。限制這些操作以行為單位進行的編輯程序稱為行編輯程序。 被編輯的文本文件可能很大,全部讀入編輯程序的數據空間(內存)的作法既不經濟,也不總能實現。一種解決方法是逐段地編輯。任何時刻只把待編輯文件的一段放在內存,稱為活區。試按照這種方法實現一個簡單的行編輯程序。設文件每行下超過320字符,很少超過80字符。 基本要求 實現以下4條基本編輯命令: (1)行插入。格式:i行號回車文本.回車 將文本插入活區中第行號行之后。(2)行刪除。格式:d行號l空格行號2回車 刪除活區中第行號1行(到第行號2行。例如:“d10”和d1014”(3)活區切換。格式: n回車 將活區寫入輸出文件,并從輸入文件中讀入下一段,作為新的活區。(4)活區顯示。格式:p回車 逐頁地(每頁20行)顯示活區內容,每顯示一頁之后請用戶決定是否繼續顯示以后各頁(如果存在)。印出的每一行要前置以行號和一個空格符,行號固定占4位增量為l。 各條命令中的行號均須在活區中各行行號范圍之內,只有插入命令的行號可以等于活區第一行行號減l,表示插入當前屏幕中第一行之前,否則命令參數非法。 指導教師 年 月 日負責教師 年 月 日學生簽字 年 月 日簡單的行編輯一、題目分析通過對該軟件課設的分析,了解到該課設要求設計一個程序,能夠實現行插入、行刪除、活區顯示、活區切換四項功能。分別設計出四個模塊,用主函數集中調度,這樣就可以方便快捷的實現各個函數以及整體函數的功能。其具體做法是,先在程序的開始定義一個結構體,其中包括五個數據項,分別是存儲每一行元素的項char string80、指向前一個結點的指針struct text *pre、指向后一個結點的指針struct text *next、記錄每一行元素的長度int num以及判斷是否刪除的標志int flat。當flat=0時,該行被刪除;當flat=1時,該行不刪除。對文本的編輯,每次都采用先打開文本文件的形式,因為這樣可以更直觀的看出編輯后文本的變化。實現活區顯示的做法是建立一個鏈表,該鏈表有20個結點,在一頁中放不下的部分為活區,執行p后可以顯示出第一頁的部分,在continue之后選擇Y便可以顯示出活區的部分,即第二頁的內容。實現活區切換的做法是執行n后,先判斷活區的內容,如果沒被刪除就把文本中內容讀入到鏈表中,便可以直接顯示出獲取部分,即第二頁的內容。實現刪除的做法是執行d,定義兩個指針分別指向要刪除的結點,刪除兩個結點之間的內容,最后將刪除后的結果存盤并顯示下一頁內容。實現插入的做法是執行i,定義一個指針變量插入行的前一行,然后給插入行分配存儲空間,將插入行的內容插入到鏈表中,便實現行插入的功能。程序還定義了一個函數來釋放所占鏈表的內存,在退出程序后利用保存函數將內容存盤.二、設計過程(程序流程圖)1.主函數的設計主函數采用dowhile循環,循環體主要調用三個子函數:1 EDIT(),2 HELP(),3 EXIT()。行編輯程序的四種主要功能都在EDIT()編輯函數中執行。HELP()函數是提示用戶各種功能的執行方式,主函數通過給字符變量cmd賦初值來選擇是結束程序還是繼續執行循環體中的內容。主程序流程圖如1所示。cmd=1 開始定義字符變量cmd給cmd賦初值switch(cmd)1編輯函數EDTT()2幫助函數HELP()3退出結束cmd=2cmd=3開始 結束圖1 主函數流程圖2.幫助函數HELP()子程序設計幫助函數的主要作用是在用戶忘記如何操作的情況下在屏幕上給用戶顯示提示操作的信息,使行插入,行刪除,活區顯示,活區切換的執行方式,其流程圖如圖2所示。 返 回 開 始輸出提示信息 返 回 開 始輸出提示信息圖2 幫助函數HELP()流程圖3.編輯函數EDIT()子程序設計簡單行編輯程序的各種功能在編輯函數中實現。首先給字符型變量cmd賦初值,通過switch(cmd)來選擇執行哪種功能。退出編輯函數:E(e),調用save all()函數將內容存盤,然后調用freemem()釋放鏈表空間。打開文件:O(o),調用openfiles()函數打開文件。執行活區顯示:P(p)。執行行刪除:D(d)。執行行插入:I(i)。執行活區切換顯示:N(n)。程序流程圖如圖3所示。圖3 編輯函數流程圖4.活區顯示函數display()子程序設計在活區顯示中首先把文本內容鏈入鏈表,函數中用page來實現頁碼的自增。函數種定義了一個指向struct text結構體的指針變量p ,在文件fp非空和行號小于20的情況下,利用fgets函數使p-string從打開的文件fp中得到字符的值,然后輸出每一行的行號和每一行的內容,在此函數的最后還可以利用Y和N來決定是否繼續顯示下一個活區的內容。其程序流程圖如圖4所示。開 始定義變量 i,coint,text *p打開的文件fp非空且coint=y|coint=Y定義page(頁數 )輸出頁數從文件中讀入數組元素p-string輸出行號和行的內容給conti賦值Y或N判斷文件是否非空輸出file end!返 回YYYNNN圖4 活區顯示函數流程圖5.活區切換函數saveanddisplay(20)子函數設計活區切換函數實現活區之間的切換,把文本的每一頁(20行)作為一個活區,可以逐頁的把活區內容顯示出來。在活區切換函數中定義了一個指向struct text結構體的指針變量p賦初值*p=NULL,當i小于20時,如果行沒有被刪除(flag=1)就通過fputs函數把活區內容寫入到文件(out).打開文件fp,如果文件非空,用fgets函數從文件fp讀入字符串,并用puts函數輸出。如果文件fp為空就輸出file end!。程序流程圖如圖5所示。NYYN定義變量 i;text *p=NULL ,page+行沒有被刪除p-flat=1判斷文件fp是否 非空輸出活區內容輸出file end!返 回1利用指針變量p找到hang 的具體位置將行的內容寫入到文件outN返回 0 返 回1 返 回0 開 始圖5 活區切換函數流程圖6行刪除函數del()子程序設計在函數的開始定義了三個指向struct text結構體的指針變量p1,p2,p3。輸入要刪除的兩個行號(比如1 3),表示刪除從第1行到第3行的數據。程序流程圖如圖6所示。輸出要刪除的行 返 回定義指針變量text *p1,*p2,*p3給min和max賦初值定義整型變量min,max,i通過指針變量p1,找到min行在活區中的位置通過指針變量p1找到max行在活區中的位置刪除行min到max的內容保存顯示刪除后的內容saveanddisplay() 開 始圖6 行刪除函數流程圖7行插入行數insert()子程序的設計行插入函數的開始定義了三個指向struct text結構體的指針變量p,p1,p2,在給hang賦初值后使p1指向頭結點,利用for循環,找到要插入行的前一行hang-1,然后給插入的行分配內存空間。輸入文本內容并連入鏈表。行程序流程圖如7所示。定義三個類型的指針變量p,p1,p2 開 始輸出“請輸入要插入的行”給變量行賦初始值令p1=頭結點,找到行插入要插入的文本內容輸出修改后的鏈表(文本內容)將修改后的鏈表存盤(savveandedisplay)返 回圖7 行插入函數流程圖三、調試過程及實驗結果(1)調試過程 在程序編寫好之后,便開始在VC中編譯執行程序,雖然程序沒有錯誤,但是執行過程中插入可以實現,刪除卻實現不了,在仔細檢驗程序后,發現在執行過程中沒有先打開文件,因此無法繼續執行。再改正之后便可以得到正確的運行結果了。(2)實驗結果1幫助函數HELP()調試結果在執行過程中按2鍵便可進入到幫助菜單中,其中有四種功能,其結果如下圖。圖8 HELP()函數的內容2打開文件函數openfiles()調試結果在命令窗口輸入1調用EDIT()函數,輸入O,回車后,輸入你想打開的文本名,回車后,輸入你想寫入的文本名。結果如圖9所示。圖9 打開文件命令調試結果3.活區顯示函數display()調試結果 打開文件后輸入P,回車后顯示每一頁的內容(即活區內容),輸入Y是繼續顯示下一頁的內容,調試結果如下面圖所示。圖10 第一頁活區的內容圖11 第2頁活區的內容4活區切換函數saveanddisplay()調試結果例如在活區顯示完第1頁后,輸入N,程序等待你輸入下一個命令,這時輸入n,回車后顯示下一活區內容,也就是第二頁的內容。調試結果如下圖所示。圖12 輸入命令n圖13 第2頁活區的內容5行刪除函數del()調試結果先進入EDIT,打開文件,觀察原始數據。輸入d后,根據提示信息輸入最小行號和最大行號(例如 1 3),回車后顯示刪除后的內容。如下圖所示。圖14 觀察原始數據結果圖15 行刪除函數調試結果6行插入函數insert()調試結果接著在行刪除函數執行后輸入命令i,回車,然后輸入你想插入的行號(例如3),回車后輸入你想插入的文本內容(如00000000000000000000,“”是文本結束的標志),回車后會顯示修改后的鏈表,即插入行后的文本內容,如圖16所示。圖26 行插入調試結果四、結論通過對該題目的編寫調試以及結果顯示可以看出,本程序可以滿足任務書的要求,實現了對行的插入、刪除、活區顯示、活區轉換的各項要求。在執行插入命令的過程中,要檢驗活區的大小,如果插入這一行之后,仍保持不超的話,就將其插入。在輸入未讀完時,可將未讀完的內容保持在活區的頂部。此外,也實現了一些簡單的操作,例如,創建了一個鏈表,實現文本文件的打開,實現以行為單位是很合理的。通過這次課設,了解簡單行編輯程序應用的廣泛性。本課程設計的簡單行編輯程序各功能的運行操作十分快捷,能滿足用戶的需要。5、 程序清單#define NULL 0#define OK 0#include #include #include #include #include typedef struct text char string80;/存儲每一行的元素 struct text *next;/指向后一個節點的指針 struct text *pre;/指向前一個節點的指針 int num;/每一行元素的長度 int flat;/確定此行是否被刪除的標志text;FILE *fp,*out;/fp是執行被打開的文件,out指向被寫入的文件text *head;/鏈表的頭指針int n=0,sum,delnum,xiugai=0,page=0;/修改用來指示文件是否被修改過,如果修改過才回存盤。page用來計算顯示的/頁數.delnum用來存儲被刪除的字節數,sum存儲一頁的總字節數void HELP()/幫助函數,顯示一些命令的格式printf(nt*n); printf(t* 打開文件: o *n); printf(t* 行插入格式: i *n); printf(t* 行刪除格式: d *n); printf(t* 活區切換格式: n *n); printf(t* 活區顯示格式:p *n); printf(t* 注意:在執行所有命令前必須先用o命令打開文件,并 *n); printf(t* 用p命令顯示出來! *n);printf(t*n); printf(nnn); system(pause);void Createlist()/建立一個二十個節點的鏈表,是文本中的一頁 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()/釋放鏈表所占的內存 text *p; for(p=head;head!=NULL;) head=p-next; free(p); p=head; int EDIT()/編輯函數,用來接受處理編輯命令 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: /活區顯示 case P: Createlist();display();break; case 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()/打開文件的函數 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文件已經結束!); return 0; return 0;int saveanddisplay(int hang)/命令n執行的函數,用來將活區的內容顯示并讀入下一頁內容 int i,endflat=0; char conti=y; text *p=NULL; page+; for(i=0,p=head;inext) /將活區寫入文件 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)/從文件讀入活區 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(文件已經結束!); return 0;int saveall()/退出編輯函數后執行的函數,將所有的內容存盤 int i,endflat=0; char conti=y; text *p; for(i=0,p=head;inext) /將活區寫入文件 if(p-flat=1) fputs(p-string,out); p-flat=0; while(!feof(fp)/將其余的內容寫入文件 fputc(fgetc(fp),out); return 0;int del()/刪除d命令對應的函數,用來刪minmax中的行,用結構體中的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)/*刪除中間的節點,將flat賦值0*/ p1-flat=0; delnum=delnum+p1-num; for(i=0,p3=head;inext)/顯示刪除后的結果 if(p3-flat=1) puts(p3-string); saveanddisplay(10);/將刪除后的結果存盤并顯示下一頁內容(十行) xiugai=1; return 0;int insert()/插入i命令對應的函數,在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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 購物中心兒童游樂區運營管理與品牌合作協議
- 納米藥物研發與臨床試驗倫理審查合作協議
- 高端別墅房產中介獨家代理銷售協議
- 網絡短視頻與影視項目聯合投資協議
- 全民健身活動贊助合作協議書
- 高清網絡直播用監聽音箱租賃服務協議
- 粵港澳大灣區跨境合伙企業項目投資信托合同
- 家具出口運輸保險及關稅豁免合同
- 個性化網絡直播虛擬背景定制服務協議
- 水利樞紐安全生產責任保證書
- 2025年山東省應急管理普法知識競賽參考試題庫大全-上(單選題)
- 102解二元一次方程組【10個必考點】(必考點分類集訓)(人教版2024)
- 鄰水現代農業發展集團有限公司招聘筆試題庫2025
- 腫瘤專科進修匯報護理
- 配電房防火安全施工技術措施
- 地鐵乘客滿意度影響因素組態效應分析:出行鏈視角研究
- 數學三角形的高、中線、角平分線教案2024-2025學年北師大版(2024)七年級數學下冊
- 2021水閘工程運行管理規程
- (高清版)DB51∕T 1292-2011 牧草種質資源田間鑒定與評價技術規程
- 三農項目申請操作流程指南
- 組織行為學(對外經濟貿易大學)知到課后答案智慧樹章節測試答案2025年春對外經濟貿易大學
評論
0/150
提交評論