统计一篇英语文章中每个单词出现次数并输出出现频率最高的10个单词

具体思路:首先将用creatArray()函数将文件中的内容读入到一个char型的动态数组,然后统计共有多少个英文单词,知道数目后创建两个char型指针valueA,valueB,valueA记录挨个记录每个单词,用valueB来搜寻,最后可得到每个单词出现的次数。再将无重复的单词写入文件,然后读入string类型的动态数组,而且用int型动态数组记录相应的每个单词出现的次数,最最后10次循环可得到出现频数最高的10个单词

#include<iostream>
#include<string>
#include<string>
#include<fstream>
using namespace std;
char *creatArray()//创建字符数组将文件内容写入字符数组中
{
FILE*fp;
if((fp=fopen("ss.txt","r+"))==NULL)
{
cout<<"cant open the file"<<endl;
exit(0);
}
int sum=0,i=0;//sum统计共有多少个字符,包含空格等字符
while(fgetc(fp)!=EOF)
sum++;
char*array=new char[sum+1];//多创建一个字符空间来存储“\0”,以表示结尾
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;//num用来存储共多少个单词
int sum=0;//存储共多少个单词,与print()函数中的sum不同,它不包含空格等字符
char *p=destr;
while(*p!='\0')//统计num
{
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;//valueA从第二个单词开始记录
for(i=0;i<num-1;i++)
{
valueA+=(strlen(valueA)+1);
char *valueB=destr;//valueB查看是否与valueA相等
for(int j=0;j<num;j++)
{
if(strcmp(valueA,valueB)==0)//若相等则对应次数增加,且break再次搜寻,若还相等则对应次数再次增加......
{
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<<"出现频率最高的10个英语单词以及各自出现的次数是:"<<endl;

/*此时每个单词不再重复*/
/*从现在开始搜寻出现频率出现最高次数的10个单词,具体思路是两个数组分别储存各个单词和分别对应的次数,其中储存单词的数组类型是string,进行10次循环,
每次可以找出一个符合要求的单词并输出,期间可用m记录是第几个单词,然后下一次循环开始之前sum--(单词总数减一),单词数组中被输出单词后的每个单词向前
移动一位(总数组长度减一),记录次数的数组采取同样方法,最后通过10次循环可找出10个单词*/

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;
}

 

文档内容:


 

 


 

结果:


 

 

 


 

 

转载于:https://www.cnblogs.com/guozw/p/3575408.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值