Exercise 1-13.
Write a program to print a histogram of the lengths of words in its input. It is easy to draw the histogram with the bars horizontal; a vertical orientation is more challenging.
<pre name="code" class="html">#include<stdio.h>
#define MAXHIST 15 /*max length of histogram */
#define MAXWORD 11 /*max length of a word*/
#define IN 1 <span style="white-space:pre"> </span>/*inside a word*/
#define OUT 0 <span style="white-space:pre"> </span>/*outside a word*/
/* print a vertical histogram */
main()
{
int c,i,j,nc,state;
// int maxvalue;
int ovflow;<span style="white-space:pre"> </span>/× number of overflow words */
int wl[MAXWORD];<span style="white-space:pre"> </span>/× word length counters */
state=OUT;
nc=0; <span style="white-space:pre"> </span>/* number of chars in a word */
ovflow=0;<span style="white-space:pre"> </span>/*number of words >= MAXWORD */
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; <span style="white-space:pre"> </span>/*beginning of a new word*/
}
else
++nc;<span style="white-space:pre"> </span>/* inside a word */
}
// maxvalue=0; 个人觉得没必要找出数组wl[]中的最大值
// for(i=1;i<MAXWORD;++i)
// if(wl[i]>maxvalue)
// maxvalue=wl[i];
for(i=MAXHIST;i>0;--i)
{
for(j=1;j<MAXWORD;++j)
<span style="white-space:pre"> </span>if((wl[j]+MAXHIST)%MAXHIST>=i) /* 取代原答案 if(wl[j]*MAXHIST/maxvalue>=i)*/
printf(" *");
else
printf(" ");
putchar('\n');
}
for(i=1;i<MAXWORD;++i)
printf("%2d",wl[i]);
putchar('\n');
for(i=1;i<MAXWORD;++i)
printf("%2d",i);
putchar('\n');
if(ovflow>0)
printf("There are %d words >= %d\n",ovflow,MAXWORD);
}
编译结果如下:
原答案的编译结果是:
感觉不够直观!