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