分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的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("无法打开此文件!
");
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]=' ';//下面判断是否为同一个单词
p=head->next;
while(p)
{
if(!_stricmp(temp,p->name))
{
p->num++;break;
}
p=p->next;
}
if(!p&&temp[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("出现频率最高的十个单词如下:
");
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 单词:",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);
}
在编程时总会遇到一些自己认为困难的地方,也许我们的解决方案不够好,但是一个个问题的解决就是我们的成长