2014-10-12 2 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

ответ

1

Вы используете i как в индексе как для внешних (студенческих), так и для внутренних (экзаменов) циклов. Вы должны использовать отдельные переменные, чтобы внутренний контур не мешал внешнему циклу.

+0

петли я изменил код и сделал я в J для моих экзаменов. Теперь он переходит ко второму человеку, но как только я ввожу свои экзамены для второго человека, он переходит в третьего ученика. Хотя я всего лишь участвую в двух учениках. Я надеюсь в этом есть смысл. – Daniel

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

+0

@ Даниэль Ах да, это потому, что все еще остались данные, оставшиеся от экзаменов 'int' = s.nextInt();' call before. Либо добавьте пустой вызов '.nextLine()', прежде чем читать имя студента, или используйте Integer.parseInt (s.nextLine()), чтобы прочитать количество учеников и баллы. – jpw

+0

Удивительный! Это полностью сработало, и теперь я могу использовать фамилии в своей программе. Тем не менее, вы не знаете, как заставить его зацикливать и рассчитать оценку второго ученика. – Daniel

1

Похоже, что вы выполняете цикл While, а затем цикл 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

+0

Код будет запускать «тот же», если вы избавитесь от строки kb.close. Что касается ученика [i], это всего лишь один из возможных способов хранения имени и класса. Может быть, вы можете передать свои значения в переменные и распечатать их на экране? Не знаю точно, что вы пытаетесь сделать, и насколько вы научились помогать дальше. – learningCurve

+0

Я нахожусь в главе 3 моего класса, и это введение в курс Java, поэтому я просто научился делать это для циклов, надеюсь, это немного помогает. – Daniel

Смежные вопросы