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

JavaScript
スポンサーリンク

今回は「ネストループ+複数プロパティ同時更新+複雑条件」の例を作り、ステップ実行で変数・オブジェクトの状態を逐次追跡して解説します。
実務でもよくある「成績管理や売上集計の複合処理」をイメージしています。


練習問題:クラスごとの生徒成績集計(複数プロパティ同時更新)

let school = [
    {
        className: "1年A組",
        students: [
            { name: "Alice", scores: { math: 95, english: 88 }, passed: false, honors: false },
            { name: "Bob",   scores: { math: 62, english: 70 }, passed: false, honors: false }
        ]
    },
    {
        className: "1年B組",
        students: [
            { name: "Charlie", scores: { math: 78, english: 85 }, passed: false, honors: false },
            { name: "David",   scores: { math: 55, english: 60 }, passed: false, honors: false }
        ]
    }
];

// 平均点と個別条件で passed と honors を更新
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;
        let subjects = Object.keys(student.scores); // ["math", "english"]
        for (let k = 0; k < subjects.length; k++) {
            total += student.scores[subjects[k]];
        }
        let avg = total / subjects.length;

        // 複合条件で複数プロパティを更新
        if (avg >= 70) {
            student.passed = true;
            student.honors = avg >= 90 ? true : false;
        } else {
            student.passed = false;
            student.honors = false;
        }
    }
}

console.log(school);
JavaScript

出力

[
  {
    className: "1年A組",
    students: [
      { name: "Alice", scores: { math: 95, english: 88 }, passed: true, honors: true },
      { name: "Bob", scores: { math: 62, english: 70 }, passed: false, honors: false }
    ]
  },
  {
    className: "1年B組",
    students: [
      { name: "Charlie", scores: { math: 78, english: 85 }, passed: true, honors: false },
      { name: "David", scores: { math: 55, english: 60 }, passed: false, honors: false }
    ]
  }
]
JavaScript

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

ijk学生科目total (前→後)avg条件 avg>=70条件 avg>=90passedhonors
000Alicemath0→95falsefalse
001Aliceenglish95→183falsefalse
00Alice18391.5truetruetruetrue
010Bobmath0→62falsefalse
011Bobenglish62→132falsefalse
01Bob13266falsefalsefalsefalse
100Charliemath0→78falsefalse
101Charlieenglish78→163falsefalse
10Charlie16381.5truefalsetruefalse
110Davidmath0→55falsefalse
111Davidenglish55→115falsefalse
11David11557.5falsefalsefalsefalse

解説ポイント

  1. 三重ループ構造
    • 外側: for i → クラス
    • 中間: for j → 生徒
    • 内側: for k → 科目ごとの点数
  2. 複数プロパティ同時更新
    • passedhonors を同時に条件判定で更新
    • avg >= 70 → passed = true
    • avg >= 90 → honors = true
  3. 逐次追跡表のメリット
    • total と avg がどう変化しているか、条件がどう評価されるか、更新されるプロパティが一目で分かる
  4. 応用
    • 実務では成績集計・売上分析・条件付きフラグ設定などに活用可能
    • 条件や科目を増やしても、ステップ実行表で順序や更新箇所を把握できる
タイトルとURLをコピーしました