while・do-whileのコードトレース
在庫を一件ずつ減らす処理と、条件付き集計を題材に反復の誤りを見つけます。回数だけでなく終了時の値、continueが飛ばす処理、最初から条件外の入力まで検証します。
この単元で学ぶこと
- whileとdo-whileの条件評価順を説明できる
- 増分・break・continueを含む繰返しを追跡できる
- 終了条件と境界の誤りを検証できる
本文解説
在庫を減らす int stock=3,sold=0; while(stock>0){stock--;sold++;}では(在庫,販売数)は(2,1)、(1,2)、(0,3)です。終了後は在庫0、販売数3。条件stock>=0へ変えると在庫0でも本体へ入り、販売数4・在庫-1となるため、条件の等号を確認します。
入力が最初から範囲外 在庫0のとき、while(stock>0)の本体は動きません。同じ減算をdo-whileにすると最初の一回で-1になります。少なくとも一度表示するメニューには後判定が適する場合がありますが、存在する在庫だけを処理するなら最初の条件確認が必要です。
奇数だけ集計する int i=0,sum=0; while(i<5){i++;if(i%2==0)continue;sum+=i;}は1、3、5を足して9です。iを先に増やすため偶数でcontinueしても次へ進めます。増分を最後へ移すなら、continue経路でも更新されるよう構造を見直します。
上限で止める int i=1,sum=0; while(i<=5){if(i==4)break;sum+=i;i++;}は1+2+3で6です。breakは条件を再確認せず外へ進むのでiは4のまま。比較の位置を加算後へ変えると4も加わり、同じbreak条件でも結果が違います。
条件式の副作用を可視化 int i=2,count=0; while(i-- >0){count++;}では比較に2、1、0を使います。本体は二回、最後のfalse判定でiは-1です。i--の代わりに--iなら比較値は1、0で本体は一回になります。比較前後の値を二列に分けると追いやすくなります。
空の本体にも意味がある int i=0; while(i++<2); System.out.print(i);ではwhileの本体は空文ですが、条件がiを変えるため終了して3を表示します。空文があるだけで無限ループと決めず、条件の副作用を確認します。副作用のない真条件と空文なら通常は終わりません。
内側だけの脱出 外側が二回回り、内側が最初の一回でbreakするなら、内側本体の実行は合計二回になり得ます。breakを見て全体終了とせず、どのループの外へ飛ぶかを括弧で特定します。外側の更新が残っているかも確かめます。
検証の終了条件 有限の例を別々のmainで実行し、期待する合計・最終カウンター・表示文字列を照合します。終了しないと予想する例はトレースで確認し、教材の自動検証では時間制限等の保護なしに実行しません。コンパイルエラー例も別ケースとし、出力不一致と区別します。
図解
重要ポイント
- whileは0回の可能性、do-whileは本体へ最低1回入る。
- 条件がfalseになった判定での副作用も数える。
- breakはループを抜け、continueは残りを飛ばす。
- 更新が全経路で実行されるかを確認する。
間違えやすい点
- 最後に表示する値と終了後の変数を混同しない。
- continueで更新を飛ばさない。
- while(false)の到達不能と変数falseで0回を区別する。
用語解説
- 前判定
- 本体の実行前に条件を評価する方式。
- 後判定
- 本体を実行してから継続条件を評価する方式。
- break
- 対象ループなどから抜ける文。
- continue
- ループ本体の残りを省略して次の継続処理へ進む文。
- 後置増分
- 式としては増加前の値を返し、変数は1増える演算。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。