【发布时间】:2014-02-07 16:12:44
【问题描述】:
这里的编程相对较新,我正在尝试通过第二版 K&R 的“C 编程语言”。我有练习题的答案,但我在练习 1-13 上被卡住了,所以我看了一下它以获得一个想法。
任务是这样的:“编写一个程序来打印其输入中单词长度的直方图。用水平条绘制直方图很容易;垂直方向更具挑战性。”
而答卷中给出的代码如下:
#include <stdio.h>
#define MAXHIST 15
#define MAXWORD 11
#define IN 1
#define OUT 0
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;
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;
}
putchar('\n');
}
if (ovflow > 0)
printf("There are %d words >= %d\n", ovflow, MAXWORD);
return 0;
}
我可以理解其中的绝大多数,但是这个特定的部分给我带来了麻烦:
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;
}
putchar('\n');
}
现在,我了解到 if 函数 if((len = wl[i] * MAXHIST / maxvalue) <= 0) 正在规范化数组中的值。我不明白的是它设置了len = 1。如果len 始终为1,那么putchar('*') 函数不应该只为大于0 的任何给定值打印一个星号吗?
提前感谢您的帮助。
【问题讨论】:
-
程序流到达
len = 1;的唯一时间是当分母maxvalue变得大于分子wl[i] * MAXHIST时,由于特定字长的高频率。a a a a a a a a a a a a a a a a so(16 个字长为 1,1 个字长为 2)就是这种情况的一个例子。
标签: c