設計分析:
遇到這樣乙個程式設計,首先解決的是檔案讀入的問題(我選擇讀入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個詞列印出來。看到題目後,我首先在紙上把需要實現的功能和需要涉及到的知識寫出來,需要實現的功能是讀取文字檔案,記錄各個單詞出現的次數,利用排序將前十個單詞輸出。涉及的知識是文字檔案的開啟以及讀寫操作,排序演算法等。我一開始...