2013-07-07 91 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:你不行。它在這裏對你不起作用。 (哎呀,你甚至不能用'double'開關',但即使你可以,也不能代表所涉及的範圍。)放棄在這裏使用'switch'。 –

+0

@ Deshika22 - 如果你真的想使用一個開關出於某種原因,轉換爲int(四捨五入到最接近的.5增量,然後乘以10,然後轉換爲int:例如3.79 - > 4.0 - > 40;然後使用積分情況)或者使用允許在case語句中更多的語言,如[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

所以可以看出別人的建議的if-else是要走的路。

+0

請爲鏈接引用來源... –

+0

@VishalK:我已經粘貼了網址。 – Lokesh

+0

aahh是啊我明白了.. –

2

你可以使用switch語句,如果你真的想,通過使用枚舉來表示不同的等級:

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的最大值和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 
} 

這個故事的寓意是,你不應該讓你的編程錘子(在這種情況下,switch語句)驅動你的設計。你的代碼應該反映你想要解決的問題,你不應該強迫你的問題變成你的代碼的形狀。

+0

+1 * switchaholics *的一個很好的解決方法* ...;) –