P1598 垂直柱状图——概率论/统计/模拟
P1598 垂直柱状图——概率论/统计/模拟
题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过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
题解/思路:
惯例,先吐槽。我第一次做的时候,不看题,在最后哪里也加了括号
for(i=max-1;i>=0;i--)
{
for(j=0;j<26;j++)//这样输出的话,最后一列后面会多输出一列空格
{
cout<<a[i][j]<<" ";
}
}
这个题 卡格式 真的很严格。注:在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
然后,犯了一个字符串读入时的小错误,上图:
cin 不能读入空格和换行:cin不能读入空格和换行;cin不能读入空格和换行!(重要的事情说三遍)!!!这个位置其实还好没卡我很久,一会就改了(好吧,我请教学长了,害)。
卡了我半小时的是一个我很气的点,找了这个bug超级久(就是一行代码的问题!),上图:
不知道是不是因为char是二维数组的原因,所以不能想这样初始化为空,最后的最后换成 memset(),就过了的时候,我心态炸了。因为,我按照右边的做法在我的电脑上编译运行的时候是正确的,luogu不给我过,卧槽!卧槽!卧槽!
正确思路:我用二维数组做的,统计所有的字符个数,记录,找到最高峰的高度,然后,按照二维数组输出,输出的时候注意空格的后面的处理,记得最后还有输出一行A到Z
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
char s[402][28];
int i,j,a[28]={0};
string s1;
memset(s,' ',sizeof(s));
for(i=0;i<4;++i)
{
getline(cin,s1);
for(j=0;j<s1.length();++j)
{
if(s1[j]>='A'&&s1[j]<='Z')
{
s[a[s1[j]-'A']][s1[j]-'A'] = '*';
a[s1[j]-'A']++;
}
}
}
int max=0;
for(i=0;i<25;i++)
{
if(max<a[i])
max=a[i];
}
for(i=max-1;i>=0;i--){
for(j=0;j<25;j++){
cout<<s[i][j]<<" ";
}
cout<<s[i][j]<<endl;
}
for(i=65;i<90;i++){
cout<<char(i)<<" ";
}
cout<<char(90)<<endl;
}
还有一个类似的思路,但是比我这个简单,学长的,让我贴贴
代码(比我短):
#include <bits/stdc++.h>
using namespace std;
int main(){
char c;
memset(s,0,sizeof(s));
while(cin>>c){
if(c <= 'Z' && c >= 'A')
s[c-'A']++;
}
int hmax = -1;
for(int i = 0;i < 26;i++)
hmax = max(hmax,s[i]);
for(int i = hmax;i > 0;i--){
for(int j = 0;j < 26;j++){
if(s[j] >= i)cout<<'*';
else cout<<' ';
cout<<' ';//两列之间的那个空行
}
cout<<endl;
}
for(int i = 0;i < 26;i++)//最后一排的A到Z
printf("%c ",'A'+i);
return 0;
}
注:学长的代码,定义 int s[26];