10大高频率单词筛选

it2022-07-05  219

//#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


最新回复(0)