[高等教育]單詞統(tǒng)計(jì)程序C++_第1頁
[高等教育]單詞統(tǒng)計(jì)程序C++_第2頁
[高等教育]單詞統(tǒng)計(jì)程序C++_第3頁
[高等教育]單詞統(tǒng)計(jì)程序C++_第4頁
[高等教育]單詞統(tǒng)計(jì)程序C++_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、.單詞統(tǒng)計(jì)問題描述文字研究人員需要統(tǒng)計(jì)某篇英文小說中某些特定單詞的出現(xiàn)次數(shù)和位置,試寫出一個實(shí)現(xiàn)這一目標(biāo)的文字統(tǒng)計(jì)系統(tǒng)。這稱為“文學(xué)研究助手”。要求算法輸入:文本文件和詞集。算法輸出:單詞出現(xiàn)的次數(shù),出現(xiàn)位置所在行的行號(同一行出現(xiàn)兩次的只輸出一個行號)。算法要點(diǎn):(1)文本串非空且以文件形式存放。(2)單詞定義:用字母組成的字符序列,中間不含空格,不區(qū)分大小寫。(3)待統(tǒng)計(jì)的單詞不跨行出現(xiàn),它或者從行首開始,或者前置一個空格。(4)數(shù)據(jù)結(jié)構(gòu)采用二維鏈表,單詞結(jié)點(diǎn)鏈接成一個鏈表,每個單詞的行號組成一個鏈表,單詞結(jié)點(diǎn)作為行號鏈表的頭結(jié)點(diǎn)。需求分析用戶需求:用戶可以通過該程序查詢和統(tǒng)計(jì)一篇英文文章

2、中某些特定單詞出現(xiàn)次數(shù)和位置。功能需求:用戶可以輸入單詞來查詢單詞出現(xiàn)次數(shù)和位置; 程序可以正確顯示查詢結(jié)果; 用戶可以選擇是否在一次輸出后繼續(xù)查詢; 在一次查詢中的結(jié)果記錄到一個二維鏈表中。概要設(shè)計(jì) 為達(dá)到設(shè)計(jì)要求,本程序采用二維鏈表存儲單詞結(jié)點(diǎn)和相關(guān)的位置信息。抽象數(shù)據(jù)類型:struct nodeint col; /行坐標(biāo)int row; /所在行的列坐標(biāo)node* next; /指向下一個坐標(biāo)結(jié)點(diǎn)的指針; /單詞坐標(biāo)坐點(diǎn)類型struct Nodechar words20; /單詞數(shù)組node* ptr; /指向單詞坐標(biāo)結(jié)點(diǎn)的指針Node* next; /指向下一個單詞結(jié)點(diǎn)的指針int n

3、um; /單詞所含字符個數(shù); /單詞結(jié)點(diǎn)class TLinkpublic:TLink() head = NULL; /構(gòu)造函數(shù)TLink() /析構(gòu)函數(shù)while( head != NULL )Node* temp;temp = head;head = head -> next;delete temp;void Insert( char* Item );/前條件:參數(shù)Item為一個字符數(shù)組。/后條件:Item所包含的單詞被插入到鏈表。void calcute(char *szFile,int size);/前條件:szFile以正確保存了文本字符,size為文本字符長度。/后條件:統(tǒng)計(jì)

4、鏈表每一個插入的單詞的個數(shù)及所在行、列坐標(biāo)。Node* gethead();/前條件:鏈表已初始化/后條件:返回鏈表頭指針private:Node* head;char A_to_a( char alp );/前條件:alp為一個正確的英文字母/后條件:如果alp是大寫字母,則轉(zhuǎn)化為小寫字母,否則不變。void showwindow();/后條件:顯示統(tǒng)計(jì)結(jié)果。void show_text();/前條件:在正確的路徑上存在一個英文文本。/后條件:讀入英文文本到字符數(shù)組并顯示在屏幕上。void input();/后條件:讀入用戶輸入的字符并插入到單詞鏈表。數(shù)據(jù)結(jié)構(gòu)圖解: 將從文件流讀入的文章字符

5、存到szFile字符數(shù)組中,以空格計(jì)數(shù)行單詞個數(shù),以換行符記錄文章列數(shù),將輸入后插入到鏈表中的單詞與字符數(shù)組中的單詞比較,遇到相等的則將當(dāng)前的行列數(shù)插入到鏈表的位置結(jié)點(diǎn)中,并且單詞個數(shù)加1。本程序允許用戶選擇是否重復(fù)進(jìn)行,并且對于在一次操作中重復(fù)輸入的單詞,在鏈表中不進(jìn)行重復(fù)插入。功能模塊: 模塊調(diào)用: 程序流程圖:主要模塊偽碼概要設(shè)計(jì):插入函數(shù)(參數(shù):Item【】數(shù)組): 新建單詞結(jié)點(diǎn);while( Itemi != '0' ) 復(fù)制各字符到單詞結(jié)點(diǎn)的單詞數(shù)組中; 記錄單詞字母個數(shù); 插入單詞字母個數(shù)到鏈表相應(yīng)域;temp -> wordsi = '0'

6、查找并比較鏈表中是否已有要插入的單詞; 如果有 不進(jìn)行插入并銷毀新建結(jié)點(diǎn); 否則 插入新建的單詞結(jié)點(diǎn);/*/統(tǒng)計(jì)函數(shù)( 參數(shù):char *szFile, int size)while( 沒有到文本字符的結(jié)尾 )依次遍歷文本字符,遇到非字母字符時(shí)計(jì)數(shù)單詞所含字母個數(shù);while( 沒有到鏈表尾 )if( 單詞結(jié)點(diǎn)所含單詞的字母個數(shù)與計(jì)數(shù)相等 )忽略大小寫比較本次遍歷到的單詞和鏈表中的結(jié)點(diǎn)單詞; if(相等) 插入行列值 遇空格行單詞個數(shù)加1; 遇換行列數(shù)加1;/*/結(jié)構(gòu)顯示模塊while( 沒到鏈表尾 )輸出結(jié)點(diǎn)單詞;如果存在,則輸出單詞的所有行、列值及出現(xiàn)次數(shù); 否則輸出沒有該詞或輸入錯誤信息

7、;/*/輸入模塊doif( 鏈表不空 )清空鏈表;輸出提示信息;接受用戶輸入; while( true )輸入的是結(jié)束字符; 退出;記錄輸入逗號前的單詞;插入到鏈表;繼續(xù)輸入;if( 鏈表空 )輸出 "沒有插入任何單詞!";else 統(tǒng)計(jì); 顯示結(jié)果;提示是否繼續(xù);輸入;while( 不繼續(xù) );詳細(xì)設(shè)計(jì)程序清單:/FILE:source.h#ifndef SOURCE_H#define SOURCE_Hstruct nodeint col;int row;node* next;struct Nodechar words20;node* ptr;Node* next;int

8、 num;class TLinkpublic:TLink() head = NULL; TLink()while( head != NULL )Node* temp;temp = head;head = head -> next;delete temp;void Insert( char* Item );void calcute(char *szFile,int size);Node* gethead();private:Node* head;char A_to_a( char alp );void showwindow();void show_text();void input();#

9、endif#include<iostream>#include<fstream>#include<cstdlib>#include "source.h"using namespace std;TLink link;int i=0;char szFile2000;int main()show_text();cout << endl;input();return 0;/*/void TLink:Insert(char *Item)int flag = 0;Node* temp;temp = new Node;int i = 0;w

10、hile( Itemi != '0' )temp -> wordsi = Itemi;+ i;temp -> num = i;temp -> wordsi = '0'Node* ptrr = NULL;ptrr = link.gethead();while( ptrr != NULL ) if( ptrr -> num = temp -> num )int n;for( n = 0; n < i; + n )if( A_to_a( ptrr -> wordsn ) != A_to_a( Itemn ) )break;if

11、( n = i )flag = 1;break; ptrr = ptrr -> next; if( flag != 1 ) temp -> ptr = NULL; temp -> next = NULL; Node* Temp = head; if( head = NULL ) head = temp; else while( Temp -> next != NULL ) Temp = Temp -> next; Temp -> next = temp; elsedelete temp;/*/char A_to_a( char alp )if( ( alp

12、>= 'A' ) && ( alp <= 'Z' ) )alp = alp + 32;return alp;/*/void TLink:calcute(char *szFile, int size)/cout << "calcute is called!" << endl;int i = 0; /記錄已搜索過的字符數(shù)-1intcol = 1;/列標(biāo)int row = 0;/行標(biāo)int count;/記錄空格數(shù)-1Node* ptrr = NULL;while( i < size )pt

13、rr = link.gethead();int j = 0;/對每個單詞從開始計(jì)數(shù)while( ( szFilei >= 'a' && szFilei <= 'z' ) | ( szFilei >= 'A' && szFilei <= 'Z' ) )+ i;+ j;while( ptrr != NULL )if( ptrr -> num = j )int n;for( n = 0; n <= j; + n )if( A_to_a( ptrr -> words

14、n ) != A_to_a( szFilei - j + n ) )break;if( n = j )node* temp;temp = new node;temp -> col = col;temp -> row = row;temp -> next = NULL;node* Temp = ptrr -> ptr; if( ptrr -> ptr = NULL )ptrr -> ptr = temp;else while( Temp -> next != NULL ) Temp = Temp -> next; Temp -> next =

15、 temp;/插入行數(shù)ptrr = ptrr -> next;if( szFilei = ' ' | szFilei = 'n' )count = -1; while( szFilei = ' ' ) + i; /設(shè)置列數(shù) + row;/行的單詞個數(shù)加 + count;/單詞之間空格-1 row = row - count; if( szFilei = 'n' ) + col; /列遇到換行累加 + i;row = 0;/單詞的行個數(shù)清零 else+ i;cout << endl;/*/Node* TLink:g

16、ethead()return head;/*/void showwindow()Node* curptr = link.gethead();while( curptr != NULL )int word_num = 0;for( int k = 0; curptr -> wordsk != '0' + k )cout << curptr -> wordsk;cout << endl;if( curptr -> ptr = NULL )cout << "沒有該詞,或輸入不正確!" << endl

17、;elsewhile( curptr -> ptr != NULL )cout << "("cout << curptr -> ptr -> col ;cout << ","cout << curptr -> ptr -> row ;cout << ")"cout << ' 'curptr -> ptr = curptr -> ptr -> next;word_num +;cout <<

18、endl;cout << "該單詞共出現(xiàn)" << word_num << "次!" << endl; curptr = curptr -> next;/*/void show_text()ifstream fin;fin.open("D:english.txt");if (fin.fail()cout<<"Input file opening failed.n"exit(1);char next;fin.get(next);while (! fin.

19、eof() szFilei = next;+ i; fin.get(next);szFilei = '0'for( int k = 0; k < i; + k )cout << szFilek;cout << "*Total number :" << i << endl;cout << "*" << endl;/*/void input()char Item40; /暫存數(shù)組char in; /接受輸入字符char ans; /判斷是否重新開始doif( lin

20、k.gethead() != NULL )link.TLink();cout << "請輸入要統(tǒng)計(jì)的單詞,單詞之間用逗號隔開(輸入鍵結(jié)束,本程序忽略空格):" << endl;cin >> in;int flag = 1;while( true )if( in = '' )break;int m = 0;while( in != ',' ) Itemm = in;+ m;cin >> in;if( in = '' ) flag = 0; break;Itemm = '0&

21、#39;link.Insert( Item );if( flag = 0 ) break;cin >> in;if( link.gethead() = NULL )cout << "沒有插入任何單詞!" << endl;else link.calcute( szFile, i ); showwindow();cout << "是否繼續(xù)?(Y/y or N/n):"cin >> ans;while( ( ans != 'n' ) && ( ans != 'N

22、' ) );運(yùn)行結(jié)果 結(jié)果分析輸入要查找的單詞之后,單詞插入鏈表,停止輸入后,程序開始在文本字符中查找鏈表中的單詞。程序從文本數(shù)組順次掃描,并在掃描到空格時(shí)記錄一個單詞的掃描結(jié)束,并記錄單詞所含字母個數(shù),然后查找鏈表,如有和該單詞字母個數(shù)相同的記錄則進(jìn)行比較,否則繼續(xù)查找下一個直到鏈表尾。此后程序繼續(xù)掃描文本字符數(shù)組的下一個單詞并和鏈表中單詞進(jìn)行相同的比較過程,直到字符數(shù)組掃描完畢。要想在輸出結(jié)果后繼續(xù),則選擇Y或y繼續(xù),否則輸入N或n退出。最后輸出結(jié)果。本次運(yùn)行中第一次操作輸入is,are,這是正確的輸入,則輸出正確的結(jié)果;第二次選擇y繼續(xù),輸入the,這也是正確的輸入,則輸出正確結(jié)

23、果;第三次選擇y繼續(xù),輸入microsoft,22%,microsoft,一、三個輸入正確,但是同樣的輸入,則按照程序設(shè)計(jì),只輸出一次結(jié)果,第二次輸入錯誤,則程序報(bào)告輸入有誤。選擇n,程序按預(yù)期結(jié)束。收獲與體會通過本次的課程設(shè)計(jì)實(shí)驗(yàn),是我對數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)編程有了更好的理解,進(jìn)一步學(xué)習(xí)了把學(xué)到的知識運(yùn)用到實(shí)際的一些問題解決中去。鞏固了和提高了編程的能力,積累了一些編程技巧和經(jīng)驗(yàn)。程序設(shè)計(jì)是選擇一種好的結(jié)構(gòu),然后設(shè)計(jì)一個好的算法。數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的好壞會直接影響到程序算法設(shè)計(jì)的可實(shí)現(xiàn)性及難易程度。在課程設(shè)計(jì)的過程中使我更深刻認(rèn)識到結(jié)構(gòu)設(shè)計(jì)的重要性,有時(shí)在結(jié)構(gòu)中加一個記錄一個數(shù)字的變量也許會使程序代碼更

24、明朗和易于設(shè)計(jì)。程序設(shè)計(jì)是一項(xiàng)看似枯燥卻會有無窮樂趣的事情,我們在做編程設(shè)計(jì)時(shí),需要極其的認(rèn)真、求實(shí)、耐心和信心。一點(diǎn)的錯誤都不會使我們得到預(yù)期的結(jié)果,所以,我要繼續(xù)認(rèn)真學(xué)習(xí)和練習(xí),多動手動腦,循序漸進(jìn)的提高自己的程序設(shè)計(jì)能力。附:讀入的文本:01 Microsoft Windows is a complex operating system. It offers02 so many featuresand does so much that it's impossible for 03 any one person to fully understandthe entire syst

25、em. This 04 complexity also makes it difficult for someone to decide05 where to start concentrating the learning effort. Well, I 06 always like to start at the lowest level by gaining a solid 07 understanding of the system's basic building blocks. Once 08 you understand the basics, it's easy to incrementally 09 add any higher-level aspects of the system to your knowledge. 10 So this book focuses on Windows' basic building blocks and11 the fundamental concepts that you must know when architecting 12 and implementing software targeting the Windows operat

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論