冯越

导航

 

前言:

开发工具:Visual Studio 2013

开发语言:C++

源代码管理工具:Github

Github源代码网址:https://github.com/superyy/YY1/blob/master/%E8%AF%8D%E9%A2%91%E7%BB%9F%E8%AE%A1main.cpp

预计各功能所花时间:5 hours

实际各功能所花时间:7 hours

性能提高所花时间:3 hours

 

要求 :实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率。 附加要求:读入一段文本文件,统计该文本文件中单词的频率。

思路:从文档里把一句语句读入第一次循环检查首字母是否符合标准并且把第一个字母输入,第二重循环把长度小于4的单词过滤;然后再主函数里把所有单词比较有相同的计数;本来打算直接在函数里把所有单词直接比较然后输出,但是考虑到时间以及代码估计四重循环,就没有尝试。

 

#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;

void func(char result[][100]);
int main()
{
char result[100][100] = { 0 };
func(result);       //调用func()这个时候result这个而且数组中都是单词了,且单词都是小写
char temp[100][100] = { 0 };       //这个二维数组是用来存放比较完的没有重复的单词
int count[100] = { 0 };         
strcpy(temp[0], result[0]);     //先将第一个单词放入temp
int num = 1;
for (int j = 0; *result[j]; j++) {  //循环遍历所有的单词
for (int i = 0; *temp[i]; i++) {    //循环存放的数组
if (!strcmp(temp[i], result[j])) {  //存放数组中若是有这个单词就count++
count[i]++;
}
else if(i == num - 1){  //难点:没有的话,先判断这个时候i是不是已经在存放数组的最后一个元素了,不是话还要继续上面的循环直至遍历完存放的数组
strcpy(temp[num++], result[j]); //遍历完存放数组也没有该单词,就把这个单词放入存放数组中
}
}
}
for (int i = 0; i < num - 1; i++) {     //输出
cout << temp[i] << ":" << '\t' << count[i] << endl;
}
return 0;
}



void func(char result[][100]) {
char buff[100];
ifstream in("D:\\source.txt");
int j = 0;
char ch;
if (in) {
in >> noskipws; //不跳过空格
while (in >> ch) {  //(¥)
int i = 0;
if (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') { //满足是字母的话就可以继续下面的程序(数字在接下来判断)
buff[i++] = ch;
}
else {      //否则不是单词跳转(¥)继续判断剩下的字符
continue;
}
while (in >> ch && ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9') {    //通过while循环构造一个单词
buff[i++] = ch;
}
buff[i] = '\0'; //单词是结束以\0结束
if (strlen(buff) >= 4) {    //判断单词长度是不是大于等于4
strcpy(result[j++], strlwr(buff));      //是的话就将其保存到二维数组中去,并且在放进去的同时保证字母都是小写,为接下来的比较铺垫
}
}

in.close();
}
}

 测试结果:

个人总结:

通过这次的词频统计个人项目练习,对C++语言的使用更加的得心应手,刷新了对二维数组的认识。

 

posted on 2016-03-15 22:14  冯越  阅读(314)  评论(4编辑  收藏  举报