C/C++:实现一个柱状统计图

C/C++:实现一个柱状统计图

如果想要实现一个柱状统计图,其实有两点需要考虑:

  • 数据的存储方式
  • 数据的收集
  • 数据的显示

我们以统计字符的个数为例子,进行说明。

首先是数据的存储方式,怎么存储最好呢?

C++的STL中有一个模板叫做map,就非常适合做数据收集的工作,我们进行如下定义:

c 复制代码
map<char, int> mp;

char表示字符类型,int表示字符的个数。

看起来一点也不难!!

如何对数据进行收集呢?

我们可以使用 getchar() 说实话,我觉得这个函数是最适合计算机的输入方式!读取方式很好控制!

c 复制代码
while((temp = getchar()) != EOF) {
    if(temp <= 'Z' && temp >= 'A') {
        mp[temp]++;
        maxn = max(maxn, mp[temp]);
    }
}

最后,就是数据的显示了,这也是最值得思考的地方,我记录了一个变量nmax,表示所有数据中,数量最大的数据,也就是表示了个数最多的字符(柱子最高)。这样我们可以便于我们动态显示柱状统计图的大小和高度。

代码如下:

c 复制代码
#include <bits/stdc++.h>
using namespace std;
map<char, int> mp;
int maxn;
int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    char temp;
    while((temp = getchar()) != EOF) {
        if(temp <= 'Z' && temp >= 'A') {
            mp[temp]++;
            maxn = max(maxn, mp[temp]);
        }
    }
    for (int i = 1; i <= maxn; i++) {
        for (char j = 'A'; j <= 'Z'; ++j) {
            if (mp[j] >= maxn - i + 1) {
                cout << "*";
            } else {
                cout << ' ';
            }
            if(j != 'Z') cout << ' ';
        }
        cout << '\n';
    }
    for (char i = 'A'; i <= 'Z'; ++i) {
        cout << i;
        if(i != 'Z') cout << ' ';
    }
    cout << endl;
    return 0;
}

运行效果如下:

输入:

txt 复制代码
AAAAAAAAAAjadlnkdaaSSSZSVCRVEHFHFBGH
XASXAXASXW NHNMUYGRBERBV fw EFWE E W E
#^HGT%%&$&^$HFGB>?HM>UJ:ACEACDACAE"F:"
1264131321f1ceqcECQE
cqc 4ef4qr54c4 q3 tyjruy45
BB

输出:

相关推荐
yugi98783841 分钟前
基于C#实现数字识别率的OCR方案
开发语言·c#·ocr
小七在进步41 分钟前
数据结构:线性表之单链表
c语言·数据结构
星越华夏44 分钟前
python中四种获取文件后缀名的方法
开发语言·python
鱼子星_1 小时前
【数据结构】排序的拓展——快速排序的生态多样性与归并排序沾染文件操作
c语言·数据结构·算法
javajenius1 小时前
Pixi:用 Rust 重写 Conda 体验的包管理工具
开发语言·其他·rust·conda
神明不懂浪漫1 小时前
【第二章】Java中的数据类型,运算符与程序逻辑控制
java·开发语言·经验分享·笔记
laowangpython1 小时前
tokio-rstracing:Rust 可观测性的标准答案
开发语言·后端·其他·rust
傻啦嘿哟1 小时前
为什么Python没有块级作用域?
开发语言·python
技术小结-李爽1 小时前
【工具】Shell之Bash、Zsh配置文件的使用
开发语言·bash
kyle~1 小时前
机器人日志系统
c++·单片机·嵌入式硬件·机器人·ros2