From: 《C程序设计语言》练习1-13 打印输入中单词长度的直方图
#include
#define OUT 0 // 在单词外
#define IN 1 // 在单词内
#define MAXLEN 10 // 单词最大长度
#define MAXWORD 100 // 单词最大个数
int wl[MAXWORD]; // word length 用于存放输入中每个单词对应的长度
/* 练习1-13 打印输入中单词长度的直方图 */
void main()
{
int i,j,c,state;
int len = 0; // 当前操作的单词长度
int wc; // word count 单词个数
wc = 0;
state = OUT; // 状态初始化,在单词外
for (i = 0; i < MAXLEN; i++)
wl[MAXLEN] = 0; // 初始化数组
while ((c = getchar()) != EOF)
{
if (c == ' ' || c == '\n' || c == '\t')
{
if(state == IN)
{
if (len >MAXLEN)
len = MAXLEN;
wl[++wc] = len;
}
len = 0; // 空格、制表符、换行的长度为0
state = OUT; // 遇到空格、制表符、换行,即为下一个单词,即在单词外
}
else if (state == OUT) // 除空格、制表符、换行,且在单词外
{
state = IN;
len++;
}
else // 除空格、制表符、换行,且在单词里
len++;
}
if (wc < 1)
printf("没有单词!\n");
else if (wc > MAXWORD)
wc = MAXWORD;
/* 水平直方图*/
printf("水平直方图如下:\n");
for (i = 1; i <= wc; i++)
{
if (i < 10)
printf(" %d: ",i);
else
printf("%d| ",i);
for (j = 1; j <= wl[i]; j++)
printf("*");
printf("\n");
}
printf("\n");
/* 垂直直方图 */
printf("垂直直方图如下:\n");
printf(" ^\n"); // 建立坐标轴
printf(" |\n");
for (i = MAXLEN; i > 0; i--)
{
if (i < 10) // 建立坐标轴
printf(" %d|",i);
else
printf("%d|",i);
for (j = 1; j <= wc; j++) // 画直方图
if (wl[j] % MAXLEN >= i)
printf(" * ");
else
printf(" ");
printf("\n");
}
// 建立坐标轴
printf(" 0 - - - - - - - - - - ->\n");
printf(" 1 2 3 4 5 6 7 8 9 1\n");
printf(" 0\n");
printf("\n");
}
运行结果:
Tips:
1、难点在于垂直方向的直方图。
for (j = 1; j <= wc; j++) // 画直方图 !!!
if (wl[j] % MAXLEN >= i)
printf(" * ");
else
printf(" ");
printf("\n");
if (wl[j] % MAXLEN >= i)
printf(" * ");
else
printf(" ");
printf("\n");
2、注意对边界情况的处理,这点比较容易遗忘。比如wc < 1 、wc > MAXWORD、len > MAXLEN