#include<stdio.h>
#define MAXHIST 15
#define MAXWORD 11
#define IN 1
#define OUT 0
int main(void)
{
int c;
int i;
int j;
int nc = 0;//一个单词字母的个数
int state = OUT;
int maxvalue;
int ovflow = 0;
int wl[MAXWORD] = {
0
};
while((c = getchar()) != EOF )
{
if (c == ' ' || c == '\t' || c == '\n' )//有两种情况
{
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 = MAXHIST; i > 0; --i)
{
for (j = 1; j < MAXWORD; ++j)
if (wl[j] * MAXHIST / maxvalue >= i)//按比例来,最大的就是MAXHIST,就是15颗星。
printf(" * ");
else
printf(" ");
putchar('\n');
}
for ( i = 1; i < MAXWORD; ++i)
printf("%2d ", i); //字母数
putchar('\n');
for ( i = 1; i < MAXWORD; ++i)
printf("%2d ", wl[i]);//出现次数
putchar('\n');
if (ovflow > 0)
printf("There are %d words >= %d\n", ovflow, MAXWORD);
return 0;
}
在进行单词长度统计时,几种情况的逻辑要清晰。
把它分成了遇到空格时。
- 开始的无效空格
- 一个单词的结束空格
遇到字母时
- 单词的首字母
- 单词中的字母