ある条件を満たしている間は決められた範囲を繰り返して処理したいということが良くあります。身近な例で表現すると、スーパーマーケットから買ってきた玉子を冷蔵庫にしまうということを考えます。
「パックから玉子を1つ取り冷蔵庫の玉子入れに置く」これをある条件を基に繰り返す。では条件は何でしょう?「パックの玉子がなくなるまで」これだと半分正解ですね。
無限ループに気をつけろ
”冷蔵庫の玉子入れ”がいっぱいだったらどうなります?ちょっと意地悪でしたかね。でも繰り返しの処理を記述するときは、いろいろな状況を想定・想像しておかなければなりません。「パックの玉子がなくなるまで」だけが条件だといつまで経っても処理が終了しません。これを無限ループと言います。
無限ループを避けるには、繰り返し処理する条件を記述したら直ぐにループから抜けるコードを記述することをお勧めします。最初から繰り返す回数が決まっている場合は無限ループにはなりません。ループを抜ける記述が予めされているからです。
流しに溜まった汚れたコップを洗う
このような同じ作業をするときは繰り返し文を利用すると便利です。
多くの方はスポンジを手に取り洗剤を付けてコップを洗い、水ですすいで水切りかごに入れるという作業を汚れたコップがなくなるまで繰り返すはずです。
- スポンジに洗剤がついてなければ洗剤をつける
- 汚れたコップを手に取り洗う
- 汚れたコップを水ですすぎ水切りかごに入れる。
- 汚れたコップが残っていないか確認する
4の判断で汚れたコップが残っていれば1に戻るという流れですね。
とくに予め繰り返す回数がわからないときは繰り返し文(ループ文)を活用します。C系で記述すると--。
while文
予めコップの数がわからない場合はwhile文を利用します。
while(条件:汚れたコップが残っている && 水切りかごに空きがある)
{
if(スポンジに洗剤が付いていない)
{
スポンジに洗剤を付ける;
}
汚れたコップを手に取り洗う;
汚れたコップを水ですすぎ水切りかごに入れる;
}
for文
予めコップの数がわかっている場合は別の記述、for文が利用できます。
for(int idx=0;idx<コップの数;idx++)
{
if(スポンジに洗剤が付いていない)
{
スポンジに洗剤を付ける;
}
汚れたコップを手に取り洗う;
汚れたコップを水ですすぎ水切りかごに入れる;
}
ここで、for文について説明します。forの後に括弧でくくられている部分は
(
整数型変数 idx の初期値は0にしなさい;
idx は コップの数より小さい間だけ繰り返しなさい;
繰り返しブロックの最後に到達したら idx を1つずつ増加させなさい
)
という意味です。上記の例で言えば
for( //繰り返しの条件)
{
//繰り返しブロック
}
となり「}」が出てきたら idx が1つずつ増加されます。
例えばコップの数が3個と予めわかっているなら
if(スポンジに洗剤が付いていない)
{
スポンジに洗剤を付ける;
}
汚れたコップを手に取り洗う;
汚れたコップを水ですすぎ水切りかごに入れる;
if(スポンジに洗剤が付いていない)
{
スポンジに洗剤を付ける;
}
汚れたコップを手に取り洗う;
汚れたコップを水ですすぎ水切りかごに入れる;
if(スポンジに洗剤が付いていない)
{
スポンジに洗剤を付ける;
}
汚れたコップを手に取り洗う;
汚れたコップを水ですすぎ水切りかごに入れる;
という記述もできますが、かっこ悪いし、後でコップの数が5とか2になったら書き替えるのが面倒ですよね。だから、繰り返し文で処理しましょ。
まとめ
同じ作業を繰り返すときは繰り返し文を利用しましょう。その方が記述も楽ですし、繰り返す数が変更になっても対処がしやすい。無限ループというループから抜け出なくなることだけはしっかり注意してください。待てど暮らせど応答がない--。という時は無限ループを思い出してください。