You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中实现水平直方图与垂直直方图的打印?

在C语言中实现水平和垂直直方图

嘿,我来帮你搞定C语言里的水平和垂直直方图!这是个练手的好题目,咱们分两种情况一步步拆解实现。

一、水平直方图

水平直方图的思路特别直接:先统计出每个类别(比如字符、数字或者数组元素)的出现次数,然后针对每个类别,打印对应次数的符号(比如*)就能搞定。

示例:统计输入小写字母的频率并打印水平直方图

比如我们统计用户输入的小写字母(a-z)出现次数,输出对应的水平直方图:

#include <stdio.h>
#include <ctype.h>

int main() {
    int count[26] = {0}; // 初始化每个字母的计数为0
    char c;

    // 读取输入,直到遇到EOF(Windows按Ctrl+Z,Linux按Ctrl+D结束输入)
    while ((c = getchar()) != EOF) {
        if (islower(c)) {
            count[c - 'a']++; // 把字母转换成0-25的索引,对应数组位置计数
        }
    }

    // 打印水平直方图
    printf("水平直方图(字母出现次数):\n");
    for (int i = 0; i < 26; i++) {
        if (count[i] == 0) continue; // 跳过没有出现过的字母
        printf("%c: ", 'a' + i);
        for (int j = 0; j < count[i]; j++) {
            printf("*"); // 每个*代表一次出现
        }
        printf(" (%d)\n", count[i]); // 末尾标注具体次数
    }

    return 0;
}

代码小说明:

  • 用大小为26的数组count对应a-z的计数,通过c - 'a'把字母转换成数组索引,这个小技巧很实用。
  • 用islower()过滤非小写字母,避免统计无关字符。
  • 最后遍历数组,只打印有计数的字母,让输出更整洁。

二、垂直直方图

垂直直方图相对麻烦一点,核心是要从最高的“柱子”开始往下逐行打印,每一层检查每个类别是否达到当前高度,达到就打印符号,否则打印空格占位。

示例:统计小写字母频率并打印垂直直方图

#include <stdio.h>
#include <ctype.h>

int main() {
    int count[26] = {0};
    char c;
    int max_count = 0; // 记录出现次数最多的字母的次数,也就是最高柱子的高度

    // 第一步:统计次数,同时找到最大计数
    while ((c = getchar()) != EOF) {
        if (islower(c)) {
            int index = c - 'a';
            count[index]++;
            if (count[index] > max_count) {
                max_count = count[index];
            }
        }
    }

    // 第二步:从最高层往下逐行打印
    printf("垂直直方图(字母出现次数):\n");
    for (int i = max_count; i > 0; i--) { // 从最高高度开始,逐行递减
        for (int j = 0; j < 26; j++) {
            if (count[j] >= i) {
                printf("* "); // 当前高度有计数,打印*
            } else {
                printf("  "); // 没有的话打印空格,保证对齐
            }
        }
        printf("\n");
    }

    // 第三步:打印底部的字母标签
    for (int i = 0; i < 26; i++) {
        if (count[i] > 0) { // 只打印出现过的字母
            printf("%c ", 'a' + i);
        } else {
            printf("  ");
        }
    }
    printf("\n");

    return 0;
}

代码小说明:

  • 统计阶段顺便记录max_count,这是垂直打印的核心依据,决定了要打印多少行。
  • 外层循环从最高高度往下走,内层循环逐个检查字母计数是否达标,用空格保证柱子对齐。
  • 最后打印底部的字母标签,让直方图的对应关系更清晰。

你可以根据自己的需求修改统计的类别(比如数字、数组元素等),核心逻辑都是先统计次数,再根据水平/垂直的打印规则输出符号就行。

内容的提问来源于stack exchange,提问作者Nirmal DC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:12:25