-4

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

4 回答 4

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此处 - 对于这种特定情况,它可能无关紧要,但如果您真的对维护精确的十进制数字感兴趣,BigDecimal则更合适。

于 2013-07-07T07:06:22.027 回答
2

提示:这里不能轻易使用switch。改为使用一系列if语句。

于 2013-07-07T07:06:01.800 回答
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 语句)来驱动你的设计。你的代码应该反映你试图解决的问题,你不应该强迫你的问题变成代码的形式。

于 2013-07-07T08:24:44.827 回答
2

Java 明确指出:

开关适用于 byte、short、char 和 int 原始数据类型。它还适用于枚举类型(在 Enum Types 中讨论)、String 类和一些包装某些基本类型的特殊类:Character、Byte、Short 和 Integer(在 Numbers 和 String 中讨论)。

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

因此,正如其他人所建议的那样,if-else 是要走的路。

于 2013-07-07T07:11:28.953 回答