Пытаюсь рассчитать средний балл

вот мой код до сих пор (он был обновлен):

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. Не соответствует требованиям, средний балл ниже 2.0
  4. Не соответствует требованиям, средний балл выше 2,0, но имеет оценку F (примечание: средний балл >= 2,0)
  5. Не соответствует требованиям, средний балл ниже 2.0 и оценка F

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


person Kentaro51    schedule 01.11.2011    source источник
comment
Ваша else if (gpa <2.0 && fail ==1) линия никогда не будет достигнута из-за того, что вы else if (gpa < 2.0)над ней.   -  person animuson    schedule 01.11.2011
comment
Если вам нужно напечатать все эти различные варианты, поместите более конкретные условия над более общими (отредактировал мой пост), поскольку, как указывает animuson, условие для вывода 3 затеняет условие для вывода 5.   -  person AusCBloke    schedule 01.11.2011


Ответы (6)


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

person Tom W    schedule 01.11.2011

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

person Chris Eberle    schedule 01.11.2011

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

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

person David Schwartz    schedule 01.11.2011

Во-первых, вы не можете сравнивать строки с помощью оператора ==. Что это делает, так это сравнивает фактические ссылки на объекты, т.е. для grade == "a" он проверяет, являются ли grade и "a" одними и теми же объектами, а это не так.

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

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

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

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

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

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

person AusCBloke    schedule 01.11.2011

Вы исправили неправильное использование оператора равенства везде, кроме предложения «пока». Так должно быть

while(!grade.equals("n")
person Ickster    schedule 01.11.2011

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

else if (gpa <2.0 && fail ==1)
person Doler    schedule 28.04.2017