#include <iostream>
#include <fstream>
#include <string>
#include<stdlib.h>
using namespace std;
FILE *fp; //读文件
char filename[20]; //文件路径及文件名
int m=0;
char c[20];
struct wordcount //存放单词及其个数
{
int key;
char a[20];
};
struct wordcount list[300];
void readfile(char filename[]) //读文件
{
char ch;
int flag=0;
int k,n=0,j=0;
for(m=0;m<200;m++) //将list全部初始化为0
list[m].key=0;
if((fp=fopen(filename,"rt"))==NULL)
printf("cannot open the file!");
else
while(!feof(fp))
{ for(k=0;k<20;k++)
c[k]='\0';
int i=0;
ch=fgetc(fp);
while(((ch>'A'&&ch<'Z')||(ch>'a'&&ch<'z'))&&!feof(fp))
{
if(ch>'A'&&ch<'Z') ch=ch+32;
c[i]=ch;
ch=fgetc(fp);
i++;
}
c[i]='\0';
for(j=0;list[j].key!=0;j++)
{
if(strcmp(list[j].a,c)==0)
{
list[j].key=list[j].key+1;
flag=1;
break;
}
}
if(flag==0)
{
list[j].key=1;
strcpy(list[j].a,c);
}
flag=0;
}
}
void sort() //排序
{
int i,j,max;
int n=100;
char ch2[20];
for(i=0;i<10;i++)
{
max=list[i].key;
for(j=i+1;j<n;j++)
if(list[j].key>max)
{
max=list[j].key;
list[j].key=list[i].key;
list[i].key=max;
strcpy(ch2,list[j].a);
strcpy(list[j].a,list[i].a);
strcpy(list[i].a,ch2);
}
cout<<list[i].a<<'\t'<<list[i].key<<'\t'<<endl;
}
}
void main()
{
int i;
cout<<"请输入文件路径及文件名 :";
scanf("%s",filename);
readfile(filename);
cout<<"频率最高的前十个词是:"<<endl;
sort();
}
本程序总共分为三部分读文件readfile()、单词统计、排序找出频率最高的前十个单词;
一、在统计单词频率的程序中,首先第一步是读文件,
if((fp=fopen(filename,"rt"))==NULL)
printf("cannot open the file!");
else
while(!feof(fp)){}
这几行代码是读文件,其中要注意的是定义fp,FILE *fp,不要忘记*;
二、单词统计部分是重要部分之一,本程序利用结构体、链表来记录单词及单词的个数
while(((ch>'A'&&ch<'Z')||(ch>'a'&&ch<'z'))&&!feof(fp))
{
if(ch>'A'&&ch<'Z') ch=ch+32;
c[i]=ch;
ch=fgetc(fp);
i++;
}
c[i]='\0';利用ch=ch+32将大写转换成小写,实现单词的识别,
for(j=0;list[j].key!=0;j++)
{
if(strcmp(list[j].a,c)==0)
{
list[j].key=list[j].key+1;
flag=1;
break;
}
}
当遇到空格一个单词结束,进行单词之间的比较,个数累加
for(i=0;i<10;i++)
{
max=list[i].key;
for(j=i+1;j<n;j++)
if(list[j].key>max)
{
max=list[j].key;
list[j].key=list[i].key;
list[i].key=max;
strcpy(ch2,list[j].a);
strcpy(list[j].a,list[i].a);
strcpy(list[i].a,ch2);
}
cout<<list[i].a<<'\t'<<list[i].key<<'\t'<<endl;
}
将第一个看做单词数最多的,和其他单词比较,最后把数量最多的单词换在第一位输出,依次类推输出出现频率最多的前十个单词;