C言語

【C言語】第2章第13回:フラグ変数を使った効率的なループ制御

フラグ変数は、ループの制御を効率的に行うための重要なテクニックです。この章では、フラグ変数の使い方や実用例を通じて、ループ制御を最適化する方法を学びます。

1. フラグ変数とは?

フラグ変数は、条件を記録するための変数で、主に0(偽)または1(真)で状態を表します。ループの終了条件や特定の処理をトリガーするために利用されます。

基本構造

int flag = 0; // フラグ変数を初期化

while (条件) {
    if (特定の条件) {
        flag = 1; // フラグを更新
    }

    if (flag) {
        break; // フラグに基づいてループを終了
    }
}

2. 基本的な例:特定の条件でループを終了

以下は、ユーザー入力に基づいてループを終了するプログラムです。

#include <stdio.h>

int main() {
    int number;
    int flag = 0; // フラグ変数を初期化

    while (1) {
        printf("Enter a number (negative to quit): ");
        scanf("%d", &number);

        if (number < 0) {
            flag = 1; // 負の数が入力されたらフラグを設定
        }

        if (flag) {
            printf("Exiting loop.\n");
            break; // フラグに基づいてループを終了
        }

        printf("You entered: %d\n", number);
    }

    return 0;
}

解説:

  • flag = 1;:負の数が入力されると、フラグが1に設定されます。
  • if (flag):フラグが1の場合、ループを終了します。

3. 実用例:特定の条件を満たすまでデータを検索

以下のプログラムは、配列内の特定の値を検索し、見つかったらループを終了します。

#include <stdio.h>

int main() {
    int numbers[] = {1, 2, 3, 4, 5};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int target = 3;
    int flag = 0; // フラグ変数を初期化

    for (int i = 0; i < size; i++) {
        if (numbers[i] == target) {
            flag = 1; // 値が見つかったらフラグを設定
            printf("Found %d at index %d.\n", target, i);
            break; // ループを終了
        }
    }

    if (!flag) {
        printf("Value not found.\n");
    }

    return 0;
}

解説:

  • flag = 1;targetが見つかったときにフラグを設定します。
  • if (!flag):ループ終了後にフラグを確認し、値が見つからなかった場合のメッセージを出力します。

4. フラグ変数のメリットと注意点

**メリット**

  • 複雑な条件をシンプルに管理できる。
  • ループ終了条件を明確にできる。

**注意点**

  • フラグ変数を適切に初期化しないと、意図しない動作を引き起こす可能性があります。
  • フラグを多用しすぎると、コードが読みにくくなることがあります。

5. 練習問題

以下の課題に挑戦して、フラグ変数の使い方を練習してください。

  1. ユーザーに複数の数値を入力させ、負の数が入力されるまで合計を計算するプログラムを作成してください。
  2. 配列内のすべての偶数を表示し、奇数が見つかった場合にループを終了するプログラムを作成してください。
  3. 特定の条件(例:配列内の要素が0)で処理をスキップし、最後に見つかった非ゼロの値を出力するプログラムを作成してください。

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

問1の解答

#include <stdio.h>

int main() {
    int number, sum = 0;
    int flag = 0;

    while (1) {
        printf("Enter a number (negative to quit): ");
        scanf("%d", &number);

        if (number < 0) {
            flag = 1;
        }

        if (flag) {
            break;
        }

        sum += number;
    }

    printf("Total sum is %d.\n", sum);
    return 0;
}

問2の解答

#include <stdio.h>

int main() {
    int numbers[] = {2, 4, 6, 7, 8};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int flag = 0;

    for (int i = 0; i < size; i++) {
        if (numbers[i] % 2 != 0) {
            flag = 1;
            break;
        }
        printf("%d is even.\n", numbers[i]);
    }

    if (flag) {
        printf("Found an odd number. Exiting loop.\n");
    }

    return 0;
}

問3の解答

#include <stdio.h>

int main() {
    int numbers[] = {1, 0, 3, 0, 5};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int lastNonZero = 0;

    for (int i = 0; i < size; i++) {
        if (numbers[i] == 0) {
            continue; // 0をスキップ
        }
        lastNonZero = numbers[i];
    }

    printf("Last non-zero value: %d\n", lastNonZero);
    return 0;
}

7. まとめ

フラグ変数は、ループの終了条件や特定の処理を効率的に制御するための便利なツールです。練習問題を通じて、その効果的な使い方をマスターしましょう!