问题描述
- C语言程序设计第二版 1.6数组练习1-13打印输入中单词长度的直方图的问题
-
/* Note:Your choice is C IDE */
#include "stdio.h"
#define MAXHIST 15 //柱状图长度
#define MAXWORD 11 //单词长度
#define IN 1
#define OUT 0
void main()
{
int c,i,nc,state;
int len;
int maxvalue; //wl[]的最大值
int ovflow;//溢出单词数
int wl[MAXWORD];//单词长度计数
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) if(nc<MAXWORD) ++wl[nc]; else ++ovflow; nc=0; } else if(state==OUT) { state=IN; nc=1; } else ++nc; } maxvalue=0; for(i=1;i<MAXWORD;++i) if(wl[i]>maxvalue) maxvalue=wl[i]; for(i=1;i<MAXWORD;++i) { printf("%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; //为什么要--len? } putchar('n'); } if(ovflow>0) printf("there are %d words >=%dn",ovflow,MAXWORD);
问题:1
if((len=wl[i]*MAXHIST/maxvalue)<=0)
len=1; 这段话表示什么意思?与下面的while语句有什么关系
问题:2
while(len>0)
{
putchar('*');
--len;
}这段话与上面的if((len=wl[i]*MAXHIST/maxvalue)<=0)有什么关系吗?
问题3:
为什么一定要求最大数值?且以此为标准?
for(i=1;i
if(wl[i]>maxvalue)
maxvalue=wl[i];
}求各位帮个忙解答疑惑!!!谢谢!!!
解决方案
木有人帮帮忙吗?谢谢
解决方案二:
这个处理实际上是叫做“归一化”,原因是:当绘制直方图时,它的高度是难以确定的,如果有类单词的数量特别多(极端情况是仅有这一种单词出现),那么会导致直方图上方超出显示区域,你看不见顶。所以,通常做法是:首先,预定义一个直方图的高度,并规定达到某个数值时,绘制为此高度。通常认为,数量最多的那一列即绘为这个高度,那么其它所有的列,都根据比例进行缩放就可以了。
所以,首先必须求得maxvalue,然后当前列的值wl[i]/maxvalue即为该直方图列的实际高度(0~1),最后乘以直方图绘制的最高高度,则可以保证以较合理的图像将直方图绘制出来。所以,最终的公式就是:
len = wl[i] * MAXHIST / maxvalue;
这个if判断只是为了 保证,当数据为0时,最起码画一点东西上去~
解决方案三:
len是用来配合换行的