统计一遍文章里单词的长度并以直方图表示

没错,这也是《C程序设计语言》里的一个小练习。

我觉得这真是好书,之前囫囵吞枣的就过了一遍,书里的练习几乎没做,就是自己大概想个思路就算了,也没管对不对。

现在重新看,发现这些练习其实都很有意思!

之前真是没做真是太笨了,导致我C基础不够扎实,这样是很难更进一步的!

我自己的一点感想,希望大家都引以为戒!

没有捷径的,踏踏实实,稳打稳扎,才是求学问的正确态度!

练习1.13 编写一个小程序,打印输入单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的直方图则要困难些。

/* * ===================================================================================== * *Filename: 1.13.c * * Description:* *Version: 1.0 *Created: 10/25/2012 05:48:03 AM *Revision: none *Compiler: gcc * *Author: Citizen Paathurnax Citizen2047@gmail.com *Company: GDUPT * * ===================================================================================== */#include <stdio.h> main(){int wlen = 0;int c,i,j;int arr[ARR_LEN];for(i=0;i<ARR_LEN;i++){arr[i]=0;}while((c=getchar()) != EOF){<=c && c<=) || (<=c && c<=)){wlen++;}else {arr[wlen-1]++;wlen = 0;}}for(i=ARR_LEN;i>=0;i–){if(arr[i]!=0){printf(,i+1);for(j=1;j<=arr[i];j++){printf();if(j%5==0){printf(” “);}}printf();}}return 0;}

我这代码很简单,也没什么巧妙的地方。

先设置一个数组,下标就用来记录单词的长度,存储的值就用来记录单词出现的次数。

然后就用getchar()获取字符,香港虚拟主机,然后判断是否为字母,是的话wlen增加。

然后判断到不是字母之后,就根据wlen的数值找到数组对应下标,再自加,代表出现次数增加一次。

arr[wlen-1]++;

  其中wlen-1只是为了用上arr[0]。

然后就从单词长度最大的往下遍历,不为零的(代表有这样长度的单词出现过)就输出其长度,网站空间,并且后面以星号代表出现次数。

if(j%5==0){printf(” “);}

这段的意思就是每5个一组,方便计算出现的总次数。

最后以这个C文件作为输入,方便测试。

由图可知,网站空间,长度为11的单词出现了一次,长度为1的单词出现了30次(我变量名取得太简单了╮(╯▽╰)╭)。

相信网上应该有比我更好的实现方法,明天网上找找看,再复制上来跟大家探讨探讨。

另外我垂直方向的直方图也没有实现,明天后天找点时间补完了再发上来!

————————————————–

今天第三天了,才完成了垂直直方图。

不是因为难度有多高,是因为前两天电脑硬盘出问题了,搞得我焦头烂额。

刚才才终于有时间完成这垂直直方图!

/* * ===================================================================================== * *Filename: 1.13.c * * Description:* *Version: 1.0 *Created: 10/25/2012 05:48:03 AM *Revision: none *Compiler: gcc * *Author: Citizen Paathurnax Citizen2047@gmail.com *Company: GDUPT * * ===================================================================================== */#include <stdio.h> main(){c,i,j;arr[ARR_LEN]; (i=0;i<ARR_LEN;i++){arr[i]=0;}while((c=getchar()) != EOF){<=c && c<=) || (<=c && c<=)){wlen++;}else {arr[wlen-1]++;wlen = 0;}}for(i=ARR_LEN;i>0;i–){););););););else if (i==16) ;,i);for (j=0;j<ARR_LEN;j++){if(arr[j] % ARR_LEN >= i){printf();}else {printf(” “);}}printf();}printf(” “);for (i=1;i<=ARR_LEN;i++){););););););else if (i==16) break;,i);}printf();return 0;}

前部分基本一样,不同的是后部分的打印输出。

主要就是下面这句判断是否需要输出“*”

if(arr[j] % ARR_LEN >= i)

由于测试的文档最长的单词为11,因此当i的值为11的时候,才符合条件。

然后以此类推。

另外输出的ABCDE也只是为了格式好看。

附测试图:

我这函数还有很多问题,因为格式原因9以后的我都用A-F来代替了,因为10要占两个位,跟上面就对不上了。

现在也没想到有什么好的解决方法。

但是15个字母的单词也非常少见了,因为我觉得基本也可以了!

只是需要垮上后座的勇气和一颗想走即走的心,

统计一遍文章里单词的长度并以直方图表示

相关文章:

你感兴趣的文章:

标签云: