找到了答案,可是里面打印直方图的地方不理解它是如何运作的~~
程序代码:
#include <stdio.h>
#define MAXHIST 15 /* 直方图的最大长度 */
#define MAXWORD 11 /* 输入单词的最大长度 */
#define IN 1 /* 在一个单词内部 */
#define OUT 0 /* 在一个单词外部 */
main()
{
int c, i, j, nc, state;
int maxvalue; /* wl[] 数组里最大的值 */
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'){ /* 遇到空格,换行,Tab表示一个单词的结束 */
state = OUT;
if (nc > 0) /* 单词长度大于0 */
if (nc < MAXWORD) /* 长度小于最大值 */
++wl[nc]; /* 在相应的单词长度上加1 */
else
++ovflow; /* 大于最大值的单词加1 */
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 = MAXHIST; i > 0; --i) { /* 打印直方图 */
for (j = 1; j < MAXWORD; ++j)
if (wl[j] * MAXHIST / maxvalue >= i) /* 这条语句是什么原理? */
printf("*");
else
printf(" ");
putchar('\n');
}
for (i = 1; i < MAXWORD; ++i)
printf("%4d ", i);
putchar('\n');
for (i = 1; i < MAXWORD; ++i)
printf("%4d ", wl[i]);
putchar('\n');
if (ovflow > 0)
printf("There are %d words >= %d\n", ovflow, MAXWORD);
}
还有运行的结果,貌似也有点不对:
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
它的直方图,不是对应在相应的字符数上~不知道是哪里出了问题
for (i = MAXHIST; i > 0; --i) {
/* 打印直方图 */
for (j = 1; j < MAXWORD; ++j)
if (wl[j] * MAXHIST / maxvalue >= i)
/* 这条语句是什么原理? */
printf("*");
else
printf(" ");
putchar('\n');
}
还有这一个for循环输出直方图,可是不理解它是如何实现的。