自己对输出直方图的理解;
至直方图的顶部开始判断数组里的值在那个位置是否需要打印*否则打印空格
然后继续直方图的下一行,重复判断是否需要打印
直到打印完直方图的最大值
不知道自己的理解对不对~
程序代码:
至直方图的顶部开始判断数组里的值在那个位置是否需要打印*否则打印空格
然后继续直方图的下一行,重复判断是否需要打印
直到打印完直方图的最大值
不知道自己的理解对不对~
程序代码:#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) { /* 循环最大直方图的次数 15 */
for (j = 1; j < MAXWORD; ++j) /* 每循环一次直方图次数,就循环一回数组的值。判断并输出*或空格,好打印出垂直的直方图 */
if (wl[j] * MAXHIST / maxvalue >= i) /* 这样可可以打印出一个 15*10 的直方图,每次输出一行输出15次 */
printf("*"); /* 这里的计算 是判断是否需要在一个位置输出*号 */
else /* 用单词长度数 × 直方图最大值 / 单词长度最大值 >= 直方图对应的行数 */
printf(" "); /* 大于行数就打印 * 否则打印空格 */
putchar('\n'); /* 在循环完10次后换行,在继续循环下一行 */
}
for (i = 1; i < MAXWORD; ++i)
printf("%d ", i);
putchar('\n');
for (i = 1; i < MAXWORD; ++i)
printf("%d ", wl[i]);
putchar('\n');
if (ovflow > 0)
printf("There are %d words >= %d\n", ovflow, MAXWORD);
}
电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~

