-4

私は今日このプログラムについて質問し、私がする必要のあることのほとんどを得ることができましたが、人々はもうそれを見ていないようです ここにそれへのリンクがあります。

これが私が今持っているものです:

import java.util.*;
import java.text.*;

public class Lab4 {
public static void main(String[] args){
    Scanner s= new Scanner(System.in);
    String input;
    int students;
    int correctAnswers=0;

    char [] answerKey= { 'B' , 'D' , 'A' , 'A' , 'C' , 'A' , 'B' , 'A' , 'C' , 'D' , 'B' , 'A' };
    char [] userAnswers = new char[answerKey.length];

    DecimalFormat df = new DecimalFormat("#0.0");

    System.out.print("how many students are in your class?");
    input = s.nextLine();
    students=Integer.parseInt(input);

    String [] name = new String[students];

    int j=1;
    while(students>=j)
    {
        System.out.print("Enter name of student" + j + ": ");
        name[j] = s.nextLine();

        System.out.print("Enter quiz score answers");
        userAnswers[answerKey.length] = s.next().charAt(0);

        for (int i = 0; i < userAnswers.length; ++i)
        {
            if(userAnswers[i]==answerKey[i]);
            correctAnswers++;
        }

        System.out.print((df.format(correctAnswers/answerKey.length)) + "%");
    j++;

    }

}

    }

しかし、ユーザーの回答を入力した後も、このエラーが発生し続けます。

スレッド「main」の例外java.lang.ArrayIndexOutOfBoundsException:12 at Lab4.main(Lab4.java:29)

それが何を意味するのか、それを修正する方法がわかりません。

4

2 に答える 2

3

これは、配列インデックスが配列内の要素の数を超える可能性があることを意味します。あなたのコードから、あなたはオフバイワンエラーを示したようです。Java配列はゼロベースであることに注意してください。つまり、配列インデックスは0で始まり、で終わりますarray.length - 1

(注:テストされていないコードで、私はScanner何ヶ月も使用していません...)

変化する

int j=1;
while(students>=j)

int j = 0;
while (students > j)

そして、このラインは

userAnswers[answerKey.length] = s.next().charAt(0);

論理的なエラーです。@Creakazoidの回答に従って範囲外に書き込んでいるだけでなく、固定されている場合でも、配列の最後の要素にすべての回答を書き込むことになります。つまり、すべての生徒の回答がユーザーの最後の文字になります。入力。

これは

for (int i = 0; i < answerKey.length; ++i) {
    userAnswers[i] = s.next().charAt(0);
}

編集:あなたは答えでいっぱいの入力の行を読む必要があるようです。したがって、行全体を読んでから、行を文字に分割します。(未テスト)

String line = s.nextLine();
for (int i = 0; i < answerKey.length; ++i) {
    userAnswers[i] = line.charAt(i);
}

さらに、

if(userAnswers[i]==answerKey[i]);

行末のセミコロンに気づきましたか?空のステートメント(セミコロンで構成)を記述しており、correctAnswers++;この条件が真であるかどうかに関係なく実行されます

に変更します

if (userAnswers[i] == answerKey[i])

変更する必要があるかもしれません

System.out.print("Enter name of student" + j + ": ");

System.out.print("Enter name of student" + (j + 1) + ": ");

ただし、出力は影響を受けません。


実際、whileループはforループに置き換えることができます-読みやすくなります:

for (int j = 0; j < students; ++j) {
    // .. your code
}
于 2013-02-27T00:26:29.323 に答える
0
userAnswers[answerKey.length] = s.next().charAt(0);

配列インデックスは 0 から始まるため、最後のアドレス指定可能なインデックスはanswerKey.length - 1.

于 2013-02-27T00:30:23.533 に答える