《C程序设计语言》练习1-13
题目:编写一个程序,打印输入中单词长度的直方图。
#include <stdio.h>
#include <stdlib.h>
#define IN 1
#define OUT 0
#define MAXHIST 15//直方图的长度
#define MAXLEN 11//含有某长度单词个数的最大数
int i, j;
int wl[MAXLEN];//存储长度为MAXLEN的单词的个数
int maxlen = 0;//实际中,单词长度含有个数最多的数
char c;
int state = OUT;
int overflow = 0;//超过设置的最长单词长度的个数
int len;//单词长度
int length;//单词个数在直方图里表示的长度
/*单词长度的水平直方图*/
void horizontal(int wl[], int maxlen)
{
for(i = 1; i < MAXLEN; i++){
printf("%3d - %d: ", i, wl[i]);
length = wl[i] * MAXHIST / maxlen;
if(wl[i] != 0 && length == 0){/*这个地方课本答案给了wl[i]<0的情况,我和小伙伴讨论后,认为不存在<0的情况*/
length = 1;
}
while(length > 0){
printf("*");
length--;
}
putchar('\n');
}
printf("have %d words, its length > %d \n", overflow, MAXLEN);
}
//垂直方向的直方图
void vertical(int wl[], int maxlen)
{
for(i = MAXHIST; i > 0; i--){
for(j = 1; j < MAXLEN; j++){
length = wl[j] * MAXHIST / maxlen;
if(length >= i)
printf(" * ");
else
printf(" ");
}
putchar('\n');
}
for(i = 1; i < MAXLEN; i++)
printf(" %d ", i);
putchar('\n');
for(i = 1; i < MAXLEN; i++)
printf(" %d ", wl[i]);
putchar('\n');
if(overflow > 0)
printf("There are %d words, its length >= %d\n", overflow, MAXLEN);
}
int main()
{
//给单词长度为i的单词个数赋初值
for(i = 0; i < MAXLEN; i++)
wl[i] = 0;
//输入
while((c = getchar()) != EOF){
if(c == ' ' || c == '\n' || c == '\t'){
if(state == IN)//结束单词
{
if(len > 0 && len <= MAXLEN)
wl[len]++;
else if(len > MAXLEN)
overflow++;
state = OUT;
len = 0;
}
}
else if(state == OUT){//开始新单词
len = 1;
state = IN;
}
else if(state == IN){//在单词内部
len++;
}
}
//找出相同单词长度含有最多的数量
for(i = 1; i < MAXLEN; i++){
if(wl[i] > maxlen)
maxlen = wl[i];
}
horizontal(wl, maxlen);
printf("\n\n");
vertical(wl, maxlen);
return 0;
}