在乙個文字檔案中的單詞統計頻率並列印前十個

2021-06-26 10:02:57 字數 2080 閱讀 5107

設計分析:

遇到這樣乙個程式設計,首先解決的是檔案讀入的問題(我選擇讀入txt);

第二,英文文章中由英文本母,標點符號,其他字元組成,要將他們分離,這就用到了詞法分析,將每個單詞分離出來並且分析;

第三,統計單詞個數(不一樣的單詞各有幾個),排序,輸出頻率最高的10個。

要解決的是檔案讀取後儲存問題,就是放在結構體中,單詞的種類和數量統計起來。可以用結構體陣列,可以用鍊錶。

統計後排序的問題,如果將整個結構體或鍊錶排序,那將是一件好大的工程,但是題目只是將頻率最高的10個詞列印出來,就像每天人們聽歌,排行榜上的第一頁是使用者聽得最多的歌曲。於是,我只是初始化了乙個結構體陣列,長度為10,將10個排序,然後用最後乙個,也就是這10個中頻率最小的與其他的比較,如果有頻率比他高的,則插入到這個長度為10 的結構體陣列中。插入之後還是順序的。這樣就節省了很多的工作量。

資料結構:

儲存單詞的資料結構:

①結構體

typedef struct

sq;②鍊錶

struct word

;找出頻率最高的十個單詞

for(i=10;i=0)

for(j=9;j>a+1;j--)

if(a<0)

frequency_max[0]=word[i];

else

frequency_max[j]=word[i];}}

**:

#define _crt_secure_no_deprecate

#define _crt_secure_no_warnings

#include

#include

#include

using namespace std;

#define m 20000

//文章單詞個數

typedef struct

sq;file *fp;

char ch;

//fp=fopen("d:\pro.txt","r");

if ((fp = fopen(infile, "r")) == null)

s = (double)clock();

while (!feof(fp))

if ((ch >= 'a'&&ch <= 'z') || (ch >= 'a'&&ch <= 'z'))              //發現乙個單詞

t_word.danci[k++] = '\0';

//乙個單詞結束

j = n;

for (i = 0; iif (n == 0 || i == j)

s = (double)clock();

//輸出頻率最高的十個單詞

sq frequency_max[10];

sq temp;

for (i = 0; i<10; i++)

//前十個排序

for (j = 0; j<10; j++)

for (i = 0; i<10 - j; i++)

if (frequency_max[i].count= 0)

執行截圖:

總結:

我發現時間主要花費在檔案的io上,由上面截圖可以看出鍊錶的效率更低,排序的時間非常少,幾乎可以忽略不計。io由於是與硬體之間的操作,所以花費時間比較多,鍊錶由於需要位址操作,效率也沒有陣列高。

在乙個文字檔案中的單詞統計頻率並列印前十個

單詞結構體 struct word 這是統計單詞部分,用的是fgetc函式對文字進行讀取,因此沒有手動讀取過程,直接將txt放入指定目錄下就可以讀取,判斷是否讀完用了feof函式 void readfile struct word head 判斷是否是單詞 while feof fp ch fget...

統計乙個文字檔案中單詞的個數(超簡單思路)

1.先將文字檔案中的內容追加到bufferstring型別的變數中,然後將bufferstring轉換為string型別,因為string類有乙個方法,可以將乙個串中某個字元,全部用指定字元 比如空格 來代替 string.replace a b 然後遇到空格就計數。轉換後計算是很簡單的,但是轉換非...

關於乙個文字檔案中的單詞統計和排序問題

題目是 寫乙個程式,分析乙個文字檔案中各個單詞出現的頻率,並且把頻率最高的10個詞列印出來。看到題目後,我首先在紙上把需要實現的功能和需要涉及到的知識寫出來,需要實現的功能是讀取文字檔案,記錄各個單詞出現的次數,利用排序將前十個單詞輸出。涉及的知識是文字檔案的開啟以及讀寫操作,排序演算法等。我一開始...