C言語のきほん|while文の活用

回数が決まっていない繰り返しは、whileがいちばん自然。入力・判定・ループを組み合わせて、実用プログラムにしていこう。

while文は「いつ終わるか分からない繰り返し」に強い

前回の「1から5まで表示」のように、回数が決まっている繰り返しは for が得意です。
でも現実のプログラムって、回数が最初から決まっていないことの方が多いです。

  • 正しい入力が来るまで入力を繰り返す
  • 特定の値が入力されたら終了する
  • 条件が満たされている間だけ処理する

こういうときに、while文がすごくフィットします。
whileは「条件が真の間は続ける」というシンプルさがあるので、入力と組み合わせると一気に実用っぽくなります。

回数が決まっているか?決まっていないか?の見分け方

状況向いている
だいたい回数が決まっているfor1〜100を表示、配列を0番から最後まで処理
いつ終わるか分からないwhile正しい入力が来るまで、終了条件が来るまで

今回の文書はまさに「whileの得意分野」を練習する内容です。

whileで条件を変えて繰り返す(基本パターン)

whileの活用でまず覚えておくと強いのが、この型です。

  1. 最初に入力する(初回入力)
  2. 条件が真なら処理する
  3. 次の入力を受け取って条件を更新する

流れ図イメージ

ここで重要なのは 初回入力が必要 ということです。
初回入力がないと、条件判定に使う変数が未初期化のままになって、変な動きをしやすくなります。

サンプルプログラム

例:0が入力されるまで、入力された数を数えて合計も出す

  • 整数を何度も入力
  • 0が入力されたら終了
  • それまでに入力した個数と合計を表示

0は「終了の合図(センチネル)」として使います。

ファイル名:9_2_1.c

// whileで「0が入力されるまで」入力を繰り返し、個数と合計を求めるプログラム
#include <stdio.h>

int main(void)
{
    int n;
    int sum = 0;      // 合計
    int count = 0;    // 入力した個数(0は数えない)

    printf("整数を入力してください(0で終了)> ");
    scanf("%d", &n);   // 初回入力(これが大事)

    while (n != 0) {   // 0が入力されるまで繰り返す
        sum += n;
        count++;

        printf("整数を入力してください(0で終了)> ");
        scanf("%d", &n);  // 次の入力で条件が変わる
    }

    printf("入力した個数は%d個、合計は%dです。\n", count, sum);

    return 0;
}

実行イメージ

整数を入力してください(0で終了)> 5
整数を入力してください(0で終了)> 2
整数を入力してください(0で終了)> -3
整数を入力してください(0で終了)> 0
入力した個数は3個、合計は4です。

このプログラムの構成(3パーツ)

パーツ役割どこ?
初回入力未初期化を防ぐ/最初の条件判定の材料最初のscanf
繰り返し処理条件が真の間の処理whileの中
条件が偽になった後ループ終了後の表示whileの後

この型を覚えるだけで、入力系の課題がかなり解けるようになります。

while文とif文を一緒に使う(繰り返しの中で分岐する)

whileの中にifを入れると、「繰り返しながら、入力に応じて処理を変える」ができます。
これができると、プログラムが一気にそれっぽくなります。

サンプル:偶数ならメッセージを変えて表示する

  • 1〜6まで表示
  • 偶数なら 偶数です
  • 奇数なら 奇数です

ファイル名:9_2_2.c

// whileの中でifを使い、偶数・奇数でメッセージを変えるプログラム
#include <stdio.h>

int main(void)
{
    int i = 1;

    while (i <= 6) {
        if (i % 2 == 0) {
            printf("%dは偶数です。\n", i);
        } else {
            printf("%dは奇数です。\n", i);
        }

        i++;  // 次へ進める更新
    }

    return 0;
}

ここでのポイント

  • whileが「繰り返しの枠」
  • ifが「その中の分岐」
  • i++ が「進行役」(これがないと止まらない)

if文やswitch文の中でwhileを回す(分岐の中で繰り返す)

今度は逆パターンです。
ifのブロックの中でwhileを使うと、状況によって繰り返し方を変えられます。

別例:表示モードでカウントの出し方を変える

  • typeを入力(1ならカウントアップ、2ならカウントダウン)
  • 1なら 1→3 を表示
  • 2なら 3→1 を表示

ファイル名:9_2_3.c

// 入力されたモードに応じて、whileで数値の出し方を変えるプログラム
#include <stdio.h>

int main(void)
{
    int type;

    printf("モードを選んでください(1:増える 2:減る)> ");
    scanf("%d", &type);

    if (type == 1) {
        int i = 1;
        while (i <= 3) {
            printf("カウント:%d\n", i);
            i++;
        }
    } else {
        int i = 3;
        while (i >= 1) {
            printf("カウント:%d\n", i);
            i--;
        }
    }

    return 0;
}

実務っぽい見方

  • ifで「処理の方針」を決める
  • whileで「方針に沿って繰り返す」

この組み合わせは、メニュー処理や入力処理でよく使います。

実践問題

整数を2つ入力し、2つの合計が10になるまで入力を繰り返してください。
合計が10になったら、達成メッセージを表示して終了します。

実行例

整数を2つ入力してください > 3 3
合計は6です。まだ10ではありません。もう一度入力してください。
整数を2つ入力してください > 4 6
合計は10です。達成しました!

解答例

ファイル名:9_2_4.c

// 2つの整数の合計が10になるまで入力を繰り返すプログラム
#include <stdio.h>

int main(void)
{
    int a, b;
    int sum;

    printf("整数を2つ入力してください > ");
    scanf("%d%d", &a, &b);
    sum = a + b;   // 初回計算(最初の判定材料)

    while (sum != 10) {
        printf("合計は%dです。まだ10ではありません。もう一度入力してください。\n", sum);

        printf("整数を2つ入力してください > ");
        scanf("%d%d", &a, &b);
        sum = a + b;  // 次の判定材料に更新
    }

    printf("合計は10です。達成しました!\n");

    return 0;
}

解説:この問題がwhile向きな理由

  • 何回で合計10になるかは、入力次第で分からない
  • 条件が満たされるまで続ける
  • 入力のたびに条件が変わる

まさに while の得意パターンです。