0

プログラムがこのforループに到達して実行しようとすると、エラーが発生します

for (int m = 0; m < students; m++){
        allScores = allScores + scores[m];

学生はintとして宣言され、allScoresはscores[]配列と同様にdoubleとして宣言されました。

これはエラーメッセージです:

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

51行目はfor(int m = 0;m<学生;m++)行です

編集:

これは私のコード全体です。scores[]配列を正しく実行していない可能性があります。

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 d=1;
    double allScores = 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 the class? ");
    input = s.nextLine();
    students=Integer.parseInt(input);

    String [] name = new String[students];
    double [] scores = new double[students];

    for (int j = 0; j < students; ++j)
    {
        int correctAnswers=0;

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

        System.out.print("Enter quiz score answers :");
        String line = s.nextLine().toUpperCase();
        for (int k = 0; k < answerKey.length; k++) {
        userAnswers[k] = line.charAt(k);
            }


            for (int i = 0; i < userAnswers.length; i++)
        {

                if(userAnswers[i] == answerKey[i])
                {
                    correctAnswers++;
                }



        }
            System.out.println(name[j]);
            System.out.println((df.format((((float)(correctAnswers) / answerKey.length)) * 100)) + "%");
            scores [d] = ((float)((correctAnswers) / answerKey.length) * 100);
            d++;
    }
    System.out.println("the high score is "   + "and the low score is "   );
    for (int m = 0; m < scores.length; m++){
        allScores = allScores + scores[m];
    }
    System.out.println("Average is:" + ((allScores/students)));

}

}

編集:

申し訳ありませんが、51行目が間違っていました

scores [d] = ((float)((correctAnswers) / answerKey.length) * 100);

編集:

新しいコードでエラーメッセージが表示されなくなりましたが、スコアの平均化が機能していないようです。

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 d=1;
    double allScores = 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 the class? ");
    input = s.nextLine();
    students=Integer.parseInt(input);

    String [] name = new String[students];
    double [] scores = new double[students + 1];

    for (int j = 0; j < students; ++j)
    {
        int correctAnswers=0;

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

        System.out.print("Enter quiz score answers :");
        String line = s.nextLine().toUpperCase();
        for (int k = 0; k < answerKey.length; k++) {
        userAnswers[k] = line.charAt(k);
            }


            for (int i = 0; i < userAnswers.length; i++)
        {

                if(userAnswers[i] == answerKey[i])
                {
                    correctAnswers++;
                }



        }
            System.out.println(name[j]);
            System.out.println((df.format((((float)(correctAnswers) / answerKey.length)) * 100)) + "%");
            scores [d] = ((float)((correctAnswers) / answerKey.length) * 100);
            d++;
    }
    System.out.println("the high score is "   + "and the low score is "   );
    for (int m = 0; m < scores.length; m++){
        allScores = allScores + scores[m];
    }
    System.out.println("Average is:" + ((allScores/students)));

}

}
4

4 に答える 4

4

問題は、。studentsより大きい値に初期化されることですscores.lengthscores.length代わりにstudents、ループの上限として使用できます。または、に初期化studentsしますscores.length(またはそれより低い値)。

配列全体を反復処理するだけの場合は、拡張forループ構文を使用できます。

for (double score : scores) {
    allScores = allScores + score;
}

編集私は自分で行を数えました(退屈なものです)そして私はこの行に着陸します:

scores [d] = ((float)((correctAnswers) / answerKey.length) * 100);

何が起こっているのかというと、それdは大きくなりすぎます。これはおそらくd、0ではなく1に初期化したためです。

于 2013-02-27T04:17:49.000 に答える
3

反復には配列のlengthプロパティを使用します。

for (int m = 0; m < scores.length; m++){
        allScores = allScores + scores[m];

ただし、エラーは51行目で発生しているとおっしゃいましたが、51行目は次のとおりです。

scores [d] = ((float)((correctAnswers) / answerKey.length) * 100);

したがって、dはscores.length以上です。

なぜdを1で初期化するのか興味がありますか?

0に変更すると、問題が解決する場合があります。

int d=0;

コードのもう1つの問題は次のとおりです。

((float)((correctAnswers) / answerKey.length) * 100);

に変更します

(((float)correctAnswers / answerKey.length) * 100);

それ以外の場合は、結果を変更します。これは、すでに浮動小数点数になっています。それは結果に影響を与えます。

于 2013-02-27T04:17:58.597 に答える
0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:  

これは、制限を超えてアレイにアクセスしている場所があるためです。にある可能性がありますscores[m];

次を使用できます。

for (int m = 0; m < scores.length; m++){
        allScores = allScores + scores[m];  
于 2013-02-27T04:21:02.023 に答える
-1

コードにはいくつかの不規則性があります。

int d=1; // your score[index] starts with this just change to 0;

scores [d] = ((float)((correctAnswers) / answerKey.length) * 100);

//your scores length will now be d + students; use the students instead
for (int m = 0; m < scores.length; m++){  //for (int m=0;m<students;m++)
        allScores = allScores + scores[m];
    }
于 2013-02-27T04:38:21.730 に答える