c++英文单词频度统计程序
英文单词频度统计程序(c++版)
写一个程序,分析一个文本文件(英文文章)中各个次出现的频率,并且把频率最高的十个词打印出来。
分析过程:
(1) 简单设想大致分为两大步骤:
1.经过文本文件的读操作将所有单词读出来;
2.统计各个单词的出现频率并将频率最高的单词输出。
(2)进一步设想,发现如果这样做工作量是十分大的:先由读文件操作将所有单词读出,并且保存到一个字符串数组中;然后文件读完后,利用循环以及字符串的比较
来统计各个单词 出现的频率。最后发现在最后一步中,如果英语文章的上下文中存在相同的词,便会在输出时有重复出现的问题。
(3)再做设想:在读文件时便同时统计单词的个数,同时将单词和对应的个数保存到相应的正整数数组和字符串数组中;统计完后再将单词按照出现的频率从大到小排
列 ,最后输出十个频度最高的。
最终我决定按照第三种想法来进行编程。
程序代码
#include <iostream>
#include <fstream>
#include <string.h>
#include <malloc.h> using namespace std;
ifstream fp("source.txt",ios::in);....//定义文件,将要读入的文件名为“source.txt”
char cbuffer;
void main()
{
char word[];.................... //定义字符数组用来记录在读文件时出现的单词
char *w[];.....................//定义字符型指针变量数组用来保存单词
char *r[];........................//在交换单词位置时起作用
int number[];...................//定义整型数组统计单词的个数
int i=,j=,k,max=;
if (!fp)..................................//如果打开文件失败则进行提示
{
cout<<"文件打开错误!!"<<endl;
fp.get(cbuffer);
}
else...................................//打开成功进行如下操作
{
while (!fp.eof())................//只要文件没有读完便进行循环
{
while ( (isalpha(cbuffer))||(isdigit(cbuffer)))....//运用isaipha和isdigit函数对cbuffer进行辨别如果为字母或数字则进行循环
{
word[i++]=cbuffer;
fp.get(cbuffer);
} word[i]='\0';.............................................//为单词制造一个结尾
w[j]=(char *)malloc(sizeof(word));..............//为w【】开辟一个word大小的空间
strcpy(w[j],word);...............................//将单词复制到字符指针数组中
number[j]=;...........................................//为当前单词的频率做初始化,记为1
for(k=,i=;i<j;i++) ..........................//将当前单词与之前统计过的单词作比较,统计频率
if(strcmp(w[i],w[j])==)
{
number[i]=number[i]+;.......................//如果存在相同的单词,则前面的单词加1
j=j-;....................................................//因为与前面的单词相同,通过W[J]将当前单词覆盖
}
j++;
i=;......................................................//使Word【】重新统计
fp.get(cbuffer);
}
cout<<"结果如下:"<<endl;
for(k=;k<=j-;k++)...............................//利用冒泡排序
for(i=k+;i<=j;i++)
{
if(number[k]<number[i])
{
int temp=number[k];..................................................................//交换顺序
number[k]=number[i];
number[i]=temp;
r[]=(char *)malloc(sizeof(w[k]));................................................//将对应的单词也进行交换
r[]=w[k];
w[k]=(char *)malloc(sizeof(w[i]));
w[k]=w[i];
w[i]=(char *)malloc(sizeof(r[]));
w[i]=r[];
} } for(k=;k<=;k++)..............................................................................//将频率最高的十个单词输出
cout<<k<<":"<<w[k]<<" "<<number[k]<<endl; }
fp.close();...........................................................................................//读完文件后关闭
cout<<endl;
cout<<"完成\n";
}
测试的txt文件:
Different people have different hobbies. Some like painting or drawing while others love playing basketball. I have many hobbies because I like to do many things. Let me share a few of my hobbies with you. To begin with, I really go in for sports, both indoors and outdoors. I like collecting cards and playing card games with my friends. But my favorite games are video games. I could play them all day long. I am for being outside in the fresh air and sunshine, too. I like riding very much, but swimming is my favorite sport. In addition, I like to draw pictures and read comics. Listening to music and singing songs are things I enjoy too. Now I'm learning how to play an instrument--the guitar. Finally, I enjoy learning English because I like speaking with foreigners and I like watching Disney cartoons. As you can see, my hobbies keep me busy and excited. I'm always looking for new things to do!
结果如下:
1 :I 14
2 :like 7
3 :and 7
4 :my 5
5 :to 5
6 :with 4
7 :hobbies 4
8 :for 3
9 :things 3
10 :games 3
完成
Press any key to continue
编程心得:
虽然说此程序总体来说十分简单,但是编起来还是有点难,并且其中也遇到了一些基础的编程问题,总结起来还是编程的经验太少了,在今后的学习中还应该多多练习。不过在这次编程中我也有着自己的收获,对于字符串数组的交换有了一定的了解,在交换前要定义一个字符串指针变量同时也要开辟相应的空间后才能进行交换,例如:
r[0]=(char *)malloc(sizeof(w[k]));
r[0]=w[k];
w[k]=(char *)malloc(sizeof(w[i]));
w[k]=w[i];
w[i]=(char *)malloc(sizeof(r[0]));
w[i]=r[0];
以上便完成了字符串的交换工作。在编程过程中总会有一些简单的错误,具体内容请看缺陷记录日志。
缺陷记录日志
| 程序错误 | 错误类型 | 更改 |
| 没有word[i]='\0'语句,致使结果中出现乱码 | 语义 | 加入 |
| 直接使用strcpy(w[j],word) | 语法 | 在之前要有w[j]=(char *)malloc(sizeof(word)); |
| 冒泡法排序代码错误 | 语法 | for(k=1;k<=j-1;k++) for(i=k+1;i<=j;i++) |
老师说一个合格的软件设计者要有明确的时间概念,虽然这是个小程序但也有这一个时间记录日志,如下:
时间记录日志
| 预计时间 | 操作 | 时间 | 操作 |
| 2小时 | 思考编码过程 | 2014.2.21-2014.2.23休息期间 | 思考整个编程的过程 |
| 4小时 | 编程 | 2014.2.24 12:30-2:40 | 查找程序文件操作 |
| 2014.2.24 2:50-5:30 | 编写程序主要代码 | ||
| 2014.2.24 6:40-9:30 | 编写并解决字符串数组的交换代码 | ||
| 2014.2.27 下午 | 删减多余代码,做最后调试 | ||
| 3小时 | 总结 | 2014.2.27 晚上 | 编写程序总结发博客 |
c++英文单词频度统计程序的更多相关文章
- C# 统计程序执行时间
随便写写,小马哥勿怪 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷. 话说马云年轻的时候也是屌丝一枚,有图为证 现 ...
- CodeIgniter框架开发的统计程序源代码开放
文章来源: PHP开发学习门户 自己初学php时,用CodeIgniter框架开发的后台统计程序源代码 程序部分页面如图: 具体配置及下载源代码:http://bbs.phpthinking.com/ ...
- Mapreduce的序列化和流量统计程序开发
一.Hadoop数据序列化的数据类型 Java数据类型 => Hadoop数据类型 int IntWritable float FloatWritable long LongWritable d ...
- “人向猿进阶”之软件工程第三课----WORDCOUNT.EXE统计程序
---恢复内容开始--- WC项目要求 这个项目要求写一个命令行程序,模仿已有的wc.exe的功能,并加以扩充,给出某程序设计源语言文件的字符数.单词数和行数.给实现一个统计程序,它能正确统计程序文件 ...
- wc 统计程序
WC项目要求 这个项目要求写一个命令行程序,模仿已有的wc.exe的功能,并加以扩充,给出某程序设计源语言文件的字符数.单词数和行数.给实现一个统计程序,它能正确统计程序文件的字符数.单词数.行数,以 ...
- YTU 2626: B 统计程序设计基础课程学生的平均成绩
2626: B 统计程序设计基础课程学生的平均成绩 时间限制: 1 Sec 内存限制: 128 MB 提交: 427 解决: 143 题目描述 程序设计基础课程的学生成绩出来了,老师需要统计出学生 ...
- 个人项目 源程序特征统计程序(C++)
零.GitHub地址 https://github.com/King-Authur/Word-count 一.项目的相关要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这 ...
- 【转载】可能是世界上最牛逼的网站统计程序——Matomo
大家做网站的时候一般都会使用网站统计程序.通常,国内网站会使用百度统计.CNZZ等,而国外网站则会使用Google Analytics等统计.国内的统计程序普遍功能不太丰富,且响应速度一般.Googl ...
- 在 Linux 如何优雅的统计程序运行时间?恕我直言,你运行的可能是假 time
最近在使用 time 命令时,无意间发现了一些隐藏的小秘密和强大功能,今天分享给大家. time 在 Linux 下是比较常用的命令,可以帮助我们方便的计算程序的运行时间,对比采用不同方案时程序的运行 ...
随机推荐
- Excel应该这么玩——2、命名列:消除地址引用
命名列:通过名称引用列,让公式更容易理解. 下面继续举上次的栗子. 1.历史遗留问题 之前虽然把数字编成了命名单元格,但其中还是有单元格地址B2.C2之类,要理解公式需要找到对应的列标题. 特别是像下 ...
- SQL复制一个表的数据到另一个表
最近做一个项目,由于客户数据量大,为了不将数据彻底删除,于是将数据移动到历史表,原始表的数据删除.由于技术有限,想不到好的方法,于是写个存储过程 执行,为了防止执行过程中出现异常,执行不完整.用到hI ...
- word转html方法
在网上看了一篇关于word转html的文章,感觉不错,和大家分享一下. /// <summary> /// word转成html /// </summary> /// < ...
- delphi TIdHTTP Post乱码问题
这里主要说的是中文乱码的问题 1. 发过去的是乱码如下处理, 服务器采用的是UFT-8编码的情况下 uses HTTPApp; sPost := HTTPEncode(UTF8Encode ...
- Sprint第二个冲刺(第八天)
一.Sprint介绍 任务进度: 二.Sprint周期 看板: 燃尽图:
- WebForm水印照片
水印照片需要的元素 绘制:1.画布2.画笔 样式 粗细 颜色3.画什么东西4.用什么字体画 大小5.位置 展示页面 <%@ Page Language="C#" AutoEv ...
- QT笔记之VS开发程序遇到的问题
转载:http://www.cnblogs.com/li-peng/p/3644812.html 转载:http://www.cnblogs.com/csuftzzk/p/VS_Qt_Experien ...
- HTML标签的应用(新手)
雪碧图(精灵图): sprite compass-合并(尽量宽高相同) 兼容性: 1.resct重置技术:normalize技术 2.加前缀:-webkit- -moz- -0- -ms- 3.< ...
- String和string的区别
(1)从位置讲 1.string是c#中的的 2.String是 .Net Framework的一个函数名(类),基于using.System的引用 (2)从性质讲 1.string是关键字,Stri ...
- 从容而优雅(leisurely and elegant)
每时每刻, 我都变得更好了. ----- 法国心理学家 埃米尔 . 库埃 每时每刻, 我都变得更忙了. ----- 罗伯特 . 西奥迪尼 咬牙切齿的寒风, 昏暗的路灯, 默默的走过那一段从教室到寝 ...