习题1-13(垂直方向直方图:编写一个程序打印输入中单词长度的垂直方向的直方图。
View Code
1 #include
2 #define IN 1 /* 在单词内部 */
3 #define OUT 0 /* 在单词外部 */
4 #define MAXLEN 15 /* 单词的最大长度 */
5 #define MAXHIST 15 /* 直方图的最大长度 */
6 #define MAXWORD 100 /* 限制输入单词的上限 */
7
8 int wl[MAXWORD]; /* 用于存放单词长度的数组 */
9
10 /* 打印垂直方向的直方图 */
11 void main(
12 {
13 char c;
14 int i, j;
15 int len = 0; /* 当前单词的长度 */
16 int wc = 0; /* 统计单词的个数 */
17 int state = OUT; /* 状态初始化为在单词外部 */
18 int maxvalue; /* 单词中最大长度 */
19 for (int k=0; k
20 wl[MAXWORD] = 0; /* 数组进行初始化 */
21 while ((c=getchar( != EOF {
22 if (c == ' ' || c == '\t' || c == '\n' {
23 if (state == IN {
24 if (len > MAXLEN
25 len = MAXLEN;
26 wl[++wc] = len;
27 }
28 len = 0;
29 state = OUT;
30 } else if (state == OUT {
31 state = IN;
32 len++;
33 } else
34 len++;
35 }
36 if (wc < 1 {
37 printf("no words!\n";
38 return;
39 }else if (wc > MAXWORD
40 wc = MAXWORD;
41 maxvalue = 0;
42 for (i=1; i<=wc; i++ {
43 if (wl[i] > maxvalue
44 maxvalue = wl[i];
45 }
46 /* 实现垂直直方图 */
47 for (i=MAXHIST; i>0; --i {
48 for (j=1; j<=wc; j++
49 if (wl[j] % MAXHIST >= i {
50 printf(" * ";
51 } else
52 printf(" ";
53 putchar('\n';
54 }
55 for (i=1; i<=wc; i++
56 printf(" %d ", wl[i];
57 putchar('\n';
58 }
RT:
垂直直方图和水平直方图程序在统计单词个数之前都是一致的,垂直直方图使用另外一种处理方式。
习题1-14:编写一个程序,打印输入中各个字符出现频度的直方图。
View Code
1 #include
2 #include
3 #define MAXHIST 15 /* 直方图长度上限 */
4 #define MAXCHAR 128 /* 出现的字符上限 */
5
6 /* 统计输入中各个字符的直方图 */
7 void main(
8 {
9 char c;
10 int i;
11 int charlen; /* 字符出现的频度 */
12 int ch[MAXCHAR]; /* 保存所有字符的数组 */
13 for (i = 0;i < MAXCHAR; i++
14 ch[i] = 0;
15 while ((c=getchar( != EOF {
16 if (c < MAXCHAR
17 ++ch[c];
18 }
19 for (i = 1; i < MAXCHAR; ++i {
20 if (ch[i] > MAXHIST
21 ch[i] = MAXHIST;
22 }
23 /* 输出水平方向直方图 */
24 for (i = 1; i < MAXCHAR; ++i {
25 charlen = ch[i];
26 if (charlen < 1
27 continue;
28 if (isprint(i /* 可显示的字符 */
29 printf("%c %d\t", i, charlen;
30 else
31 printf(" %d\t", charlen;
32 while (ch[i] > 0 {
33 putchar('*';
34 --ch[i];
35 }
36 putchar('\n';
37 }
38