【问题标题】:Grading a student's test based on input answers [closed]根据输入答案对学生的测试进行评分[关闭]
【发布时间】:2013-02-27 00:23:55
【问题描述】:

我今天早些时候曾问过有关此计划的问题,并且能够完成我需要完成的大部分工作,但似乎人们不再关注它 Here's 链接。

这是我现在拥有的:

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++;

    }

}

    }

但我在输入用户的答案后不断收到此错误:

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常: 12 在 Lab4.main(Lab4.java:29)

我不确定这意味着什么或如何解决它。

【问题讨论】:

  • 这意味着您正在尝试读取数组末尾。
  • 表示你试图访问第 29 行索引 12 处的数组,但你的数组小于 13 个元素。
  • 如果对新用户投反对票的人能够解释原因或至少指出FAQ

标签: java arrays for-loop while-loop user-input


【解决方案1】:

这意味着您的数组索引可能超过数组中的元素数。从您的代码中,您似乎展示了Off-by-one error。请注意,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
}

【讨论】:

  • 对不起,我不完全理解 for 循环部分,您是否建议我摆脱 'if(userAnswers[i]==answerKey[i]);正确答案++;'并将其替换为 'userAnswers[i] = s.next().charAt(0);'
  • 抱歉,我无法将其格式化为代码框
  • 谈到那行,我刚刚注意到另一个错误 - 请参阅我的更新。
  • 将 userAnswers[i] = s.next().charAt(0) 行放在 if 语句之前,这样在我输入我的分数后什么都没有发生,没有错误代码,它只是移动光标到下一行,是不是放错地方了?
  • userAnswers[i] = s.next().charAt(0) 应该在一个 for 循环中,if 语句在另一个 for 循环中。你可以将它们结合起来,但我担心你不能以正确的方式做到这一点......
【解决方案2】:
userAnswers[answerKey.length] = s.next().charAt(0);

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

【讨论】:

  • 感谢您修复了该错误消息,但是当程序尝试重新运行时它给了我这个:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 2 at Lab4.main(Lab4.java:26 )
  • 我的 while 循环有问题吗?这就是它的说法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2020-10-23
  • 2022-07-08
  • 1970-01-01
  • 2022-06-10
  • 2014-10-08
相关资源
最近更新 更多