數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--文本編輯器_第1頁(yè)
已閱讀1頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論