2016-01-30 5 views
0

Это моя первая Java-программа. Предполагается, что пользователь должен вводить значения int от 0 до 100. Если пользователь вводит отрицательное значение, запись данных прекращается, и статистика отображается. Я не могу включать статические методы, математику или массивы.Java-поиск минимального значения из ввода сканера всегда приводит к нулю

У меня возникла проблема с поиском минимального класса minGrade. Независимо от того, какие значения вводятся при запуске программы, minGrade всегда приводит к нулю. Я уже некоторое время занимаюсь этим, но безрезультатно.

Другая проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю программу, и я ввожу кучу int, но затем вводим буквы алфавита для проверки проверки ошибок, программа анализирует пользователя дважды, а не один раз.

"Please enter a numeric grade between 0 and 100, inclusive, and press Enter:" 

Соответствующий код:

import java.util.Scanner; 


public class Grades { 

    public static void main(String[] args) 
    { 
     Scanner keyboard = new Scanner(System.in); 

     System.out.println("Please enter the Course Code and and press Enter:"); 
     String courseCode = keyboard.nextLine(); 
     System.out.println("You entered: " + courseCode + "\n"); 

     int grade = 0; 

     int numberOfGrades = 0; 
     int maxGrade = 0; 
     int minGrade =0; 
     double avgGrade = 0; 
     int sumGrades = 0; 

     int sentinel = 0; 



     do 

     { 


       **System.out.println("Please enter a numeric grade between 0 and 100, inclusive, and press Enter:");** 
       while(!keyboard.hasNextInt()) 
       { 

        System.out.println("Please enter a numeric grade between 0 and 100, inclusive, and press Enter:"); 
        keyboard.nextLine(); 

       } 

       grade = keyboard.nextInt(); 
       if((grade <=100) && (grade >= 0)) 
       { 
        numberOfGrades++; 
        sumGrades += grade; 
        sentinel = 0; 

        if(maxGrade < grade) 
         maxGrade = grade; 

        **if(minGrade > grade) 
         minGrade= grade;** 
       } 
       else if(grade > 100) 
       { 

        System.out.println("The entered number was greater than 100. Please enter a number between 0 and 100 inclusive, " 
          + "or input a negative number to exit Grade entry"); 
        sentinel = 0; 
       } 
       else if(grade <0) 
       { 
        grade = 0;//maybe? 
        sentinel = -1; 

       } 

     } 
     while((grade >100) || (sentinel == 0)); 


     avgGrade = (sumGrades/numberOfGrades); 



     System.out.println("You entered: " + "\ngrade: " + grade + "\n" + "sentinel: "+ sentinel + 
       "\nSum of Grades: " + sumGrades +"\nNumber of Grades: "+ numberOfGrades +"\nAverage Grades: " + avgGrade 
       + "\nMaxium Grade: "+ maxGrade+"\nMinimum Grade: "+minGrade); 
    } 

} 

Любой вход на это, форма моего кода для моей первой программы Java, или что-нибудь еще было бы весьма признателен.

Последний выпуск, который у меня есть, заключается в том, что средний класс всегда имеет десятое место нуля. Как я могу получить десятое место, чтобы не было нуля и фактической средней суммы?

ответ

1

Ваша проблема с minGrade заключается в том, что вы инициализируете ее до 0. Это уже значение min, поэтому никакие другие значения не будут меньше этого. (Фактически вы это гарантируете, установив отрицательные оценки на 0.) Инициализируйте его до максимального значения (100).

Похоже, что проблема с «двойным приглашением» - это common one с nextLine и nextInt. Решение, похоже, использует только nextLine, а затем анализирует возвращаемое значение для объекта Integer. (И печать ваш «неверный входной» текст на NumberFormatException.

Наконец, ваш avgGrade всегда xx.0 как вы делите два целых числа, которые всегда дает целое число обратно. Вы должны бросить один к двойному, чтобы получить двойной назад:..

avgGrade = ((double)sumGrades/numberOfGrades); 
+0

Да, я имею в виду, что он спрашивает пользователя дважды. '.nextLine()' и 'nextInt(), как бы я пошел, чтобы убедиться, что он не спрашивает дважды, когда число не является «Int». Я сам не совсем понимаю эти два утверждения, и java-документация мало помогла. Спасибо, двойное преобразование работало. Я попробовал avgGrade = 1.0d * (x/y), он, похоже, не работал – SeesSound

+0

@SajSeesSound вам нужно сделать один из элементов двойным, как показано в моем примере кода. Проблема в том, что (x/y) будет усекаться до int, поэтому вам нужно сделать ((double) x/y). Я работаю над двойной проблемой. – River

+0

И, наконец, не изменилось ли значение «grade» перед первым оператором «if» на что-то отличное от нуля? Если да, то почему значение для вычислений повторяется как ноль? – SeesSound

1

minGrade никогда не будет установлено значение, отличное от 0, потому что 0 никогда не будет больше, чем вошел в класс, так что эта проверка не удалась if(minGrade > grade) Попробуйте инициализацией minGrade к Integer.MAX_VALUE