我看到最近的帖子实际上试图与我做同样的事情,但他的代码停在一个学生身上,它将无法正常工作。我设法修复了他的代码出了什么问题,但有两件事我仍然不明白。当我输入名字和姓氏的学生姓名时,java代码出错并且程序停止。当我只使用名字时,程序会一直进行,但在我计算出一个学生的成绩后停止。在我输入的学生人数达到所有成绩之前,它不会持续循环。
public class proj2
{
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Welcome to Gradecalculator!");
System.out.println("Please enter the number of students:");
int students = s.nextInt();
System.out.println("Please enter the number of exams:");
int exams = s.nextInt();
int i = 0;
int studentnumber = 1;
int sum = 0;
while (i < students) {
System.out.println("Enter student " + studentnumber++ + "'s name :");
String studentname = s.next();
System.out.println("Enter exam scores :");
for (; i < exams; i++) {
int n = s.nextInt();
sum+=n;
if (n < 0) {
System.out.println("Invalid exam scores, reenter: ");
}
}
double average = sum/exams;
if (average <= 100 && average >= 90) {
System.out.println("Letter grade: A");
System.out.println(studentname + " gets 4 stars! ****");
}
if (average <= 89 && average >= 80) {
System.out.println("Letter grade: B");
System.out.println(studentname + " gets 3 stars! ***");
}
if (average <= 79 && average >= 70) {
System.out.println("Letter grade: C");
System.out.println(studentname + " gets 2 stars! **");
}
if (average <= 69 && average >= 60) {
System.out.println("Letter grade: D");
System.out.println(studentname + " gets 1 star! *");
}
if (average <= 59) {
System.out.println("Letter grade: F");
System.out.println(studentname + " gets 0 stars!");
}
}
}
}
这是我的代码,我的目标是在我已经获得学生一的输出后让程序循环再次循环,但它只是停止平均第一个学生的成绩。
答案 0 :(得分:2)
当我输入姓名的学生姓名时,java代码出错并且程序停止
我猜你得到的错误是java.util.InputMismatchException
。发生这种情况是因为String studentname = s.next();
只获取一个令牌,当您输入带有两个令牌(如John Doe
)的名称时,第二个令牌仍保留在输入缓冲区中,并由下一个调用int n = s.nextInt();
进行解析。当然不行。您想要使用String studentname = s.next();
读取整行,而不是使用String studentname = s.nextLine();
(当您想要读取数字时,最好的选择可能是对所有调用使用Integer.parseInt()。)
此外,当您使用nextInt()
读取数据时,不会消耗换行符,这意味着当您继续下一次调用时,它仍然存在并将被解析而不是名称(在本例中) 。在您阅读名称之前使用s.nextLine()
读取空行,或使用Integer.parseInt(s.nextLine())
读取数据。
您可能还希望使用异常来优雅地捕获错误导致的错误。
在旁注中,Java中的类名应以Code Conventions for the Java Programming Language
中所述的大写字母开头请参阅Scanner.nextLine()的文档。
另外,正如另一个答案所述,我错过的是你在获得学生姓名的while循环和每个学生获得分数的for循环中使用相同的变量i
。这不行。你应该在第二个循环中使用另一个变量,如j
:
for (int j = 0; j < exams; j++) {
int n = s.nextInt();
sum+=n;
if (n < 0) {
System.out.println("Invalid exam scores, reenter: ");
}
}
理想情况下,您需要使用面向对象的方法,并创建具有相关测试分数的学生对象,并将数据读入学生的集合(可能是一个arrayList),但也许这是课程后期的解决方案或你似乎在运动的道路上。
答案 1 :(得分:1)
您正在使用i
作为外部(学生)和内部(考试)循环的索引。您应该使用单独的变量来确保内部循环不会干扰外部循环。
答案 2 :(得分:1)
看起来你正在做While循环,然后是for循环然后是if并返回for循环直到它完成所有等级。你需要将学生姓名和成绩放在同一个循环中。
for(i=0; i<3; i++){
System.out.println("What is the Students name?");
Name = kb.next();//NAME
System.out.println("What is the Students test score?");
Grade = kb.nextDouble();//GRADE
System.out.println();//SKIP SPACE ON SCREEN
student[i]= new TestScores(Name, Grade); //PASSES ARGUMENT THEN STORES NAME AND GRADE WITH ARRAY ADDRESS
}
kb.close();