编写一个程序,打印输入中单词长度的直方图

#include<stdio.h>
#define MAXHIST 15
#define MAXWORD 11
#define IN 1
#define OUT 0

int main()
{
 int c, i, j, nc, state; //其中C用于计算单词长度,state用于判断是否在计算一个单词
 int len; //用于保存根据比例计算出来需要打印的个数结果
 int maxvalue; //保存最大单词数量
 int ovflow; //用于计算超过规定长度的单词数
 int wl[MAXWORD];

 state = OUT;
 nc = 0;
 ovflow = 0;
 for (i = 0; i < MAXWORD; i++) //wl用于统计各个长度的单词量
 {
  wl[i] = 0; //首先初始化数组,全设为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];
 }
# if 0 //水平直方图
 for (i = 1; i < MAXWORD; ++i)
 {
  printf("%5d-%5d:", wl[i]);
  if (wl[i] > 0)
  {
   if ((len = wl[i] * MAXHIST / maxval) <= 0)
    len = 1;
  }
  else
  {
   len = 0;
  }
  while (len > 0)
  {
   printf("*");
   --len;
  }
  putchar('\n')
 }
#else  //垂直直方图
 /*垂直直方图的思想在于从最大值开始遍历,由上往下,由左往右*/
 for (i = MAXHIST; i > 0; --i)
 {
  for (j = 1; j < MAXWORD; j++)
   if (wl[j] * MAXHIST / maxvalue > i)
    printf("*");
   else
    printf(" ");
  putchar('\n');
 }
 for (i = 1; i < MAXWORD; i++)
  printf("%4d", i);
 putchar('\n');
# endif
 if (ovflow > 0)
 {
  printf("There ar %d words>= %d\n", ovflow, MAXWORD);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值