如何实现printf垂直输出?字符统计结果垂直打印技巧求助
字母统计结果的垂直柱状输出实现方案
你现有代码实现了读取输入并统计每个字母出现次数的功能,但使用了26个单独变量,后续输出垂直柱状图可以按以下思路优化并实现:
原始代码
#include <stdio.h> #include <ctype.h> int main() { int c1; int a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, j=0, k=0, l=0, m=0, n=0, o=0, p=0, q=0, r=0, s=0, t=0, u=0, v=0, w=0, x=0 , y=0, z=0; while (( c1=getchar()) != EOF) if (isalpha(tolower(c1)) != 0) { if (tolower(c1) == 97) { // Character = 'a' a += 1; } else if (tolower(c1) == 98) { // Character = 'b' b += 1; } else if (tolower(c1) == 99) { // Character = 'c' c += 1; } . . . } return 0; }
需求说明
将统计结果以垂直柱状图形式输出,例如输入ABC---Ddhhh时,输出:
* * * **** * abcdefghijklmnopqrstuvwxyz
实现思路
- 优化计数存储:用长度为26的数组替代26个单独变量,索引0对应字母
a,25对应z,统计时通过tolower(c1) - 'a'直接获取索引,简化代码逻辑。 - 确定最大计数:遍历计数数组找到最大值,这是垂直柱状图的最高行数。
- 逐行绘制柱状图:从最高行到第1行依次遍历,对每个字母的计数,若当前行高度小于等于该字母的计数则输出
*,否则输出空格,保证每列对齐。 - 输出底部字母行:最后输出连续的
a-z字符串,作为柱状图的横轴标签。
修改后的完整代码
#include <stdio.h> #include <ctype.h> int main() { int c1; int counts[26] = {0}; // 数组存储每个字母的计数,索引0对应a,25对应z // 读取输入并统计字母出现次数 while ((c1 = getchar()) != EOF) { if (isalpha(c1)) { int index = tolower(c1) - 'a'; // 转换为小写后计算索引 counts[index]++; } } // 找到最大计数,确定柱状图的最高行数 int max_count = 0; for (int i = 0; i < 26; i++) { if (counts[i] > max_count) { max_count = counts[i]; } } // 逐行输出柱状图 for (int row = max_count; row > 0; row--) { for (int i = 0; i < 26; i++) { printf(counts[i] >= row ? "*" : " "); } printf("\n"); } // 输出底部的字母行 for (int i = 0; i < 26; i++) { printf("%c", 'a' + i); } printf("\n"); return 0; }
代码说明
- 计数优化:数组
counts替代零散变量,避免大量if-else判断,代码更简洁易维护。 - 最大计数获取:遍历数组找到最高柱子的高度,确保垂直输出能覆盖所有统计结果。
- 垂直输出逻辑:从最高行开始逐行绘制,通过判断计数与行号的关系输出星号或空格,实现垂直柱状效果。
- 字母行输出:通过循环生成
a-z字符串,与柱状图每列严格对齐。
内容的提问来源于stack exchange,提问作者user19159910
相关产品推荐
相关产品推荐

