我最近开始学习Java。我的老师给了我们这份作业,内容是编写下面的If-Else
语句代码并将其转换为Switch-Case
语句代码。我正确地编写了If-Else
语句代码,但是Switch-Case
似乎有一些错误。我越早得到答案越好。谢谢。
我要转换的内容:
int x;
System.out.println("type in a mark to see what grade it is");
Scanner input = new Scanner(System.in);
x = input.nextInt();
if (x >= 90 && x <= 100) {
System.out.println("A");
}
if (x >= 80 && x < 90) {
System.out.println("B");
}
if (x >= 70 && x < 80) {
System.out.println("C");
}
if (x >= 60 && x < 70) {
System.out.println("D");
}
if (x >= 50 && x < 60) {
System.out.println("E");
}
if (x < 50 && x > 0) {
System.out.println("F");
}
if (x <= 0 || x > 100) {
System.out.println("invalid mark");
}
我尝试过的事情:
Scanner input = new Scanner(System.in);
int x = input.nextInt();
switch (x) {
case x >= 90 && x <= 100:
System.out.println("A");
break;
case x >= 80 && x < 90:
System.out.println("B");
break;
case x >= 70 && x < 80:
System.out.println("C");
break;
case x >= 60 && x < 70:
System.out.println("D");
break;
case x >= 50 && x < 60:
System.out.println("E");
break;
case x < 50 && x > 0:
System.out.println("F");
break;
default:
System.out.println("invalid mark");
除了一些语法错误消息之外,没有提供任何实际输出。
答案 0 :(得分:5)
由于您的switch
语句具有int
变量x
作为输入参数,因此所有case
语句都必须检查int
的值,而不是布尔值。这就是为什么会出现不兼容类型错误的原因。您可以这样做:
switch (x / 10) {
case 9:
System.out.println("A");
break;
case 8:
System.out.println("B");
break;
...
查看更多Java文档switch statement
答案 1 :(得分:2)
不确定这是否是您的老师想要的东西,但是我会用enum
来做到这一点。
enum Grade {
A(90, 100),
B(80, 90),
C(70, 80),
D(60, 70),
E(50, 60),
F(0, 50);
private Grade(int from, int to) {
fromScore = from; toScore = to;
}
private int fromScore, toScore;
boolean inRange(int score) {
return score >= fromScore && score < toScore);
}
public static Grade fromScore(int score) {
for (Grade gr : Grade.values()) {
if (gr.inRange(score)) { return gr; }
}
throw new InvalidGradeException(score); // TODO
}
}
然后您可以做
Scanner input = new Scanner(System.in);
x = input.nextInt();
try {
Grade gr = Grade.fromScore(x);
switch (gr) {
case A: System.out.println("grade is A"); break;
case B: System.out.println("grade is B"); break;
case C: System.out.println("grade is C"); break;
case D: System.out.println("grade is D"); break;
case E: System.out.println("grade is E"); break;
case F: System.out.println("grade is F"); break;
}
} catch (InvalidGradeException ex) {
System.out.println("invalid score");
}
实际上,switch
变得毫无意义,因为您可以做到
System.out.printf("Grade is %s%n", Grade.fromScore(x).name());
答案 2 :(得分:0)
开关中的case
需要一个常数。
有关常量表达式的确切定义,请参见http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.28。
如果有else
的话,您可以“优化”您的内容...
Scanner input = new Scanner(System.in);
int x = input.nextInt();
if (x >= 90 && x <= 100) {
System.out.println("A");
} else if (x >= 80 && x < 90) {
System.out.println("B");
} else if (x >= 70 && x < 80) {
System.out.println("C");
} else if (x >= 60 && x < 70) {
System.out.println("D");
} else if (x >= 50 && x < 60) {
System.out.println("E");
} else if (x < 50 && x > 0) {
System.out.println("F");
} else if (x <= 0 || x > 100) {
System.out.println("invalid mark");
}
顺便说一句,我想我会通过以下方式重写成绩的计算:
private static char computeMark(int x) {
if (x <= 0 || x > 100) {
throw new IllegalArgumentException("Invalid mark : " + x);
}
return (char) ((int)'A' + ((99-Math.max(49, x))/10));
}
HTH!