10大高频率单词筛选

//#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个单词

 

posted on 2014-03-03 22:05  矫健  阅读(427)  评论(2编辑  收藏  举报

导航