[C言語] while文の書き方を解説

C言語におけるwhile文は、条件が真である間、特定のコードブロックを繰り返し実行するための制御構造です。

基本的な構文はwhile (条件) { /* 繰り返し実行するコード */ }です。

条件が最初に評価され、真であればブロック内のコードが実行されます。

条件が偽になると、ループは終了します。

無限ループを避けるために、ループ内で条件を変化させるコードを含めることが重要です。

典型的な使用例として、カウンタ変数を用いたループや、ユーザー入力を待つループなどがあります。

この記事でわかること
  • while文の基本的な書き方と動作の流れ
  • while文を使った具体的な使用例と応用方法
  • while文と他のループ構造との違いと選び方
  • 実践的なプログラムでのwhile文の活用例

目次から探す

while文の基本構造

while文とは

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

条件が偽になるとループを終了します。

while文は、繰り返し処理を行う際に非常に便利で、特に繰り返し回数が事前に決まっていない場合に適しています。

while文の基本的な書き方

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

#include <stdio.h>
int main() {
    int count = 0; // カウンタ変数の初期化
    // while文の開始
    while (count < 5) {
        printf("カウント: %d\n", count); // カウントを表示
        count++; // カウンタをインクリメント
    }
    return 0;
}

この例では、countが5未満である間、printf関数を使ってカウントを表示し、countをインクリメントしています。

カウント: 0
カウント: 1
カウント: 2
カウント: 3
カウント: 4

このプログラムは、countが5になるまでループを繰り返し、各ループでカウントを表示します。

while文の動作の流れ

while文の動作は以下のように進行します。

  1. 条件式を評価する。
  2. 条件式が真であれば、ループ内のブロックを実行する。
  3. 条件式が偽になるまで、ステップ1に戻る。

この流れにより、while文は条件が満たされている間、繰り返し処理を行います。

無限ループの作成

while文を使って無限ループを作成することも可能です。

無限ループは、条件が常に真である場合に発生します。

以下は無限ループの例です。

#include <stdio.h>
int main() {
    while (1) { // 条件が常に真
        printf("無限ループ中\n");
    }
    return 0;
}

このプログラムは、while文の条件が常に真であるため、printf関数を無限に実行し続けます。

無限ループは、特定の条件でループを終了させるためにbreak文を使用することが一般的です。

while文の使用例

基本的なループの例

while文を使った基本的なループの例を以下に示します。

この例では、0から9までの数字を順に表示します。

#include <stdio.h>
int main() {
    int i = 0; // ループカウンタの初期化
    // 0から9までの数字を表示
    while (i < 10) {
        printf("%d\n", i);
        i++; // カウンタをインクリメント
    }
    return 0;
}
0
1
2
3
4
5
6
7
8
9

このプログラムは、iが10未満である間、printf関数を使ってiの値を表示し、iをインクリメントします。

条件付きループの例

次に、条件付きでループを終了する例を示します。

この例では、ユーザーが入力した数値が10以上になるまでループを続けます。

#include <stdio.h>
int main() {
    int number = 0; // ユーザー入力を格納する変数
    // ユーザーが10以上の数を入力するまでループ
    while (number < 10) {
        printf("10以上の数を入力してください: ");
        scanf("%d", &number); // ユーザーからの入力を受け取る
    }
    printf("入力された数: %d\n", number);
    return 0;
}
10以上の数を入力してください: 5
10以上の数を入力してください: 8
10以上の数を入力してください: 12
入力された数: 12

このプログラムは、ユーザーが10以上の数を入力するまで、scanf関数を使って入力を受け取り続けます。

入力を受け取るループの例

while文を使って、ユーザーからの入力を繰り返し受け取る例を示します。

この例では、ユーザーが”exit”と入力するまで文字列を受け取ります。

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

このプログラムは、ユーザーが”exit”と入力するまで、scanf関数を使って文字列を受け取り、入力された文字列を表示します。

strcmp関数を使って入力された文字列が”exit”であるかを確認し、break文でループを終了します。

while文と他のループ構造の比較

C言語には、while文の他にfor文とdo-while文というループ構造があります。

それぞれのループには特徴があり、用途に応じて使い分けることが重要です。

while文とfor文の違い

スクロールできます
特徴while文for文
初期化ループの外で行うループヘッダで行う
条件判定ループの先頭で行うループの先頭で行う
更新処理ループ内で行うループヘッダで行う
  • while文は、繰り返し回数が事前に決まっていない場合や、条件が複雑な場合に適しています。

初期化や更新処理を自由に配置できるため、柔軟性があります。

  • for文は、繰り返し回数が明確に決まっている場合に適しています。

初期化、条件判定、更新処理を一行で記述できるため、コードが簡潔になります。

while文とdo-while文の違い

スクロールできます
特徴while文do-while文
条件判定ループの先頭で行うループの末尾で行う
最低実行回数0回1回
  • while文は、条件が真である限りループを実行しますが、条件が最初に評価されるため、条件が偽の場合は一度も実行されません。
  • do-while文は、ループの内容を少なくとも一度は実行したい場合に適しています。

条件がループの末尾で評価されるため、条件が偽でも一度は実行されます。

どのループを選ぶべきか

ループを選ぶ際には、以下のポイントを考慮すると良いでしょう。

  • 繰り返し回数が決まっている場合: for文を使用すると、コードが簡潔で読みやすくなります。
  • 繰り返し回数が不明な場合: while文を使用すると、条件に応じた柔軟なループが可能です。
  • 少なくとも一度は実行したい場合: do-while文を使用すると、条件に関わらず一度はループを実行できます。

これらの特徴を理解し、適切なループ構造を選択することで、効率的で読みやすいコードを書くことができます。

while文の応用

while文は基本的なループ構造ですが、応用することでより複雑な処理を実現できます。

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

ネストされたwhile文

while文をネストして使用することで、二重ループを実現できます。

以下は、二次元配列の要素をすべて表示する例です。

#include <stdio.h>
int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 2x3の行列
    int i = 0, j = 0; // 行と列のカウンタ
    // 行のループ
    while (i < 2) {
        j = 0; // 列のカウンタをリセット
        // 列のループ
        while (j < 3) {
            printf("%d ", matrix[i][j]);
            j++;
        }
        printf("\n");
        i++;
    }
    return 0;
}
1 2 3 
4 5 6

このプログラムは、while文をネストして二次元配列の各要素を表示します。

複数条件のwhile文

while文で複数の条件を組み合わせることができます。

以下は、二つの条件を持つループの例です。

#include <stdio.h>
int main() {
    int a = 0, b = 10;
    // aが5未満かつbが5より大きい間ループ
    while (a < 5 && b > 5) {
        printf("a: %d, b: %d\n", a, b);
        a++;
        b--;
    }
    return 0;
}
a: 0, b: 10
a: 1, b: 9
a: 2, b: 8
a: 3, b: 7
a: 4, b: 6

このプログラムは、aが5未満かつbが5より大きい間、ループを実行します。

フラグを使ったループ制御

フラグ変数を使ってループを制御することができます。

以下は、フラグを使ってループを終了する例です。

#include <stdio.h>
int main() {
    int flag = 1; // フラグ変数
    int count = 0;
    // フラグが真である間ループ
    while (flag) {
        printf("カウント: %d\n", count);
        count++;
        if (count >= 5) {
            flag = 0; // フラグを偽にしてループを終了
        }
    }
    return 0;
}
カウント: 0
カウント: 1
カウント: 2
カウント: 3
カウント: 4

このプログラムは、countが5以上になるとフラグを偽にしてループを終了します。

break文とcontinue文の活用

break文とcontinue文を使うことで、ループの制御をより柔軟に行うことができます。

  • break文: ループを即座に終了します。
  • continue文: ループの残りの処理をスキップし、次の反復に進みます。

以下は、break文とcontinue文を使った例です。

#include <stdio.h>
int main() {
    int i = 0;
    while (i < 10) {
        i++;
        if (i == 5) {
            continue; // iが5のときはスキップ
        }
        if (i == 8) {
            break; // iが8のときはループを終了
        }
        printf("%d\n", i);
    }
    return 0;
}
1
2
3
4
6
7

このプログラムは、iが5のときにcontinue文でスキップし、iが8のときにbreak文でループを終了します。

while文を使った実践的なプログラム

while文は、実際のプログラムでさまざまな用途に利用されます。

ここでは、while文を使った実践的なプログラムの例を紹介します。

ユーザー入力を検証するプログラム

ユーザーからの入力を検証し、正しい入力が得られるまで繰り返し入力を求めるプログラムです。

#include <stdio.h>
int main() {
    int number;
    // ユーザーが1から10の間の数を入力するまでループ
    while (1) {
        printf("1から10の間の数を入力してください: ");
        scanf("%d", &number);
        if (number >= 1 && number <= 10) {
            break; // 正しい入力が得られたらループを終了
        } else {
            printf("無効な入力です。もう一度試してください。\n");
        }
    }
    printf("入力された数: %d\n", number);
    return 0;
}
1から10の間の数を入力してください: 15
無効な入力です。もう一度試してください。
1から10の間の数を入力してください: 5
入力された数: 5

このプログラムは、ユーザーが1から10の間の数を入力するまで、入力を繰り返し求めます。

メニュー選択ループの実装

ユーザーにメニューを表示し、選択に応じた処理を行うプログラムです。

#include <stdio.h>
int main() {
    int choice;
    // ユーザーが0を選択するまでメニューを表示
    while (1) {
        printf("メニュー:\n");
        printf("1. オプション1\n");
        printf("2. オプション2\n");
        printf("0. 終了\n");
        printf("選択してください: ");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                printf("オプション1が選択されました。\n");
                break;
            case 2:
                printf("オプション2が選択されました。\n");
                break;
            case 0:
                printf("終了します。\n");
                return 0; // プログラムを終了
            default:
                printf("無効な選択です。もう一度試してください。\n");
        }
    }
}
メニュー:
1. オプション1
2. オプション2
0. 終了
選択してください: 1
オプション1が選択されました。
メニュー:
1. オプション1
2. オプション2
0. 終了
選択してください: 0
終了します。

このプログラムは、ユーザーが0を選択するまでメニューを表示し、選択に応じたメッセージを表示します。

ファイル読み込みループの例

ファイルからデータを読み込み、ファイルの終わりまでループするプログラムです。

#include <stdio.h>
int main() {
    FILE *file;
    char line[100];
    file = fopen("example.txt", "r"); // ファイルを読み取りモードで開く
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // ファイルの終わりまで行を読み込む
    while (fgets(line, sizeof(line), file) != NULL) {
        printf("%s", line); // 行を表示
    }
    fclose(file); // ファイルを閉じる
    return 0;
}
ファイルの内容が表示されます。

このプログラムは、example.txtというファイルを開き、ファイルの終わりまで各行を読み込んで表示します。

ファイルが存在しない場合は、エラーメッセージを表示します。

よくある質問

while文で無限ループを避けるにはどうすればいいですか?

無限ループを避けるためには、while文の条件が適切に更新されるようにすることが重要です。

ループ内で条件に影響を与える変数を更新し、条件が偽になるように設計します。

例えば、カウンタ変数をインクリメントすることで、特定の条件に達したときにループを終了させることができます。

例:count++

while文の条件が常に真にならないようにするには?

while文の条件が常に真にならないようにするためには、条件式を慎重に設計し、ループ内で条件に影響を与える変数を適切に更新することが必要です。

条件式に含まれる変数がループ内で変化しない場合、条件が常に真になり、無限ループが発生します。

条件式を見直し、変数の更新を確認することが重要です。

while文の中で変数を更新する方法は?

while文の中で変数を更新するには、ループ内の適切な位置で変数の値を変更するコードを記述します。

通常、ループの各反復で変数をインクリメント、デクリメント、または新しい値に設定することで更新します。

例えば、カウンタ変数をインクリメントする場合は、count++のように記述します。

まとめ

while文は、C言語における基本的なループ構造であり、条件が真である間、繰り返し処理を実行します。

この記事では、while文の基本構造、使用例、他のループ構造との比較、応用例、実践的なプログラム、そしてよくある質問について解説しました。

これらの知識を活用して、より効率的で柔軟なプログラムを作成することができます。

この記事を参考に、実際のプログラムでwhile文を活用してみてください。

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

関連カテゴリーから探す

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