根据输入的答案对学生的测试进行评分



我今天早些时候问过关于这个程序的问题,并且能够完成我需要完成的大部分工作,但人们似乎不再关注它了这是它的链接。

这是我现在拥有的:

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在Lab4.main(Lab4.java:29(

我不知道这意味着什么,也不知道如何修复它。

这意味着您的数组索引可能超过数组中的元素数。从您的代码中,您似乎显示了一个"一次关闭"错误。请注意,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
}
userAnswers[answerKey.length] = s.next().charAt(0);

数组索引是从零开始的,所以最后一个可寻址索引将是answerKey.length - 1

相关内容

  • 没有找到相关文章

最新更新