描述
输入4行全部由大写字母组成的文本,输出一个垂直直方图,给出每个字符出现的次数。注意:只用输出字符的出现次数,不用输出空白字符,数字或者标点符号的输出次数。
输入
输入包括4行由大写字母组成的文本,每行上字符的数目不超过80个。
输出
输出包括若干行。其中最后一行给出26个大写英文字母,这些字母之间用一个空格隔开。前面的几行包括空格和星号,每个字母出现几次,就在这个字母的上方输出一个星号。注意:输出的第一行不能是空行。
样例输入
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
题目讲解:
首先读题分析得知,本题想要做的是统计字符串中每一个大写字母出现的次数,然后将该数据用垂直直方图的样式输出。
输入四行大写字母组成的文本,则需要我们输入四个字符串
#include <bits/stdc++.h>
using namespace std;
int main(){
string a;
cin>>a;
string b;
cin>>b;
string c;
cin>>c;
string d;
cin>>d;
}
然后将字符串中的字符逐个输出,以便于下一步的统计计算,用a.length()得到字符串的长度,字符串的输出方式与数组一样。a[0]为字符串a中的第一个字符,a[1]为字符串a中的第二个字符...
#include <bits/stdc++.h>
using namespace std;
int main(){
int an[26]={0};
string a;
cin>>a;
string b;
cin>>b;
string c;
cin>>c;
string d;
cin>>d;
for(int i=0;i<a.length();i++){
cout<<a[i];
}
}
然后需要统计各个大写字母出现的次数,一共有26个字母,此时定义一个数组an[26]用来保存每一个大写字母出现的次数,
当A出现时,将an[0]=0变为an[0]=1,
当B出现时,将an[1]=0变为an[1]=1,
以此类推
当A再次出现时,将an[0]=1变为an[0]=2。
所以总结规律为,
当A出现时,an[0]++
当B出现时,an[1]++,
利用字符与整型之间的转换关系
A-'A'=0 B-'A'=1...
当a[i]出现时,(a[i]可能是ABCD.....,),运行an[a[i]-'A']++。
剩下的bcd字符串同理。
#include <bits/stdc++.h>
using namespace std;
int main(){
int an[26]={0};
string a;
cin>>a;
string b;
cin>>b;
string c;
cin>>c;
string d;
cin>>d;
for(int i=0;i<a.length();i++){
an[a[i]-'A']++;
}
for(int i=0;i<b.length();i++){
an[b[i]-'A']++;
}
for(int i=0;i<c.length();i++){
an[c[i]-'A']++;
}
for(int i=0;i<d.length();i++){
an[d[i]-'A']++;
}
}
利用数组an[26]中得到的每一个大写字母的个数去显示垂直直方图。
按照从上到下的方式输出,先找到最大的数字去作为整个直方图的总层数。
int mx=0;//找26个数字当中的最大值
for(int i=0;i<26;i++){
mx=max(mx,an[i]);
}
假设最大的数字为10,则总层数是10 ,开始输出的则是10层,因为在上面的是最高层,A出现的次数为5次,则在字母A的上方输出的是空的,如果B 出现的次数为10次,在字母B上方输出的就是*。
因此,在输出10层时,判断条件为an[i]<10,
if(an[i]<10){
cout<<" ";
}
else{
cout<<"* ";
}
在输出9层时,判断条件为an[i]<9,
if(an[i]<9){
cout<<" ";
}
else{
cout<<"* ";
}
以此类推,直到输出最后一层,最下面的一层,1层。
改成循环结构,将ABCDEFG...输出
完整代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int an[26]={0};
string a;
cin>>a;
string b;
cin>>b;
string c;
cin>>c;
string d;
cin>>d;
for(int i=0;i<a.length();i++){
an[a[i]-'A']++;
}
for(int i=0;i<b.length();i++){
an[b[i]-'A']++;
}
for(int i=0;i<c.length();i++){
an[c[i]-'A']++;
}
for(int i=0;i<d.length();i++){
an[d[i]-'A']++;
}
int mx=0;//找26个数字当中的最大值
for(int i=0;i<26;i++){
mx=max(mx,an[i]);
}
int mx1=mx;
for(int j=0;j<mx;j++){
for(int i=0;i<26;i++){
if(an[i]<mx1){
cout<<" ";
}
else{
cout<<"* ";
}
}
mx1--;
cout<<endl;
}
for(int i = 0; i < 26; ++i)
cout << char(i+'A') << ' ';
return 0;
}
共同学习,共同进步。欢迎对编程代码感兴趣的小伙伴一起交流。