统计一篇文章中每个单词出现的频率,并把频率最高的十个词输出
先扫描文章,统计出每个单词出现的次数,把出现次数排序,输出出现次数最高的十个单词。
采用C++编写
首先创建一个字符数组,用来存储文件内容;
再创建一个数组,记录每个单词出现的次数;
最后对所有的单词出现的频率排序,输出前出现次数最高的前十个单词。
#include<iostream>
#include<string>
#include<string>
#include<fstream>
using namespace std;
char *creatArray()
{
FILE*fp;
if((fp=fopen("word.txt","r+"))==NULL)
{
cout<<"cant open the file"<<endl;
exit(0);
}
int sum=0,i=0;
while(fgetc(fp)!=EOF)
sum++;
char*array=new char[sum+1];
fp=fopen("ss.txt","r+");
array[0]=fgetc(fp);
while(!feof(fp))
{
i++;
array[i]=fgetc(fp);
}
cout<<"总计"<<sum<<"个单词"<<endl;
array[sum]='\0';
return array;
}
void print()
{
char*destr=creatArray();
int num=1;
int sum=0;
char *p=destr;
while(*p!='\0')
{
if(*p>='A'&&*p<='Z')
{
*p=*p-'A'+'a';
}
if(*p==' '||*p==','||*p=='.'||*p=='\"'||*p==':'||*p=='!'||*p=='\'')
{
num++;
*p='\0';
}
p++;
}
int *account=new int[num];
account[0]=1;
for(int i=1;i<num;i++)
account[i]=0;
char *valueA=destr;
for(i=0;i<num-1;i++)
{
valueA+=(strlen(valueA)+1);
char *valueB=destr;
for(int j=0;j<num;j++)
{
if(strcmp(valueA,valueB)==0)
{
account[j]++;
break;
}
else
valueB+=(strlen(valueB)+1);
}
valueA=destr;
ofstream outfile("ww.txt",ios::out);
if(!outfile)
{
cout<<"open error!"<<endl;
exit(1);
}
for(i=0;i<num;i++)
{
if(account[i]&&*valueA!='\0')
{
outfile<<valueA;
outfile<<" ";
cout<<valueA<<" 出现的次数:"<<account[i]<<endl;
sum++;
}
valueA+=(strlen(valueA)+1);
}
outfile.close();
cout<<endl<<"出现频率最高的十个英语单词以及各自出现的次数是:"<<endl;
int*amount=new int[sum];
string*value=new string[sum];
ifstream infile("ww.txt",ios::in);
if(!infile)
{
cout<<"open error!"<<endl;
exit(1);
}
for(i=0;i<sum;i++)
{
infile>>value[i];
}
int n=0;
valueA=destr;
for(i=0;i<num;i++)
{
if(account[i]&&*valueA!='\0')
{
amount[n]=account[i];
n++;
}
valueA+=(strlen(valueA)+1);
}
int m,k;
for(k=0;k<10;k++)
{
int max=amount[0];
for(i=0;i<sum;i++)
{
if(max<amount[i])
{
max=amount[i];
m=i;
}
}
sum--;
cout<<value[m]<<"出现次数"<<max<<endl;
for(i=m;i<sum;i++)
amount[i]=amount[i+1];
value[i]=value[i+1];
}
}
}
int main()
{
print();
return 0;
}
浙公网安备 33010602011771号