读书人

打印单纯词直方图

发布时间: 2012-11-07 09:56:10 作者: rapoo

打印单词直方图
这个是贴的代码 之前没有写出来 刚开始 对于直方图的理解是 横坐标<--> 单词长度 纵坐标<-->单词数
然后横坐标 长度 从1 ~10 每个横坐标值 对应相同长度的单词数 每 个纵坐标值 等于每行的单词数总和
但是没有搞出来。看了答案后,有地方不解的是,他为什么用len = wl[i] * MAXHIST / maxvalue) ,其中
#define MAXHIST 15 /*max length of histogram */
#define MAXWORD 11 /*max length of a word*/
int wl[MAXWORD]; /* word length counters*/
直方图到底是怎么计算的啊?求解?谢谢
下面是源代码
#include <stdio.h>
#define OUT 0
#define IN 1 /*inside a word*/
#define MAXHIST 15 /*max length of histogram */
#define MAXWORD 11 /*max length of a word*/

//print horizontal histogram
int main()
{
int c, i, nc, state;
int len; /*length of each bar*/
int maxvalue; /*maxium value for wl[]*/
int ovflow; /*number of overflow words*/
int wl[MAXWORD]; /* word length counters*/

state = OUT;
nc = 0;
ovflow = 0;
for( i = 0; i < MAXWORD; ++i)
wl[i] = 0;
while ((c = getchar()) != EOF)
{
if (c == ' ' || c == '\n' || c == '\t')
{
state = OUT;
if(nc > 0 && nc < MAXWORD)
++wl[nc];
else
++ovflow;
nc = 0;
}
else if(state == OUT){
state = IN;
nc = 1 ; /*beginning of a new word*/
}
else
++nc; /*inside a word;*/
}
maxvalue = 0;
for(i =1; i < MAXWORD; ++i)
if(wl[i] > maxvalue)
maxvalue = wl[i];

for(i =1; i < MAXWORD; ++i)
{
printf("word length %5d - %5d: ", i, wl[i]);
if (wl[i] > 0)
{
if((len = wl[i] * MAXHIST / maxvalue) <= 0)
len = 1;
}
else
len = 0;

while (len > 0)
{
putchar('*');
--len;
}
putchar('\n');
}
if(ovflow > 0)
printf("there are %d words >= %d\n", ovflow, MAXWORD);
}

[解决办法]
这个处理实际上是叫做“归一化”,原因是:当绘制直方图时,它的高度是难以确定的,如果有类单词的数量特别多(极端情况是仅有这一种单词出现),那么会导致直方图上方超出显示区域,你看不见顶。所以,通常做法是:首先,预定义一个直方图的高度,并规定达到某个数值时,绘制为此高度。通常认为,数量最多的那一列即绘为这个高度,那么其它所有的列,都根据比例进行缩放就可以了。

所以,首先必须求得maxvalue,然后当前列的值wl[i]/maxvalue即为该直方图列的实际高度(0~1),最后乘以直方图绘制的最高高度,则可以保证以较合理的图像将直方图绘制出来。所以,最终的公式就是:
len = wl[i] * MAXHIST / maxvalue;
[解决办法]
http://topic.csdn.net/u/20121031/17/9a475948-ea16-46c0-a4f5-33bebe078e0c.html?45433

读书人网 >C语言

热点推荐