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