[C言語] while文のループをbreak文で抜ける方法

C言語において、while文は条件が真である限り繰り返し処理を行うループ構造です。

ループを途中で終了したい場合、break文を使用します。

break文は、whileループ内で実行されると、ループを即座に終了し、ループの後のコードに制御を移します。

これにより、特定の条件が満たされたときにループを抜けることが可能です。

例えば、無限ループを防ぐためや、特定の値に達したときに処理を終了する際に有効です。

この記事でわかること
  • while文内でのbreak文の基本的な使用方法
  • ユーザー入力や特定条件によるループの終了方法
  • ネストされたループや複数条件でのbreak文の応用例
  • break文とcontinue文の併用によるループ制御
  • 状態遷移を用いたループの管理方法

目次から探す

while文とbreak文の組み合わせ

C言語におけるwhile文とbreak文の組み合わせは、ループ処理を柔軟に制御するための重要な手法です。

while文は条件が真である限り繰り返し処理を行いますが、break文を使用することで、特定の条件を満たしたときにループを強制的に終了させることができます。

以下では、具体的な使用例を通じてその活用方法を解説します。

while文内でのbreak文の使用例

while文内でbreak文を使用することで、ループを途中で終了させることができます。

以下に基本的な使用例を示します。

#include <stdio.h>
int main() {
    int i = 0;
    // ループ開始
    while (i < 10) {
        printf("iの値: %d\n", i);
        if (i == 5) {
            // iが5になったらループを終了
            break;
        }
        i++;
    }
    return 0;
}
iの値: 0
iの値: 1
iの値: 2
iの値: 3
iの値: 4
iの値: 5

この例では、iが5になった時点でbreak文が実行され、whileループが終了します。

条件に応じたループの終了

break文は、特定の条件を満たしたときにループを終了させるために使用されます。

以下の例では、ユーザーからの入力に応じてループを終了します。

#include <stdio.h>
int main() {
    int number;
    // ユーザーが0を入力するまでループ
    while (1) {
        printf("数字を入力してください (0で終了): ");
        scanf("%d", &number);
        if (number == 0) {
            // 0が入力されたらループを終了
            break;
        }
        printf("入力された数字: %d\n", number);
    }
    return 0;
}
数字を入力してください (0で終了): 5
入力された数字: 5
数字を入力してください (0で終了): 3
入力された数字: 3
数字を入力してください (0で終了): 0

このプログラムでは、ユーザーが0を入力するとbreak文が実行され、ループが終了します。

無限ループからの脱出

while文をwhile(1)のように記述すると無限ループを作成できますが、break文を使用することで特定の条件でループを抜け出すことができます。

#include <stdio.h>
int main() {
    int count = 0;
    // 無限ループ
    while (1) {
        printf("カウント: %d\n", count);
        count++;
        if (count >= 10) {
            // カウントが10以上になったらループを終了
            break;
        }
    }
    return 0;
}
カウント: 0
カウント: 1
カウント: 2
カウント: 3
カウント: 4
カウント: 5
カウント: 6
カウント: 7
カウント: 8
カウント: 9

この例では、countが10以上になるとbreak文が実行され、無限ループから脱出します。

無限ループを制御する際にbreak文は非常に有用です。

実践例

ここでは、while文とbreak文を組み合わせた実践的な例を紹介します。

これらの例は、実際のプログラムでよく使われるシナリオを想定しています。

ユーザー入力によるループ終了

ユーザーの入力に基づいてループを終了する方法は、インタラクティブなプログラムでよく使用されます。

以下の例では、ユーザーが特定の文字列を入力することでループを終了します。

#include <stdio.h>
#include <string.h>
int main() {
    char input[100];
    // "exit"が入力されるまでループ
    while (1) {
        printf("文字列を入力してください (終了するには 'exit' と入力): ");
        scanf("%s", input);
        if (strcmp(input, "exit") == 0) {
            // "exit"が入力されたらループを終了
            break;
        }
        printf("入力された文字列: %s\n", input);
    }
    return 0;
}
文字列を入力してください (終了するには 'exit' と入力): hello
入力された文字列: hello
文字列を入力してください (終了するには 'exit' と入力): world
入力された文字列: world
文字列を入力してください (終了するには 'exit' と入力): exit

このプログラムでは、ユーザーが”exit”と入力するとbreak文が実行され、ループが終了します。

特定条件でのデータ処理停止

データ処理を行う際に、特定の条件を満たした場合に処理を停止することが求められることがあります。

以下の例では、配列内の特定の値を見つけたときにループを終了します。

#include <stdio.h>
int main() {
    int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int target = 7;
    int i;
    // 配列内のtargetを探す
    for (i = 0; i < 10; i++) {
        if (data[i] == target) {
            printf("見つけた値: %d\n", data[i]);
            // targetが見つかったらループを終了
            break;
        }
    }
    return 0;
}
見つけた値: 7

このプログラムでは、配列内でtargetの値を見つけた時点でbreak文が実行され、ループが終了します。

センチネル値によるループ制御

センチネル値は、データの終わりを示す特別な値で、ループを制御するために使用されます。

以下の例では、センチネル値として-1を使用してループを終了します。

#include <stdio.h>
int main() {
    int number;
    // センチネル値-1が入力されるまでループ
    while (1) {
        printf("数字を入力してください (-1で終了): ");
        scanf("%d", &number);
        if (number == -1) {
            // -1が入力されたらループを終了
            break;
        }
        printf("入力された数字: %d\n", number);
    }
    return 0;
}
数字を入力してください (-1で終了): 10
入力された数字: 10
数字を入力してください (-1で終了): 20
入力された数字: 20
数字を入力してください (-1で終了): -1

このプログラムでは、ユーザーが-1を入力するとbreak文が実行され、ループが終了します。

センチネル値は、データの終端を示すために便利です。

応用例

while文とbreak文の組み合わせは、基本的なループ制御だけでなく、より複雑な状況にも対応できます。

ここでは、応用的な使用例を紹介します。

ネストされたループでのbreak文の使用

ネストされたループ内でbreak文を使用する場合、break文は最も内側のループのみを終了させます。

以下の例では、二重ループの内側のループを終了させる方法を示します。

#include <stdio.h>
int main() {
    int i, j;
    // 外側のループ
    for (i = 0; i < 3; i++) {
        // 内側のループ
        for (j = 0; j < 3; j++) {
            if (j == 1) {
                // jが1のとき内側のループを終了
                break;
            }
            printf("i: %d, j: %d\n", i, j);
        }
    }
    return 0;
}
i: 0, j: 0
i: 1, j: 0
i: 2, j: 0

このプログラムでは、jが1になると内側のループが終了し、外側のループが次の反復に進みます。

複数条件でのループ終了

複数の条件を組み合わせてループを終了させることも可能です。

以下の例では、2つの条件のいずれかが満たされたときにループを終了します。

#include <stdio.h>
int main() {
    int count = 0;
    int limit = 5;
    // countが10以上またはlimitが0以下でループを終了
    while (count < 10 && limit > 0) {
        printf("カウント: %d, リミット: %d\n", count, limit);
        count++;
        limit--;
    }
    return 0;
}
カウント: 0, リミット: 5
カウント: 1, リミット: 4
カウント: 2, リミット: 3
カウント: 3, リミット: 2
カウント: 4, リミット: 1

このプログラムでは、countが10以上になるか、limitが0以下になるとループが終了します。

break文とcontinue文の併用

break文とcontinue文を併用することで、ループの制御をさらに細かく行うことができます。

continue文はループの残りの処理をスキップし、次の反復に進みます。

#include <stdio.h>
int main() {
    int i;
    // 1から10までの数をループ
    for (i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            // 偶数の場合は次の反復に進む
            continue;
        }
        if (i > 7) {
            // iが7を超えたらループを終了
            break;
        }
        printf("奇数: %d\n", i);
    }
    return 0;
}
奇数: 1
奇数: 3
奇数: 5
奇数: 7

このプログラムでは、偶数のときはcontinue文で次の反復に進み、iが7を超えるとbreak文でループを終了します。

状態遷移に基づくループ制御

状態遷移を用いてループを制御することも可能です。

以下の例では、状態変数を用いてループの終了を制御します。

#include <stdio.h>
typedef enum { START, PROCESS, END } State;
int main() {
    State currentState = START;
    int count = 0;
    // 状態に基づくループ
    while (currentState != END) {
        switch (currentState) {
            case START:
                printf("開始状態\n");
                currentState = PROCESS;
                break;
            case PROCESS:
                printf("処理中: %d\n", count);
                count++;
                if (count >= 3) {
                    currentState = END;
                }
                break;
            case END:
                // ここには到達しない
                break;
        }
    }
    return 0;
}
開始状態
処理中: 0
処理中: 1
処理中: 2

このプログラムでは、状態変数currentStateを用いてループの進行を制御し、countが3に達したときにEND状態に遷移してループを終了します。

状態遷移を用いることで、複雑なロジックを整理しやすくなります。

よくある質問

break文を使うときの注意点は?

break文を使用する際には、以下の点に注意が必要です。

  • ループの終了範囲: break文は最も内側のループのみを終了します。

ネストされたループで使用する場合は、どのループが終了するのかを明確に理解しておく必要があります。

  • コードの可読性: break文を多用すると、ループの終了条件が分散し、コードの可読性が低下することがあります。

可能であれば、ループの条件式で終了条件を管理することを検討してください。

  • 無限ループの制御: 無限ループを制御するためにbreak文を使用する場合、必ず終了条件が確実に満たされることを確認してください。

さもないと、プログラムが意図せず停止しない可能性があります。

while文とfor文のどちらを使うべき?

while文とfor文はどちらもループを実現するための構文ですが、使用する場面によって適切な選択が異なります。

  • while: 条件が真である限りループを続けるため、繰り返し回数が事前に決まっていない場合や、条件が動的に変化する場合に適しています。
  • for: 繰り返し回数が事前に決まっている場合や、ループの初期化、条件判定、更新処理を一つの行にまとめたい場合に適しています。

選択の基準は、コードの可読性と意図の明確さです。

どちらの文を使うかは、プログラムの目的と構造に応じて判断してください。

break文を使わずにループを終了する方法はある?

break文を使わずにループを終了する方法もあります。

以下の方法が一般的です。

  • 条件式の工夫: ループの条件式を工夫することで、break文を使わずにループを終了できます。

例えば、while文の条件式に終了条件を組み込むことで、自然にループを抜けることができます。

  • 例:while (condition && !exitCondition) { /* ループ処理 */ }
  • フラグ変数の使用: フラグ変数を用いてループの終了を制御することも可能です。

フラグ変数を条件式に組み込むことで、break文を使わずにループを終了できます。

  • 例:while (flag) { /* ループ処理 */ if (exitCondition) flag = 0; }

まとめ

while文とbreak文の組み合わせは、C言語におけるループ制御の基本的かつ強力な手法です。

この記事では、基本的な使い方から応用例までを通じて、break文の効果的な使用方法を学びました。

これを機に、実際のプログラムでwhile文とbreak文を活用し、より効率的なコードを書いてみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 繰り返し処理 (26)
  • 条件分岐 (27)
  • URLをコピーしました!
目次から探す