2. 要求
(1). 实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率。 附加要求:读入一段文本文件,统计该文本文件中单词的频率。
(2). 性能分析:
- 对C++代码运行VS的性能分析工具,找出性能问题并进行优化。
- 对Java程序运行性能分析工具 NetBeans IDE 6.0,找出性能问题并进行优化。
4. 作业提示
(1). 定义
- 字母: A-Z, a-z.
- 字母数字: A-Z, a-z, 0-9.
- 分隔符: 非字母数字
- 单词:
- 包含有4个或4个以上的字母
- 单词由分隔符分开
- 如果一个字符串包含_非_字母数字,则不是单词
- 单词大小写不敏感,例如 “file”、“FILE”和“File”可以看作同一个单词
- 单词必须是字母开头,“file123”是单词,“123file”不是单词
(2). 示例
输入
Word is case insensitive, i.e. “file”, “FILE” and “File” are considered the same word.
输出
word: 2
case: 1
insensitive: 1
file: 3
considered: 1
same: 1
预计至少一个下午做完,做起来才发现真的是无从下手……实际上做了八个小时左右。分析要在程序中逐步加入大写改小写、删除非字幕字符、确定字符长度大于等于4、单词频率统计四个程序块。
#include <iostream> #include <vector> #include <algorithm> #include <string> #include <fstream> using namespace std; struct WORD { string word; int num; }; vector<WORD> a; //创建vector对象,a[] int&value(const string&s) { for(int i=0;i<a.size();i++) if(s==a[i].word) return a[i].num; WORD p; p.word=s; p.num=0; a.push_back(p); //在数组a最后添加数据 return a[a.size()-1].num; } int main() { string str; cout << "输入字符串:\n"; char c; while(c=cin.get()) { if(c>='a' && c<='z' || c>='A' && c<='Z' || c==' ' || c=='\n') str+=c; //去除符号 if(c=='\n') break; } //输出去掉非英文字符的字符串 for(int j=0;str[j]!='\0';j++) { if(str[j]>='A'&&str[j]<='Z') { str[j]+= 32; //大写字母Ascll码+32转换为小写 } } //输出转换为小写的字符串 string buf; ofstream fout("D:\123.txt"); //把转换好的字符串写入文件 fout<<str; fout.close (); ifstream fin("D:\123.txt"); //读出写入的字符串并排序 while(fin>>buf) value(buf)++; vector<WORD>::const_iterator p; //迭代器访问元素 for(p=a.begin();p!=a.end();++p) cout<<p->word<<":"<<p->num<<'\n'; return 0; }
本来想直接读入字符串文件在进行大小写改写和删除字符的程序,但是一直不能运行成功,就改成了手动输入字符串。
然后把改好大小写和删除好字符的字符串用Ofstream写入了原来的文件后再进行频率统计。虽然麻烦了点,但是也算是运行出来了……
做完这个之后发现成绩出来了……最后剩下的框定单词长度的一步就没做急急忙忙准备交作业……
运行结果:
这两次作业让我知道了如何用输入输出的方式打开文件。巩固了之前C++学到的大小写转换,学习了如何去掉字符以及简单的词频统计程序。作业中没有做出来的单词长度回头还需要进一步研究。
新学到了vector的用法:
C++ vector用法 - 金河 - 博客园
http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html