作业3:个人项目-词频统计
要求
(1). 实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率。 附加要求:读入一段文本文件,统计该文本文件中单词的频率。
(2). 性能分析:
- 对C++代码运行VS的性能分析工具,找出性能问题并进行优化。
- 对Java程序运行性能分析工具NetBeans IDE 6.0,找出性能问题并进行优化。
功能模块分析
1.结构体
①初始化出现次数;
②指针
2.大写转小写(预估用时10min,实际用时≤10min)
3.判断是否为单词(预估用时30min,实际用时30min)
①字符数≥4;
②字母开头;
③不存在非字母数字
4.重复出现计数(预估用时30min,实际用时45min)
5.分割字符串(预估用时30min,实际用时≥50min)
源代码
#include<iostream> #include<fstream> #include<cstring> using namespace std; struct Str{ //定义结构体 int count; char *p; }; Str test[100]; void lwr(char x[]) //大写转小写 { int k = 0; while (x[k] != '\0') { if (x[k] >= 'A'&&x[k] <= 'Z') x[k] = x[k] + 32; k++; } } int identify(char a[]) //判断是否符合单词的定义 { int m=(strlen(a)>=4)?1:0; int n=(a[0]>='a'&&a[0]<='z')?1:0; if(!m||!n) return 0; else while(a) { for(int i=1;;i++) { if(!(a[i]>='a'&&a[i]<='z')||!(a[i]>='0'&&a[i]<='9')) return 0; else return 1; } } } int counting(char b[],int num) //对出现次数计数 { for(int j=0;j<num;j++) {
if(!strcmp(b,test[j].p)) test[j].count++; else return 0;
} } int main() { char c[200]; ifstream fin("D:/data.txt"); //从文档中获取字符串 for(int f=0;;f++) fin>>c[f]; fin.close(); cin.get(); lwr(c); const char *delim = ",”“.''!?"; //分割字符串 char *q; int n=0; q = strtok(c, delim); while (q) { if (identify(q)) { strcpy(test[n].p,q); n++; } cout << test[n].p << ":" << test[n].count << '\n'; q=strtok(NULL,delim); } return 0; }
输入
Word is case insensitive, i.e. “file”, “FILE” and “File” are considered the same word.
输出
统计结果正确
Github:https://github.com/yangyangji/count/blob/master/count.cpp
小结
面对一个程序任务,先不急于编写代码,分析该程序需要几个模块,每个模块的功能,有条理后进行编程,思路清晰。
此次编程最大的收获是学习了分割字符串的strtok函数。一开始还因为不知道怎么把字符串分割成几个单词而苦恼,后来在网上查阅了各种资料,看来实例后掌握strtok函数的用法。
源程序优点:
分几个模块,定义函数实现功能,条理清晰。
缺点:
有些部分还有调整简化的空间,对分割字符串掌握还不够熟练。
总的来说,路还很长,day day up~