lyf362345 发表于 2013-12-26 15:52

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

k&r 里的练习题 1-13,我自己写的:#include <stdio.h>

#define MAXLEN 15

int main()
{
        int c, len, ovflow;
        int chars;

        len = ovflow = 0;

        for (int i = 0; i < MAXLEN; ++i) {
                chars = 0;
        }

    while ((c = getchar()) != EOF) {
            if (c == ' ' || c == '\n' || c == '\t') {
                    ++chars;
                    len = 0;
            }
            else {
                    ++len;

                    if (len > MAXLEN) {
                            ++ovflow;
                            len = 0;
                    }
            }
    }

    for (int i = 1; i < MAXLEN; ++i) {
            printf("%02d | ", i);
            for (int j = 0; j < chars; ++j) {
                    printf("*");
            }
            printf("\n");
    }

    printf("OF | %d\n", ovflow);
}完事我看了下习题解答, 他是这样的写的:#define MAXHIST 15
#define MAXWORD 11
#define IN 1
#define OUT 0

int main()
{
    int c, nc, state, len, ovflow, maxvalue;
    int wl;

    // nc 单词长度
    // ovflow 大于最大字符长度(MAXWORD)的单词书
    // maxvalue wl下最长的一个
    nc = len = ovflow = maxvalue =0;
    state = OUT;

    for (int i = 0; i < MAXWORD; ++i) {
      wl = 0;
    }

    // 收集全部输入
    while ((c = getchar()) != EOF) {
      if (c == ' ' | c == '\n' || c == '\t') {
            state = OUT;

            if (nc > 0) {
                if (nc > MAXWORD) {
                  ++ovflow;
                }
                else {
                  ++wl;
                }
            }

            nc = 0;
      }
      else if (state == IN) {
            state = IN;
            nc = 1;
      }
      else {
            ++nc;
      }
    }

    // 找出最长的单词
    for (int i = 1; i < MAXWORD; ++i) {
      if (wl > maxvalue) {
            maxvalue = wl;
      }
    }

    for (int i = 1; i < MAXWORD; ++i) {
      printf("%5d - %5d : ", i, wl);
      if (wl > 0) {
            if ((len = wl * MAXHIST / maxvalue) <= 0) {
                len = 1;
            }
      }
      else {
            len = 0;
      }

      while (len > 0) {
            putchar('*');
            --len;
      }

      putchar('\n');
    }
}那种合适呢?

柠檬树庄园 发表于 2016-07-11 17:28

第二个例子,第一行少了一个include#include <stdio.h>23行有一个typo,应该是      if (c == ' ' || c == '\n' || c == '\t') {
页: [1]
查看完整版本: 编写一个程序,打印输入中单词长度的直方图