[C言語] 0が入力されたらループ処理を終了するプログラムの書き方を解説

C言語でユーザーが0を入力した際にループを終了するプログラムを作成するには、whileループやdo-whileループを使用します。

ループ内でscanf関数を用いてユーザーからの入力を受け取り、その値をチェックします。

入力された値が0である場合、break文を使用してループを終了します。

この方法により、ユーザーが0を入力するまでループが継続し、0が入力されると即座にループが終了します。

この記事でわかること
  • while、do-while、forループの基本的な構文と使い方
  • 0が入力された際にループを終了する方法
  • 入力値のバリデーションや複数の終了条件の設定方法
  • ループ内での計算処理やネストされたループの活用法
  • ループ処理におけるメモリ管理の注意点

目次から探す

whileループを使った基本的な例

C言語におけるwhileループは、条件が真である限り繰り返し処理を行うための基本的な制御構造です。

ここでは、whileループの基本的な構文と、特定の条件でループを終了する方法について解説します。

whileループの構文

whileループの基本的な構文は以下の通りです。

#include <stdio.h>
int main() {
    // 変数の宣言
    int condition = 1;
    // whileループの開始
    while (condition) {
        // ループ内の処理
        printf("ループ内の処理を実行中\n");
        // 条件を更新する処理
        condition = 0; // 例として、ループを1回で終了させる
    }
    return 0;
}

この構文では、conditionが真(0以外の値)である限り、ループ内の処理が繰り返されます。

conditionが偽(0)になると、ループは終了します。

0が入力されたら終了するwhileループの実装

ユーザーからの入力を受け取り、0が入力されたらループを終了するプログラムを実装してみましょう。

#include <stdio.h>
int main() {
    int input;
    // ユーザーからの入力を受け取る
    printf("整数を入力してください(0で終了):");
    scanf("%d", &input);
    // whileループの開始
    while (input != 0) {
        // 入力された整数を表示
        printf("入力された整数は %d です\n", input);
        // 再度ユーザーからの入力を受け取る
        printf("整数を入力してください(0で終了):");
        scanf("%d", &input);
    }
    printf("プログラムを終了します\n");
    return 0;
}
整数を入力してください(0で終了):5
入力された整数は 5 です
整数を入力してください(0で終了):3
入力された整数は 3 です
整数を入力してください(0で終了):0
プログラムを終了します

このプログラムでは、ユーザーが0を入力するまで、入力された整数を表示し続けます。

0が入力されると、ループが終了し、プログラムも終了します。

無限ループからの脱出方法

無限ループは、条件が常に真であるために終了しないループのことです。

無限ループを意図的に作成することもありますが、通常はbreak文を使って脱出します。

#include <stdio.h>
int main() {
    int input;
    // 無限ループの開始
    while (1) {
        // ユーザーからの入力を受け取る
        printf("整数を入力してください(0で終了):");
        scanf("%d", &input);
        // 0が入力されたらループを終了
        if (input == 0) {
            break;
        }
        // 入力された整数を表示
        printf("入力された整数は %d です\n", input);
    }
    printf("プログラムを終了します\n");
    return 0;
}
整数を入力してください(0で終了):7
入力された整数は 7 です
整数を入力してください(0で終了):2
入力された整数は 2 です
整数を入力してください(0で終了):0
プログラムを終了します

このプログラムでは、while (1)によって無限ループを作成し、inputが0の場合にbreak文でループを終了します。

これにより、意図的にループを制御することができます。

do-whileループを使った例

do-whileループは、少なくとも一度はループ内の処理を実行することを保証する制御構造です。

ここでは、do-whileループの基本的な構文と、特定の条件でループを終了する方法について解説します。

do-whileループの構文

do-whileループの基本的な構文は以下の通りです。

#include <stdio.h>
int main() {
    int condition = 1;
    // do-whileループの開始
    do {
        // ループ内の処理
        printf("ループ内の処理を実行中\n");
        // 条件を更新する処理
        condition = 0; // 例として、ループを1回で終了させる
    } while (condition);
    return 0;
}

この構文では、doブロック内の処理が少なくとも一度は実行され、その後にwhileの条件が評価されます。

条件が真であれば、再びdoブロックが実行されます。

0が入力されたら終了するdo-whileループの実装

ユーザーからの入力を受け取り、0が入力されたらループを終了するプログラムを実装してみましょう。

#include <stdio.h>
int main() {
    int input;
    // do-whileループの開始
    do {
        // ユーザーからの入力を受け取る
        printf("整数を入力してください(0で終了):");
        scanf("%d", &input);
        // 入力された整数を表示
        if (input != 0) {
            printf("入力された整数は %d です\n", input);
        }
    } while (input != 0);
    printf("プログラムを終了します\n");
    return 0;
}
整数を入力してください(0で終了):8
入力された整数は 8 です
整数を入力してください(0で終了):4
入力された整数は 4 です
整数を入力してください(0で終了):0
プログラムを終了します

このプログラムでは、ユーザーが0を入力するまで、入力された整数を表示し続けます。

0が入力されると、ループが終了し、プログラムも終了します。

do-whileループの利点と注意点

利点

  • 少なくとも一度は実行される: do-whileループは、条件が最初に評価される前にループ内の処理が実行されるため、少なくとも一度は処理が行われることが保証されます。
  • ユーザー入力に適している: ユーザーからの入力を受け取る際に、少なくとも一度は入力を促す必要がある場合に便利です。

注意点

  • 条件の評価タイミング: 条件がループの最後に評価されるため、条件が偽であっても一度はループが実行されることを考慮する必要があります。
  • 無限ループのリスク: 条件が常に真である場合、無限ループになる可能性があるため、条件の設定には注意が必要です。

do-whileループは、特定の状況で非常に便利ですが、使用する際にはその特性を理解して適切に活用することが重要です。

forループを使った例

forループは、繰り返し処理を行う際に、初期化、条件チェック、更新処理を一つの行で記述できる便利な制御構造です。

ここでは、forループの基本的な構文と、特定の条件でループを終了する方法について解説します。

forループの構文

forループの基本的な構文は以下の通りです。

#include <stdio.h>
int main() {
    // forループの開始
    for (int i = 0; i < 5; i++) {
        // ループ内の処理
        printf("ループ内の処理を実行中: %d\n", i);
    }
    return 0;
}

この構文では、forの中に初期化、条件、更新処理を記述します。

iが5未満である限り、ループ内の処理が繰り返されます。

0が入力されたら終了するforループの実装

通常、forループは回数が決まっている場合に使用されますが、条件を工夫することで、ユーザーの入力に応じてループを終了することも可能です。

#include <stdio.h>
int main() {
    int input;
    // forループの開始
    for (;;) { // 無限ループを作成
        // ユーザーからの入力を受け取る
        printf("整数を入力してください(0で終了):");
        scanf("%d", &input);
        // 0が入力されたらループを終了
        if (input == 0) {
            break;
        }
        // 入力された整数を表示
        printf("入力された整数は %d です\n", input);
    }
    printf("プログラムを終了します\n");
    return 0;
}
整数を入力してください(0で終了):9
入力された整数は 9 です
整数を入力してください(0で終了):6
入力された整数は 6 です
整数を入力してください(0で終了):0
プログラムを終了します

このプログラムでは、for (;;) を使って無限ループを作成し、inputが0の場合にbreak文でループを終了します。

これにより、ユーザーの入力に応じてループを制御することができます。

forループでの条件チェックの工夫

forループは通常、回数が決まっている場合に使用されますが、条件を工夫することで柔軟に使用することができます。

条件チェックの工夫

  • 無限ループの利用: for (;;) を使って無限ループを作成し、break文で条件に応じてループを終了する方法があります。

これにより、ユーザーの入力や他の条件に応じてループを制御できます。

  • 複数の終了条件: forの条件部分に複数の条件を組み合わせることで、より複雑な終了条件を設定することができます。

例:for (int i = 0; i < 10 && input != 0; i++)

forループは、初期化、条件、更新処理を一行で記述できるため、コードを簡潔に保つことができます。

条件を工夫することで、さまざまな状況に対応したループを作成することが可能です。

応用例

C言語のループ処理を応用することで、より複雑で実用的なプログラムを作成することができます。

ここでは、いくつかの応用例を紹介します。

入力値のバリデーションを追加する

ユーザーからの入力が正しい形式であることを確認するために、入力値のバリデーションを追加することができます。

#include <stdio.h>
int main() {
    int input;
    while (1) {
        printf("正の整数を入力してください(0で終了):");
        if (scanf("%d", &input) != 1 || input < 0) {
            printf("無効な入力です。もう一度入力してください。\n");
            // 入力バッファをクリア
            while (getchar() != '\n');
            continue;
        }
        if (input == 0) {
            break;
        }
        printf("入力された整数は %d です\n", input);
    }
    printf("プログラムを終了します\n");
    return 0;
}

このプログラムでは、ユーザーが正の整数を入力するまで、再入力を促します。

無効な入力があった場合、エラーメッセージを表示し、入力を再度求めます。

複数の終了条件を設定する

ループを終了するために、複数の条件を設定することができます。

#include <stdio.h>
int main() {
    int input;
    int count = 0;
    while (count < 5) {
        printf("整数を入力してください(0で終了):");
        scanf("%d", &input);
        if (input == 0) {
            break;
        }
        printf("入力された整数は %d です\n", input);
        count++;
    }
    printf("プログラムを終了します\n");
    return 0;
}

このプログラムでは、ユーザーが0を入力するか、5回入力が行われるとループが終了します。

ループ内での計算処理を行う

ループ内で計算処理を行い、結果を出力することができます。

#include <stdio.h>
int main() {
    int input;
    int sum = 0;
    while (1) {
        printf("整数を入力してください(0で終了):");
        scanf("%d", &input);
        if (input == 0) {
            break;
        }
        sum += input;
        printf("現在の合計は %d です\n", sum);
    }
    printf("最終的な合計は %d です\n", sum);
    return 0;
}

このプログラムでは、ユーザーが入力した整数の合計を計算し、入力のたびに現在の合計を表示します。

ループのネストと終了条件

ループをネストして、複雑な処理を行うことができます。

#include <stdio.h>
int main() {
    int outer, inner;
    for (outer = 1; outer <= 3; outer++) {
        printf("外側ループ: %d\n", outer);
        for (inner = 1; inner <= 2; inner++) {
            printf("  内側ループ: %d\n", inner);
        }
    }
    return 0;
}

このプログラムでは、外側のループが3回、内側のループが2回実行されます。

ネストされたループを使うことで、より複雑な処理を行うことができます。

ユーザーに終了確認を求める

ループを終了する前に、ユーザーに確認を求めることができます。

#include <stdio.h>
int main() {
    int input;
    char confirm;
    while (1) {
        printf("整数を入力してください:");
        scanf("%d", &input);
        printf("入力された整数は %d です。終了しますか?(y/n):", input);
        scanf(" %c", &confirm);
        if (confirm == 'y' || confirm == 'Y') {
            break;
        }
    }
    printf("プログラムを終了します\n");
    return 0;
}

このプログラムでは、ユーザーが整数を入力した後、終了するかどうかを確認します。

ユーザーが’y’または’Y’を入力した場合にループを終了します。

よくある質問

ループが終了しないのはなぜ?

ループが終了しない原因としては、以下のような点が考えられます。

  • 条件が常に真である: ループの条件が常に真である場合、ループは終了しません。

例えば、while (1)のような無限ループを意図せずに作成してしまうことがあります。

  • 条件の更新がない: ループ内で条件を更新する処理がないと、条件が変わらず、ループが終了しないことがあります。

例:i++を忘れる。

  • 入力の誤り: ユーザー入力に依存する場合、期待した入力が得られないとループが終了しないことがあります。

入力のバリデーションを行い、正しい入力を確認することが重要です。

0以外の値でループを終了させるには?

0以外の値でループを終了させるには、終了条件を適切に設定する必要があります。

以下の方法があります。

  • 特定の値をチェックする: ループ内で特定の値をチェックし、その値が入力された場合にbreak文を使用してループを終了します。

例:if (input == 5) { break; }

  • 複数の条件を組み合わせる: forwhileの条件部分に複数の条件を組み合わせて、特定の値でループを終了させることができます。

例:while (input != 5 && input != 10)

ループ内でのメモリ管理はどうすればいい?

ループ内で動的メモリを使用する場合、適切なメモリ管理が重要です。

以下の点に注意してください。

  • メモリの確保と解放: malloccallocでメモリを確保した場合、使用後にfreeを呼び出してメモリを解放することを忘れないでください。

例:int *ptr = malloc(sizeof(int)); ... free(ptr);

  • メモリリークの防止: ループ内でメモリを確保する場合、毎回新しいメモリを確保するのではなく、必要に応じて再利用するか、ループの外で確保することを検討してください。
  • エラーチェック: メモリ確保が失敗した場合に備えて、NULLチェックを行い、適切なエラーハンドリングを行うことが重要です。

まとめ

C言語のループ処理は、さまざまな方法で応用できる強力なツールです。

この記事では、while、do-while、forループの基本的な使い方から応用例までを解説しました。

これらの知識を活用して、より効率的で柔軟なプログラムを作成してみてください。

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

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す