C 言語でデータセットの中央値を計算する方法

CBeginner
オンラインで実践に進む

はじめに

この実験では、C プログラミングでデータセットの中央値を計算する方法を学びます。この実験では、数値の配列を読み込み、ソートし、中央の要素(または中央の 2 つの要素の平均)を見つけ、中央値を出力する、といった手順をカバーします。段階的な手順は、配列の読み込み、ソート、出力のための関数を含め、これらのタスクを実装するプロセスを C プログラミングを使ってガイドします。この実験は、C 言語で統計分析手法を理解し適用するための実践的なアプローチを提供します。

配列の読み込みとソート

このステップでは、中央値の計算の準備として、数値の配列を読み込み、それをソートする方法を学びます。このタスクは C プログラミングを使って実行します。

まず、配列の読み込みとソートを実装するための C ファイルを作成しましょう。

cd ~/project
nano median_calculator.c

次に、ファイルに以下のコードを追加します。

#include <stdio.h>

#define MAX_SIZE 100

// 配列要素を読み込む関数
void readArray(int arr[], int *n) {
    printf("要素数を入力してください (最大 %d): ", MAX_SIZE);
    scanf("%d", n);

    printf("%d個の要素を入力してください:\n", *n);
    for (int i = 0; i < *n; i++) {
        scanf("%d", &arr[i]);
    }
}

// バブルソートを使って配列をソートする関数
void sortArray(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 要素を交換
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// 配列を出力する関数
void printArray(int arr[], int n) {
    printf("ソート済み配列:");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);
    printArray(arr, n);

    return 0;
}

プログラムをコンパイルして実行します。

gcc median_calculator.c -o median_calculator
./median_calculator

実行例:

要素数を入力してください (最大 100): 5
5個の要素を入力してください:
42
15
7
23
11
ソート済み配列: 7 11 15 23 42

コードを分解してみましょう。

  1. readArray() 関数は、ユーザーが入力した配列要素を読み込みます。
  2. sortArray() 関数はバブルソートアルゴリズムを使用して、要素を昇順に並べ替えます。
  3. printArray() 関数はソート済みの配列を表示します。
  4. main() 関数はこれらの関数を連携させます。

バブルソートアルゴリズムは O(n²) の時間計算量を持ち、理解しやすいですが、大規模なデータセットに対しては効率的なアルゴリズムではありません。

中央値(中央の要素または中央 2 つの要素の平均)の計算

このステップでは、ソート済みの配列の中央の要素、または中央の 2 つの要素の平均を求めることで、中央値を計算するプログラムを拡張します。

既存のファイルを開いてコードを修正します。

cd ~/project
nano median_calculator.c

中央値を計算する新しい関数を追加してコードを更新します。

#include <stdio.h>

#define MAX_SIZE 100

// 前の関数(readArray、sortArray、printArray)は同じです

// 中央値を計算する新しい関数
float calculateMedian(int arr[], int n) {
    // 要素数が奇数の場合は、中央の要素を返します
    if (n % 2 != 0) {
        return arr[n / 2];
    }

    // 要素数が偶数の場合は、中央の 2 つの要素の平均を返します
    int mid1 = arr[(n / 2) - 1];
    int mid2 = arr[n / 2];
    return (mid1 + mid2) / 2.0;
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);
    printArray(arr, n);

    // 中央値を計算して出力
    float median = calculateMedian(arr, n);
    printf("中央値:%.2f\n", median);

    return 0;
}

更新されたプログラムをコンパイルして実行します。

gcc median_calculator.c -o median_calculator
./median_calculator

要素数が奇数の例:

要素数を入力してください (最大 100): 5
5個の要素を入力してください:
42
15
7
23
11
ソート済み配列: 7 11 15 23 42
中央値: 15.00

要素数が偶数の例:

要素数を入力してください (最大 100): 6
6個の要素を入力してください:
42
15
7
23
11
8
ソート済み配列: 7 8 11 15 23 42
中央値: 13.00

中央値計算に関する重要な点:

  1. 要素数が奇数の場合は、中央値は中央の要素です。
  2. 要素数が偶数の場合は、中央値は中央の 2 つの要素の平均です。
  3. 中央値を計算する前に、配列をソートする必要があります。

calculateMedian() 関数は、どちらの場合も処理します。

  • 整数除算を使用して中央のインデックスを見つけます。
  • 要素数が奇数か偶数かをチェックします。
  • 適切な中央値の値を返します。

中央値の出力

この最終ステップでは、中央値計算プログラムを拡張して、より詳細な出力を行い、中央値の表示方法を複数示します。

既存のファイルを開いて最終的な修正を行います。

cd ~/project
nano median_calculator.c

改良された出力形式でコードを更新します。

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

#define MAX_SIZE 100

// 前の関数(readArray、sortArray、printArray、calculateMedian)は同じです

void printDetailedMedianInfo(int arr[], int n, float median) {
    printf("\n--- 中央値計算詳細 ---\n");
    printf("要素数:%d\n", n);
    printf("配列要素:");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n\n中央値計算:\n");

    if (n % 2 != 0) {
        printf("要素数は奇数\n");
        printf("中央のインデックス:%d\n", n / 2);
        printf("中央の要素:%d\n", arr[n / 2]);
    } else {
        printf("要素数は偶数\n");
        printf("中央の 2 つのインデックス:%d と %d\n", (n / 2) - 1, n / 2);
        printf("中央の 2 つの要素:%d と %d\n", arr[(n / 2) - 1], arr[n / 2]);
    }

    printf("\n最終的な中央値:%.2f\n", median);
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);

    float median = calculateMedian(arr, n);

    // ソート済み配列を出力
    printArray(arr, n);

    // 詳細な中央値情報を表示
    printDetailedMedianInfo(arr, n, median);

    return 0;
}

更新されたプログラムをコンパイルして実行します。

gcc median_calculator.c -o median_calculator
./median_calculator

要素数が奇数の例:

要素数を入力してください (最大 100): 5
5個の要素を入力してください:
42
15
7
23
11
ソート済み配列: 7 11 15 23 42

--- 中央値計算詳細 ---
要素数: 5
配列要素: 7 11 15 23 42

中央値計算:
要素数は奇数
中央のインデックス: 2
中央の要素: 15

最終的な中央値: 15.00

要素数が偶数の例:

要素数を入力してください (最大 100): 6
6個の要素を入力してください:
42
15
7
23
11
8
ソート済み配列: 7 8 11 15 23 42

--- 中央値計算詳細 ---
要素数: 6
配列要素: 7 8 11 15 23 42

中央値計算:
要素数は偶数
中央の2つのインデックス: 2 と 3
中央の2つの要素: 11 と 15

最終的な中央値: 13.00

このステップで改善された点:

  1. 新しい関数printDetailedMedianInfo()を追加しました。
  2. 中央値計算に関する包括的な情報を提供します。
  3. 要素数が奇数と偶数の異なるシナリオを示します。
  4. ユーザーが中央値の計算をより理解しやすくします。

まとめ

この実験では、数値の配列を読み込み、バブルソートアルゴリズムを使用してソートし、中央値の計算に必要なデータの準備を行いました。ソート済みの配列はコンソールに出力され、最初のステップが正常に完了したことを示します。バブルソートアルゴリズムは理解しやすいですが、時間計算量は O(n²) であり、大規模なデータセットに対しては必ずしも効率的ではありません。次のステップでは、ソート済み配列の中央値を求めることに焦点を当てます。

次のステップでは、配列のサイズに応じて、中央の要素または中央の 2 つの要素の平均を特定します。このステップにより、中央値が正確に計算され、ユーザーに提示されます。