5.
繰り返し処理
繰り返し処理
・*:..☆ プロローグ ☆..:*・
「ランプの精よ。これから客が40人来るんだ。どうか40人分のコーヒーを出しておくれ。」
「おいおい、アラジン、忘れたのかい?。願い事は、もっと具体的で明確でないと駄目だ。あいまいな願い事が不幸を生んできた事への反省だって言っただろう。」
「そうだったな。十分に具体的なつもりだったんだけど。それじゃあ、40個のコーヒーカップを出しておくれ。それから次の願い事として、40個のカップにコーヒーを注いでおくれ。」
「こらこら。物品の複数要求禁止って規則を忘れたかい?。一回の願い事で出せる物品は1個、1単位までなんだよ。急にたくさんの物を持つと、ろくなことにならないからね。」
「そうだったな。それじゃあ、最初の願いはコーヒーカップを出してくれ、だ。その次の願いは、カップにコーヒーを注いでくれ、だ。そしてその次の願いは、またコーヒーカップを出してくれ、で、その次の願いは...」
「まてまて、魔法には申請と許可が必要なんだ。願い事システムが変わってから回数制限は無くなったけど、80回も許可を取っていたら日が暮れてしまうぞ。それでもいいのかい?」
「う~ん、困ったな。早くしないと40人の客が来てしまう。よし、これならどうかな。最初の願い事は、続く2回の願い事を40回繰り返してくれ、だ。2番目の願い事は、コーヒーカップを出してくれ、だ。3番目の願い事は、コーヒーカップにコーヒーを注いでくれ、だ。これならいいだろう。」
「よしよし、それなら大丈夫だろう。どんなルールにも抜け道はあるものさ。願い事のしかたが分かってきたじゃないか。」
カフェオレを作ることを考えてみましょう。その工程は次のようなものであるとします。
- カップを用意する
- ミルクを注ぐ
- コーヒーを注ぐ
これで、カフェオレが1杯できました。それでは、2杯のカフェオレを作りましょう。実際とはちょっと違うかもしれませんが、次のようであるとします。
- カップを用意する
- ミルクを注ぐ
- コーヒーを注ぐ
- カップを用意する
- ミルクを注ぐ
- コーヒーを注ぐ
今度は、5杯のカフェオレを作りましょう。1~3の工程を5回、記述すればよいわけですが、それではかなり長くなってしまうので、次のように書いてみます。
-
以下を5回、繰り返す
(1) カップを用意する
(2) ミルクを注ぐ
(3) コーヒーを注ぐ
来客数だけ作るのであれば、次のように書けばよいでしょう。
-
カフェオレの数が来客数になるまで以下を繰り返す
(1) カップを用意する
(2) ミルクを注ぐ
(3) コーヒーを注ぐ
このように、同じ事を何回も行う処理を、プログラム言語では繰り返しの構文として用意しています。
5.1. while 文
while 文
while 文は次のように記述します。
while( 式 )
文
- 式を評価し、真であれば、つまり 0 でなければ文を実行します。
- 再び式を評価し、結果によって文を実行します。
- 評価した結果が偽であれば、つまり 0 であれば繰り返しは終了します。
次のように考えてもよいでしょう。
- 式を評価し、0 であれば、繰り返しを終了します。
- 文を実行します。
while 文の例
while 文の例
int n = 0;
while( n < 10 )
n++;
- 変数 n の初期値は 0 です。
- while 文に差し掛かった時点で n は 0 ですから、式 n < 10 を評価した結果は真となり、n++ が実行され n は 1 となります。
- 再び n < 10 を評価し、n++ が実行されます。
- n が 10 になった時点で n < 10 を評価すると、結果は偽となるので while 文を抜けます。
5.2. for 文
for 文
for 文は次のように記述します。
for( 式 A ; 式 B ; 式 C )
文
式 A、B、C と文は、以下のように実行されます。
- 式 A を実行します
- 式 B を評価し、真であれば、つまり0でなければ文を実行します。偽であれば for 文を抜けます。
- 式 C を実行します
- 2.に戻ります
式 A、B、Cには、どのような式を書いてもよいのですが、次のような書き方が多用されます。ここで、n は繰り返し回数を数える為のカウンターとして使用する変数です。
- 式 A:n = 0 のように、変数を初期化する。
- 式 B:n < 10 のような条件式。
- 式 C:n++ のように、変数の値を変化させる。
この書き方によって、決まった回数だけ文を繰り返すことが出来ます。例えば、文を 10 回、繰り返すには、以下のように記述します。
for( n = 0 ; n < 10 ; n++ )
文
for 文では、式 A、B、Cの、いずれも省略可能です。
式 B を省略した場合、評価した結果は真とされ、繰り返しを抜ける事はなくなります。繰り返しを抜けるには、後で述べる break 文、または、return 文を使用しなければなりません。
for 文の例
for 文の例
int i;
for( i = 0 ; i < 10 ; i++ )
printf( "Hello World\n" );
- 変数 i は、繰り返しの回数を数えるために使用する変数です。
- 式 A の部分で i に 0 を代入します。
- 式 B には、10 回の繰り返しが行われる条件式を記述します。
- 式 C では、変数 i をインクリメントします。
-
“Hello World”が 10 回、表示されます。
5.3. do~while 文
do~while 文
do~while 文は次のように記述します。
do
文
while( 式 );
while 文は、式を評価した後に、その結果によって文が実行されるか while 文を抜けるかが決まります。
while 文に差し掛かった時点、つまり、最初の 1 回目の式の評価が偽であった場合には、文は 1 回も実行されません。
これに対し、do~while 文は、まず文を実行し、その後に式を評価します。評価した結果が真であれば、再び文を実行し、偽であれば do~while 文を抜けます。
while 文と異なり do~while 文では、少なくても 1 回は文が実行されます。
5.4. break、continue 文
break、continue 文
break 文、continue 文は、繰り返し構文の中で使用され、処理の実行を制御します。
break 文
break 文
break 文が実行されると、最も内側の繰り返し処理を抜け出し、次の処理に遷移します。
実際には次のようなプログラムを書くことはありませんが、例として見てください。
while( n < 10 ){
printf( "Hello " );
break;
printf( "World\n" );
}
変数 n が 10 未満であれば、printf( "Hello " ); が実行されます。
次に break; がありますから、そこで while 文を抜けます。printf( "World\n" ); は実行されません。
このような使い方では、プログラムとしての意味がありませんので、通常は if 文と共に使用します。
int sum = 0;
int num, i;
for( i = 0 ; i < 10 ; i++ ){
scanf( "%d", &num );
sum += num;
if( sum > 100 )
break;
}
10 回の繰り返しの中で、数値を入力し、合計を計算します。途中で合計が 100 を超えたら繰り返しを終了します。
continue 文
continue 文
continue 文が実行されると、以降の文を実行せずに、次の繰り返しに移行します。
break の場合と同様、実際には次のようなプログラムを書くことはありませんが、例として見てください。
for( i = 0 ; i < 10 ; i++ ){
printf( "Hello " );
continue;
printf( "World\n" );
}
for 文によって 10 回の繰り返しが行われます。“Hello”は 10 回、出力されますが、“World”は、continue 文の後にあるため出力されません。continue が実行されることにより、printf( "World\n" ); は実行されず、次の繰り返しに移行します。
break と同様、通常は if と共に使用します。
int sum = 0;
int num, i;
for( i = 0 ; i < 10 ; i++ ){
scanf( "%d", &num );
if( num < 0 )
continue;
sum += num;
}
10 回の繰り返しの中で、数値を入力し、合計を計算します。ただし、入力された値が負の場合には合計に加えません。