没错,这也是《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个字母的单词也非常少见了,因为我觉得基本也可以了!
只是需要垮上后座的勇气和一颗想走即走的心,