#include <stdio.h>
#define LENGTH 10 /*规定,输出为直方图的单词数只能为LENGTH个*/
#define OUT 0 /*输入非字母时候的状态*/
#define IN 1 /*输入为字母时候的状态*/
/*
*该函数最基本的思想是,
*定义一个数组用于保存从第一个出现的单词到最后一个或者规定限度为止的单词的长度,
*定义一个变量用于保存最长的单词的长度。
*依据上面两个变量,打印出垂直直方图。
*主要的判断是,最长的单词长度变量依次减一一直减到零,
*在这一过程中,依次判断长度数组中每个单词与上面的自减量相比,
*当大于或等于这个变量的时候输出‘*’,当小于这个变量时,输出‘ ’。
*/
int main()
{
int wLengths [LENGTH]; /*用于依次保存单词长度的数组*/
for(int i = 0; i < LENGTH; i++)
{
wLengths[i] = 0;
}
int maxLength; /*用于保存最长单词的数组*/
short state; /*用于保存输入状态*/
short wl; /*用于计算字长的变量*/
int lIndex; /*用于计算数组的下标*/
int c; /*用于保存当前输入的字符*/
state = OUT; /*state的初始状态为没有输入字母*/
wl = 0;
lIndex = 0;
/*判断当输入的字符不为EOF时,则去判断当下的字符*/
while((c = getchar()) != EOF && lIndex < LENGTH)
{ /*当c是字母时,如果当前的输入状态为OUT,则改为IN。wl自增一位。*/
if((c <= 'z' && c >= 'a') || (c <= 'Z' && c > 'A'))
{
if (state == OUT) {
state = IN;
}
wl++;
} else /*当输入状态为IN时,说明刚刚结束一个字母的取值。保存当前wl的长度到数组中去,wl置0;状态改为OUT*/
{
if (state == IN)
{
wLengths[lIndex++] = wl;
if (maxLength < wl) {
maxLength = wl;
}
wl = 0;
}
state = OUT;
if (c == '\n') {
break;
}
}
}
/*现在得到了一个字长的数组wlengths[], 还有一个最大长度的字母
*用着两个变量打印直方图。
*/
for (int lenStep = maxLength; lenStep > 0; lenStep--)
{
for (int i = 0; i < LENGTH; i++)
{
if (wLengths[i] < lenStep)
{
printf(" ");
} else
{
printf("* ");
}
}
printf("\n");
}
/*长度不为0的输出作为直方图的下标*/
for(int i = 0; i < LENGTH; i++)
{
int wi = wLengths[i];
if (wi != 0)
{
printf("%d ", wLengths[i]);
}
}
return 0 ;
}
#define LENGTH 10 /*规定,输出为直方图的单词数只能为LENGTH个*/
#define OUT 0 /*输入非字母时候的状态*/
#define IN 1 /*输入为字母时候的状态*/
/*
*该函数最基本的思想是,
*定义一个数组用于保存从第一个出现的单词到最后一个或者规定限度为止的单词的长度,
*定义一个变量用于保存最长的单词的长度。
*依据上面两个变量,打印出垂直直方图。
*主要的判断是,最长的单词长度变量依次减一一直减到零,
*在这一过程中,依次判断长度数组中每个单词与上面的自减量相比,
*当大于或等于这个变量的时候输出‘*’,当小于这个变量时,输出‘ ’。
*/
int main()
{
int wLengths [LENGTH]; /*用于依次保存单词长度的数组*/
for(int i = 0; i < LENGTH; i++)
{
wLengths[i] = 0;
}
int maxLength; /*用于保存最长单词的数组*/
short state; /*用于保存输入状态*/
short wl; /*用于计算字长的变量*/
int lIndex; /*用于计算数组的下标*/
int c; /*用于保存当前输入的字符*/
state = OUT; /*state的初始状态为没有输入字母*/
wl = 0;
lIndex = 0;
/*判断当输入的字符不为EOF时,则去判断当下的字符*/
while((c = getchar()) != EOF && lIndex < LENGTH)
{ /*当c是字母时,如果当前的输入状态为OUT,则改为IN。wl自增一位。*/
if((c <= 'z' && c >= 'a') || (c <= 'Z' && c > 'A'))
{
if (state == OUT) {
state = IN;
}
wl++;
} else /*当输入状态为IN时,说明刚刚结束一个字母的取值。保存当前wl的长度到数组中去,wl置0;状态改为OUT*/
{
if (state == IN)
{
wLengths[lIndex++] = wl;
if (maxLength < wl) {
maxLength = wl;
}
wl = 0;
}
state = OUT;
if (c == '\n') {
break;
}
}
}
/*现在得到了一个字长的数组wlengths[], 还有一个最大长度的字母
*用着两个变量打印直方图。
*/
for (int lenStep = maxLength; lenStep > 0; lenStep--)
{
for (int i = 0; i < LENGTH; i++)
{
if (wLengths[i] < lenStep)
{
printf(" ");
} else
{
printf("* ");
}
}
printf("\n");
}
/*长度不为0的输出作为直方图的下标*/
for(int i = 0; i < LENGTH; i++)
{
int wi = wLengths[i];
if (wi != 0)
{
printf("%d ", wLengths[i]);
}
}
return 0 ;
}