将if-else转换为switch case语句

时间:2019-07-01 09:23:44

标签: java

我最近开始学习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");

除了一些语法错误消息之外,没有提供任何实际输出。

3 个答案:

答案 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!