作业3词频统计
(1). 實現一個控制臺程序,給定一段英文字符串,統計其中各個英文單詞(4字符以上含4字符)的出現頻率。
答:
| ? | 從文件讀取 | 遍歷字符串 | 大寫轉小寫 | 將句子分隔成一個個單詞 | 判斷是否為單詞 | 計算單詞出現的頻率 |
| 預估時間 | 10minutes | 10minutes | 20minutes | 40minutes | 1hours | 2hours |
| 實際時間 | 5minutes | 5minutes | 15minutes | 1hours | 2hours | 2hours |
?? ? ? ? 在寫這次作業之前我認為只是一個簡單統計題,但是看了一眼老師的要求之后,就開始有點瘋了。一個要求一個要求的提出來,重疊在一起,我就發現無從下手了。又是大小寫不區分,又是單詞的要求長度不小于4,什么什么的。我發現就這么一個簡單的編程題能被老師改成這樣,老師真是煞費苦心啊。既然要求這么多,我就把每個要求一個一個拆開分析,然后再試著將他們組裝起來。
#include<iostream> #include<fstream> #include<cstring> using namespace std;struct Num{int num;char *s; };Num word[999];int Change(char str[999])//大寫轉小寫 {int a = 0;while (str[a] != '\0')//當str字符串未結束時將大寫字母轉小寫{if (str[a] >= 'A'&&str[a] <= 'Z')str[a] = str[a] + 32;//因為大寫字母與小寫字母的ascll碼值相差32,大寫轉小寫要加上32a++;}return 0; } int Judge(char w[])//判斷是否符合題意的單詞 {for (int e = 1; w[e] != '\0';){if(strlen(w)<4)//判斷單詞字長是否超過以及等于4return -1;if (w[e] >= 'a' && w[e] <= 'z')//判斷單詞的首字符是否是字母return -1;if (!((w[e] >= 'a' && w[e] <= 'z') || (w[e] >= '0' && w[e] <= '9')))//判斷單詞中是否有非字母數字return -1;elsee++;}return 0; } int Fre(char f[],int total ) //統計單詞出現過的頻率 {if (total>0)for (int i = 0; i <total; i++){if (!strcmp(f, word[i].s)) {word[i].num++; return -1;}}return 0; }int main() { char sentence[999];ifstream file("d://test.txt"); //讀取if (!file){cout << "Unable to open ";exit(1); }while (!file.eof()){file.getline(sentence,999);}file.close();const char *delim = ",“”.' '‘’!?"; //delim是用來定義分隔符的內容char *p= strtok(sentence, delim);//strtok函數根據分隔符分隔字符串int n=0;int c=0;while (p){Change(p);if (Judge(p) != -1){if (Fre(p, n)!=-1){word[n].s = p;n++;}}p = strtok(NULL, delim);}while (word[c].s) //輸出統計結果{cout << word[c].s<< ":" << word[c].num << '\n';c++;}return 0; }我按照我模塊的順序即 從文件中讀取——>大寫字母轉為小寫字母(為了不區分大小寫,函數為Change)——>把句子按照分隔符分割開來(運用strtok函數)——>判斷是否符合題意的單詞(函數為Judge)——>計算單詞出現的頻率(函數Fre)。
運行出的結果:
?
?
?
總結:在這次編寫過程中,我發現這個果然一點都不簡單。說起來一套一套的,但是真正實施起來還是很有難度的。除了一個讀取文件原先寫過之外其他的感覺都是第一次接觸。第一個大寫轉小寫在匯編里寫的很順溜,但是在C++中是第一次寫,課本中并沒有提及,所以只能借助百度來解決,百度還真有,所以第二個模塊解決了。分隔句子又是一個大難題,于是我再次借助百度大神來,但是百度上的答案都不一樣,所以我挑了一個我最能理解方式利用strtok(char s[],const char *delim)函數來寫。利用delim定義分隔符。第三個模塊完成。判斷單詞的條件,第一判斷字長不小于4,第二判斷首字母是否為字母,第三判斷字母中是否有非字母數字。這個是借助大神幫忙,才能夠寫出來,這個真的很難啊。花了我不少心血啊。第四個模塊完成。然后最重點的來了,計算詞頻。用指針訪問單詞在與下一個單詞比較,相同加一,知道訪問到字符串末尾在結束。
將他們組合起來更是花了好長時間。
希望以后老師在布置作業的時候,能夠將每一次的交作業時間用紅色標注一下,不要模棱兩可的給個時間!!
轉載于:https://www.cnblogs.com/wumin2/p/5284888.html
總結
- 上一篇: [改善Java代码] 推荐使用序列化实现
- 下一篇: oracle 实现ID自增