版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計總結(jié)報告</p><p> 設(shè)計題目:文本編輯器</p><p><b> 學(xué)生姓名: </b></p><p> 系 別:計算機科學(xué)與工程</p><p> 專 業(yè):計算機科學(xué)與技術(shù)</p><p> 班 級:06-1</p
2、><p><b> 學(xué) 號: </b></p><p><b> 指導(dǎo)教師: </b></p><p> 2008 年 12 月 20 日</p><p> 課 程 設(shè) 計 任 務(wù) 書</p><p> 題目 文本編輯器
3、 </p><p> 專業(yè)、班級 計科06-1 學(xué)號 26 姓名 羅啟福 </p><p><b> 主要內(nèi)容:</b></p><p> ?。?)打開文本文件(2)顯示文本內(nèi)容(3)插入文本行(可一次性插入多行)(4)刪除指定文本行(可一次性刪除多行)(5)拷貝指定的多行(6)修改行(7
4、)查找指定的字符串 (8)替換指定的字符串(支持全部替換) (9) 統(tǒng)計字數(shù) (10) 存盤 (11)另存為 (12)系統(tǒng)菜單、右鍵菜單(右擊顯示框或其它地方)(13)附帶功能(游戲、系統(tǒng)時間、繪圖、記事本)</p><p><b> 基本要求:</b></p><p> 要求完成:輸出整篇文章內(nèi)容;在文章尾部追加一行;在文章指定行插入新行;修改文章指定行;刪除
5、文章指定行;統(tǒng)計某一字符串在文章中出現(xiàn)的次數(shù);統(tǒng)計文章的全部字母數(shù);統(tǒng)計文章的數(shù)字個數(shù);保存文章到磁盤指定文件;加載磁盤文章文件。</p><p> 運行環(huán)境:WindowsXP, 帶有MFC基礎(chǔ)類庫的VC++6.0</p><p> 操作數(shù)據(jù):打開與應(yīng)用程序在同目錄下的me.txt 或file.dat,也可使用瀏覽功能打開任意文本文件,然后進行各種操作。</p><
6、;p><b> 主要參考資料等:</b></p><p> 《數(shù)據(jù)結(jié)構(gòu)(C語言版)》 作者:嚴蔚敏 吳偉民 出版社:清華大學(xué)出版社</p><p> 《Visual C++程序設(shè)計--基礎(chǔ)與實例分析》作者:朱晴婷 等 出版社:清華大學(xué)出版社</p><p> 《數(shù)據(jù)結(jié)構(gòu)算法實現(xiàn)及解析》 作者:高一凡
7、 出版社:西安電子科技大學(xué)出版社</p><p> 完 成 期 限: 一周 </p><p> 指導(dǎo)教師簽名: </p><p> 課程負責人簽名: </p><p> 2008年 12 月 20 日</p><
8、;p><b> 目錄</b></p><p> 設(shè)計題目(任選其一)</p><p><b> 需求分析</b></p><p> 運行環(huán)境(軟、硬件環(huán)境)</p><p><b> 算法設(shè)計的思想</b></p><p><b&g
9、t; 算法的流程圖</b></p><p><b> 算法設(shè)計分析</b></p><p><b> 源代碼</b></p><p><b> 運行結(jié)果分析</b></p><p><b> 收獲及體會</b></p>
10、<p><b> 設(shè)計題目</b></p><p> 設(shè)計目的:文本編輯程序是一個面向用戶的系統(tǒng)服務(wù)程序,廣泛用于源程序的輸入和修改,甚至用于報刊和書籍的編輯排版以及辦公室的公文書信的起草和潤色。</p><p> 設(shè)計內(nèi)容:文章編輯功能:輸入一頁文字,程序可以統(tǒng)計出文字、數(shù)字、空格的個數(shù)。靜態(tài)存儲一頁文章,每行最多不超過80個字符,共N行;要求(
11、1)分別統(tǒng)計出其中英文字母數(shù)和空格數(shù)及整篇文章總字數(shù);(2)統(tǒng)計某一字符串在文章中出現(xiàn)的次數(shù),并輸出該次數(shù);(3)刪除某一子串,并將后面的字符前移。 存儲結(jié)構(gòu)使用線性表,分別用幾個子函數(shù)實現(xiàn)相應(yīng)的功能;輸入數(shù)據(jù)的形式和范圍:可以輸入大寫、小寫的英文字母、任何數(shù)字及標點符號。輸出形式:(1)分行輸出用戶輸入的各行字符;(2)分4行輸出"全部字母數(shù)"、"數(shù)字個數(shù)"、"空格個數(shù)&q
12、uot;、"文章總字數(shù)"(3)輸出刪除某一字符串后的文章;要求完成:輸出整篇文章內(nèi)容;在文章尾部追加一行;在文章指定行插入新行;修改文章指定行;刪除文章指定行;統(tǒng)計某一字符串在文章中出現(xiàn)的次數(shù);統(tǒng)計文章的全部字母數(shù);統(tǒng)計文章的數(shù)字個數(shù);保存文章到磁盤指定文件;加載磁盤文章文件。</p><p><b> 二.需求分析</b></p><p>
13、隨著個人電腦的迅速普及,各種實用的小型軟件的開發(fā)和設(shè)計也變得更要必要了。本軟件是為電腦使用者做文本編輯而精心設(shè)計的,可以滿足文本操作的大部分要求。</p><p> 文本編輯程序是一個面向用戶的系統(tǒng)服務(wù)程序,廣泛用于源程序的輸入和修改,甚至用于報刊和書籍的編輯排版以及辦公室的公文書信的起草和潤色。</p><p><b> 功能模塊描述:</b></p>
14、;<p><b> 打開文件:</b></p><p> 該模塊的功能主要是用于打開文本文件用于編輯。用戶可直接輸入與之在同一個目錄下的說有文本文件,也可以實用瀏覽按鈕打開其它任何地方的任何文本文件。默認文件名為me.txt,默認路徑為同目錄。</p><p> 可使用“打開文件”按鈕,也可使用系統(tǒng)菜單中的“文件\打開”</p>&l
15、t;p><b> 2.顯示文本內(nèi)容:</b></p><p> 該模塊的功能是顯示已經(jīng)打開的文本文件??墒褂谩帮@示文件內(nèi)容”按鈕,也可使用系統(tǒng)菜單中的“編輯\顯示”</p><p><b> 3.插入行:</b></p><p> 可使用“插入行”按鈕,也可使用系統(tǒng)菜單中的“編輯\插入行”或右鍵菜單中的“插入
16、行”打開插入行數(shù)據(jù)的對話框。在第一個輸入框中輸入插入的位置,在第二個輸入框中輸入插入的總行數(shù)。然后可以在彈出的輸入框中輸入要插入的數(shù)據(jù)。4.刪除行:</p><p> 可使用“刪除行”按鈕,也可使用系統(tǒng)菜單中的“編輯\刪除行” 或右鍵菜單中的“刪除行”打開刪除行數(shù)據(jù)的對話框。在第一個輸入框中輸入刪除的起始位置,在第二個輸入框中輸入刪除的總行數(shù)。</p><p><b> 5
17、.拷貝行:</b></p><p> 可使用“拷貝行”按鈕,也可使用系統(tǒng)菜單中的“編輯\拷貝行”打開拷貝行數(shù)據(jù)的對話框。在第一個輸入框中輸入拷貝的起始位置,在第二個輸入框中拷貝刪除的總行數(shù).在第三個輸入框中輸入要吧拷貝的數(shù)據(jù)插入的位置。</p><p><b> 6.修改行:</b></p><p> 可使用“修改行”按鈕,也
18、可使用系統(tǒng)菜單中的“編輯\修改行”打開修改行數(shù)據(jù)的對話框。在第一個輸入框中輸入修改的行位置,在彈出輸入框中輸入新數(shù)據(jù)內(nèi)容。</p><p><b> 7.查找字符串:</b></p><p> 可使用“查找字符串”按鈕,也可使用系統(tǒng)菜單中的“編輯\查找字符串”打開查找字符串數(shù)據(jù)的對話框。在輸入框中輸入要查找的字符串。</p><p><
19、;b> 8.替換字符串:</b></p><p> 可使用“替換字符串”按鈕,也可使用系統(tǒng)菜單中的“編輯\替換字符串”打開替換字符串數(shù)據(jù)的對話框。在第一個輸入框中輸入要替換的字符串,在第二個輸入框中輸入新數(shù)據(jù)內(nèi)容。</p><p><b> 9.存盤或另存為:</b></p><p> 該模塊可以保存文本內(nèi)容到指定的文
20、件。</p><p> 10.統(tǒng)計各種字符的個數(shù):</p><p> 該模塊可以統(tǒng)計出中文、英文、空格、數(shù)字及其它字符的個數(shù)和總字符數(shù)。</p><p><b> 11.附加功能:</b></p><p> 附加功能有游戲、繪圖、記事本及查看系統(tǒng)時間。</p><p><b>
21、 功能分析:</b></p><p> 本系統(tǒng)主要是用于文本編輯者的文檔編輯,文本編輯程序是一個面向用戶的系統(tǒng)服務(wù)程序,廣泛用于源程序的輸入和修改,甚至用于報刊和書籍的編輯排版以及辦公室的公文書信的起草和潤色。</p><p><b> 三.運行環(huán)境</b></p><p> ×VisualC++6.0帶MFC基礎(chǔ)類
22、庫,WindowsXP環(huán)境</p><p> ×Intel Pentium以上CPU、64MB以上內(nèi)存</p><p> ×推薦使用PIII以上CPU、128MB以上內(nèi)存</p><p><b> 四.算法設(shè)計的思想</b></p><p> 計算機上的非數(shù)值處理的對象基本上都是字符串數(shù)據(jù),隨
23、著語言加工程序的發(fā)展,產(chǎn)生了字符串處理的一系列的操作。本軟件所使用的基本操作和存儲結(jié)構(gòu)為采用串的堆分配存儲結(jié)構(gòu),并定義相應(yīng)的操作函數(shù)。文本編輯的操作函數(shù)調(diào)用這些方法并結(jié)合MFC的庫函數(shù)實現(xiàn)文本編輯的圖形界面。</p><p><b> 串的堆分配存儲:</b></p><p> struct HString</p><p><b>
24、; {</b></p><p> char *ch; // 若是非空串,則按串長分配存儲區(qū),否則ch為NULL</p><p> int length; // 串長度</p><p><b> };</b></p><p> 串的堆分配存儲的實現(xiàn)函數(shù):</p><p> S
25、tatus StrAssign(HString &T,char *chars);</p><p> Status StrCopy(HString &T,HString S);</p><p> Status StrEmpty(HString S);</p><p> int StrCompare(HString S,HString T);<
26、;/p><p> int StrLength(HString S);</p><p> Status ClearString(HString &S);</p><p> Status Concat(HString &T,HString S1,HString S2);</p><p> Status SubString(HS
27、tring &Sub, HString S,int pos,int len);</p><p> void InitString(HString &T);</p><p> int Index(HString S,HString T,int pos) ;// 嚴蔚敏《數(shù)據(jù)結(jié)構(gòu)》算法4.1</p><p> Status StrInsert(HS
28、tring &S,int pos,HString T); // 算法4.4;</p><p> Status StrDelete(HString &S,int pos,int len);</p><p> Status Replace(HString &S,HString T,HString V);</p><p> void Dest
29、royString();</p><p> void StrPrint(HString T);</p><p> 現(xiàn)在主要分析一下Index(S,T,pos)和StrInsert的基本思想:</p><p> Index(S,T,pos):在主串S中取第i(i的初值為pos)個字符起、長度和串T相等的字串和串T比較,若相等,則求出函數(shù)值為i,否則i值增1直至串
30、S中不存在和串T相等的子串為止。</p><p> StrInsert(&S,pos,T):為串S重新分配大小等于串S和串T長度之和的存儲空間,然后進行復(fù)制。</p><p> 文本編輯的操作函數(shù):</p><p> void Open();</p><p> char* List();</p><p>
31、; void Insert();</p><p> void Delete();</p><p> void Copy();</p><p> void Modify();</p><p> void Search();</p><p> void Replace();</p><p&g
32、t; void Save();</p><p><b> 算法的流程圖</b></p><p><b> 主程序的流程圖:</b></p><p><b> 算法設(shè)計分析</b></p><p> 本軟件所使用的基本操作和存儲結(jié)構(gòu)為采用串的堆分配存儲結(jié)構(gòu),并定義相應(yīng)的
33、操作函數(shù)。文本編輯的操作函數(shù)調(diào)用這些方法并結(jié)合MFC的庫函數(shù)實現(xiàn)文本編輯的圖形界面。</p><p><b> 串的堆分配存儲:</b></p><p> struct HString</p><p><b> {</b></p><p> char *ch; // 若是非空串,則按串長分配
34、存儲區(qū),否則ch為NULL</p><p> int length; // 串長度</p><p><b> };</b></p><p> 串的堆分配存儲的主要實現(xiàn)函數(shù)分析:</p><p> Status StrCopy(HString &T,HString S)</p><p&
35、gt; { // 初始條件: 串S存在。操作結(jié)果: 由串S復(fù)制得串T</p><p><b> int i;</b></p><p><b> if(T.ch)</b></p><p> free(T.ch); // 釋放T原有空間</p><p> T.ch=(char*)malloc(
36、S.length*sizeof(char)); // 分配串空間</p><p> if(!T.ch) // 分配串空間失敗</p><p> exit(OVERFLOW);</p><p> for(i=0;i<S.length;i++) // 拷貝串</p><p> T.ch[i]=S.ch[i];</p>
37、<p> T.length=S.length;</p><p> return OK;</p><p><b> }</b></p><p> 此函數(shù)可以把一個串T釋放,然后吧串S復(fù)制到T,得到新串。時間復(fù)雜度為O(S.length);</p><p> int Index(HString S,HSt
38、ring T,int pos) // 嚴蔚敏《數(shù)據(jù)結(jié)構(gòu)》算法4.1</p><p> { // T為非空串。若主串S中第pos個字符之后存在與T相等的子串,</p><p> // 則返回第一個這樣的子串在S中的位置,否則返回0</p><p> int n,m,i;</p><p> HString sub;</p>
39、<p> InitString(sub);</p><p><b> if(pos>0)</b></p><p><b> {</b></p><p> n=StrLength(S);</p><p> m=StrLength(T);</p><p>
40、;<b> i=pos;</b></p><p> while(i<=n-m+1)</p><p><b> {</b></p><p> SubString(sub,S,i,m);</p><p> if(StrCompare(sub,T)!=0)</p><p
41、><b> ++i;</b></p><p><b> else</b></p><p><b> return i;</b></p><p><b> }</b></p><p><b> }</b></p&g
42、t;<p><b> return 0;</b></p><p><b> }</b></p><p> 利用判等、求串長和求子串的操作可以實現(xiàn)求子串位置定位函數(shù)Index(HString S,HString T,int pos) ,T為非空串。若主串S中第pos個字符之后存在與T相等的子串, 則返回第一個這樣的子串在S中的位
43、置,否則返回0,時間復(fù)雜度為O( );</p><p> 文本編輯器的主要功能函數(shù)的基本操作:</p><p> #define MAX_LEN 200 // 文件最大行數(shù)</p><p> #define LINE_LEN 200 // 每行字符數(shù)最大值+1</p><p> #define NAME_LEN 50 // 文件名最大
44、長度(包括盤符、路徑)+1</p><p> void Open();</p><p> char* List();</p><p> void Insert();</p><p> void Delete();</p><p> void Copy();</p><p> void
45、 Modify();</p><p> void Search();</p><p> void Replace();</p><p> void Save();</p><p> 文本編輯器的主要功能函數(shù)算法分析:</p><p> void Insert()</p><p><
46、;b> { // 插入行</b></p><p> int i,l,m;</p><p> CInsertDlg dlg; </p><p> if(IDOK==dlg.DoModal())//在第l行前插m行,請輸入l m:</p><p><b> {</b></p><
47、;p> l=dlg.m_insertl;</p><p> m=dlg.m_insertm;</p><p><b> }</b></p><p> if(n+m>MAX_LEN)</p><p><b> {</b></p><p> Message
48、Box(hWnd,"插入行太多\n","提示",</p><p> MB_OK|MB_ICONEXCLAMATION );</p><p><b> return;</b></p><p><b> }</b></p><p> if(n>=l-
49、1&&l>0)</p><p><b> {</b></p><p> for(i=n-1;i>=l-1;i--)</p><p> T[i+m]=T[i];</p><p><b> n+=m;</b></p><p> for(i=l
50、-1;i<l-1+m;i++)</p><p><b> {</b></p><p> CInsertInforDlg indlg;</p><p> if(IDOK==indlg.DoModal())//順序輸入待插入內(nèi)容:</p><p><b> {</b></p>
51、<p> strcpy(str,indlg.m_insertinfor.GetBuffer(0));</p><p><b> }</b></p><p> InitString(T[i]);</p><p> StrAssign(T[i],str);</p><p><b> }<
52、/b></p><p><b> }</b></p><p><b> else</b></p><p> MessageBox(hWnd,"行超出范圍\n",</p><p> "提示",MB_OK|MB_ICONEXCLAMATION );&
53、lt;/p><p><b> }</b></p><p> 上述算法是對插入行數(shù)據(jù)函數(shù)的定義,它和MFC的一些庫函數(shù)有很多的嵌套調(diào)用,需要包含很多頭文件。先調(diào)用輸入框的對話框輸入插入的起始位置,第二個輸入框是插入的總行數(shù),它可以支持插入多行。</p><p> void Replace()</p><p> { //
54、 替換字符串</p><p> int i,k,f=1,count=0; // f為繼續(xù)替換標志</p><p> HString s,t;</p><p> CReplaceDlg dlg;</p><p> if(dlg.DoModal()==IDOK)// 輸入待替換的字符串:</p><p><b
55、> {</b></p><p> strcpy(str,dlg.m_replacey.GetBuffer(0));</p><p> strcpy(strr,dlg.m_replaceh.GetBuffer(0));</p><p><b> }</b></p><p> InitString
56、(s);</p><p> StrAssign(s,str);</p><p> InitString(t);</p><p> StrAssign(t,strr);</p><p> for(i=0;i<n&&f;i++) // 逐行查找、替換</p><p><b> {&
57、lt;/b></p><p> k=1; // 由每行第1個字符起查找</p><p><b> while(k)</b></p><p><b> {</b></p><p> k=Index(T[i],s,k); // 由本行的第k個字符開始查找</p><p&
58、gt; if(k) // 找到</p><p><b> {</b></p><p><b> count++;</b></p><p> CString strS;</p><p> strS.Format("第%d行: %s\n第%d個字符處找到。是否替換(Y/N)? &qu
59、ot;,i+1,T[i].ch,k);</p><p> if(IDYES==MessageBox(hWnd,strS,"提示",</p><p> MB_YESNO|MB_ICONQUESTION ))</p><p><b> {</b></p><p> StrDelete(T[i],k
60、,StrLength(s));</p><p> StrInsert(T[i],k,t);</p><p><b> }</b></p><p> if(IDNO==MessageBox(hWnd,"繼續(xù)替換嗎(Y/N)?\n","提示",</p><p> MB_YESN
61、O|MB_ICONQUESTION ))</p><p> {// 中斷查找、替換</p><p><b> f=0;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b>
62、; else</b></p><p> k+=StrLength(t);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> if(
63、f)</b></p><p> MessageBox(hWnd,"沒找到\n","提示",MB_OK);</p><p> CString strT;</p><p> strT.Format("共替換 %d個\n",count);</p><p> strT+=
64、dlg.m_replacey;</p><p> MessageBox(hWnd,strT,"替換結(jié)果",MB_OK|MB_ICONEXCLAMATION );</p><p><b> }</b></p><p> 上述算法是對替換數(shù)據(jù)函數(shù)的定義,它和MFC的一些庫函數(shù)有很多的嵌套調(diào)用,需要包含很多頭文件。先調(diào)用輸入
65、框的對話框輸入要被替換的字符串,第二個輸入框是輸入新字符串,它可以支持一次替換多行,甚至全部替換。</p><p><b> 源代碼</b></p><p> 以下為自己添加的頭文件程序:</p><p> // c1.h (程序名)</p><p> #include<string.h></p
66、><p> #include<ctype.h></p><p> #include<malloc.h> // malloc()等</p><p> #include<limits.h> // INT_MAX等</p><p> #include<stdio.h> // EOF(=^Z或F6)
67、,NULL</p><p> #include<stdlib.h> // atoi()</p><p> #include<io.h> // eof()</p><p> #include<math.h> // floor(),ceil(),abs()</p><p> #include<pr
68、ocess.h> // exit()</p><p> #include<iostream.h> // cout,cin</p><p> // 函數(shù)結(jié)果狀態(tài)代碼</p><p> #define TRUE 1</p><p> #define FALSE 0</p><p> #defin
69、e OK 1</p><p> #define ERROR 0</p><p> #define INFEASIBLE -1</p><p> // #define OVERFLOW -2 因為在math.h中已定義OVERFLOW的值為3,故去掉此行</p><p> typedef int Status; // Status是函數(shù)
70、的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等</p><p> typedef int Boolean; // Boolean是布爾類型,其值是TRUE或FALSE</p><p> // c4-2.h 串的堆分配存儲</p><p> struct HString</p><p><b> {</b></p&
71、gt;<p> char *ch; // 若是非空串,則按串長分配存儲區(qū),否則ch為NULL</p><p> int length; // 串長度</p><p><b> };</b></p><p> Status StrAssign(HString &T,char *chars);</p>&
72、lt;p> Status StrCopy(HString &T,HString S);</p><p> Status StrEmpty(HString S);</p><p> int StrCompare(HString S,HString T);</p><p> int StrLength(HString S);</p>
73、<p> Status ClearString(HString &S);</p><p> Status Concat(HString &T,HString S1,HString S2);</p><p> Status SubString(HString &Sub, HString S,int pos,int len);</p>&l
74、t;p> void InitString(HString &T);</p><p> int Index(HString S,HString T,int pos) ;// 算法4.1</p><p> Status StrInsert(HString &S,int pos,HString T); // 嚴蔚敏《數(shù)據(jù)結(jié)構(gòu)》算法4.4;</p><
75、;p> Status StrDelete(HString &S,int pos,int len);</p><p> Status Replace(HString &S,HString T,HString V);</p><p> void DestroyString();</p><p> void StrPrint(HString
76、T);</p><p> //textedit.h 文本行編輯</p><p> #include"c1.h"</p><p> #include"c4_2.h" // 采用串的堆分配存儲結(jié)構(gòu),包含串的堆分配基本操作</p><p> #define MAX_LEN 200 // 文件最大行數(shù)&
77、lt;/p><p> #define LINE_LEN 200 // 每行字符數(shù)最大值+1</p><p> #define NAME_LEN 50 // 文件名最大長度(包括盤符、路徑)+1</p><p> void Open();</p><p> char* List();</p><p> void I
78、nsert();</p><p> void Delete();</p><p> void Copy();</p><p> void Modify();</p><p> void Search();</p><p> void Replace();</p><p> void
79、Save();</p><p> 以下為自己添加的源文件程序(即各種函數(shù)的實現(xiàn)部分):</p><p> //c4_2.cpp文件</p><p> #include"StdAfx.h"</p><p> #include"c4_2.h"</p><p> Status
80、 StrAssign(HString &T,char *chars)</p><p> { // 生成一個其值等于串常量chars的串T</p><p><b> int i,j;</b></p><p><b> if(T.ch)</b></p><p> free(T.ch);
81、// 釋放T原有空間</p><p> i=strlen(chars); // 求chars的長度i</p><p><b> if(!i)</b></p><p> { // chars的長度為0</p><p> T.ch=NULL;</p><p> T.length=0;<
82、/p><p><b> }</b></p><p><b> else</b></p><p> { // chars的長度不為0</p><p> T.ch=(char*)malloc(i*sizeof(char)); // 分配串空間</p><p> if(!T.
83、ch) // 分配串空間失敗</p><p> exit(OVERFLOW);</p><p> for(j=0;j<i;j++) // 拷貝串</p><p> T.ch[j]=chars[j];</p><p> T.length=i;</p><p><b> }</b>&l
84、t;/p><p> return OK;</p><p><b> }</b></p><p> Status StrCopy(HString &T,HString S)</p><p> { // 初始條件: 串S存在。操作結(jié)果: 由串S復(fù)制得串T</p><p><b>
85、 int i;</b></p><p><b> if(T.ch)</b></p><p> free(T.ch); // 釋放T原有空間</p><p> T.ch=(char*)malloc(S.length*sizeof(char)); // 分配串空間</p><p> if(!T.ch)
86、// 分配串空間失敗</p><p> exit(OVERFLOW);</p><p> for(i=0;i<S.length;i++) // 拷貝串</p><p> T.ch[i]=S.ch[i];</p><p> T.length=S.length;</p><p> return OK;<
87、;/p><p><b> }</b></p><p> Status StrEmpty(HString S)</p><p> { // 初始條件: 串S存在。操作結(jié)果: 若S為空串,則返回TRUE,否則返回FALSE</p><p> if(S.length==0&&S.ch==NULL)</
88、p><p> return TRUE;</p><p><b> else</b></p><p> return FALSE;</p><p><b> }</b></p><p> int StrCompare(HString S,HString T)</p&
89、gt;<p> { // 若S>T,則返回值>0;若S=T,則返回值=0;若S<T,則返回值<0</p><p><b> int i;</b></p><p> for(i=0;i<S.length&&i<T.length;++i)</p><p> if(S.ch[i
90、]!=T.ch[i])</p><p> return S.ch[i]-T.ch[i];</p><p> return S.length-T.length;</p><p><b> }</b></p><p> int StrLength(HString S)</p><p> {
91、// 返回S的元素個數(shù),稱為串的長度</p><p> return S.length;</p><p><b> }</b></p><p> Status ClearString(HString &S)</p><p> { // 將S清為空串</p><p><b>
92、; if(S.ch)</b></p><p><b> {</b></p><p> free(S.ch);</p><p> S.ch=NULL;</p><p><b> }</b></p><p> S.length=0;</p>
93、<p> return OK;</p><p><b> }</b></p><p> Status Concat(HString &T,HString S1,HString S2)</p><p> { // 用T返回由S1和S2聯(lián)接而成的新串</p><p><b> int i
94、;</b></p><p><b> if(T.ch)</b></p><p> free(T.ch); // 釋放舊空間</p><p> T.length=S1.length+S2.length;</p><p> T.ch=(char *)malloc(T.length*sizeof(char)
95、);</p><p><b> if(!T.ch)</b></p><p> exit(OVERFLOW);</p><p> for(i=0;i<S1.length;i++)</p><p> T.ch[i]=S1.ch[i];</p><p> for(i=0;i<S2.
96、length;i++)</p><p> T.ch[S1.length+i]=S2.ch[i];</p><p> return OK;</p><p><b> }</b></p><p> Status SubString(HString &Sub, HString S,int pos,int len
97、)</p><p> { // 用Sub返回串S的第pos個字符起長度為len的子串。</p><p> // 其中,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1</p><p><b> int i;</b></p><p> if(pos<1||pos>S
98、.length||len<0||len>S.length-pos+1)</p><p> return ERROR;</p><p> if(Sub.ch)</p><p> free(Sub.ch); // 釋放舊空間</p><p> if(!len) // 空子串</p><p><b&
99、gt; {</b></p><p> Sub.ch=NULL;</p><p> Sub.length=0;</p><p><b> }</b></p><p><b> else</b></p><p><b> { // 完整子串<
100、;/b></p><p> Sub.ch=(char*)malloc(len*sizeof(char));</p><p> if(!Sub.ch)</p><p> exit(OVERFLOW);</p><p> for(i=0;i<=len-1;i++)</p><p> Sub.ch[i]
101、=S.ch[pos-1+i];</p><p> Sub.length=len;</p><p><b> }</b></p><p> return OK;</p><p><b> }</b></p><p> void InitString(HString &
102、amp;T)</p><p> { // 初始化(產(chǎn)生空串)字符串T。另加</p><p> T.length=0;</p><p> T.ch=NULL;</p><p><b> }</b></p><p> int Index(HString S,HString T,int pos
103、) // 算法4.1</p><p> { // T為非空串。若主串S中第pos個字符之后存在與T相等的子串,</p><p> // 則返回第一個這樣的子串在S中的位置,否則返回0</p><p> int n,m,i;</p><p> HString sub;</p><p> InitString(s
104、ub);</p><p><b> if(pos>0)</b></p><p><b> {</b></p><p> n=StrLength(S);</p><p> m=StrLength(T);</p><p><b> i=pos;</
105、b></p><p> while(i<=n-m+1)</p><p><b> {</b></p><p> SubString(sub,S,i,m);</p><p> if(StrCompare(sub,T)!=0)</p><p><b> ++i;<
106、/b></p><p><b> else</b></p><p><b> return i;</b></p><p><b> }</b></p><p><b> }</b></p><p><b>
107、 return 0;</b></p><p><b> }</b></p><p> Status StrInsert(HString &S,int pos,HString T) // 算法4.4</p><p> { // 1≤pos≤StrLength(S)+1。在串S的第pos個字符之前插入串T</p>
108、;<p><b> int i;</b></p><p> if(pos<1||pos>S.length+1) // pos不合法</p><p> return ERROR;</p><p> if(T.length) // T非空,則重新分配空間,插入T</p><p><b&
109、gt; {</b></p><p> S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char));</p><p><b> if(!S.ch)</b></p><p> exit(OVERFLOW);</p><p> for(i=S.le
110、ngth-1;i>=pos-1;--i) // 為插入T而騰出位置</p><p> S.ch[i+T.length]=S.ch[i];</p><p> for(i=0;i<T.length;i++)</p><p> S.ch[pos-1+i]=T.ch[i]; // 插入T</p><p> S.length+=T.
111、length;</p><p><b> }</b></p><p> return OK;</p><p><b> }</b></p><p> Status StrDelete(HString &S,int pos,int len)</p><p>
112、{ // 從串S中刪除第pos個字符起長度為len的子串</p><p><b> int i;</b></p><p> if(S.length<pos+len-1)</p><p> exit(ERROR);</p><p> for(i=pos-1;i<=S.length-len;i++)<
113、;/p><p> S.ch[i]=S.ch[i+len];</p><p> S.length-=len;</p><p> S.ch=(char*)realloc(S.ch,S.length*sizeof(char));</p><p> return OK;</p><p><b> }</b
114、></p><p> Status Replace(HString &S,HString T,HString V)</p><p> { // 初始條件: 串S,T和V存在,T是非空串(此函數(shù)與串的存儲結(jié)構(gòu)無關(guān))</p><p> // 操作結(jié)果: 用V替換主串S中出現(xiàn)的所有與T相等的不重疊的子串</p><p> in
115、t i=1; // 從串S的第一個字符起查找串T</p><p> if(StrEmpty(T)) // T是空串</p><p> return ERROR;</p><p><b> do</b></p><p><b> {</b></p><p> i=In
116、dex(S,T,i); // 結(jié)果i為從上一個i之后找到的子串T的位置</p><p> if(i) // 串S中存在串T</p><p><b> {</b></p><p> StrDelete(S,i,StrLength(T)); // 刪除該串T</p><p> StrInsert(S,i,V); //
117、 在原串T的位置插入串V</p><p> i+=StrLength(V); // 在插入的串V后面繼續(xù)查找串T</p><p><b> }</b></p><p> }while(i);</p><p> return OK;</p><p><b> }</b>
118、;</p><p> void DestroyString()</p><p> { // 堆分配類型的字符串無法銷毀</p><p><b> }</b></p><p> void StrPrint(HString T)</p><p> { // 輸出T字符串。另加</p&g
119、t;<p><b> int i;</b></p><p> for(i=0;i<T.length;i++)</p><p> printf("%c",T.ch[i]);</p><p> printf("\n");</p><p><b>
120、 }</b></p><p> //textedit.cpp// algo4-3.cpp 文本行編輯</p><p> #include"StdAfx.h"</p><p> #include "kecheng.h"</p><p> #include "openDlg.h
121、"</p><p> #include "InsertDlg.h"</p><p> #include "InsertInforDlg.h"</p><p> #include "DeleteDlg.h"</p><p> #include "CopyDl
122、g.h"</p><p> #include "ModifyDlg.h"</p><p> #include "ModifyInforDlg.h"</p><p> #include "SearchDlg.h"</p><p> #include "Rep
123、laceDlg.h"</p><p> #include "windows.h"</p><p> #include"textedit.h"</p><p> #include"c1.h"</p><p> #include"c4_2.h" //
124、 采用串的堆分配存儲結(jié)構(gòu)</p><p> #define MAX_LEN 200 // 文件最大行數(shù)</p><p> #define LINE_LEN 200 // 每行字符數(shù)最大值+1</p><p> #define NAME_LEN 50 // 文件名最大長度(包括盤符、路徑)+1</p><p><b> //
125、全局變量</b></p><p> HString T[MAX_LEN];</p><p> char str[LINE_LEN],strr[LINE_LEN],filename[NAME_LEN]="";</p><p><b> FILE *fp;</b></p><p> i
126、nt n=0; // 文件行數(shù)</p><p> HWND hWnd;</p><p> void Open()</p><p> { // 打開文件(新或舊)</p><p><b> int i;</b></p><p> if(filename[0]) // 文件已打開</p
127、><p> MessageBox(hWnd,"已存在打開的文件\n","提示",</p><p> MB_OK|MB_ICONINFORMATION );</p><p><b> else</b></p><p><b> {</b></p>
128、<p> CopenDlg dlg;</p><p> if(IDOK==dlg.DoModal())</p><p><b> {</b></p><p> //filename=dlg.m_filename;</p><p> strcpy((char*)filename,dlg.m_file
129、name.GetBuffer(0));//strcpy拷貝字符串,遇到'\0'就結(jié)束拷貝;</p><p><b> }</b></p><p> else return;//取消操作 返回void值</p><p> fp=fopen(filename,"r");</p><p&g
130、t; if(fp) // 已存在此文件</p><p><b> {</b></p><p><b> do</b></p><p><b> {</b></p><p> fgets(str,LINE_LEN,fp);</p><p> i
131、=strlen(str);</p><p> str[i-1]=0; // 將10強制改為0</p><p><b> i--;</b></p><p><b> if(i>0)</b></p><p><b> {</b></p><p>
132、; StrAssign(T[n],str);</p><p><b> n++;</b></p><p> if(n>MAX_LEN)</p><p><b> {</b></p><p> MessageBox(hWnd,"文件太大\n","提示&qu
133、ot;,</p><p> MB_OK|MB_ICONEXCLAMATION );</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> }while(i
134、>0);</p><p> fclose(fp);</p><p><b> }</b></p><p><b> else</b></p><p> MessageBox(hWnd,"新文件\n","提示",</p><p
135、> MB_OK|MB_ICONEXCLAMATION );</p><p><b> }</b></p><p><b> }</b></p><p> char* List()</p><p> { // 顯示文件內(nèi)容</p><p><b>
136、int i;</b></p><p> CString strT,strS;</p><p> for(i=0;i<n;i++)</p><p><b> { </b></p><p> strT.Format("%d:%s",i+1,T[i].ch);//格式化函數(shù)1 s
137、trT.Format("%d:%s",i+1,T[i].ch);</p><p> //printf("%d: ",i+1);//函數(shù)2為sprintf(tempf,"%s說:%s",chara,charb);其中tempf[80],chara[10],charb[10]為char</p><p> strS+=strT;
138、</p><p> strS+="\r\n";</p><p><b> }</b></p><p> getchar();</p><p> char str1[32678];</p><p> strcpy(str1,strS.GetBuffer(0));<
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--文本編輯器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---簡易文本編輯器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--簡易文本編輯器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-簡易文本編輯器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-小型文本編輯器的設(shè)計
- 文本編輯器課程設(shè)計報告
- 文本編輯器課程設(shè)計
- 簡易文本編輯器課程設(shè)計報告
- vb課程設(shè)計報告----文本編輯器
- vb課程設(shè)計報告---文本編輯器
- java課程設(shè)計--文本編輯器
- java課程設(shè)計---文本編輯器
- java課程設(shè)計---文本編輯器
- vb課程設(shè)計文本編輯器
- java課程設(shè)計(文本編輯器)
- c語言課程設(shè)計--文本編輯器
- c_文本編輯器課程設(shè)計
- 文本編輯器_java課程設(shè)計實驗報告
- visual_basic課程設(shè)計報告---文本編輯器
- 操作系統(tǒng)課程設(shè)計---文本編輯器
評論
0/150
提交評論