今回は「ネストされたループ(2重・3重)+条件付き更新」の例を作り、逐次追跡表でステップ実行を示します。
複雑な処理も「どの条件でどの変数が変わるか」を分かりやすく追えます。
練習問題:クラスごとの生徒成績集計(2重ループ)
let school = [
{
className: "1年A組",
students: [
{ name: "Alice", scores: [95, 88, 92], passed: false },
{ name: "Bob", scores: [62, 70, 58], passed: false }
]
},
{
className: "1年B組",
students: [
{ name: "Charlie", scores: [78, 85, 80], passed: false },
{ name: "David", scores: [55, 60, 65], passed: false }
]
}
];
// 各生徒の平均点で passed 更新(2重ループ+条件付き更新)
for (let i = 0; i < school.length; i++) {
let classroom = school[i];
for (let j = 0; j < classroom.students.length; j++) {
let student = classroom.students[j];
let total = 0;
for (let k = 0; k < student.scores.length; k++) { // 3重ループで点数集計
total += student.scores[k];
}
let avg = total / student.scores.length;
if (avg >= 70) {
student.passed = true;
} else {
student.passed = false;
}
}
}
console.log(school);
JavaScript出力
[
{ className: "1年A組", students: [
{ name: "Alice", scores: [95,88,92], passed: true },
{ name: "Bob", scores: [62,70,58], passed: false }
]},
{ className: "1年B組", students: [
{ name: "Charlie", scores: [78,85,80], passed: true },
{ name: "David", scores: [55,60,65], passed: false }
]}
]
JavaScriptステップ実行(逐次追跡)
| i | j | k | 学生 | scores[k] | total (前→後) | avg | 条件評価 | passed |
|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | Alice | 95 | 0→95 | – | – | false |
| 0 | 0 | 1 | Alice | 88 | 95→183 | – | – | false |
| 0 | 0 | 2 | Alice | 92 | 183→275 | 275/3=91.67 | 91.67>=70 → true | true |
| 0 | 1 | 0 | Bob | 62 | 0→62 | – | – | false |
| 0 | 1 | 1 | Bob | 70 | 62→132 | – | – | false |
| 0 | 1 | 2 | Bob | 58 | 132→190 | 190/3=63.33 | 63.33>=70 → false | false |
| 1 | 0 | 0 | Charlie | 78 | 0→78 | – | – | false |
| 1 | 0 | 1 | Charlie | 85 | 78→163 | – | – | false |
| 1 | 0 | 2 | Charlie | 80 | 163→243 | 243/3=81 | 81>=70 → true | true |
| 1 | 1 | 0 | David | 55 | 0→55 | – | – | false |
| 1 | 1 | 1 | David | 60 | 55→115 | – | – | false |
| 1 | 1 | 2 | David | 65 | 115→180 | 180/3=60 | 60>=70 → false | false |
解説ポイント
- 三重ループ
- 外側
for i→ クラス - 中間
for j→ 学生 - 内側
for k→ 点数配列の要素
- 外側
- 条件付き更新
- 平均点が 70 以上 → passed = true
- それ以外 → passed = false
- 逐次表のメリット
- どの学生のどの科目点数が total に加算されたか
- 平均点と条件判定が分かりやすい
- バグの箇所を特定しやすい
- 参照型オブジェクト
student.passedを更新すると元の配列に反映
応用例
- 平均点だけでなく honors判定や科目別警告 を追加
- ネストループ内で 条件付き割引・在庫更新 の処理に応用可能
- ステップ表を作ることで、複雑なネスト処理でも理解・デバッグが容易

