自己对输出直方图的理解;
至直方图的顶部开始判断数组里的值在那个位置是否需要打印*否则打印空格
然后继续直方图的下一行,重复判断是否需要打印
直到打印完直方图的最大值
不知道自己的理解对不对~
至直方图的顶部开始判断数组里的值在那个位置是否需要打印*否则打印空格
然后继续直方图的下一行,重复判断是否需要打印
直到打印完直方图的最大值
不知道自己的理解对不对~
程序代码:
#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语言开始~我的计算机旅行~