具体思路:首先将用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; }
文档内容:
结果: