垂直柱状图

题目描述

写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过 \(100\) 个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。

输入格式

四行字符,由大写字母组成,每行不超过 \(100\) 个字符

输出格式

由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。

样例 #1

样例输入 #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 <bits/stdc++.h>
using namespace std;

int main() {
    map<char, int> myMap;
    string line;
    int lineCount = 0;

    // 读取输入的四行数据
    while (getline(cin, line) && lineCount < 4) {
        for (char ch : line) {
            if (isalpha(ch) && isupper(ch)) { // 只统计大写字母
                myMap[ch]++;
            }
        }
        lineCount++;
    }

    // 找到最大频率
    int maxCount = 0;
    for (char i = 'A'; i <= 'Z'; i++) {
        maxCount = max(maxCount, myMap[i]);
    }

    // 输出柱状图
    for (int i = maxCount; i > 0; i--) {
        bool first = true;
        for (char j = 'A'; j <= 'Z'; j++) {
            if (!first) cout << " ";
            if (myMap[j] >= i) {
                cout << "*";
            } else {
                cout << " ";
            }
            first = false;
        }
        cout << endl;
    }

    // 输出最后一行字母标签
    for (char j = 'A'; j <= 'Z'; j++) {
        if (j != 'A') cout << " ";
        cout << j;
    }
    cout << endl;

    return 0;
}
posted @ 2024-11-04 15:36  xiins  阅读(14)  评论(0编辑  收藏  举报