题目
题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过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
想法
这个题有点意思啊,折腾我好长时间。
首先就是接收字符串,然后用桶算法统计每个字母出现的次数。
接着,找出出现最多的字母的次数,将这个最大值作为参照。从上到下输出。
该题有两个坑点:
- 数组尽量开大点
- 每一行最后一个
*
之后不能有空格。
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
char a[100];
int count[26]={0};
int l;
for(int j=0;j<4;j++){
gets(a);
l = strlen(a);
for(int i=0;i<l;i++){
if(a[i] == 32)continue;
if(a[i]>='A' &&a[i]<='Z')
count[a[i] - 65]++;
}
}
int maxn = count[0];
for(int i=0;i<26;i++){
if(count[i]>maxn){
maxn = count[i];
}
}
int end = 0;
for(int j=0;j<maxn;j++){
for(int k=25;k>0;k--){
if(count[k] >= maxn - j ){
end = k;
break;
}
}
for(int i=0;i<26;i++){
if(i>end)break;
if(count[i]<(maxn-j))cout<<" ";
else{
cout<<"*";
}
cout<<" ";
}
cout<<endl;
}
for(int i=0;i<26;i++){
cout<<(char)(i+65);
if(i!=25){cout<<" ";}
}
}