第6章の9 ループの常套手段

1. 無限ループ

永遠に続くループ処理。ただし、ある条件で break文で脱出するように作ります。無限ループは一般的にwhile文かfor文を使って記述します。

(1) while文の無限ループ

永遠に続くループ処理。ただし、ある条件で break文で脱出するように作ります。

【書き方】
while (1) {
  文;
  if (条件式)
    break;
  文;
}

何故 while(1) が無限ループになるのか?
C言語では =0:「偽」、≠0:「真」 である
「1」は「≠0」、つまり「真」
while(1) は「常に真」、つまり「無限ループ」

// -1を入力するまで加算処理を行う例
#include <stdio.h>

int main(void)
{
    int n;
    int sum = 0;

    while (1) {    // 無限ループ
        scanf("%d", &n);
        if (n == -1)    // 入力データが -1 なら
            break;      // ループから脱出
        sum = sum + n;
    }
    printf("sum = %d\n", sum);

    return 0;
}

【フローチャート】

(2) forの無限ループ

for文を使って無限ループを記述する場合もあります。

【書き方】
for (;;) {
  文;
  if (条件式)
    break;
  文;
}

forの場合は慣例として、for (;;) と記述します。初期設定なし、継続条件なし、再設定なし、で無限ループになります。

〇 演習問題

無限ループを用いて次の処理を行いなさい。

1 × 2 = 2、2 × 2 = 4、4 × 2 = 8 のように整数値を順に2倍して いくと何番目に「32767」で表せる範囲を超えるか調べなさい。

【実行結果例】
data = 2
data = 4
data = 8
data = 16
data = 32
data = 64
data = 128
data = 256
data = 512
data = 1024
data = 2048
data = 4096
data = 8192
data = 16384
data = 32768

cnt = 15

解答例

#include <stdio.h>

int main(void)
{
    int data = 1;
    int cnt = 1;

    while (1) {
        data *= 2;
        printf("data = %d\n", data);
        if (data >= 32767) {
            break;
        }
        cnt++;
    }
    printf("\ncnt = %d\n", cnt);

    return 0;
}

2. 数値以外または EOF でループを終了する

これまでの例では「特定の数値が入力されたらループを抜ける」方法を紹介しました。
しかし、すべての数値に意味がある場合もあります。
そのようなときは、数値以外の入力(あるいは EOF)をトリガにしてループを終了できます。

#include <stdio.h>

int main(void)
{
    int n;
    int sum = 0;

    /* 数値を読み取れる限り合計する。
       数値以外または EOF でループ終了 */
    while (scanf("%d", &n) == 1) {
        sum += n;
    }
    printf("sum = %d\n", sum);

    return 0;
}

【実行結果例】
1
2
3
e
  ← 数値でない入力
sum = 6

水色文字はキーボードからの入力

scanf関数は入力個数を返却します(下表参照)。そのため、
while (scanf(“%d”, &n) == 1)
と記述すると、”%d” 指定で変換できる 10進整数を入力したときのみループを続行します。ですから、実行結果例のように 10進整数以外を入力するとscanfは 0 を返し、ループを終了します。

状況戻り値挙動
整数を 1 個読み取れた1ループ続行
整数に変換できない文字0ループ終了
入力開始前に EOFEOF(-1)ループ終了

「実行結果例」では「e」を入力していますが、scanfに「EOF」を送ることもできます。
EOF を送る方法は環境ごとに異なります(例: Windows の標準コンソールなら行頭で Ctrl+Z→Enter、Unix 系なら Ctrl+D)。

〇 演習問題

キーボードから10進数以外が入力されるまで次の処理を行いなさい。

  • 1を入力   : ”apple” と表示
  • 2を入力   : ”banana” と表示
  • 3を入力   : ”cherry” と表示
  • それ以外を入力: ”???” と表示

【実行結果例】
1~3 の整数値入力(終了条件: 10進数以外)
1
apple
2
banana
3
cherry
4
???
a

水色文字はキーボードからの入力

解答例

#include <stdio.h>

int main(void)
{
    int a;

    printf("1~3の整数値入力(終了条件:10進数以外)\n" );
    while (scanf( "%d", &a ) == 1) {
        switch (a) {
            case 1:
                printf("apple\n");
                break;
            case 2:
                printf("banana\n");
                break;
            case 3:
                printf("cherry\n");
                break;
            default:
                printf("???\n");
                break;
        }
    }

    return 0;
}

コメント