//#include<iostream.h>
#include<
string.h>
#include<fstream.h>
struct Word
//定义结构数组储存单词
{
char w[
20];
int num;
}Word[10000];
void main()
//主函数
{
ifstream infile("test1.txt",ios::
in);
char a,t[
20];
int n;
int wordTypeNum=
0,wordNum=
0;
int i;
int j;
int ijt;
for(i=
0;i<
10000;i++)
// 给结构数组频率计数num赋初值0
Word[i].num=
0;
strcpy(Word[0].w,
"wow\0");
//为以后编程方便,将第一个结构成员w赋一个绝对不是单词的词
if(!infile)
//判断文件是否打开成功打开
cerr<<
"File open error"<<
endl;
else
{
while(infile.
get(a))
//依次读取txt文件中每个字符
{
if(a==
' '||a==
','||a==
','||a==
'!'||a==
'?'||a==
'"'||a==
':'||a==
';')
//这些为单词间隔符,不全
{
t[wordNum]=
'\0';
//单词结束
for(i=
0;i<=wordTypeNum;i++)
//和前面已储存单词进行比较
{
if(strcmp(t,Word[i].w)==
0)
//找到相同的单词,num累加1
{
Word[i].num++;wordNum=
0;
}
}
if(strcmp(t,Word[i].w)!=
0)
//没找到相同的单词,在新的结构体内储存新单词
{
wordTypeNum++
;
strcpy(Word[wordTypeNum].w,t);
Word[wordTypeNum].num++
;
wordNum=
0;
}
}
else //字符组成单词
{
t[wordNum]=
a;
wordNum++
;
}
}
/*cout<<endl;
for(i=1;i<=wordTypeNum;i++)
cout<<Word[i].w<<" "<<Word[i].num<<endl;*/
for(i=
1;i<wordTypeNum;i++)
//将结构数组根据num成员从大到小排列
{
for(j=
1;j<wordTypeNum-i;j++
)
{
if(Word[j].num<Word[j+
1].num)
{
ijt=
Word[j].num;
Word[j].num=Word[j+
1].num;
Word[j+
1].num=
ijt;
}
}
}
cout<<
"频率最高的10个单词如下:"<<
endl;
for(i=
1;i<=
10;i++)
//输出前10个
{
cout<<Word[i].w<<
" "<<Word[i].num<<
endl;
}
infile.close();
}
}
设计思路:结构数组存储单词和频数 空格及标点符号作为单词分隔符
每组成一个单词都和前面已储存的单词进行对比,一样的话累加到上面,不一样在下一个结构体创建新的单词
不足:有些复杂的分隔符没识别,像多个空格,标点符号加空格;
如果文章不大,空间浪费严重
如果文章巨大,会有问题,
最多9999个单词
转载于:https://www.cnblogs.com/shangjiaojian/p/3579331.html