如何在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
相关产品推荐
相关产品推荐

