成绩计算器不会循环到第二个学生

时间:2014-10-12 01:54:39

标签: java

我看到最近的帖子实际上试图与我做同样的事情,但他的代码停在一个学生身上,它将无法正常工作。我设法修复了他的代码出了什么问题,但有两件事我仍然不明白。当我输入名字和姓氏的学生姓名时,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!");
            }
        }
    }
}

这是我的代码,我的目标是在我已经获得学生一的输出后让程序循环再次循环,但它只是停止平均第一个学生的成绩。

3 个答案:

答案 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();