C 言語でデータセットの範囲を求める方法

C 言語Beginner
オンラインで実践に進む

はじめに

この実験では、C プログラミングでデータセットの範囲を見つける方法を学びます。この実験は、以下の手順で構成されています:1) 配列を読み込み、ソートする、2) 最大値と最小値の差を求めて範囲を計算する、3) 範囲を出力する。この実験では、C を用いてデータセットの統計的性質を分析するプロセスを理解するのに役立つ、段階的なガイドとサンプルコードを提供します。

配列の読み込みとソート

このステップでは、範囲の計算の準備として、数値の配列を読み込み、ソートする方法を学びます。データセットの入力と整理には、シンプルなアプローチを使用します。

まず、C プログラムを作成して配列を読み込み、ソートしてみましょう。

#include <stdio.h>

#define MAX_SIZE 100

// 二つの要素を入れ替える関数
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// バブルソート関数を使用して配列をソートする
void sortArray(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

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

    // 要素数を読み込む
    printf("要素数を入力してください (最大 %d): ", MAX_SIZE);
    scanf("%d", &n);

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

    // 配列をソートする
    sortArray(numbers, n);

    // ソートされた配列を出力する
    printf("ソートされた配列:");
    for (int i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    return 0;
}

主な構成要素を分解してみましょう。

  1. 最大 100 個の要素を持つ配列サイズを定義します。
  2. swap() 関数は、配列の二つの要素を入れ替えるのに役立ちます。
  3. sortArray() 関数はバブルソートを使用して、要素を昇順に並べ替えます。
  4. main() 関数では、以下の処理を行います。
    • 要素数を読み込む
    • 配列要素を入力する
    • 配列をソートする
    • ソートされた配列を出力する

コンパイルと実行の例:

gcc -o array_sort array_sort.c
./array_sort

実行例:

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

範囲 = 最大値 - 最小値

このステップでは、ソートされた配列内の最大値と最小値の差を求めることで、データセットの範囲を計算する方法を学びます。

前のプログラムを修正して範囲を計算してみましょう。

#include <stdio.h>

#define MAX_SIZE 100

// 二つの要素を入れ替える関数
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// バブルソート関数を使用して配列をソートする
void sortArray(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

// 範囲を計算する関数
int calculateRange(int arr[], int size) {
    // 配列が空の場合、0 を返す
    if (size == 0) return 0;

    // 範囲は、ソートされた配列の最後の要素 (最大値) から最初の要素 (最小値) を引いた値です
    return arr[size - 1] - arr[0];
}

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

    // 要素数を読み込む
    printf("要素数を入力してください (最大 %d): ", MAX_SIZE);
    scanf("%d", &n);

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

    // 配列をソートする
    sortArray(numbers, n);

    // 範囲を計算して出力する
    int range = calculateRange(numbers, n);

    printf("最小値:%d\n", numbers[0]);
    printf("最大値:%d\n", numbers[n - 1]);
    printf("範囲:%d\n", range);

    return 0;
}

このステップで変更した主な点は以下のとおりです。

  1. 範囲を計算する calculateRange() 関数を追加しました。
  2. 範囲は、ソートされた配列の最後の要素 (最大値) から最初の要素 (最小値) を引くことで計算されます。
  3. 最小値、最大値、および範囲の値を表示する出力文を追加しました。

コンパイルと実行の例:

gcc -o range_calculator range_calculator.c
./range_calculator

実行例:

要素数を入力してください (最大 100): 5
5 個の整数を入力してください:
42 15 7 23 11
最小値: 7
最大値: 42
範囲: 35

範囲は、ソートされた配列の最大値から最小値を引いた値で、データセットの広がりを表します。

範囲の表示

この最終ステップでは、ユーザーフレンドリーな方法で範囲計算結果をフォーマットして表示し、出力に統計的なコンテキストを追加する方法を学びます。

範囲計算プログラムの改良版を作成しましょう。

#include <stdio.h>

#define MAX_SIZE 100

// 二つの要素を入れ替える関数
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// バブルソート関数を使用して配列をソートする
void sortArray(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

// 範囲を計算する関数
int calculateRange(int arr[], int size) {
    // 配列が空の場合、0 を返す
    if (size == 0) return 0;

    // 範囲は、最後の要素 (最大値) から最初の要素 (最小値) を引いた値です
    return arr[size - 1] - arr[0];
}

// 詳細な範囲情報を表示する関数
void printRangeAnalysis(int arr[], int size, int range) {
    printf("\n--- 統計的な範囲分析 ---\n");
    printf("データセットサイズ:%d\n", size);
    printf("最小値:%d\n", arr[0]);
    printf("最大値:%d\n", arr[size - 1]);
    printf("範囲:%d\n", range);

    // 追加の洞察
    printf("\n解釈:\n");
    printf("範囲は、データセット内の値の広がりを表します。\n");
    printf("範囲が大きいほど、データにばらつきがあることを示します。\n");
}

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

    // 要素数を読み込む
    printf("要素数を入力してください (最大 %d): ", MAX_SIZE);
    scanf("%d", &n);

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

    // 配列をソートする
    sortArray(numbers, n);

    // 範囲を計算する
    int range = calculateRange(numbers, n);

    // 詳細な範囲分析を表示する
    printRangeAnalysis(numbers, n, range);

    return 0;
}

このステップで改善した主な点は次のとおりです。

  1. 包括的な出力を提供する printRangeAnalysis() 関数を追加しました。
  2. 範囲とデータのばらつきに関する追加のコンテキストを含めました。
  3. 出力をより情報豊かで読みやすいようにフォーマットしました。

コンパイルと実行の例:

gcc -o range_analysis range_analysis.c
./range_analysis

実行例:

要素数を入力してください (最大 100): 6
6 個の整数を入力してください:
10 25 7 42 15 33

--- 統計的な範囲分析 ---
データセットサイズ: 6
最小値: 7
最大値: 42
範囲: 35

解釈:
範囲は、データセット内の値の広がりを表します。
範囲が大きいほど、データにばらつきがあることを示します。

このプログラムは、データセットの範囲をより包括的に表示し、計算の統計的意義をユーザーが理解するのに役立ちます。

まとめ

この実験では、最初に単純なバブルソートアルゴリズムを使用して数値の配列を読み取り、ソートする方法を学びました。このステップは、範囲を計算するためのデータセットの準備を行いました。次に、ソートされた配列内の最大値から最小値を引くことで、データセットの範囲を見つける方法を学びます。最後に、計算された範囲を出力します。完了したステップから得られる主な学習点は、配列の読み取りとソート、およびデータセットの範囲の概念です。