C程序设计语言——例子1.13

这段C程序设计了一个直方图生成器,能够根据输入的单词长度绘制垂直直方图。程序首先定义了一个数组存储单词长度,然后通过读取输入的字符计算单词长度,并找出最长的单词。在直方图绘制部分,程序遍历每个单词长度,根据最长长度自减进行星号打印。最后,输出每个单词的原始长度。
摘要由CSDN通过智能技术生成
#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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值