ネストした制御構文を理解する
入れ子の制御構文は、外側の一回の処理の中で内側の分岐や反復を実行する構造です。外側と内側の変数を別に追い、内側の初期化、合計回数、break・continueの対象を読み解きます。
この単元で学ぶこと
- 入れ子ループの回数と順番を求める
- 内側変数の初期化位置とスコープを判断する
- 入れ子内の分岐と制御移動を追う
本文解説
二重ループの順番 for(int i=0;i<2;i++){for(int j=0;j<2;j++){print(i+":"+j+";");}}は0:0;0:1;1:0;1:1;です。外側iを固定したまま内側jを最後まで動かし、内側が終わってからiを更新します。二変数を同時に一つずつ増やす構造ではありません。
内側初期化の繰返し 内側forのint j=0は外側が本体へ入るたびに評価します。i=1の回でもjは0からです。jを外で宣言してwhile(j<2)だけ置くと、初回の終了値2を保持し二回目は0回になる場合があります。
一定回数の積 外側3回、内側4回で毎回同じ範囲を完走するなら本体は12回です。breakや条件付きcontinueで処理を省略する場合、表示や加算回数は12より少なくなります。ループ条件の評価回数と本体実行回数も別です。
外側値に依存する回数 for(int i=1;i<=3;i++){for(int j=0;j<i;j++){count++;}}は1+2+3=6回です。内側の回数が毎回変わるので3*3とはできません。外側の各値と内側の回数を表にします。
条件付きの内側処理 if(i==j)だけ表示するなら対角の組だけになります。if((i+j)%2==0)なら合計が偶数の組です。まず全組合せを列挙し、その後に条件で絞ると、入れ子の進み方と条件の意味を分けて確認できます。
変数のスコープ for(int i=0;...){for(int i=0;...){...}}は外側iと内側iのスコープが重なり重複です。内側をjとすれば区別できます。ループの外でiを使いたいなら、外側forの宣言欄でなく外で宣言する必要があります。
終了対象を特定する 内側のbreakは通常内側だけを終了し、外側本体の後続文を実行します。continueも通常内側の次へ進みます。外側の制御へ移りたいならラベルを明示し、for更新式が実行されるかも追います。
行と列を作る 外側を行、内側を列として扱うと長方形の表示を作れます。内側で文字を繰り返し、外側本体末尾で区切りを出すと行ごとのまとまりになります。区切りの表示を内側へ移すと各文字の後へ入り、同じ回数でも見た目が変わります。
図解
重要ポイント
- 外側の反復ごとに内側forの初期化が行われる。
- 回数が固定なら外側回数×内側回数になる。
- 内側の上限が外側変数に依存すると単純な積にならない。
- breakやcontinueの対象は最も近い対応構文か指定ラベル。
間違えやすい点
- 外側が一回進むたび内側も一回だけ進むと思わない。
- 内側カウンタを外へ置いて再初期化し忘れない。
- 入れ子で同名ローカル変数を重複宣言しない。
用語解説
- 入れ子
- ある構文の内部へ別の構文を配置する構造。
- 外側ループ
- 内側ループ全体を本体の一部に持つ反復。
- 反復回数の総和
- 外側の各回で実行した内側回数を足した数。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。