基本制御文(While14)★


新しい命令を使って、前回のプログラムを書き換えます。

前回のプログラムは、同じ命令を2度書く必要がありましたが、新しい命令を使うと1度ですむようになります。

新しい命令とは「break」というキーワードです。

「break」は以前「switch文」の所で出てきました。

「switch文」での「break」は「switch文から抜ける」、というものでしたが、繰り返しと組み合わせることで「繰り返しから抜ける」という使い方が出来るようになります。

少し例を書いてみましょう。


<sample program 041-01>

#include <stdio.h>

int main( void )
{
    while( 1 ) {
        printf( "Hello\n" );
        break;
    }

    return 0;
}

<実行結果 VC++ Express Edition>

Hello
続行するには何かキーを押してください・・・

while( 1 ) は無限ループですから、延々と「Hello」という文字が表示されるはずですが、breakがあるために途中で繰り返しから抜けてしまい、1度しか表示されなくなっています。

ただ、このような使い方だと無限ループの意味が無くなってしまいますので、通常はif文と組み合わせて使います。


<sample program 041-02>

#include <stdio.h>

int main( void )
{
    int counter;

    counter = 0;

    while( 1 ) {

        printf( "counter = %d\n", counter );

        counter++;

        if( counter > 9 ) {
            break;
        }
    }

    return 0;
}

<実行結果 VC++ Express Edition>

counter = 0
counter = 1
counter = 2
counter = 3
counter = 4
counter = 5
counter = 6
counter = 7
counter = 8
counter = 9
続行するには何かキーを押してください・・・

0から9までの数値を表示するプログラムです。

whileの条件を書かず、無限ループで作成しています。

counterを増加させていき、9を超えたらbreakして繰り返しを抜けます。

このようにif文と組み合わせて使えば、繰り返しの好きな箇所から抜けることが出来ます。

前回のプログラムで説明した、

 得点入力
 チェック
 合計

という順番でプログラムを組むときも、チェックの箇所でbreakを使えば途中で抜けらることが出来ます。


では、前回のプログラムを書き換えてみます。


<sample program 041-03>

#include <stdio.h>

int main( void )
{
    int sum;
    int input;

    sum = 0;

    while( 1 ) {

        do {
            printf( "点数を入力してください:" );
            scanf( "%d", &input );
        } while( input < 0 || input > 100 && input != 999 );

        if( input == 999 ) {
            break;
        }

        sum += input;

    }

    printf( "得点合計は%d点です。\n", sum );

    return 0;
}

<実行結果 VC++ Express Edition>

点数を入力してください:100
点数を入力してください:0
点数を入力してください:50
点数を入力してください:999
得点合計は150点です。
続行するには何かキーを押してください・・・

入力した後、チェックを行い、999であれば無限ループを抜けています。

同じ題材(得点合計)で何種類かのプログラムを書きましたが、1つの問題に対する解法(プログラム)はいくつかあります。

10人いれば10通りのプログラムが出来上がる可能性があるのです。

ですから毎回<解答>と書いています。

<解答例>を見た後で、他の方法も無いのかどうか、皆さんも考えてみてください。


最後にbreakを使う上での注意点を1つ書いておきます。

次のプログラムを実行してみてください。


<sample program 041-04>

#include <stdio.h>

int main( void )
{
    int data = 10;

    while( 1 ) {
        switch( data ) {
            case 10:
                printf( "data = %d\n", data );
                break;
        }
    }

    return 0;
}

data = 10 という文字が延々と表示されます。

whileとswitchを併用する際に、switch文の中に書いてあるbreakは、あくまでもswitch文を抜けるためのbreakですからwhile文までは抜け出しません。

whileは無限ループになっていますから、ずっと抜け出せないままになります。

逆にswitch文の中にwhile文を書き、while文の中でbreakを実行してもswitch文は抜け出しません。


<sample program 041-05>

#include <stdio.h>

int main( void )
{
    int data = 10;

    switch( data ) {

        case 10:
            while( 1 ) {
                printf( "case 10\n" );
                break;
            }

        case 11:
            printf( "case 11\n" );
            break;
    }

    return 0;
}

<実行結果 VC++ Express Edition>

case 10
case 11
続行するには何かキーを押してください・・・

case 10: の中にwhile文があります。

無限ループですが、"case 10"と表示するとすぐbreakします。

ただし、このbreakは、while文を抜けるだけですから、switch文は抜けません。

抜けないため、case 11: の内容も実行されています。


次へ

戻る

目次へ