zoukankan      html  css  js  c++  java
  • 单人作业

    题目:写一个程序,分析一个文本文件中各个词出现的频率,并且把出现频率最高的十个词打印出来。

    设计思路:

    1. 定义结构体(Words)数组wu[1024]用于接收读入的单词,wu[i].name表示单词,初始为“”;wu[i].num表示单词出现的次数,初始为0。
    2. 从文本中读入单词,当读入的字符为英文字符时,用空字符串a接受直至空格(或换行,间隔符)结束。
    3. 将a赋予wu[i].name,并使wu[i].num加1.
    4. 将各单词的出现次数进行冒泡降序排序,并将前十个输出。

    问题解决:

    开始将a赋予wu[i].name时只是单纯的用一个循环令a!= wu[i].name时,wu[i].name=a。结果输出时,wu[i].name永远是文章的最后一个单词,每次循环都将前一个单词替换掉(a!= wu[i].name时),导致输出结果的错误。于是,增加一个变量n来记录收入单词的个数,使得a!=wu[i].name&&i==n时,将a赋予wu[i].name,并使wu[i].num加1。这样又出现了新的问题,当a==wu[i].name时只是进行数量加1,导致wu数组中name不为空的元素个数比录入单词少的情况,即wu[i].name=””但是wu[i].num!=0的情况,所以还要把数组中符合这样条件元素删掉。

    开始对wu[i].num进行冒泡排序的时候,交换顺序的时候没有考虑单词name,只把序号交换,这样变相更改了单词出现的频率,又使输出结果产生了错误。所以,对num交换的时候也对相应name进行了交换。

    代码:

    #include<iostream>

    #include<string>

    #include<fstream>

    using namespace std;

    typedef  struct Words

    {

           string name;

           int num;

    }W;

    int judgechar(char c)

    {

           if(c>='a'&&c<='z'||c>='A'&&c<='Z')

              return 1;

           else return 0;

    }

    void main()

    {

           W wu[1024];

           char ch;

           int i,n=0;

           for(i=0;i<1024;i++)

           {

                  wu[i].name="";

                  wu[i].num=0;

           }

           string a="";

           FILE *f;

           f=fopen("in.txt","r");

        while((ch=fgetc(f))!=EOF)

           {

                  a="";

                  if(ch==' '||ch==' '||ch==' '){}

            else if(judgechar(ch))

                    {

                         while(judgechar(ch))

                         {

                                a=a+ch;

                    ch=fgetc(f);                  

                         }

                  }

                  n++;

            for(i=0;i<1024;i++)

                  {

                         if(a==wu[i].name)

                         {

                                wu[i].num++;

                                break;

                         }

                      else if (a!=wu[i].name&&i==n)

                         {

                                wu[i].name=a;

                                wu[i].num++;

                         }

           }

           }

           for(i=0;i<1024;i++)

           {

                  if(wu[i].name==""&&wu[i].num!=0)

                  {

                         wu[i].name=wu[i+1].name;

                         wu[i].num=wu[i+1].num;

                  }

           }

           W t;

           int j;

           for(j=0;j<1203;j++)

                  for(i=0;i<1023-j;i++)

                      if(wu[i].num<wu[i+1].num)

                        {

                                         t.num=wu[i].num;

                                         wu[i].num=wu[i+1].num;

                                         wu[i+1].num=t.num;

                                         t.name=wu[i].name;

                                         wu[i].name=wu[i+1].name;

                                         wu[i+1].name=t.name;

                                  }

           cout<<"出现频率次数最高的十个单词:"<<endl;

            for(i=0;i<10;i++)

             {

                         cout<<"单词"<<endl;

                cout<<wu[i].name<<endl;

                         cout<<"出现次数"<<endl;

                cout<<wu[i].num<<endl;

              }

    }

    测试文本:(in.txt)

    We all know that English is very useful. Many people in the world speak English. So more and more people in China study it.  How to study English well? I think we must have a good way to study English. If you want to learn English well, listening, speaking, reading and writing are important. You should listen to tapes every day. You should often speak English with your teachers and friends. You should read English every morning. And, you had better keep a diary every day. In this way, you can study English well

    结果:

    心得:

    编程时需要面面俱到,对待细小的方面也要思考清楚,不能想当然。

    遇到问题是要有耐心去一一解决,不能急躁,更不能放弃。

    程序中的数组可以使用链表,使用链表的话可能会使结果更加准确,但是不能很好的使用链表,所以选择数组。

  • 相关阅读:
    【NOI D2T1】量子通信(容斥原理+卡常)
    CF1555D Say No to Palindromes(线段树)
    CF1554B Cobb
    CF1554A Cherry
    【做题笔记】UVA10162 Last Digit
    【做题记录】CF1223D Sequence Sorting
    CF39H
    UVA10763
    题解 AT2361 [AGC012A] AtCoder Group Contest
    このブログについて | About this blog
  • 原文地址:https://www.cnblogs.com/blaze04/p/3575515.html
Copyright © 2011-2022 走看看