C/C++:实现一个柱状统计图
如果想要实现一个柱状统计图,其实有两点需要考虑:
- 数据的存储方式
- 数据的收集
- 数据的显示
我们以统计字符的个数为例子,进行说明。
首先是数据的存储方式,怎么存储最好呢?
C++的STL中有一个模板叫做map,就非常适合做数据收集的工作,我们进行如下定义:
map<char, int> mp;
char
表示字符类型,int
表示字符的个数。
看起来一点也不难!!
如何对数据进行收集呢?
我们可以使用 getchar()
说实话,我觉得这个函数是最适合计算机的输入方式!读取方式很好控制!
while((temp = getchar()) != EOF) {
if(temp <= 'Z' && temp >= 'A') {
mp[temp]++;
maxn = max(maxn, mp[temp]);
}
}
最后,就是数据的显示了,这也是最值得思考的地方,我记录了一个变量nmax,表示所有数据中,数量最大的数据,也就是表示了个数最多的字符(柱子最高)。这样我们可以便于我们动态显示柱状统计图的大小和高度。
代码如下:
#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;
}
运行效果如下:
输入:
AAAAAAAAAAjadlnkdaaSSSZSVCRVEHFHFBGH
XASXAXASXW NHNMUYGRBERBV fw EFWE E W E
#^HGT%%&$&^$HFGB>?HM>UJ:ACEACDACAE"F:"
1264131321f1ceqcECQE
cqc 4ef4qr54c4 q3 tyjruy45
BB
输出: