我正在尝试解决竞争性编程实践问题。我只是一个初学者,所以请多多包涵。
这是问题
您学校的历史老师需要使用他设计的真/假测验等级的帮助 计分技术。每个正确答案可获得2分,每个错误答案可获得1分 扣除点,没有答案为零。 您的任务是帮助老师自动完成此任务。 输入项 文件中的第一项包含以下形式的测试答案: TFFTFTFTFFFTTTTFTFTF
下一行是测试案例的数量,即参加测试的学生人数。 文件中的所有其他条目都是学生ID,后跟一个空白,然后是学生的 回应。例如,条目:
S2013-1-1003 TFTFTFTT TFTFTFFTTFT
表示学生ID为S2013-1-1003,问题1的答案为True,则 问题2的答案为False,依此类推。这名学生没有回答问题9。 这个例子有20个问题。 输出量 输出应该是学生的ID,然后是答案,然后是测试成绩, 其次是考试成绩。假设以下等级量表:90%-100%,A; 80%-89.99%,B; 70%-79.99%,C; 60%-69.99%,D;和0%-59.99%F。
样本输入
TTTTTFFFFF
3
S2013-1-2345 TTTTTFFFFF
S2013-1-1266 TFTFTFTFTF
S2012-2-0006 T T TF F F
样本输出
S2013-1-2345 TTTTTFFFFF 20 A
S2013-1-1266 TFTFTFTFTF 8 F
S2012-2-0006 T T TF F F 12 D
* /
我的代码:
public class Score {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
//input answer to the test
String correctAnswer = sc.nextLine();
//input number of test cases
int numberOfStudents = sc.nextInt();
String studentID[] = new String[numberOfStudents];
String studentAnswer[] = new String[numberOfStudents];
int studentScore[] = new int[numberOfStudents];
char studentGrade[] = new char[numberOfStudents];
//ask user to input data
for(int i = 0; i < numberOfStudents; i++) {
System.out.println("Enter student details");
studentID[i] = sc.nextLine();
studentAnswer[i] = sc.nextLine();
}//end of first for loop
//checks whether the student has the correct score
for(int y = 0; y < correctAnswer.length(); y++) {
if(studentAnswer[y].charAt(y) == correctAnswer.charAt(y)) {
studentScore[y]++;
}//end of if
}//end of for
for(int y = 0; y < numberOfStudents; y ++) {
double percentage = (studentScore[y] / correctAnswer.length()) * 100 ;
//check the letter grade of the student
if(percentage >= 90) {
studentGrade[y] = 'A';
}//end of first if
else if(percentage >= 80 && percentage <= 89) {
studentGrade[y] = 'B';
}//end first else if
else if(percentage >= 70 && percentage <= 79) {
studentGrade[y] = 'C';
}//end of second else if
else if(percentage >= 60 && percentage <= 69) {
studentGrade[y] = 'D';
}//end of third else if
else {
studentGrade[y] = 'F';
}//end of last else
}//end of for
//close the scanner to avoid any memory leaks
//display the score
for(int i = 0; i < numberOfStudents; i++) {
System.out.printf("%d\t%d\t%d\t%d", studentID[i], studentAnswer[i], studentScore[i], studentGrade[i]);
}//end of first for
}//end of main
}//end of class
程序会编译,但是一旦我输入测试数据,我都会从编译器收到outofBounders错误。然后我意识到我在这段代码中犯了一个错误
System.out.println("Enter student details");
studentID[i] = sc.nextLine();
studentAnswer[i] = sc.nextLine();
}//end of first for loop
如果StudentID和studentAnswer是整数,那么我可以使用空格将它们分开,然后在一行中输入数据。但是我忘记了当我使用空格作为分隔符时,它不会被分隔,因为空格仍被视为字符串。我的主要问题是如何要求用户在由字符串分隔的一行中输入学生ID和答案,以便可以将其存储到学生ID数组和studentAnswer数组等数组中。
答案 0 :(得分:0)
用于显示分数的格式说明符是错误的!您可以如下进行更改:
//显示分数
for(int i = 0; i < numberOfStudents; i++) {
System.out.printf("%s\t%s\t%d\t%s", studentID[i], studentAnswer[i], studentScore[i], studentGrade[i])
}//end of first for
答案 1 :(得分:0)
您正在使用sc.nextLine()进行输入。 nextLine()的作用是,它从输入缓冲区读取所有字符,直到找到 \ n 或 newline 个字符。
因此,您可以要求用户以这种方式进行输入: 学生ID \ n studentAnswer
另一种修改输入数组的方法如下:
for(int i = 0; i < numberOfStudents; i++) {
System.out.println("Enter student details");
String line = sc.nextLine();
char[] chars = line.toCharArray();
String fs = "";
String sc = "";
boolean flag = false;
for(int j=0;j<chars.length;j++){
if(chars[j]==' ') {
flag = true;
continue;
}
if(flag ==false) fs += chars[j];
else sc += chars[j];
}
studentID[i] = fs;
studentAnswer[i] = sc;
}