具體思路:首先將用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; }
文檔內容:
結果: