C言語でのヒストグラムの作成と表示

C言語でのヒストグラムの作成と表示

ヒストグラムとは

ヒストグラムとは、データの分布を視覚的に表現する棒グラフの一種です。C言語では、配列を利用してヒストグラムを作成できます。例えば、テストの点数の分布や、文字の出現頻度などをヒストグラムで表すことができます。

基本的なヒストグラムの作成

まずは、簡単な整数データのヒストグラムを作成する方法を示します。

#include <stdio.h>

#define SIZE 10  // データの最大値を10に設定

int main() {
    int data[] = {1, 3, 2, 7, 3, 4, 7, 8, 3, 2, 5, 8, 9, 1, 3};
    int hist[SIZE] = {0};  // ヒストグラム用の配列

    // データをヒストグラムに集計
    for (int i = 0; i < sizeof(data)/sizeof(data[0]); i++) {
        hist[data[i]]++;
    }

    // ヒストグラムの表示
    printf("ヒストグラム:\n");
    for (int i = 0; i < SIZE; i++) {
        printf("%d: ", i);
        for (int j = 0; j < hist[i]; j++) {
            printf("*");
        }
        printf("\n");
    }

    return 0;
}

このコードでは、1から9までのデータを集計し、それを「*」で可視化しています。

動的配列を用いたヒストグラム

データの範囲が事前に分からない場合、動的メモリを使用してヒストグラムを作成することができます。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, max = 0;
    printf("データの数を入力: ");
    scanf("%d", &n);

    int *data = (int *)malloc(n * sizeof(int));
    if (data == NULL) {
        printf("メモリ確保に失敗しました\n");
        return 1;
    }

    printf("データを入力:\n");
    for (int i = 0; i < n; i++) {
        scanf("%d", &data[i]);
        if (data[i] > max) {
            max = data[i];
        }
    }

    int *hist = (int *)calloc(max + 1, sizeof(int));

    for (int i = 0; i < n; i++) {
        hist[data[i]]++;
    }

    printf("ヒストグラム:\n");
    for (int i = 0; i <= max; i++) {
        if (hist[i] > 0) {
            printf("%d: ", i);
            for (int j = 0; j < hist[i]; j++) {
                printf("*");
            }
            printf("\n");
        }
    }

    free(data);
    free(hist);
    return 0;
}

このプログラムでは、ユーザーから入力されたデータに基づいて動的にヒストグラムを作成しています。

縦向きのヒストグラム

横向きではなく、縦向きのヒストグラムを表示することも可能です。

#include <stdio.h>

#define SIZE 10

int main() {
    int data[] = {1, 3, 2, 7, 3, 4, 7, 8, 3, 2, 5, 8, 9, 1, 3};
    int hist[SIZE] = {0};

    for (int i = 0; i < sizeof(data)/sizeof(data[0]); i++) {
        hist[data[i]]++;
    }

    int max_count = 0;
    for (int i = 0; i < SIZE; i++) {
        if (hist[i] > max_count) {
            max_count = hist[i];
        }
    }

    for (int i = max_count; i > 0; i--) {
        for (int j = 0; j < SIZE; j++) {
            if (hist[j] >= i) {
                printf(" * ");
            } else {
                printf("   ");
            }
        }
        printf("\n");
    }

    for (int i = 0; i < SIZE; i++) {
        printf("%2d ", i);
    }
    printf("\n");

    return 0;
}

ファイル入力を利用したヒストグラム

データをファイルから読み込んでヒストグラムを作成することもできます。

#include <stdio.h>

#define SIZE 10

int main() {
    FILE *file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けません\n");
        return 1;
    }

    int hist[SIZE] = {0}, value;
    while (fscanf(file, "%d", &value) != EOF) {
        if (value >= 0 && value < SIZE) {
            hist[value]++;
        }
    }
    fclose(file);

    printf("ヒストグラム:\n");
    for (int i = 0; i < SIZE; i++) {
        printf("%d: ", i);
        for (int j = 0; j < hist[i]; j++) {
            printf("*");
        }
        printf("\n");
    }

    return 0;
}

まとめ

C言語でヒストグラムを作成する方法を解説しました。基本的な方法から、動的配列やファイル入力の活用まで、用途に応じてさまざまな実装が可能です。データの可視化に役立つため、ぜひ活用してみてください。

コメントは受け付けていません。