前回はelseifによる複数条件の分岐を扱った。今回からは繰り返し処理(ループ)に入る。まずは最も基本的な繰り返し構文である while文 を扱う。
while文の基本構文
while (条件式)
処理
endwhilewhile は「条件式が真である間、処理を繰り返す」という構文である。実行の流れは次の通りである。
- 条件式を評価する
- 真であれば、内側の処理を1回実行し、1に戻る
- 偽であれば、繰り返しを終了し、
endwhileの次の行へ進む
if文と違い、一度実行して終わりではなく、条件が偽になるまで何度も繰り返すという点が最大の特徴である。
【具体例】1からnまでの合計
○整数型: goukei(整数型: n)
整数型: i
整数型: sum
i ← 1
sum ← 0
while (i ≦ n)
sum ← sum + i
i ← i + 1
endwhile
return sumこの処理は、i が n 以下である間、sum に i を加算し続け、そのたびに i を1ずつ増やしていく。goukei(4) を実行した場合の流れをトレースすると次のようになる。
i=1, sum=0
while (1 ≤ 4) → 真
sum = 0 + 1 = 1
i = 2
while (2 ≤ 4) → 真
sum = 1 + 2 = 3
i = 3
while (3 ≤ 4) → 真
sum = 3 + 3 = 6
i = 4
while (4 ≤ 4) → 真
sum = 6 + 4 = 10
i = 5
while (5 ≤ 4) → 偽 → ループ終了
return 10前判定ループであることに注意する
while文は「条件式を先に評価してから処理を実行する」という前判定型のループである。
つまり、最初の判定で条件がすでに偽であれば、内側の処理は一度も実行されない。
i ← 10
while (i が 5 以下)
sum ← sum + i
endwhileこの例では、i の初期値がすでに10であり、i が 5 以下 という条件は最初から偽であるため、内側の sum を sum + i とする は一度も実行されずにループを抜ける。
試験問題では、このような「一度も実行されないケース」に注意が必要である。
無限ループに注意する
while文では、ループ内で条件式に関わる変数を更新し忘れると、条件が永遠に真のままとなり、処理が終了しない「無限ループ」に陥る。
/* 誤った例:iを更新し忘れている */
i ← 1
while (i が n 以下)
sum ← sum + i
endwhileこの例では、n が1以上である場合、i の値が更新されないため、条件が永遠に真のままとなり、ループが終了しない。試験問題でも、「このプログラムを実行するとどうなるか」という設問で、無限ループになることを見抜けるかが問われることがある。
【具体例】条件によって回数が変わる処理
whileループは、あらかじめ繰り返し回数を指定するのではなく、条件が成立している間、処理を繰り返したい場合に適している。例えば「値を2で割り続け、1以下になるまでの回数を数える」処理を考える。
○整数型: kaisu(整数型: n)
整数型: count
count ← 0
while (n が 1 より大きい)
n ← n ÷ 2
count ← count + 1
endwhile
return count例えば、kaisu(8) を実行すると、
8 → 4 → 2 → 1
と変化する。
2で割った商が1になるまでに、3回の割り算を行っているため、戻り値は3になる。
このように、while文は「条件式が真である間、処理を繰り返す」構文です。繰り返し回数そのものを指定するのではなく、条件によって繰り返しを終了する点に注目しよう。
学習のポイント
- while文は前判定型であり、最初から条件が偽であれば処理は一度も実行されない
- ループ条件に関係する変数が適切に更新されているかを確認し、無限ループになっていないかをチェックする
- トレースの際は、
iやsumのような変数の値を1周ごとに書き出していく - ループを抜けた直後の変数の値が、条件式が偽になったときの値であることを意識する
まとめ
while文は、「条件式が真である間、処理を繰り返す」という構文である。
そのため、繰り返し回数そのものを指定するのではなく、「どの条件が成立している間、処理を続けるのか」に注目することが重要である。
次回扱うfor文も繰り返し処理に使われるが、while文とは異なる形で繰り返しを制御する。



コメント