zoukankan      html  css  js  c++  java
  • 软件工程个人小程序:分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来

           编程可谓是最令自己痛疼的事了,开学没几天,软件工程老师留给我们一个编程作业。说真的一点思路也没有,说也可笑,居然会莫名的害怕,不过,自从下定决心学习计算机(前2年半一直在犹豫,很傻哦!)就决定一定要自己编。也让自己从零开始(也许不是零呢),从第二周开始,除了上课,就是把C语言课本上的习题都实践一遍(真的有些收获)。周四软件老师留了个人编程作业:

           写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来。


          周五,周六两天就看C语言,做课后习题,(因为对编程脑子一片空白),周一下午就开始着手老师的作业。

          思路很简单:1 读文件,统计文件中单词个数(用C课本中的一道例题)

                          2  将文件内容分割成单词到二维数组中

                          3  对单词排序,并输出频率最高的10个单词

       周一下午:

                 很简单地实现了读文件,以及统计文件中单词个数,但是如何将单词存到二维字符数组中真的很让我不知所措,就那样执拗地想,在本子上写写画画,晚上回到宿舍不甘心,洗漱完后又是挑灯夜战(编程是我弱项,必须花时间想),l一边理解课本上判断一个字符串中单词个数的算法(谭浩强 C程序设计P106),一边想如何在这个算法的基础上将单词统计到一个二维数组中。直到凌晨1点多。

                 熬夜成果:实现了将每一个单词的首字符记录下来,在记录每个单词时输出的单词不对(虽然很笨,但是还是很高兴的,因为自己真的有在思考)。

    周二上午及下午无课时:

               仍然执拗地进行”攻克“那一个对与我来说的难点,只要将文件中内容转化为单词存储到二维数组中,就可以继续下一步了。晚上,终于熬不住了,撇下作业,开始看C,编课后习题,要不这一天都没有什么实质性的收获了。

    周三下午:

            在宿舍,上网查如何将字符串分割成单词(不敢直接找答案,那样就限制了自己的想法),了解到strtok()函数:

       原型
    char *strtok(char *s, char *delim);
    编辑本段功能
    分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串

    一下午,完成统计单词个数,并将单词存储到数组中,晚上,开始进行将每个单词出现的次数记录并排序的部分,感觉思路很简单但是真正做起来还是有很多意外“惊喜”,最终,一个简单的程序终于实现。代码如下:
     1 #include<string.h> 
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #define N 1000
     5 void main() 
     6 {
     7   FILE *fp; 
     8   char filename[10];
     9   char s[N];  //保存文件中的内容  
    10   char *d=" ";//在s串中将包含有 " "的位置处加上NULL,注意空格的输出  
    11   char *p;  
    12   int flag[N];  //标识
    13   char a[N][N];
    14   int i=0,n,m=0,l,j,temp1,temp2,b[N]={0},c[N]={0};
    15   printf("请输入文件名:
    ");
    16   scanf("%s",filename);
    17   if((fp=fopen(filename,"r"))==NULL)
    18   {
    19     printf("文件打不开!
    ");
    20     exit(0);
    21   }
    22   while(!feof(fp))   //文件内容保存在字符串数组s[]中
    23   {
    24     s[i]=fgetc(fp);
    25     i++;
    26   }
    27     s[i]='';    //定义的s[]有N个元素,不一定能用完,所以,文件中内容保存到s后,最后给s赋‘’,作为字符串结束标志
    28  
    29   
    30     i=0;        //将s中字符串转化为单词数组存到字符串数组a[][]中
    31     p=strtok(s,d);  
    32     while(p)    
    33   {         
    34  
    35       strcpy(a[i],p);    
    36       p=strtok(NULL,d); 
    37       flag[i]=1;
    38          i++;
    39   }  
    40     n=i;
    41 
    42    for(i=0;i<n;i++)  //统计相同单词出现次数
    43     while(flag[i])
    44     {
    45        for(j=i;j<n;j++)
    46         {
    47           if(!strcmp(a[i],a[j]))
    48           {
    49               b[m]++;    //m为不同的单词数,b[]为相同的一个单词出现的个数
    50               flag[j]=0;
    51               c[m]=i;    
    52           }
    53           else continue;
    54         }
    55         m++;
    56     }
    57     
    58     printf("
    出现次数排序前10的如下
    ");
    59     printf("-----------------------
    ");
    60  
    61     for(i=0;i<m-1;i++) //按出现频率排序统计
    62       for(j=i+1;j<n;j++)
    63           if(b[i]<b[j])
    64           {
    65              temp1=b[i];b[i]=b[j];b[j]=temp1;
    66              temp2=c[i];c[i]=c[j];c[j]=temp2;
    67           }
    68     printf("排序	单词	频数
    ");
    69      for(i=0;i<10;i++)   //显示出频率最高的前10个单词,及出现次数
    70      {
    71         printf("%d	%s	%d
    ",i+1,a[c[i]],b[i]);
    72      }
    73         printf("-----------------------
    ");
    74 }
    运行结果:


    之前写程序都是百度什么的,才使得自己编程能力很差,这次编的程序其实也很差,没什么实用价值,但是,自己从这几天的思考中,一方面更加了解自己,一方面,也体会到编程其实还是很好玩的,也相信,不是能力差,是根本就没有花时间在编程上(要是我从大一就意识到会不会更好呢?勿以往之不谏,知来者之可追吧) 所以,开始从零开始,从这个很不完美的一次软件工程作业开始。
    对了,把这么菜的程序放到这样的博客中真的很需要很需要勇气呢O(∩_∩)O哈!

       

             

            

  • 相关阅读:
    Visual Studio各版本区别
    调试ASP.NET网站IIS环境问题解决方法汇总
    关于Webpage Not Found问题解决~~~
    SpringCloud+vue搭建的商城项目
    springcloud实现限流
    ReentrantLock
    栈和堆的特点
    你用对锁了吗?浅谈 Java “锁” 事
    ReentrantReadWriteLock读写锁的使用
    OAuth2
  • 原文地址:https://www.cnblogs.com/fengxiaolan/p/3576903.html
Copyright © 2011-2022 走看看