单人作业

本文介绍了一个程序设计实例,旨在分析文本文件中各词出现频率,并筛选出最高频的十个词进行输出。通过引入结构体数组、判断字符类型、循环读取并更新单词频率,最终对数据进行排序和输出。程序中遇到的问题及解决方案,强调了编程时对细节的关注和耐心的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

设计思路:

  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=='\t'||ch=='\n'){}

        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

结果:

心得:

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

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

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

转载于:https://www.cnblogs.com/blaze04/p/3575515.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值