第6章の7 break文

1. break文の基本

break文は、switchのブロックやループから脱出する際に使用します。

  • switch文で、case句の処理を打ち切りブロックを脱出するときに用いる。 ⇒ 説明済み
  • for文、while文などのループから脱出するときに、if文と併用して用いる。
#include <stdio.h>

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

    // とりあえず 10回ループ
    for (int i = 1; i <= 10; i++) {
        scanf("%d", &n);
        if (n == -1)  // 入力データが -1 なら
            break;    // ループから脱出
        sum = sum + n;
    }
    printf("sum = %d\n", sum);

    return 0;
}

【実行結果例】
1
2
3
-1
sum = 6

【フローチャート】

この例では、とりあえず 10回ループすることになっていますが、 入力値が -1 だった場合は、直ちにループ処理を打ち切ることになります。
つまり、「10個の入力データ、または -1 が入力されるまでデータの合計をとる」という処理になっています。

2. 多重ループを一気に抜ける

break文を多重ループの中で使用した場合は、 そのbreak文の含まれるループからひとつだけ脱出するので注意してください。

ですから、二重、三重のループを抜けるには、その度にbreak文を使うようになります。
下の例では三重ループを抜けるのに、3回breakしています。

#include <stdio.h>

int main( void )
{
    int i, j, k, no = 1;
    
    for (i=1; i<=10; i++) {
        for (j=1; j<=10; j++) {
            for (k=1; k<=10; k++) {
                no = no + (i * j + k);
                if (no >= 2000) break;
            }
            if (no >= 2000) break;
        }
        if (no >= 2000) break;
    }
    printf("i:%d j:%d k:%d\n",i,j,k);

    return 0;
}

【実行結果例】
i:2 j:7 k:9

多重ループを一気に抜けるには一般にgoto文が使われます。構造化プログラミングでは用いないようにと教えられるgoto文ですが、この場合に限り使用してもかまわないでしょう。

#include <stdio.h>

int main( void )
{
    int i, j, k, no = 1;
    for (i=1; i<=10; i++) {
        for (j=1; j<=10; j++) {
            for (k=1; k<=10; k++) {
                no = no + (i * j + k);
                if (no >= 2000) goto OUT;
            }
        }
    }
OUT:
    printf("i:%d j:%d k:%d\n",i,j,k);

    return 0;
}

goto文では、コロン(:)を付けたラベル(上記では “OUT” )へ一気に制御を移すことができます。その有効範囲は関数内部になります。

〇 演習問題

問1

予め決めた数を当てるゲームのプログラムを次の要領で作成しなさい。

  • 5回ループしながら、数字を入力する。
  • 入力した数字が 5 ならループを脱出する。
  • 5回以内に当たれば、当たりまでの回数を表示する。
  • 5回以内に当たらなければ、当たりの数字を表示する。

【実行結果例】
数当てゲームです。
1~10の整数値を入力> 8
1~10の整数値を入力> 5
2回目で当たりです。

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

問2

次の仕様に従って、プログラムを作成せよ。

  • 2つの整数の除算を行い、小数点以下 50桁まで求めなさい。
  • ただし、計算途中で割り切れた場合は、それ以後の小数点は求めません。
  • また、割る数に 0 が入力された場合は計算を行いません。
  • 負数は入力されないものとします。

【処理手順】

  1. 計算結果を格納する整数型配列を大きさ 51 で宣言する。
  2. 整数値 ( a, b ) を入力する。
  3. b に 0 が入力されたら、そのまま処理を終了する。
    (コンピュータでは 0 で割るという処理はあってはならないもの。)
  4. 計算結果 [0] に a を b で割った結果を格納する。
  5. 1 から 51 までループする。
    ・ a を b で割った余りが 0 ならループを終了する。
    ・ a に余り × 10 を代入する。
    ・ 計算結果 [ループ番目] に a を b で割った結果を格納する。
  6. 計算結果を表示する。

【実行結果例1】(小数部で割り切れる)
整数値を2つ入力してください 5 4
5 / 4 = 1.25

【実行結果例2】(割り切れない)
整数値を2つ入力してください 10 3
10 / 3 = 3.33333333333333333333333333333333333333333333333333
(小数点以下50桁)

【実行結果例3】(整数部で割り切れる)
整数値を2つ入力してください 10 2
10 / 2 = 5.

【実行結果例4】( b に 0 を入力)
整数値を2つ入力してください 10 0
処理終了

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

解答例

// 問1
#include <stdio.h>

int main(void)
{
    int i, no;

    printf("数当てゲームです。\n");
    for (i = 1; i <= 5; i++) {
        printf("1~10の整数値を入力> ");
        scanf("%d", &no);
        if (no == 5)
            break;
    }
    if (i <= 5) {
        printf("%d回目で当たりです。\n", i);
    }
    else {
        printf("残念でした。当たりは%dです。\n", 5);
    }

    return 0;
}
// 問2
#include <stdio.h>

int main(void)
{
    int kekka[51];
    int i, a, b;
    int amari;

    printf("整数値を2つ入力してください ");
    scanf("%d%d", &a, &b);

    if(b == 0){
        printf( "処理終了\n" );
        return 0;
    }

    printf("%d / %d = ", a, b);

    kekka[0] = a / b;
    for (i = 1; i < 51; i++) {
        amari = a % b;
        if (amari == 0)
            break;
        a = amari * 10;
        kekka[i] = a / b;
    }
    printf("%d.", kekka[0]);
    for (a = 1; a < i; a++) {
        printf("%d", kekka[a]);
    }
    printf("\n");

    return 0;
}

コメント