题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过100个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入格式
四行字符,由大写字母组成,每行不超过100个字符
输出格式
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
输入输出样例
输入 #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<iostream>
#include<string>
using namespace std;
int main()
{
string str;
int a[30]={0};
for(int i = 0; i < 4; i ++) //统计四次
{
getline(cin,str); // 输入一行
for(int i = 0; i < str.size();i++)
{
if(str[i] > 64 && str[i] < 91) //是大写字母
{
a[str[i] - 'A' + 1] ++ ; //对应的A存入数组a中次数
//数组从下标1开始计数
}
}
}
// for(int i = 1; i <= 26;i++) cout << a[i] << " "; //检查统计是否正确
int maxn = 0;
for(int i = 1;i <= 26; i++) maxn = max(a[i],maxn); //记录最大数
char b[maxn+1][27+1] = {'|'};
for(int j = 1;j <= 27 ; j ++ ) //列
{
for(int i = maxn; i > maxn - a[j];i -- ) // 行 从下向上
{
b[i][j] = '*';
}
for(int i = maxn - a[j]; i >= 0 ; i--)
{
b[i][j] = ' ';
}
} //存入完成
int c[maxn]={0};
for(int i = 0;i <= maxn ; i++ ) //遍历每行
{
for(int j = 27; j >= 1 ; j -- ) //倒叙遍历直到出现第一个 *
{
if(b[i][j] == '*')
{
c[i] = j; //记录最后一个* 的位置
break; //结束内循环
}
}
}
// for(int i = 0;i <= maxn;i++) cout << c[i] << " ";
// cout<<endl;
for(int i = 0;i <=maxn ; i++ )
{
for(int j = 1; j <= c[i] ; j ++ )
{
if(j!=c[i])
// printf("%c ",b[i][j]);
cout << b[i][j] << " ";
else
// printf("%c\n",b[i][j]);
cout << b[i][j] << endl;
}
}
cout << "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" << endl;
return 0;
}