词频统计
要求:
实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率。输出要求:按照频率降序输出单词及频率,相同频率则按字母顺序输出。
源程序:
#include <iostream> #include <string> using namespace std; struct Word { string Str; int Count; }; void CalcCount(Word *words,string &newWord,int size) //统计词频 { int i=0; for(;i<size;i++) { if(words[i].Str==newWord) { words[i].Count++; return; } else if(words[i].Str=="") break; } words[i].Str=newWord; words[i].Count =1; } int main() { Word *words; string content; cout<<"输入一段英文:"; getline(cin, content); //从输入流读入指定字符串 int wCount = 1; for(unsigned int i=0; i<content.length();i++) //计算单词总数 { if(content[i]==' ') wCount++; } words=new Word[wCount]; string::size_type offset=content.find(' ');//单词都是以空格隔开 while(offset!=string::npos) { string wStr=content.substr(0,offset); //string.substr()从0开始返回长度为offset的字符串 if (wStr.length()<4) //除去长度小于4的单词 { wCount--; content.erase(0,offset+1); offset=content.find(' '); continue; } content.erase(0,offset+1); //string.erase()删除从0开始的长度为offset+1的字符串 CalcCount(words,wStr,wCount); offset=content.find(' '); } if (content.length()>= 4) { CalcCount(words, content, wCount); //计算最后一个单词 } else wCount--; for (int j=0; j<wCount; j++) { if (words[j].Str=="") { wCount--; } } for(i=0;i<wCount-1;i++) { cout << words[i].Str << "频率:" << words[i].Count << "次" << endl; } delete [] words; return 0; }
预估时间:
词频统计:3小时 实际:5小时
查找字符:2小时 实际:2小时
实验结果:
程序的思路:
先设计一个统计词频的函数,而后读入输入的字符串,读入长度大于4的单词,以空格分离,删除长度小于4的单词。
遇到的问题与总结:
没能将大写字母改成小写字母,输入的字符串中也不能存在逗号。这次程序很难,跟室友讨论了很久,还是没能写出符合要求的程序。最后的结果也还是有错误。这次的作业我还是不会,希望老师下次出题目可以简单一点。
附上github链接:https://github.com/skyhiahiahia/homework3