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

 

你可能感兴趣的:(单词)