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増える演算。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。