单词计数

来源:互联网 发布:淘宝神笔怎么保存模板 编辑:程序博客网 时间:2024/04/28 16:04

 单词计数C++版

   这次用C++写单词计数,我收获很多。期间也遇到些困难,最后都解决了那感觉真是太好了。这次的实验虽然代码量不高,但却给我以后的编程之路打下了厚厚的基石,此时此刻,我想给大家分享下我的心得:

      要敲出好的代码,首先要学会分析代码。这个版本的单词计数原理是这样的,定义一个file类型的fp存放要读取的txt文件,然后遍历文件字符,遇到空格或回车就判定一个单词的结束(目前只支持中文),然后定义数组用来统计各种单词出现的次数,每统计一次单词就遍历前面的单词,出现过的就+1,新出现的就开辟新的数组单元。最后用冒泡排序法把排名前十的单词打印出来即可。

        知道了原理后,我加测了时间函数,大约11ms左右,后来我也做了性能分析,这里附图一张,程序大部分的时间都是主函数(因为没写别的函数),从树状结构中也了解到了比较消耗内存的sputn和sputc,让我的观察能力也有了一定的提升。在以后的时间里,我也得更加努力地学习,多写多练多读代码,还要学会分析,从代码中吸取他人的思想,这也是一种成长。

<span style="font-size:14px;">#include "stdafx.h"#include<iostream>#include<iomanip>#include<time.h>using namespace std;#define N 10000//定义单词上限typedef struct{char danci[20];//储存单词int count;//记录单词个数,后面出现几次}wd;void main(){int time1 = clock();wd word[N];wd t_word;int K, n = 0, i, j;FILE *fp;char ch;fp = fopen("E://everything//License.txt", "r");//读取文件cout << "当前txt文件下频率最高的10个单词是" << endl;while (!feof(fp))//feof()检测是否达到文件尾部{ch = getc(fp);//获取当前字符if (ch == ' ' || ch == 10){//ASCLL码中10为换行符,此条件为遇到空格或火车则跳过continue;}if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z'))              //发现一个单词{K = 0;t_word.count = 1;while ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || (ch == '\'')){if (ch >= 'A'&&ch <= 'Z')ch += 32;//转换成小写t_word.danci[K++] = ch;//把当前字母存入数组ch = getc(fp);}t_word.danci[K++] = '\0';//结束标志\0//一个单词结束j = n;for (i = 0; i<j; i++) //与前面的单词比较{if (strcmp(t_word.danci, word[i].danci) == 0)//如果有单词相同{word[i].count++;//则此类单词加1break;}}if (n == 0 || i == j)//前面如果没有相同的单词{word[n] = t_word;//则为此类单词开辟新单元n++;}}}//输出频率最高的十个单词wd frequency_max[11];wd temp;for (i = 0; i<10; i++){frequency_max[i] = word[i];//初始化频率最高的十个单词为前十个单词}//前十个排序//冒泡排序法for (j = 0; j<10; j++)for (i = 0; i<10 - j; i++)if (frequency_max[i].count<frequency_max[i + 1].count){temp = frequency_max[i];frequency_max[i] = frequency_max[i + 1];frequency_max[i + 1] = temp;}for (i = 10; i<n; i++){if (frequency_max[9].count<word[i].count){int a = 8;while (frequency_max[a].count<word[i].count&&a >= 0){a--;}for (j = 9; j>a + 1; j--){frequency_max[j] = frequency_max[j - 1];}if (a<0)frequency_max[0] = word[i];elsefrequency_max[j] = word[i];}}for (i = 0; i<10; i++){cout << setiosflags(ios::left) << setw(10) << frequency_max[i].danci << frequency_max[i].count << endl;//setw()设置输出域宽,默认齐}int time2 = clock();int time3 = time2 - time1;cout << "程序总共耗时" << time3 << "毫秒" << endl;}</span>

性能分析:

  结果图:


0 0
原创粉丝点击