Tuesday, August 16, 2011

Exercise 1-13 (continued)

Exercise 1-13  Write a program to print a histogram of the lengths of words in its input.  (Vertical orientation).

#include <stdio.h>

  /* Don't make MAXLENGTH more than (the width of your terminal - 1)
     and don't make it more than 99 */

#define MAXLENGTH 20

int main(void)
{
  int c;
  unsigned int i;
  unsigned int length = 0;

  /* count[0] stores the number of words longer than MAXLENGTH. */

  unsigned int count[MAXLENGTH+1];

  for (i = 0; i <= MAXLENGTH; ++i)
    count[i] = 0;

  do
  {
    switch(c=getchar())
    {
    case ' ':
    case '\t':
    case '\n':
      if (length > 0)
      {
        if (length <= MAXLENGTH)
          count[length]++;
        else
          count[0]++;

        length = 0;
      }
      break;

    default:
      length++;
      break;
    }
  }
  while (c != EOF);

    /* The histogram will be as tall as the maximum length. */

  length = 0;

  for (i = 0; i < MAXLENGTH+1; ++i)
  {
    if (count[i] > length)
      length = count[i];
  }

  for ( ; length > 0 ; --length)
  {
    for (i=1 ; i < MAXLENGTH+1 ; ++i)
    {
      if (count[i] >= length)
        putchar('*');
      else
        putchar(' ');
    }

    if (count[0] >=length)
      putchar('*');

    putchar('\n');
  }

  for (i = 0; i <= ((MAXLENGTH >=10) ? MAXLENGTH+1 : MAXLENGTH) ; ++i)
    putchar('-');

  putchar('\n');

  for (i = 1; i <= MAXLENGTH; ++i)
  {
    if (i/10 > 0)
      printf("%d", i/10);
    else
      printf("%d", i);
  }

  if (MAXLENGTH/10 > 0)
    printf("%d", MAXLENGTH/10);
  else
    printf("%d", MAXLENGTH);

  putchar('\n');

  for (i = 1; i <= MAXLENGTH; ++i)
  {
    if (i/10 > 0)
      printf("%d", i%10);
    else
      putchar(' ');
  }

  if (MAXLENGTH/10 > 0)
    printf("%d", MAXLENGTH%10);

  printf("+\n");

  return 0;
}


No comments:

Post a Comment