题目:写一个程序,分析一个文本中各个词出现的频率,并且把频率最高的10个词打印出来。
我觉得这个问题主要是读取文件,然后统计个数和排序几个点。以前也做过类似的读文件,我直接用的以前读文本的方式,即ifstream方式,使用完文件还需关闭,然后使用了结构体和类定义单词,这样方便在文本中寻找,不用判断前后都是空格的为一个单词,结构体单词有单词名和个数,先定下第一个单词,然后将其他单词一一与它比较,是一样的就数量加一,不一样就从头再比较。然后我定义了一个数组,存放每种单词的个数,然后使用冒泡法将单词个数(数组)由大到小排列,最后输出前十个。
程序:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
class danci{
public:string name;
int num;
danci(){
num=0;
name="";
};
};
void readfile(danci*&inchar,int &counter){
ifstream infile("in.txt");
if(!infile) {
cout<<"cannot open!"<<endl;
return;
}
while(infile){
string temp;
infile>>temp;
int i=0;
for( ;i<counter;i++){
if(temp==inchar[i].name) {
inchar[i].num++;
break;
}
}
if(i==counter&&inchar[i].name!=temp){
inchar[counter].name=temp;
inchar[counter].num++;
counter++;
}
};
infile.close();
}
void output(danci*inchar,int counter){
for(int i=0;i<counter;i++)cout<<"单词"<<inchar[i].name<< ":"<<" "<<"出现次数"<<inchar[i].num<<endl;
}
void main(){
danci*inchar=new danci[1000];
int counter=0;
readfile(inchar,counter);
output(inchar,counter);
int a[500];
int i;
for( i=0;i<500;i++) a[i]=inchar[i].num;
int j,t;
for (j=0;j<500;j++)
for(i=0;i<500-j;i++)
if(a[i+1]>=a[i])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
for(i=0;i<10;i++)
cout<<a[i]<<endl;
}
实验结果: