C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で配列データからヒストグラムを作成するプログラムの書き方

この記事では、C++を使って配列内のデータからヒストグラム(度数分布図)を作成するプログラムを解説します。

ここでは、配列に格納された整数値をもとに、縦軸・横軸の両方が配列の値と対応するヒストグラムをコンソール上に描画することを目標とします。

アルゴリズムの流れ

ヒストグラムの描画は、以下の手順で行います。

  1. 最大値の取得:max_element関数を使って配列内の最大値を求めます。この値がヒストグラムの最上部(y軸の最大値)になります。
  2. 上の行から順に出力:最大値から0まで1ずつ減らしながら各行を処理し、その行の高さ(i)以上の値を持つ配列要素の位置に「x」を表示します。条件を満たさない位置は空白のままにします。
  3. 軸と元データの表示:すべての行を出力した後、区切り線を描き、その下に元の配列の値を横一列に並べて出力します。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
void make_histogram(int arr[], int n){
    int maxEle = *max_element(arr, arr + n);
    for (int i = maxEle; i >= 0; i--) {
        cout.width(2);
        cout << right << i << " | ";
        for (int j = 0; j < n; j++) {
            if (arr[j] >= i)
                cout << " x ";
            else
                cout << "   ";
        }
        cout << "\n";
    }
    for (int i = 0; i < n + 3; i++)
        cout << "---";
    cout << "\n";
    cout << " ";
    for (int i = 0; i < n; i++) {
        cout.width(2);
        cout << right << arr[i] << " ";
    }
}
int main() {
    int arr[10] = { 10, 9, 12, 4, 5, 2,
                    8, 5, 3, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    make_histogram(arr, n);
    return 0;
}

実行結果

12 | x
11 | x
10 | x x
 9 | x x x
 8 | x x x x
 7 | x x x x
 6 | x x x x
 5 | x x x x x x
 4 | x x x x x x x
 3 | x x x x x x x x
 2 | x x x x x x x x x
 1 | x x x x x x x x x x
 0 | x x x x x x x x x x
---------------------------------------
10  9 12  4  5  2  8  5  3  1

出力の見方

この例では、配列の値が {10, 9, 12, 4, 5, 2, 8, 5, 3, 1} であり、最大値は12です。そのため、12行分のバーが上から順に描画されます。

各列は配列の各要素に対応しており、その要素の値が現在の行番号(左端の数字)以上であれば「x」が表示されます。たとえば、最初の要素である10は、行番号が10以下の行で「x」として現れます。

一番下の行には元の配列の値がそのまま表示されるため、どの列がどのデータに対応しているのかがひと目でわかるようになっています。cout.width(2)による桁揃えを行うことで、数値のずれを防ぎ、見やすい出力を実現しています。

  1. C++で配列の最大積部分集合を求めるアルゴリズムと実装方法を解説

    この問題では、n個の整数からなる配列 arr[] が与えられ、その中から部分集合を選んで積の最大値(最大積部分集合)を求めるプログラムを作成します。問題の概要配列の要素から任意の部分集合を選び、その積として考えられる最大値を計算します。部分集合 − 配列 sub[] のすべての要素が配列 arr[] に含まれているとき、sub[] は arr[] の部分集合とみなされます。具体例で問題を理解する入力arr[] = {4, 5, 2, -1, 3}出力40説明部分集合 sub[] = {4, 5, 2}積 = 4 × 5 × 2 = 40解法アプローチ1. 単純な方法(全列挙)最もシンプルなのは

  2. C++で配列がビトニック配列かどうかを判定するプログラム

    N個の整数からなる配列 arr[N] が与えられたとき、その配列がビトニック配列であるかどうかを判定するのが本記事のテーマです。ビトニック配列であれば「Yes its a bitonic array」と出力し、そうでなければ「No its not a bitonic array」と出力します。ビトニック配列とは、まず厳密に増加し、その後厳密に減少するような配列のことです。たとえば arr[] = {1, 2, 3, 4, 2, -1, -5} という配列は、4までは厳密に増加しており、4以降は厳密に減少しているため、ビトニック配列といえます。入力例と出力例入力arr[] = {1, 3, 5,