![](/img/trans.png)
[英]how can i get the total number of similar grade letters in my student grade calculator program
[英]Grade Calculator Does Not Loop to Second Student
我看到了最近的一篇文章,该文章实际上试图实现与我相同的目的,但是他的代码仅限于一名学生,并且不起作用。 我设法解决了他的代码出了什么问题,但是有两件事我仍然不明白。 当我输入学生的名字以及姓氏和名字时,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!");
}
}
}
}
这是我的代码,我的目标是一旦我已经获得了学生的输出,就再次让程序循环,但是它只是停止了对第一个学生的平均评分。
当我输入学生的名字以及姓氏和名字时,java代码出现错误,程序停止运行
我猜测您得到的错误是java.util.InputMismatchException
。 发生这种情况是因为String studentname = s.next();
仅获得一个令牌,当您输入带有两个令牌的名称(如John Doe
,第二个令牌将保留在输入缓冲区中,并由下一次调用进行解析int n = s.nextInt();
哪个当然行不通。 而不是使用String studentname = s.next();
您想使用String studentname = s.nextLine();
读取整行String studentname = s.nextLine();
(最好的选择可能是在您要读取数字时对所有呼叫使用Integer.parseInt()。)
同样,当您使用nextInt()
读取数据时,换行符将不会被使用,这意味着当您继续进行下一个调用时,它仍然存在并且将被解析而不是名称(在这种情况下)。 在读取名称之前,请使用s.nextLine()
读取空行,或者使用Integer.parseInt(s.nextLine())
读取数据。
您可能还希望使用异常来优雅地捕获由于错误输入而导致的错误。
另外,如Java编程语言的代码约定中所述,Java中的类名称应以大写字母开头。
请参阅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)中,但这也许是您在课程或练习路径的后期阶段的解决方案似乎在。
您正在使用i
作为外部(学生)循环和内部(考试)循环的索引。 您应该使用单独的变量,以确保内部循环不会干扰外部循环。
看起来您正在执行While循环,然后执行for循环,然后执行if并返回for循环,直到完成所有等级。 您需要将学生姓名和年级放在相同的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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.