您的位置:首页 > 其它

分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来

2014-03-02 17:55 281 查看
分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来

在刚刚拿到题目的时候首先想到的要点有:

1.从文件读取数据

2.统计出来单词个数,并保存

3.排序,输出

我要用的编程语言是c,对文件的读取我看了一下书,明确了一些语法,使用格式并看了一些网上其他人对本题的实现。

对从文件中得到的数据开始是想用个2维数组表示,文件指针得到一个存到数组里,读取时分三种情况,字母,空格,

其他类型,字母读入,遇到空格算一个,其他类型无操作。

但是接下来,在排序时感到有些麻烦,先要统计次再排序,因此用到了链表,设置单词结构体,有单词名,出现次数,

在单词存储时判断是否出现过,出现过则num加1,接下来只要排序输出就好了。

完整代码如下:

#include<stdio.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>
#include<ctype.h>

struct word{
char name[30];
int num;
struct word *next;
};//每个单词最大30个字母,存放单词的链表

void readfile(struct word*&head)
{
FILE *fp;
if((fp=fopen("ab.txt","r"))==NULL)//只读方式打开文件
{
printf("无法打开此文件!\n");
exit(0);
}
char ch,temp[30];
struct word *p;
while(!feof(fp)) //读取单词直到文件结束
{
int i=0;
ch=fgetc(fp); //
temp[0]=' ';
while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||temp[0]==' ')
{
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
{
temp[i]=ch;
i++;
}
ch=fgetc(fp);
if(feof(fp)) break;
}

temp[i]='\0';//下面判断是否为同一个单词
p=head->next;
while(p)
{
if(!_stricmp(temp,p->name))
{
p->num++;break;
}
p=p->next;
}
if(!p&&temp[0]!='\0')//新单词的进入链表,初始化
{
p=new word;
strcpy(p->name,temp);
p->num=1;
p->next=head->next;
head->next=p;
}
}
}

void sort(struct word*&head) //已有单词出现次数,进行排序
{
struct word *q; //单词指针
int a[10],i; //存储十个单词的出现次数初值为0
for(i=0;i<10;i++)
a[i]=0;
printf("出现频率最高的十个单词如下:\n");
for(i=0;i<10;i++)
{
q=head;
while(q!=NULL)
{
if(q->num>a[i])
a[i]=q->num;
else
q=q->next;
}
q=head;
while(q!=NULL)
{
if(a[i]==q->num)
{
q->num=0;
printf("出现频率:%d\t单词:",a[i]);
puts(q->name);
break;
}
else
q=q->next;
}
}
}
void main()
{
struct word *pdj;
pdj=new word;
pdj->next=NULL;
readfile(pdj);
sort(pdj);
}

在编程时总会遇到一些自己认为困难的地方,也许我们的解决方案不够好,但是一个个问题的解决就是我们的成长
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐