使用switch语句确定GPA结果

时间:2013-07-07 07:04:23

标签: java

这是从命令行确定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");
    }
  }  
}

4 个答案:

答案 0 :(得分:9)

Switch / case语句不能那样工作。它们不是条件 - 它们是特定的案例。 (而且,正如其他人指出的那样,无论如何都无法启用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);

重要的是要注意我在这里只使用一个条件 - 即使你的switch / case的语法有效,即使你已经将=>更改为>=在每种情况下,您仍然会遇到无效的情况,例如3.495,这些情况不属于任何存储桶。这也意味着您只需要指定一次边界。

现在,当你进行编译时,如果输入“3.5”作为输入,它仍然会失败,因为这行:

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

你真的想要

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

...否则你只会解析整数输入。

你可能还想考虑在这里使用BigDecimal而不是double - 对于这种特殊情况,它可能并不重要,但如果你真的对保持精确的十进制数字感兴趣,{{1更合适。

答案 1 :(得分:2)

提示:您无法在此处轻松使用switch。请改用一系列if语句。

答案 2 :(得分:2)

Java明确指出:

  

开关使用byte,short,char和int原始数据   类型。它也适用于枚举类型(在枚举类型中讨论),   String类,以及一些特定的包装类   原始类型:字符,字节,短整数和整数(在   数字和字符串)。

有关切换的详细信息以及示例,请参见http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

正如其他人所建议的那样 - 其他方式是要走的路。

答案 3 :(得分: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
}

这个故事的寓意是你不应该让你的编程锤(在这种情况下,开关语句)驱动你的设计。您的代码应该反映您尝试解决的问题,您不应该将问题强加到代码的形状中。