C语言统计输入字符各字母频率并生成直方图

半杯拿铁
半杯拿铁
发布时间:2026-10-13| 6人浏览过
原创

本文介绍在C语言环境中,如何编写程序计算用户输入的字符序列里各个字母(不区分大小写)的出现次数,并将统计结果以二维直方图的形式展示出来。该方法主要依赖字符集函数进行标准化,并利用数组下标特性简化遍历逻辑。

核心算法逻辑

第1步:初始化环境与读取输入

首先定义一个长度为26的整数数组来存储a~z的频次,并在程序启动时将所有元素清零。随后进入一个循环,从标准输入流中逐个读取字符,直到遇到文件结束标志(EOF)。对于每一个读入的字符,需要判断其是否为有效字母,这一步通常借助标准库中的isalpha()函数完成。

第2步:统一大小写与索引映射

为了统一步调,在确定字符为字母后,将其全部转换为小写。这里推荐使用ctype.h头文件提供的tolower()函数处理大写转小写的操作。接着,利用字符的ASCII码特性构建数组索引:将当前小写字母减去字符'a'的ASCII值,即可得到该字母在0到25之间的偏移量,以此作为数组下标对对应的计数器执行加一操作。

if (isalpha(c)) {
    c = tolower(c);
    ++char_count[c - 'a'];
}

第3步:寻找最大值确定图表高度

为了准确绘制直方图的高度(即行数),需要预先遍历整个计数数组,找出其中记录的最大数值。将这个最大值赋给控制外层循环次数的变量,确保输出的图表能够容纳出现频率最高的那个字母,不会出现数据溢出或截断的情况。

int max = 0;
for (x = 0; x < 26; x++) {
    if (char_count[x] > max) {
        max = char_count[x];
    }
}

第4步:循环绘制直方图

绘制过程采用双重循环结构:
- 外层循环:负责打印直方图的每一行。循环次数由之前求得的最大频次决定,自上而下递减。
- 内层循环:负责处理当前这一行的26个字母位置。比较当前统计到的频次是否大于等于当前的行高阈值,若是则在控制台输出代表柱体的符号(如字符x),否则输出空格。

for (; max > 0; max--) {
    for (x = 0; x < 26; x++) {
        if (char_count[x] >= max) {
            putchar('x');
        } else {
            putchar(' '); // 补充原代码缺失的空格输出以便排版
        }
    }
    putchar('\n');
}

第5步:输出横坐标标识

直方图底部的横轴需要标明每个柱体具体代表的字母。通过在循环中使用putchar('a' + x),可以依次打印出a、b、c……直至z,帮助用户直观对应每一列的频率含义。

完整的程序代码如下:

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

int main() {
    int x, max;
    int char_count[26];
    char c;

    // 1. 清零数组
    for (x = 0; x < 26; x++) char_count[x] = 0;

    // 2. 读取输入并统计
    while ((c = getchar()) != EOF) {
        if (isalpha(c)) {
            c = tolower(c);
            ++char_count[c - 'a'];
        }
    }

    // 3. 寻找最高频率
    max = 0;
    for (x = 0; x < 26; x++) {
        if (char_count[x] > max) {
            max = char_count[x];
        }
    }

    // 4. 打印直方图
    for (; max > 0; max--) {
        for (x = 0; x < 26; x++) {
            if (char_count[x] >= max) {
                putchar('x');
            } else {
                putchar(' ');
            }
        }
        putchar('\n');
    }

    // 5. 打印底部标签
    for (x = 0; x < 26; x++) {
        putchar('a' + x);
    }
    putchar('\n');

    return 0;
}

总结

这段代码展示了如何利用字符编码规律(减法求偏移)替代复杂的条件分支来判断,极大提升了代码的效率与可读性。以上就是C语言统计输入字符各字母频率的代码实现,更多关于C语言基础编程技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。