gpt4 book ai didi

c - 如何用比例而不是原始数字显示文本直方图

转载 作者:行者123 更新时间:2023-12-01 12:45:14 27 4
gpt4 key购买 nike

来自 K&R C 答案书练习 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.


我能够制作水平直方图。问题是我的程序为每个给定长度的单词数量打印了一个“X”,而在书中它进行了某种计算来显示每个给定长度的单词数量与其余单词的比率。
首先是我的程序:
#include <stdio.h>
#define MAXLENGTH 10
#define BORDERLENGTH 50

int main()
{
int i, j, c, count;
int ccount[MAXLENGTH];

count = 0;

for (i = 0; i < MAXLENGTH; ++i)
ccount[i] = 0;
while ((c = getchar()) != EOF){
if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
++count;
else if (count != 0){
++ccount[count - 1];
count = 0;
}
}
for (i = 0; i < BORDERLENGTH; ++i)
printf("-");
printf("\n");
count = 0;
for (i = 1; i <= MAXLENGTH; ++i){
printf("%2d|", i);
for (j = 0; j < ccount[count]; ++j )
printf("x");
++count;
printf("\n");
}
for (i = 0; i < BORDERLENGTH; ++i)
printf("-");

getchar();
return 0;
}
请注意,我已将单词定义为任何数字或字母顺序,它们之间或之后没有任何标点符号。
再次注意,我的程序输出 x 个“X”,其中 x 是每个给定字长的字数。考虑到练习的要求,我的输出方法是否会被认为是正确的?我对直方图甚至是什么都不太熟悉。
现在这是书中的程序:
#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);

getchar();
return 0;
}
请注意,该程序定义了一个词与我所做的不同。它还包含溢出检查。我感到困惑的部分是:
if (wl[i] > 0){
if ((len = wl[i] * MAXHIST / maxvalue) <= 0)
len = 1;
}
else
len = 0;
那是什么 wl[i] * MAXHIST / maxvalue if中的计算从数学的角度来看,陈述是做什么的?它如何创建单词之间的比例。这是一个众所周知的公式吗?

最佳答案

此计算将值标准化以在直方图中显示它们。该程序设置为始终将计数最高的单词显示为 MAXHIST (即 15 个)星号,无论计算了多少个单词。这样做是为了避免产生多行星号的直方图。

例如,如果您的文件包含 200 个单词,其中 150 个长度为 4,其余 50 个长度为 2,则直方图将显示 15 *四字母单词的字符,以及 5 *两个字母的单词的字符。如果给该程序一个包含 2000 个单词的文件,其中 1500 个有 4 个字母,500 个有 2 个字母,则生成的直方图将完全相同。

请注意,如果以简单的方式应用此方案会产生不正确的结果:例如,如果您的文件包含 3000 个四字母单词和只有一个两字母单词,则将 3000 标准化为 15 个字符将使星号的两单词行更少比一个字符宽。这就是为什么有一个 if条件表示如果计数不为零,则必须至少打印一个星号。

关于c - 如何用比例而不是原始数字显示文本直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20785423/

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