gpt4 book ai didi

c - C 编程语言 (K&R) - 练习 1-13

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:14 25 4
gpt4 key购买 nike

这里的编程相对较新,我正在尝试学习 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 的给定值打印一个星号?

预先感谢您的帮助。

最佳答案

条件

if((len = wl[i] * MAXHIST / maxvalue) <= 0)
len = 1;

实际上永远不会小于零,因为它仅应用于正 wl[i]。如您所料,len 被规范化为最大数量的星号。请注意,在 if 语句本身中,(len = wl[i] * MAXHIST/maxvalue)。所以 len 只是规范化了。仅当归一化截断为零(因为这是整数除法对小于 1 的数字所做的),len 才会设置为 1。这只是确保至少为非零柱打印一个星号。

关于c - C 编程语言 (K&R) - 练习 1-13,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21632573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com