C 打印输入中单词长度的直方图

导言中的题目,昨天我勉强算实现了输出,不过效果其实很糟糕,还是没有考虑今天发的那几个问题,下载好答案之后就看了看,题目意思也明白了:

原话:

编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易,垂直方向的直方图则要困难一些。

实际上,他是要统计,比如hello有5个字母,我只输入hello 那么5中就输出1,类似的hello world在5中就输出2

我当时实际上只是很简单的直方图了,而没有考虑本身,所以是个错误的答案。

同时我还在想,我怎么知道单词有多长呢——答案很好的解决了这个问题。

基本的内容我都加了注释了。

水平直方图:

#include <stdio.h>

#define MAXHIST 15  // 直方图的最大长度
#define MAXWORD 11  // 单词最大长度
#define IN 1
#define OUT 0

main(void)
{
    int c, i, nc, state;
    int len;        // 每个直方长度
    int maxvalue;    // 单词的最大值
    int ovflow;     //  溢出单词的个数
    int wl[MAXWORD]; // 单词长度统计

    state = OUT;
    nc = 0;         // 单词中的字符数;
    ovflow= 0;     // 单词 >= 最大单词 的个数
    for (i = 0; i < MAXWORD; ++i)
        wl[i] = 0;  // 设定初值
    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\n' || 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) {
            // 1 设定len的长度 2 如果len存在但过小会被舍去小数部分,故判断手动改为1
            if ((len = wl[i] * MAXHIST / maxvalue) <= 0)
                len = 1;
        } else
            len = 0;    // 如果遍历时为0
        while (len > 0) {
            putchar('*');   // 用 * 占位
            --len;
        }

        putchar('\n');
    }

    // 对超过限值的单词进行报告
    if (ovflow > 0)
        printf("There are %d words >= %d\n", ovflow, MAXWORD);
}

竖直直方图(其实还是横着一个个输出的):

#include <stdio.h>

#define MAXHIST 15
#define MAXWORD 11
#define IN 1
#define OUT 0

main(void)
{
    int c, i, j, nc, state;
    int maxvalue;       // 数组wl[]的最大值
    int ovflow;         // 超过最大长度的单词书
    int wl[MAXWORD];    // 单词长度计数

    state = OUT;
    nc = 0;             // 一个单词中的字符数量
    ovflow = 0;         // words >= MAXWORD 的数量
    for (i = 0; i < MAXWORD; ++i)
        wl[i] = 0;      // 给单词长度设定初值
    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\n' || 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 = MAXHIST; i > 0; --i) {     // 列数(从最大依次递减)
        for (j = 1; j < MAXWORD; ++j)   // 行数
        // i从最大值开始 如果满足这一行条件(> i) 则输出 * MAXHIST / maxvalue相当于设定百分比
            if (wl[j] * MAXHIST / maxvalue >= i)
                printf("%4c", '*');
            else
                printf("%4c", ' ');
            putchar('\n');
    }
    for (i = 1; i < MAXWORD; ++i)
        printf("%4d", i);
    putchar('\n');
    for (i = 1; i < MAXWORD; ++i)
        printf("%4d", wl[i]);
    putchar('\n');
    if (ovflow > 0)
        printf("There are %d words >= %d\n", ovflow, MAXWORD);

    return 0;
}

注释部分看完水平再看竖直基本上就能明白整个程序什么意思了,竖直方向可以看成是一个直角坐标系。printf("%4c", '*');原来的答案并非这么写,而是用空格填满,可是- -不晓得多少个空格我对不准…………

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 成品, 源码, 题目

添加新评论