打印输入中单词长度的直方图

   源于《The C Programming Language》P17 pr1-13:

  

   编写一个程序,打印输入中单词长度的直方图。

   代码

 

main.c
1 /**************************************************************
2 直方图定义:
3 n:某个长度单词出现的次数(长度为4的单词出现了9次,则n = 9)
4 M:出现最频繁的长度的次数
5 H:定义的直方图的最大长度(本例中为MAXHIST)
6 **************************************************************/
7
8 #include <stdio.h>
9
10  #define MAXHIST 15 //直方图的最大长度
11 #define MAXWORD 11 //单词的最大长度
12 #define IN 1 //在单词中
13 #define OUT 0 //在单词外
14
15 int main()
16 {
17
18 int c, i, nc, state; //nc:单词的长度
19 int len; //直方图中每个直方条的长度
20 int maxvalue; //wl数组的最大值
21 int ovflow; //长度大于或等于MAXWORD的单词的数量
22 int wl[MAXWORD]; //按单词长度值0~11,统计输入中各长度的单词数,存放在wl数组中
23
24 state = OUT;
25 nc = 0;
26 ovflow = 0;
27 for(i = 0; i < MAXWORD; ++i)
28 wl[i] = 0;
29
30 while((c = getchar()) != EOF)
31 if(c == ' ' || c == '\n' || c == '\t')
32 {
33 state = OUT;
34 if(nc > 0)
35 if(nc < MAXWORD)
36 ++wl[nc];
37 else
38 ++ovflow;
39 nc = 0;
40 }
41 else if(state == OUT)
42 {
43 state = IN;
44 nc = 1;
45 }
46 else
47 ++nc;
48
49 maxvalue = 0;
50 for(i = 1; i < MAXWORD; ++i)
51 if(wl[i] > maxvalue)
52 maxvalue = wl[i];
53 for(i = 1; i < MAXWORD; ++i)
54 {
55 printf("%5d - %5d : ", i, wl[i]);
56 if(wl[i] > 0)
57 {
58 if((len = wl[i] * MAXHIST / maxvalue) <= 0)
59 len = 1;
60 }
61 else
62 len = 0;
63 while(len > 0)
64 {
65 putchar('*');
66 --len;
67 }
68 putchar('\n');
69 }
70 if(ovflow > 0)
71 printf("there are %d words >= %d\n", ovflow, MAXWORD);
72
73 return 0;
74
75 }

 

   分析:

   1, 费了点时间读懂了题目,本题中的单词长度直方图的理解:

       错误:“单词 - 长度”模式

                例如: fuck       -       ****

                         teaching -       ********

                         i            -       *

                         good      -       ****

       正确:用直方图表示长度为n的单词数占总单词数的比例

   2, 用数组wl存储长度从1~10的单词的个数,如上例,wl[1] = 1, wl[4] = 2, wl[8] = 1

   3, len = wl[i] * MAXHIST / maxvalue; len:表示长度为i的单词数占总单词数的比例

posted on 2011-07-10 15:40  将军之盾  阅读(1146)  评论(0编辑  收藏  举报