Попытка рассчитать средний балл - PullRequest
2 голосов
/ 01 ноября 2011

вот мой код (он был обновлен):

import java.util.Scanner; 

public class gpa {

   public static void main(String[] args) {
      double gpa=0;
      double input = 0;
      String grade= "";
      int classes =0;
      double fail =0;
      do
      {
         System.out.print("Enter Grade (n to quit): "); 
         Scanner sc = new Scanner(System.in); 
          grade = sc.nextLine(); 
          grade = grade.toLowerCase(); 
          if (grade.equals("a"))
          {
             input = 4.0;
          }
          if (grade.equals("b"))
          {
             input = 3.0;
          }
          if (grade.equals("c"))
          {
             input = 2.0;
          }
          if (grade.equals("d"))
          {
             input = 1.0;
          }
          if (grade.equals("f"))
          {
             fail = 1;
          }

          gpa+=input;
          classes++;
      } while(grade!="n");
      System.out.print("GPA: " + gpa + "   "); 

      gpa/=classes;
      if (gpa>=2 && classes >=4 && fail !=1)
      {
         System.out.print("Eligible");    
      }
      else if(classes <4)
      {
         System.out.print("Ineligible. less than 4 classes"); 
      }
      else if (gpa < 2.0)
      {
         System.out.print("Ineligible. GPA is less than 2.0"); 
      }
      else if (gpa >=2.0 && fail == 1)
      {
         System.out.print("Ineligible. GPA is above 2.0, but has an F");
      }
      else if (gpa <2.0 && fail ==1)
      {
         System.out.print("Ineligible. GPA is below 2.0 and has F");
      }
   }

}

Вот что мне нужно для вывода:

  1. Допустимо
  2. Недопустимо, принимая менее 4 классов
  3. Не соответствует требованиям, gpa ниже 2,0
  4. Не соответствует критериям, gpa выше 2,0, но имеет оценку F (примечание: gpa> = 2,0)
  5. Не соответствует критериям, gpa ниже2.0 и имеет оценку F

Он продолжает запрашивать ввод.Как мне это остановить?Я попытался преобразовать оценку в символ, но это закончилось ужасно для меня.Я думаю, что это может быть ошибка компилятора или что-то.Любая помощь будет оценена.Хотя полезная помощь могла бы снизить мое кровяное давление.

Ответы [ 6 ]

1 голос
/ 01 ноября 2011

Для начала нельзя сравнивать строки с помощью оператора ==.То, что он делает, это сравнивает фактические ссылки на объекты, т.е.для grade == "a" он проверяет, являются ли grade и "a" одинаковыми объектами, но это не так.

Чтобы проверить содержимое строк на равенство, используйте.equals(), т.е.grade.equals("a").

Другое дело, не должен ли средний балл быть средним из ваших общих баллов?то есть.gpa /= classes после завершения цикла.

Кроме того, вместо использования double для хранения fail, переменной флага, позволяющей узнать, не произошел ли у субъекта предмет, используйте boolean и установите для него значениеtrue если оценка - F. Если говорить об этом утверждении if, то оно не изменит input, и предыдущее значение input будет добавлено к gpa вместо оценки сбоев, такой как 0.0.

А как насчет неверного ввода?Это также приведет к увеличению gpa на предыдущее значение input.

EDIT: и использование некоторых else if s вместо отдельных операторов if,так как любое другое условие будет проверено, даже если одно условие проходит.то есть.Если grade.equals("a") истинно, вы все равно будете без необходимости проверять, являются ли grade также "b", "c", "d" и "f".

EDIT2: С этим списком условий, которые вы только что добавили, и тем, как у вас есть последний блок операторов if, общее правило состоит в том, чтобы ваши более конкретные условия были выше более обобщенных, чтобы они не скрывались от обобщенных.то есть.Число 5 («Не соответствует критериям, gpa ниже 2,0 и имеет оценку F») затенено номером 3 («Не соответствует критериям, gpa ниже 2,0»), если вы сохраняете их в таком порядке, как указано в animuson.

1 голос
/ 01 ноября 2011

В дополнение к некорректному сравнению (тестирование, если две строки ссылаются на один и тот же объект, а не на то, что их содержимое логически равно), вам также не удастся установить input в 0 для оценки F . В результате, один f засчитывается в GPA так же, как и в предыдущем классе.

Когда человек наконец-то вводит n , вы все равно делаете математические вычисления, чтобы добавить оценку и увеличить количество оценок. Кроме того, вы никогда не вычисляете средний балл (вы просто суммируете оценки).

1 голос
/ 01 ноября 2011

Это сбивает с толку многих новых Java-программистов, это очень распространенная ошибка. Вам нужно использовать метод .equals, а не оператор ==. См. Java String.equals против == .

1 голос
/ 01 ноября 2011

Вы используете String (объект), а не char, поэтому вам нужно использовать метод .equals. например вместо grade == "a" вам нужно grade.equals("a").

0 голосов
/ 28 апреля 2017

Java, JavaScript, PHP или C ++, язык не имеет значения, так как методы все одинаковые.Вы должны серьезно подумать о последствиях использования одной и той же переменной в этих двух строках кода:

else if (gpa <2.0 && fail ==1)
0 голосов
/ 01 ноября 2011

Вы исправили неправильное использование оператора равенства везде, но в своем предложении while. Должно быть

while(!grade.equals("n")
...