《C程序设计语言》习题解 <二>

//练习1-13,编写一个程序,打印输入中单词长度的直方图.水平方向的直方图比较容易绘制,
//垂直方向的困难一些.(书中第17页)
//做这个练习之前最好能先弄懂直方图是什么
//首先,定义:
//n为某个长度单词出现的次数
//M为出现最频繁的长度的次数
//H为你所定义的直方图的最大长度
//那么所求的len = n * H / M
 
#include<stdio.h>
#include<string.h>
 
#define IN 0
#define OUT 1
#define MAXWORD 11
#define MAXHIST 15
 
int main()
{
  int c, i, j, nc, state;
  int len, maxvalue, ovflow;
  int wl[MAXWORD];
 
  state = OUT;
  nc = 0;
  ovflow = 0;
  memset(wl, 0, sizeof(wl));
  while((c = getchar()) != EOF)
    {
      if(c == '\n' || c == ' ' || c == '\t')
        {
          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];
        }
    }
  //垂直方向直方图 开始
  /*
     for(i = 1; i < MAXWORD; ++i)
     {
     printf("%5d - %5d : ", i, wl[i]);
     if(wl[i] > 0)
     {
     if((len = wl[i] * MAXHIST / maxvalue) <= 0)
     {
     len = 1;
     }
     while(len--)
     {
     putchar('*');
     }
     }
     putchar('\n');
     }
   */
  //垂直方向直方图 结束
 
  //水平方向直方图 开始
  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("%3d ", i);
    }
  putchar('\n');
  for(i = 1; i < MAXWORD; ++i)
    {
      printf("%3d ",wl[i]);
    }
  putchar('\n');
  //水平方向直方图 结束
 
  if(ovflow > 0)
    {
      printf("Here are %d words >= %d\n", ovflow, MAXWORD);
    }
  return 0;
}
//练习1-14,编写一个程序,打印输入中个字符出现频度直方图.(书中17页)
//这里只考虑小写字母,要一并统计答谢字母,只要扩大数组范围即可
#include<stdio.h>
#include<string.h>
 
#define MAXHIST 15
 
int main()
{
  int i,c,D[26];
  int maxvalue, len;
  memset(D, 0, sizeof(D));
  while((c = getchar()) != EOF)
    {
      c-='a';
      ++D[c];
    }
  maxvalue = 0;
  for(i = 0;i < 26;++i)
    {
      if(D[i] > maxvalue)
        {
          maxvalue = D[i];
        }
    }
  for(i = 0; i < 26; ++i)
    {
      printf("%c : ",i+'a');
      if((len = D[i] * MAXHIST / maxvalue) <= 0)
        {
          len = 1;
        }
      while(len--)
        {
          putchar('*');
        }
      putchar('\n');
    }
  return 0;
}
» 本博客采用署名 2.5 中国大陆许可协议进行许可,本文版权归作者所有,欢迎转载,但必须在明显位置给出原文连接。
anyShare分享到:
发表评论?

0 条评论。

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>