C语言:编写一个程序,打印输入中单词长度的直方图。
- C/C++
- 2015-03-11
- 174热度
- 0评论
第2版《C程序设计语言》,P17,练习1-13:编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的直方图则要困难些。
此题咋一看比较简单,而且也不难得出思路。难的是根据清晰的思路写出代码,并且写出漂亮的代码。所以这道题还是做了很久,并且参考了书上的解答。
我的代码(水平方向的直方图):
#include <stdio.h>
# define MAXHIST 15
# define MAXWORD 11
# define IN 1
# define OUT 0
main()
{
int n, i, c, nc, ovflow, state;
int wl[MAXWORD];
nc = 0;
ovflow = 0;
state = OUT;
for (i = 0; i < MAXWORD; ++i)
wl[i] = 0;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\n' || c == '\t') {
if (state == IN) {
if (nc > MAXWORD)
++ovflow;
else
++wl[nc - 1];
state = OUT;
nc = 0;
}
}
else {
++nc;
if (state == OUT)
state = IN;
}
}
for (i = 0; i < MAXWORD; ++i) {
printf("%3d-%3d : ", i+1, wl[i]);
for (n = 0; n < wl[i] && n < MAXHIST; ++n)
putchar('*');
putchar('\n');
}
if (ovflow > 0)
printf("超过长度限制的单词个数为%d\n", ovflow);
return 0;
}
书上的代码:
#include <stdio.h>
# define MAXHIST 15 /* max length of histogram */
# define MAXWORD 11 /* max length of a word */
# define IN 1 /* inside a word */
# define OUT 0 /* outside a word */
/* print horizontal historgram */
main()
{
int c, i, nc, state;
int len; /* length of each bar */
int maxvalue; /* maximum value for wl[] */
int ovflow; /* number of overflow words */
int wl[MAXWORD]; /* word length counters */
state = OUT;
nc = 0; /* number of chars in a word */
ovflow = 0; /* number of words >= MAXWORD */
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; /* beginning of a new word */
} else
++nc; /* inside a word */
}
maxvalue = 0;
for (i = 1; i < MAXWORD; ++i)
if (wl[i] > maxvalue)
maxvalue = wl[i];
for (i = 1; i < MAXWORD; ++i) {
printf("%dd - %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);
}
书中的此题主要是演示数组的使用。过于细节的地方不必深究。