英文单词频度统计程序(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[50];.................... //定义字符数组用来记录在读文件时出现的单词 char *w[500];.....................//定义字符型指针变量数组用来保存单词 char *r[2];........................//在交换单词位置时起作用 int number[500];...................//定义整型数组统计单词的个数 int i=0,j=0,k,max=0; 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;...........................................//为当前单词的频率做初始化,记为1 for(k=0,i=0;i<j;i++) ..........................//将当前单词与之前统计过的单词作比较,统计频率 if(strcmp(w[i],w[j])==0) { number[i]=number[i]+1;.......................//如果存在相同的单词,则前面的单词加1 j=j-1;....................................................//因为与前面的单词相同,通过W[J]将当前单词覆盖 } j++; i=0;......................................................//使Word【】重新统计 fp.get(cbuffer); } cout<<"结果如下:"<<endl; for(k=1;k<=j-1;k++)...............................//利用冒泡排序 for(i=k+1;i<=j;i++) { if(number[k]<number[i]) { int temp=number[k];..................................................................//交换顺序 number[k]=number[i]; number[i]=temp; 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]; } } for(k=1;k<=10;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 晚上 | 编写程序总结发博客 |