2014-10-12 58 views
0

我看到最近发布的一篇文章试图达到和我一样的效果,但是他的代码停在一个学生身上,它不起作用。我设法解决了他的代码有问题,但有两件事我仍然不明白。当我输入学号的姓名时,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

您使用我两次搞乱你的循环顺序 – NightSkyCode 2014-10-12 02:13:58

回答

1

您正在使用i作为外部(学生)和内部(考试)循环的索引。您应该使用单独的变量来确保内部循环不会干扰外部循环。

+0

我改变了我的代码,并提出了我为我的考试第j。它现在循环到第二个人,但一旦我输入第二个人的考试成绩,它就会成为第三个学生。即使我只为2名学生输入。我希望这是有道理的。 – Daniel 2014-10-12 02:19:42

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()以大写字母开头。

此外,正如在另一个答案中提到的,我错过了,你在同时使用变量i在获取学生名称的while循环和为每个学生获得分​​数的for循环。这不起作用。你应该在第二循环中使用另一个变量一样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)学生,但也许这是您在课程后期或您似乎正在进行的练习道路上的解决方案。

+0

我使用迄今为止收到的建议更新了我的代码,但它仍然没有循环到第二个学生。小心再看一下?我还修复了String studentname = s.nextLine();但是一旦我这样做了,其余的代码就不能工作了,所以我把它放回s.next(); – Daniel 2014-10-12 02:18:17

+0

@丹尼尔啊是的,那是因为还有数据从'int exams = s.nextInt();'以前的调用。在读取学生姓名前,或者使用Integer.parseInt(s.nextLine())读取学生人数和分数,可以添加空的'.nextLine()'调用。 – jpw 2014-10-12 02:24:34

+0

太棒了!这完全有效,现在我可以在我的程序中使用姓氏。仍然不确定如何让它循环并计算第二个学生的成绩。 – Daniel 2014-10-12 02:32:48

1

它看起来像你正在做的循环然后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(); 
+0

我们还没有学过像[i]和kb的东西,所以我不允许在我的代码中使用它。请注意再看一下吗? – Daniel 2014-10-12 02:18:45

+0

如果您摆脱kb.close行,代码将运行“相同”。至于学生[我],这只是存储名称和等级的一种可能方式。也许你可以将你的值传递给变量并将它们打印到屏幕上?不知道你想要做什么以及你学到了多少帮助。 – learningCurve 2014-10-12 02:26:38

+0

我在讲我的课的第3章,这是Java课程的简介,所以我刚刚学会了如何做循环,希望这会有所帮助。 – Daniel 2014-10-12 02:35:40