★基本制御文(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: の内容も実行されています。