#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]=' '; 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]=' '; 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<<' '<<list[i].key<<' '<<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]=' ';利用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<<' '<<list[i].key<<' '<<endl;
}
将第一个看做单词数最多的,和其他单词比较,最后把数量最多的单词换在第一位输出,依次类推输出出现频率最多的前十个单词;