C言語

【C言語】第3章第10回:配列を活用したプログラム例

配列は多くのプログラムで使用される基本的なデータ構造です。この章では、配列を活用した具体的なプログラム例を示し、それらのコードを詳細に解説します。

1. 配列を使った単純な検索プログラム

配列内の特定の値を検索するプログラムを作成します。

例:線形探索アルゴリズムを使用して検索

#include <stdio.h>

int main() {
    int numbers[] = {12, 34, 56, 78, 90};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int target, found = 0;

    printf("Enter a number to search: ");
    scanf("%d", &target);

    for (int i = 0; i < size; i++) {
        if (numbers[i] == target) {
            printf("Number %d found at index %d\n", target, i);
            found = 1;
            break;
        }
    }

    if (!found) {
        printf("Number %d not found in the array.\n", target);
    }

    return 0;
}

解説:

  • scanfを使ってユーザーから検索値を入力。
  • forループで配列を走査し、条件に一致する値が見つかればインデックスを出力。
  • 見つからない場合はエラーメッセージを表示。

2. 配列を使った統計計算

配列の値を使って、平均値や中央値を計算します。

例:配列の平均値と中央値を計算するプログラム

#include <stdio.h>
#include <stdlib.h> // qsort関数のためのヘッダー

int compare(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

int main() {
    int numbers[] = {12, 34, 56, 78, 90};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int sum = 0;
    double mean, median;

    // 平均値の計算
    for (int i = 0; i < size; i++) {
        sum += numbers[i];
    }
    mean = (double)sum / size;

    // 中央値の計算
    qsort(numbers, size, sizeof(int), compare); // 配列を昇順にソート
    if (size % 2 == 0) {
        median = (numbers[size / 2 - 1] + numbers[size / 2]) / 2.0;
    } else {
        median = numbers[size / 2];
    }

    printf("Mean: %.2f\n", mean);
    printf("Median: %.2f\n", median);

    return 0;
}

解説:

  • 平均値は、すべての要素の合計をサイズで割ることで計算。
  • qsort関数を使い、配列をソートして中央値を計算。
  • 要素数が偶数の場合と奇数の場合で中央値の計算方法が異なる。

3. 配列を使った並べ替えプログラム

バブルソートを使って配列の要素を並び替えます。

例:バブルソートアルゴリズム

#include <stdio.h>

void bubbleSort(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]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int numbers[] = {90, 12, 56, 34, 78};
    int size = sizeof(numbers) / sizeof(numbers[0]);

    bubbleSort(numbers, size);

    printf("Sorted array: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    return 0;
}

解説:

  • 内側のループで隣接する要素を比較し、大小関係が逆の場合に交換。
  • 外側のループが終わるごとに最大値が配列の末尾に固定。

4. 練習問題

以下の課題に挑戦して、配列を使った実践的なプログラミングスキルを向上させましょう。

  1. 配列内のすべての偶数を抽出して新しい配列に格納し、それを出力するプログラムを作成してください。
  2. 配列の最大値と最小値の差を計算するプログラムを作成してください。
  3. ユーザーが入力した値を配列に格納し、降順に並び替えて表示するプログラムを作成してください。

5. 練習問題の解答と解説

問1の解答

#include <stdio.h>

int main() {
    int numbers[] = {12, 34, 56, 78, 90, 11, 23};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int evens[size], k = 0;

    for (int i = 0; i < size; i++) {
        if (numbers[i] % 2 == 0) {
            evens[k++] = numbers[i];
        }
    }

    printf("Even numbers: ");
    for (int i = 0; i < k; i++) {
        printf("%d ", evens[i]);
    }
    printf("\n");

    return 0;
}

6. まとめ

配列を使ったプログラム例を通じて、検索、統計計算、並べ替えといった基本的なアルゴリズムを学びました。これらのスキルを応用して、さらに複雑なプログラムを作成してみましょう。