2013-07-07 2 views
-4

Это код для определения GPA из командной строки. На данный момент код неверен. Я надеюсь увидеть исправленный код.Использование оператора switch для определения результата GPA

public class Main { 
    public static void main(String[] args) { 
    double gpa = Integer.parseInt(args [0]); 
    switch(gpa)) { 
     case (gpa>3.5) :   System.out.println("First class Hons"); break; 
     case (3.49=> gpa => 3.0): System.out.println("upper Second class Hons"); break; 
     case (2.99=> gpa >= 2.5): System.out.println("Lower Second class Hons"); break; 
     case (2.99=> gpa >= 2.0): System.out.println("Pass"); break; 
     case (2.0 => gpa):   System.out.println("Fail"); break; 
     default:     System.out.println("Invalied gpa"); 
    } 
    } 
} 
+2

Вы не можете использовать оператор switch для сравнения double. Вместо этого используйте инструкции if-else. – Kon

+0

без дуги, как создать этот код – Deshika22

+2

@ Deshika22: Почему вы так стремились использовать оператор 'switch'? Это просто не подходит для диапазонов. –

ответ

2

Подсказка: вы не можете легко использовать switch здесь. Вместо этого используйте серию операторов if.

9

Операции с переключателем/регистром не работают. Это не условия - они специфические случаи. (И, как указывалось другими, вы не можете переключиться на double значений в любом случае.) Вы просто хотите много if/else заявления:

String grade; 
if (gpa >= 3.5) { 
    grade = "First class Hons"; 
} else if (gpa >= 3.0) { 
    grade = "Upper second class Hons"; 
} else if (gpa >= 2.5) { 
    grade = "Lower second class Hons"; 
} else if (gpa >= 2.0) { 
    grade = "Pass"; 
} else { 
    grade = "Fail"; 
} 
System.out.println(grade); 

Важно отметить, что я только с помощью одного условие для каждой проверки здесь - даже если ваш синтаксис для коммутатора/случая работал, и даже если бы вы изменили => на >= в каждом случае, у вас все равно были бы недопустимые случаи, например, 3.495, которые не попадали ни в какие ковши. Это также означает, что вам нужно только указать каждую границу один раз.

Теперь, когда вы получили его компиляции она все равно будет ошибкой, если ввести «3,5» в качестве входных данных, из-за этой линии:

double gpa = Integer.parseInt(args [0]); 

Вы на самом деле хотите

double gpa = Double.parseDouble(args[0]); 

. .. в противном случае вы будете разбирать только целое число ввод.

Вы могли бы также рассмотреть возможность использования BigDecimal вместо double здесь - для этого конкретного случая это не имеет значения, но если вы действительно заинтересованы в сохранении точных десятичных цифр, BigDecimal больше подходит.

+0

, если я использую оператор switch, как создать код – Deshika22

+0

@ Deshika22: Вы не можете. Это просто не работает для вас здесь. (Черт, вы даже не можете использовать 'switch' с' double', но даже если бы вы могли, вы не могли бы представлять диапазоны.) Просто оставьте здесь «switch». –

+0

@ Deshika22 - Если вы действительно хотите использовать коммутатор по какой-либо причине, конвертируйте в int (от округления до ближайшего .5 инкремента, умножьте на 10, затем преобразуйте в int: eg 3.79 -> 4.0 -> 40, а затем используйте интегральные случаи) или используйте язык, который позволяет больше в случае, например [Go] (http://golang.org/ref/spec#Switch_statements). – tjameson

2

Java ясно сказано:

A switch works with the byte, short, char, and int primitive data types. It also works with enumerated types (discussed in Enum Types), the String class, and a few special classes that wrap certain primitive types: Character, Byte, Short, and Integer (discussed in Numbers and String).

Более подробную информацию о коммутаторе вместе с, например, можно увидеть на http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

Так как это было предложено другими, если-то еще есть способ пойти.

+0

Ссылка на PLS для источника цитаты ... –

+0

@VishalK: Я уже вставил url. – Lokesh

+0

aahh да, я получил это .. –

2

Вы можете использовать переключатель заявление, если вы действительно хотите, с помощью перечислений для представления различных марок:

public class Main { 
    public static void main(String[] args) { 
     double gpa = Double.parseDouble(args[0]); 
     Grade grade = Grade.getGradeFromGPA(gpa); 

     switch (grade) { 
      case FIRST_CLASS: System.out.println("First class Hons"); break; 
      case TWO_ONE:  System.out.println("upper Second class Hons"); break; 
      case TWO_TWO:  System.out.println("Lower Second class Hons"); break; 
      case PASS:   System.out.println("Pass"); break; 
      case FAIL:   System.out.println("Fail"); break; 
      default:   System.out.println("Invalied gpa"); 
     } 
    } 

    private enum Grade { 
     FIRST_CLASS(3.5, 4), 
     TWO_ONE(3, 3.49), 
     TWO_TWO(2.5, 2.99), 
     PASS(2.49, 2), 
     FAIL(0, 1.99); 

     private final double minGPA; 
     private final double maxGPA; 

     Grade(final double minGPA, final double maxGPA) { 
      this.minGPA = minGPA; 
      this.maxGPA = maxGPA; 
     } 

     static Grade getGradeFromGPA(double gpa) { 
      for (Grade grade : Grade.values()) { 
       if (grade.maxGPA >= gpa && grade.minGPA <= gpa) { 
        return grade; 
       } 
      } 
      //invalid GPA 
      return null; 
     } 
    } 
} 

Примечания:

  • я исправил Integer.parseInt в Double.parseDouble
  • Я оставил логику так, как она была в вашем вопросе, но она не оставляет сомнений в том, что происходит с входами, такими как 3.499 - это вернет недопустимый класс, поскольку он скользит между максимумом TWO_ONE и min FIRST_CLASS

Если вы действительно использовали перечисление, вы, вероятно, не использовали бы переключатель, чтобы распечатать оценку. Вам будет лучше иметь строку, представляющую описание класса и печать, т.е.:

public static void main(String[] args) { 
    double gpa = Double.parseDouble(args[0]); 
    Grade grade = Grade.getGradeFromGPA(gpa); 

    if (grade != null) { 
     System.out.println(grade.description); 
    } else { 
     System.out.println("Invalied gpa"); 
    } 
} 

private enum Grade { 
    FIRST_CLASS(3.5, 4, "First class Hons"), 
    TWO_ONE(3, 3.49, "upper Second class Hons"), 
    TWO_TWO(2.5, 2.99, "Lower Second class Hons"), 
    PASS(2.49, 2, "Pass"), 
    FAIL(0, 1.99, "Fail"); 

    private final double minGPA; 
    private final double maxGPA; 
    private final String description; 

    // remaining code omitted for brevity 
} 

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

+0

+1 Хорошее обходное решение для * switchaholics * ...;) –

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