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];

posted @ 2021-01-06 23:11  许君  阅读(106)  评论(0编辑  收藏  举报