C言語

【C言語】第3章第7回:配列を使った簡単なアルゴリズムの実装

アルゴリズムはプログラミングの基盤となる概念です。この章では、配列を使った基本的なアルゴリズムをいくつか実装し、その仕組みを学びます。

1. 配列を使ったアルゴリズムの重要性

配列は、アルゴリズムを効率的に実行するための基本的なデータ構造です。ソート、検索、統計計算など、多くのアルゴリズムで使用されます。

以下では、配列を使った簡単なアルゴリズムを実装していきます。

2. 最大値と最小値を探すアルゴリズム

配列内の要素を走査して、最大値と最小値を見つけるアルゴリズムを実装します。

例:最大値と最小値を見つけるプログラム

#include <stdio.h>

int main() {
    int numbers[] = {12, 7, 19, 3, 8, 15};
    int max = numbers[0];
    int min = numbers[0];

    for (int i = 1; i < 6; i++) {
        if (numbers[i] > max) {
            max = numbers[i];
        }
        if (numbers[i] < min) {
            min = numbers[i];
        }
    }

    printf("Maximum value: %d\n", max);
    printf("Minimum value: %d\n", min);

    return 0;
}

解説:

  • 最大値と最小値を配列の最初の要素で初期化します。
  • ループ内で各要素を比較し、必要に応じて最大値または最小値を更新します。

3. 配列内の要素の合計と平均を計算

配列内のすべての要素を合計し、その平均値を計算します。

例:合計と平均を計算するプログラム

#include <stdio.h>

int main() {
    int numbers[] = {12, 7, 19, 3, 8, 15};
    int sum = 0;
    double average;

    for (int i = 0; i < 6; i++) {
        sum += numbers[i];
    }

    average = (double)sum / 6;

    printf("Sum: %d\n", sum);
    printf("Average: %.2f\n", average);

    return 0;
}

解説:

  • ループ内で要素を加算し、合計値を計算します。
  • 合計値を要素数で割り、平均値を計算します。
  • キャスト(double)を使用して整数の割り算を回避します。

4. バブルソート:配列の要素を並び替える

バブルソートアルゴリズムを使って配列の要素を昇順に並び替えます。

例:バブルソートで配列を並び替えるプログラム

#include <stdio.h>

int main() {
    int numbers[] = {12, 7, 19, 3, 8, 15};
    int n = 6; // 配列の要素数

    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (numbers[j] > numbers[j + 1]) {
                // 値を交換
                int temp = numbers[j];
                numbers[j] = numbers[j + 1];
                numbers[j + 1] = temp;
            }
        }
    }

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

    return 0;
}

解説:

  • 内側のループで隣接する要素を比較し、大小関係に応じて交換します。
  • 外側のループが終了するごとに、最大値が配列の末尾に固定されます。

5. 練習問題

以下の課題に挑戦して、配列を使ったアルゴリズムの理解を深めましょう。

  1. 配列内の偶数と奇数の数をカウントし、それぞれを出力するプログラムを作成してください。
  2. 配列内の要素を降順に並び替えるバブルソートアルゴリズムを実装してください。
  3. ユーザーが入力した値を配列に格納し、その最大値と最小値を出力するプログラムを作成してください。

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

問1の解答

#include <stdio.h>

int main() {
    int numbers[] = {12, 7, 19, 3, 8, 15};
    int even = 0, odd = 0;

    for (int i = 0; i < 6; i++) {
        if (numbers[i] % 2 == 0) {
            even++;
        } else {
            odd++;
        }
    }

    printf("Even numbers: %d\n", even);
    printf("Odd numbers: %d\n", odd);

    return 0;
}

問2の解答

#include <stdio.h>

int main() {
    int numbers[] = {12, 7, 19, 3, 8, 15};
    int n = 6;

    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (numbers[j] < numbers[j + 1]) {
                int temp = numbers[j];
                numbers[j] = numbers[j + 1];
                numbers[j + 1] = temp;
            }
        }
    }

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

    return 0;
}

問3の解答

#include <stdio.h>

int main() {
    int n, max, min;

    printf("Enter the number of elements: ");
    scanf("%d", &n);

    int numbers[n];
    printf("Enter %d elements: ", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    max = min = numbers[0];
    for (int i = 1; i < n; i++) {
        if (numbers[i] > max) max = numbers[i];
        if (numbers[i] < min) min = numbers[i];
    }

    printf("Maximum value: %d\n", max);
    printf("Minimum value: %d\n", min);

    return 0;
}

7. まとめ

配列を使った基本的なアルゴリズムを学ぶことで、効率的なデータ操作が可能になります。ここで紹介したアルゴリズムを応用して、さらに高度なプログラムに挑戦してみましょう。