

### 前提・実現したいこと

JavaScriptにて成績処理の課題をやっています。  
（学生の成績（点数）を入力し、その平均点、最高点を表示するという課題）

内容としては

まず最初に人数を入力しそして、その回数だけ名前と点数を入力。

例：※入力画面は prompt で行う。  
入力画面：「人数を入力してください」 入力：３  
入力画面：「名前を入力してください」 入力：山田  
入力画面：「点数を入力してください」 入力：60  
入力画面：「名前を入力してください」 入力：田中  
入力画面：「点数を入力してください」 入力：70  
入力画面：「名前を入力してください」 入力：鈴木  
入力画面：「点数を入力してください」 入力：80

そして以下のようなメニュー入力画面を出します。

1:修正 2:平均点 3:最高点 0:終了

１を入力すると「名前を入力してください」と出す。  
例えば「田中」と入力すると「何点ですか？」と出るので点数を入力します。  
これで田中さんの点数が変更される。

２を入力すると平均点を出す。

３を入力すると「最高点は鈴木さん、80点」と出す。

０を入力すると終了。

※終了されない場合にはまたメニューの入力画面を出す。

### 発生している問題・エラーメッセージ

[code]

    メニューの入力画面で1(修正)を選択した際に変更したい人の名前を入力するところまでは
    期待する動きとなってくれているのですがその後の「何点ですか？」の所がうまくいかず
    値を入力すると変更したい人とは別の人の点数が変わってしまいます。
    
[/code]

### 該当のソースコード

[code]

    var students = parseInt(prompt('生徒の人数を入力してください')); // 2
    var studentsArray = []; // [2]
    studentsArray.push(students); //人数管理
    
    var nameArray = []; //名前を管理する配列
    var scoreArray = []; //点数を管理する配列
    
    var totalScore = 0; //　平均点を出すための変数
    var maxScore = 0; //　最高得点
    var maxScorePerson = ""; //　最高得点の生徒
    
    for (let i = 0; i < students; i++) {
    
      var studentName = prompt('生徒の名前を入力してください');
      var studentScore = parseInt(prompt('生徒の点数を入力してください'));
    
      nameArray.push(studentName);
      scoreArray.push(studentScore);
    
      totalScore = totalScore + scoreArray[i]; //点数の合計
    
      if (studentScore > maxScore) {
        maxScore = studentScore; // 最高得点
        maxScorePerson = studentName; //最高得点の生徒
      }
    
      if (students == studentsArray.length + i) {
        var menu = parseInt(prompt('1:修正 2:平均点 3:最高点 0:終了')) //メニュー;
        if (menu === 1) {
          studentName = prompt('変更したい生徒の名前を入力してください');
          if (studentName == studentName[i]) {
            nameArray[i] = studentName;
          }
          if (nameArray[i] != studentScore[i]) {
            scoreArray[i] = parseInt(prompt('変更後の点数を入力してください'));
          }
        } else if (menu === 2) {
          alert("平均点は" + totalScore / students + "です");
        } else if (menu === 3) {
          alert("最高得点は" + maxScore + "点で" + maxScorePerson + "さんです");
        } else if (menu === 0) {
          alert('終了します');
        }
      }
    }
    console.log(nameArray);
    console.log(scoreArray);
    
[/code]

### 試したこと

[code]

    if (menu === 1) {
          studentName = prompt('変更したい生徒の名前を入力してください');
          if (studentName == studentName[i]) {
            nameArray[i] = studentName;
          }
          if (nameArray[i] != studentScore[i]) {
            scoreArray[i] = parseInt(prompt('変更後の点数を入力してください'));
          }
    
[/code]

studentsが２人でそれぞれ[Aさん、Bさん][10点、20点]と入力し、  
上記のコードでAさんの点数を100点に変更しようとして  
studentArrayとscoreArrayをconsoleで出力してみると  
[Aさん、Bさん][10点、100点];  
とBさんの点数が変更されてしまいます。  
対処方法がわかりません。  
よろしくお願いします。


CC BY-SA 4.0
2019-12-18T14:16:43.423
61552
2019-12-18T15:48:04.847
37093
question
javascript array
配列の中の値を変更する方法


今のコードでは、`students == studentsArray.length +
i`が成り立つ時にメニューが表示されるようになっていますが`studentsArray`の長さは1なので、`i === students -
1`となり常に最後の学生に対して修正処理が行われるようになっています。

おそらくやりたいことは次のように最初の入力処理が終わったら一旦ループを閉じ、新たにメニューを表示するループを開始することではないでしょうか。（概略のみにとどめています）

[code]

    for (let i = 0; i < students; i++) {
      // 最初の入力処理
    }
    
    // メニュー表示のループ
    while (true) {
      var menu = parseInt(prompt('1:修正 2:平均点 3:最高点 0:終了'));
      if (menu === 1) {
        studentName = prompt('変更したい生徒の名前を入力してください');
        // 名前studentNameであるような学生のインデックスを探す
        for (let i = 0; i < students; i++) {
          if (studentName == nameArray[i]) {
            scoreArray[i] = parseInt(prompt('変更後の点数を入力してください'));
          }
        }
      }
      // menu === 2,3の場合
      } else if (menu === 0) {
         alert('終了します');
         break;
      }
    }
    
[/code]


CC BY-SA 4.0
2019-12-18T15:48:04.847
61556
2019-12-18T15:48:04.847
13199
61552
answer