JavaScript | レベル別練習問題:繰り返し(for / while / do…while)

JavaScript
スポンサーリンク

今回は「ネストされたループ(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

ステップ実行(逐次追跡)

ijk学生scores[k]total (前→後)avg条件評価passed
000Alice950→95false
001Alice8895→183false
002Alice92183→275275/3=91.6791.67>=70 → truetrue
010Bob620→62false
011Bob7062→132false
012Bob58132→190190/3=63.3363.33>=70 → falsefalse
100Charlie780→78false
101Charlie8578→163false
102Charlie80163→243243/3=8181>=70 → truetrue
110David550→55false
111David6055→115false
112David65115→180180/3=6060>=70 → falsefalse

解説ポイント

  1. 三重ループ
    • 外側 for i → クラス
    • 中間 for j → 学生
    • 内側 for k → 点数配列の要素
  2. 条件付き更新
    • 平均点が 70 以上 → passed = true
    • それ以外 → passed = false
  3. 逐次表のメリット
    • どの学生のどの科目点数が total に加算されたか
    • 平均点と条件判定が分かりやすい
    • バグの箇所を特定しやすい
  4. 参照型オブジェクト
    • student.passed を更新すると元の配列に反映

応用例

  • 平均点だけでなく honors判定や科目別警告 を追加
  • ネストループ内で 条件付き割引・在庫更新 の処理に応用可能
  • ステップ表を作ることで、複雑なネスト処理でも理解・デバッグが容易
タイトルとURLをコピーしました