#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;
int ovflow;
int wl[MAXWORD];
state = OUT;
nc = 0;
ovflow = 0;
for(i = 0; i < MAXWORD; ++i)
{
wl[i] = 0;
}
//输入遇到字母k的时候退出
//依次扫描每个输入字符开始的时候置state为IN,
//扫描到单词结尾的时候置state为OUT,此时nc为刚扫描完单词的长度
while((c = getchar()) != 'k')
{
//出现以下三个字母的时候说明遇到新的单词了
if(c == ' ' || c == '\n' || c == '\t')
{
//改变state状态兵根据nc保存必要的结果
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)
{
//这里利用了一个简单的数学公式,最长行len总是MAXHIST
//原因是最长行的wl[i]==maxvalue
//这样按比例缩放出来的直方图好看些
if((len = wl[i] * MAXHIST / maxvalue) <=0) //这条代码什么意思
len = 1;
}
else
{
len = 0;
}
//假设前面if((len=...)<=0)中计算的len=10那么执行到这里,len的值还是10
while(len > 0) //这里的len不是都只可以打印0或1吗
{
putchar('*');
--len;
}
putchar('\n');
}
if(ovflow > 0)
printf("There are %d words >= %d\n", ovflow , MAXWORD);
}
|