发布网友 发布时间:2022-04-24 22:28
共1个回答
热心网友 时间:2023-10-13 08:41
实现关键点:
去除非字母字符(assii码)
大写统一转小写;
然后开始统计词频。
代码如下请参考:
#include<iostream>
#include<fstream>
#include<string>
#include<map>
using namespace std;
string bd;
struct ll
{
string str;
int times;
};
ll aa[500];
int cishu=0;//列表里的不同词的数量
void save_file()//打开文件,读取文件
{
ifstream outfile("词频统计文件.txt",ios::in);
if(!outfile)
{
cerr<<"打开文件错误"<<endl;
exit(1);
}
while(!outfile.eof())
{
getline(outfile,bd);
}
outfile.close();
}
void delete_fh()//去除标点符号
{
int i=0;
while(i<bd.size())
{
if(bd[i]==',' || bd[i]=='.')
if(i<bd.size()-2)
bd=bd.substr(0,i)
+wz.substr(i+2,bd.size()-i-2);//前面的是遇到符号的句子+后
面的句子连接起来。逗号去除,把句子连接起来
else
bd=bd.substr(0,i);
i++;
}
}
void change()//变成小写字母
{
int i=0;
while(i<bd.size())
{
if(isupper(bd[i]))
bd[i]=bd[i]+32;
i++;
}
}
//把数据放在临时字符串与结构列表中判断,如果在结构列表
//中有就加1,如果没有就添在结构表里。
void add_a_word(string tmp)//向列表里加入词
{
int c;
for(c=0;c<cishu;c++)//遍历词表
{
if(aa[c].str==tmp)//找到了
{
aa[c].times++;//次数+1
break;
}
}
if(c==cishu)//列表里没有该词
{
aa[c].str=tmp;//把词加入列表
aa[c].times=1;//出现次数=1
cishu++;//总次数+1
}
}
void count1()//查找一个空格的单词
{
int i=0;
int a=0;
int j=0;
int n=0;
string tmp;
while(i<bd.size())
{
if(bd[i]==' ')
{
tmp=bd.substr(a,i-a);
add_a_word(tmp);
a=i+1;
}
i++;
}
}
void count2()//查找俩个空格的单词
{
string tmp1,tmp2,tmp3;
int i=0;
int a=0;
int c=0;
int s=0;
while(i<bd.size())
{
if(bd[i]==' ')
{
tmp1=bd.substr(a,i-a);
a=i+1;
c=i+1;
while(c<bd.size())
{
if(wz[c]==' ')
{
tmp2=wz.substr
(i+1,c-i-1);
break;
}
c++;
}
if(c==bd.size())
// tmp2=bd.substr
(i+1,bd.size()-i-1);
break;
tmp3=tmp1+' '+tmp2;
add_a_word(tmp3);
i=c;
continue;
}
i++;
}
//for( s=0;s<cishu;s++)
//{
// cout<<aa[s].str<<" "<<aa
[s].times<<endl;
//}
}
void over_file()//写文件
{
int s;
fstream outfile("output.txt",ios::out);
if(!outfile)
{
cerr<<"open error"<<endl;
exit(1);
}
for(s=0;s<cishu;s++)
{
outfile<<aa[s].str<<" "<<aa
[s].times<<endl;
//cout<<aa[s].str<<" "<<aa[s].times<<endl;
}
outfile.close();
}
int main(){
save_file();
delete_fh();
change();
count1();
count2();
over_file();
return 0;