|
发表于 2013-2-8 19:58:38
|
显示全部楼层
- #include<stdio.h>
- #define MAXHIST 15
- #define MAXWORD 11
- #define IN 1
- #define OUT 0
- void main()
- {
- int c, i, nc, state;
- int len;
- int maxvalue;
- int ovflow;
- int wl[MAXWORD];
- state = OUT;
- nc = 0;
- ovflow = 0;
- for(i = 0; i < MAXWORD; ++i)
- {
- wl[i] = 0;
- }
- //输入遇到字母k的时候退出
- //依次扫描每个输入字符开始的时候置state为IN,
- //扫描到单词结尾的时候置state为OUT,此时nc为刚扫描完单词的长度
- while((c = getchar()) != 'k')
- {
- //出现以下三个字母的时候说明遇到新的单词了
- if(c == ' ' || c == '\n' || c == '\t')
- {
- //改变state状态兵根据nc保存必要的结果
- state = OUT;
- if(nc > 0)
- {
- if(nc < MAXWORD)
- {
- ++wl[nc];
- }
- else
- {
- ++ovflow;
- }
- }
- 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 = 1;i < MAXWORD; ++i)
- {
- printf("%5d - %5d :", i, wl[i]);
- if(wl[i] > 0)
- {
- //这里利用了一个简单的数学公式,最长行len总是MAXHIST
- //原因是最长行的wl[i]==maxvalue
- //这样按比例缩放出来的直方图好看些
- if((len = wl[i] * MAXHIST / maxvalue) <=0) //这条代码什么意思
- len = 1;
- }
- else
- {
- len = 0;
- }
- //假设前面if((len=...)<=0)中计算的len=10那么执行到这里,len的值还是10
- while(len > 0) //这里的len不是都只可以打印0或1吗
- {
- putchar('*');
- --len;
- }
- putchar('\n');
- }
- if(ovflow > 0)
- printf("There are %d words >= %d\n", ovflow , MAXWORD);
- }
复制代码 |
|