統計一篇英語文章中每個單詞出現次數並輸出出現頻率最高的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;
}

 

文檔內容:


 

 


 

結果:


 

 

 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM