该程序主要是实现打印输入中单词长度的水平方向的直方图
(len = nl[i] * MAXHIST / maxvalue) <= 0)这个while语句循环的条件让我有些困惑。它会出现len小于0的情况吗?如果不会出现,那么他这个条件改成(len = nl[i] * MAXHIST / maxvalue) = 0)也是可以的吗?如果会出现,那么可否帮忙具体举个例子。谢谢大家了!
#include<stdio.h>
#define IN 1 //单词内部
#define OUT 0 //单词外部
#define MAXNUMBER 11 //一个单词的最大长度
#define MAXHIST 15 //直方图的最大长度
int main()
{
int c,i,nc,state;
int overflow; //长度超过规定范围的单词个数
int maxvalue; //nl[]数组元素中的最大值
int nl[MAXNUMBER]; //储存单词长度
nc = 0; //一个单词的字符个数
state = OUT; //初始状态是在单词外
overflow = 0; //意味着长度大于MAXNUMBER 的单词个数
for (i=0;i< MAXNUMBER;i++)
{
nl[i] = 0 ;
}
while ((c=getchar())!=EOF)
{
if (c==' '||c=='\n'||c=='\t')
{
state = OUT;//在结束时,开始记录对应单词长度的个数
if (nc > 0)
{
if (nc <= MAXNUMBER)
{
nl[nc]++;
}
else
{
overflow++;
}
}
nc = 0;
}
else if (state==OUT)
{
state = IN;
nc=1; //状态:一个单词的开始
}
else
{
nc++;//状态:在一个单词中
}
}
maxvalue = 0;
int len = 0;
for (i=1;i< MAXNUMBER;i++)//find nl[i] maxvalue
{
if (nl[i] > maxvalue)
{
maxvalue = nl[i];
}
}
for (i = 1; i < MAXNUMBER; i++)
{
printf("%5d - %5d :",i,nl[i]);
if (nl[i] > 0)
{
if ((len = nl[i] * MAXHIST / maxvalue) <= 0)//此处将程序编的更加简单
//len = nl[i] * MAXHIST / maxvalue这样的赋值操作是一个表达式
//因此可以作为更大表达式的一部分出现,所以说len并不是只在if分支语句中起作用的局部变量。
//这里进行完该操作语句后,持续进行while循环语句。
//同时,该语句可以看成len = nl[i] / maxvalue * MAXHIST,nl[i]表示长度为i单词的个数
//maxvalue表示最大频数,两者之比再乘以直方图最大高度,所以得到的便是相应高度。
//同时这样也起到了限制打印长度的作用
{
len = 1;
}
}
else
{
len = 0;
}
while (len > 0)
{
putchar('*');
len--;
}
putchar('\n');
}
if (overflow > 0)
{
printf("there are %d words >=%d\n",overflow,MAXNUMBER);
}
return 0;
}