题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过 100 100 100 个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入格式
四行字符,由大写字母组成,每行不超过 100 100 100 个字符
输出格式
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
样例输入
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
样例输出
*
*
* *
* * * *
* * * *
* * * * * *
* * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
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
提示
每行输出后面不允许出现多余的空格。
思路分析
这道题考查数组计数、根据数组元素值模拟绘出柱状图。难点是根据数组元素值模拟绘出柱状图。
由于输出的特点是:逐行输出。那么可以得出绘制柱状图步骤:
1、找出数组元素的最大值 mlen,mlen也就是柱状图中柱子的最大高度,也就是构成柱状图的
∗
*
∗的行数。
2、对于柱状图的每一行,遍历数组元素,当数组元素值达到当前行高度时,输出*,否则输出空格。一个双层循环嵌套就实现。
注意:因为题目要求“每行输出后面不允许出现多余的空格”,所以柱状图的最后一列要单独处理:在输出字符后,不能再添加空格。(目前洛谷的测试数据貌似不再检查每行最后是否有多余空格。不过,本文的参考代码仍然严格按题目要求编写。)
参考代码
#include<iostream>
#include<string>
using namespace std;
string s;
int slen, mlen;
int a[27];
int main() {
//读入4行字符串
for (int i = 1; i < 5; i++) { //分别处理每个字符串
getline(cin, s);
for (int j = 0; j < s.size(); j++) {
if (s[j] >= 'A' && s[j] <= 'Z') a[s[j] - 'A']++;
}
}
//找到出现次数的最大值
for (int i = 0; i < 26; i++)
mlen = max(a[i], mlen);
//从上到下逐行输出星号 *
for (int i = mlen; i > 0; i--) {
for (int j = 0; j < 25; j++) {
if (a[j] < i) cout << " ";
else cout << "* ";
}
//最后一列单独处理,因为题目要求“”每行输出后面不允许出现多余的空格。
if (a[25] < i) cout << " ";
else cout << "*";
//一行输出结果,换行
cout << endl;
}
//输出最后一行大写字母
for (int j = 'A'; j <= 'Y'; j++)
cout << char(j) << " ";
cout<<'Z';
return 0;
}