这是从命令行确定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");
}
}
}
答案 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;
}
}
}
注意:
如果您真的使用了枚举,则可能不会使用开关来打印等级。你最好有一个表示等级和印刷描述的字符串,即:
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
}
这个故事的寓意是你不应该让你的编程锤(在这种情况下,开关语句)驱动你的设计。您的代码应该反映您尝试解决的问题,您不应该将问题强加到代码的形状中。