编程可谓是最令自己痛疼的事了,开学没几天,软件工程老师留给我们一个编程作业。说真的一点思路也没有,说也可笑,居然会莫名的害怕,不过,自从下定决心学习计算机(前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("请输入文件名:\n");
16   scanf("%s",filename);
17   if((fp=fopen(filename,"r"))==NULL)
18   {
19     printf("文件打不开!\n");
20     exit(0);
21   }
22   while(!feof(fp))   //文件内容保存在字符串数组s[]中
23   {
24     s[i]=fgetc(fp);
25     i++;
26   }
27     s[i]='\0';    //定义的s[]有N个元素,不一定能用完,所以,文件中内容保存到s后,最后给s赋‘\0’,作为字符串结束标志
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("\n出现次数排序前10的如下\n");
59     printf("-----------------------\n");
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("排序\t单词\t频数\n");
69      for(i=0;i<10;i++)   //显示出频率最高的前10个单词,及出现次数
70      {
71         printf("%d\t%s\t%d\n",i+1,a[c[i]],b[i]);
72      }
73         printf("-----------------------\n");
74 }

 

运行结果:


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

   

         

 

        

 

posted on 2014-03-02 16:05  fengxiaolan  阅读(858)  评论(1编辑  收藏  举报