垂直柱状图
题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过 \(100\) 个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入格式
四行字符,由大写字母组成,每行不超过 \(100\) 个字符
输出格式
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
样例 #1
样例输入 #1
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
样例输出 #1
*
*
* *
* * * *
* * * *
* * * * * *
* * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
提示
每行输出后面不允许出现多余的空格。
作答
#include <bits/stdc++.h>
using namespace std;
int main() {
map<char, int> myMap;
string line;
int lineCount = 0;
// 读取输入的四行数据
while (getline(cin, line) && lineCount < 4) {
for (char ch : line) {
if (isalpha(ch) && isupper(ch)) { // 只统计大写字母
myMap[ch]++;
}
}
lineCount++;
}
// 找到最大频率
int maxCount = 0;
for (char i = 'A'; i <= 'Z'; i++) {
maxCount = max(maxCount, myMap[i]);
}
// 输出柱状图
for (int i = maxCount; i > 0; i--) {
bool first = true;
for (char j = 'A'; j <= 'Z'; j++) {
if (!first) cout << " ";
if (myMap[j] >= i) {
cout << "*";
} else {
cout << " ";
}
first = false;
}
cout << endl;
}
// 输出最后一行字母标签
for (char j = 'A'; j <= 'Z'; j++) {
if (j != 'A') cout << " ";
cout << j;
}
cout << endl;
return 0;
}