Java switch case语句是否只对小于赋值的值进行计数?

Java switch case语句是否只对小于赋值的值进行计数?,java,Java,如果标题有误导性,很抱歉,但我不知道如何用语言表达我的问题。请看下面的代码。当我运行它时,如果我输入100到109之间的任何值,它将显示“HD-10”,但我只希望mark==100获得HD-10,超过100的任何值都将显示无效。有什么建议吗 ps我确实从java.util导入了scanner,只是不知道为什么它没有显示在下面的代码中 提前感谢您的帮助 public class GradeCase_testResults { public static void main(String [

如果标题有误导性,很抱歉,但我不知道如何用语言表达我的问题。请看下面的代码。当我运行它时,如果我输入100到109之间的任何值,它将显示“HD-10”,但我只希望mark==100获得HD-10,超过100的任何值都将显示无效。有什么建议吗

ps我确实从java.util导入了scanner,只是不知道为什么它没有显示在下面的代码中

提前感谢您的帮助

public class GradeCase_testResults
{
    public static void main(String [] args)
    {
        float total;
        int mark;
        Scanner sc = new Scanner(System.in);

        System.out.println("Please enter the student's mark");
        total = sc.nextInt ();

        mark = (int)total / 10;

        switch(mark)
        {
            case 1: case 2:case 3:case 4:
                System.out.println("F-" + mark);
                break;
            case 5:
                System.out.println("P-5");
                break;
            case 6:
                System.out.println("C-6");
                break;
            case 7:
                System.out.println("D-7");
                break;
            case 8:
                System.out.println("HD-8");
                break;
            case 9:
                System.out.println("HD-9");
                break;
            case 10: 
                System.out.println("HD-10");
                break;
            default:
                System.out.println("Invalid");
                break;
        }
    }
}

你的验证放错地方了。您应该确保输入在[0100]范围内

编辑: 问题是你试图解释错误的输入。 在您的情况下,我想唯一有效的输入是在[0100]范围内,因为分数超过100分或任何负值都没有意义。 确保输入正确,您的问题就会消失:) 您可以这样做:

do
{
    System.out.println("Please enter the student's mark");
    total = sc.nextInt ();
} while(total < 0 || total > 100)
do
{
System.out.println(“请输入学生分数”);
总计=sc.nextInt();
}而(总数<0 | |总数>100)
问题是
(int)10x/10
对于0到9之间的X值总是返回10。因此,它遇到了
标记
为10的情况

与其他类似,当您输入例如98时,它将归入案例9

不幸的是,与kotlin不同,Java中的交换机需要常量表达式,而大于不是常量来计算值


切换到if语句,或者使用您输入的值,而不执行您正在作为switch语句输入的除法。

尝试使用
mark=Math.floorDiv(int,int)相反,这将为您正确地取整它

所以改变

mark = (int)total / 10;
致:

把你的
float-total
改成
int-total
,我真的不知道你以前为什么把它改成
float
,然后把它转换成
int

编辑:

由于要使用浮点,因此需要计算小数点,因此还需要将
扫描仪更改为使用
nextFloat()

然后您可以像以前一样强制转换到
int
,并且
floorDiv
仍将正常工作。

我已将您的“/”更改为“%”(模):

case 10: 
System.out.println("HD-10");
致:


它似乎正在工作,就像你想要的一样。

首先验证输入。仅在有效时使用开关。伪代码:

if(total>=0 && total <=100)
    switch...
else
    System.out.println("Invalid");

如果(total>=0&&total我将从可读性的角度来处理这个问题

虽然将值从
float-total
(0-100)转换为
int-mark
(1-10)(嘿,零发生了什么事?)并使用switch语句最终返回映射的字符串似乎很可爱,但读取起来完全混乱,容易出现错误

为什么不使用一些老式的比较呢

publicstaticvoidmain(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
System.out.println(“请输入学生分数”);
System.out.println(getMark(sc.nextFloat());
}
私有静态字符串getMark(浮点总数){
如果(总数<50)返回“F-”;
如果(总数<60)返回“P-5”;
如果(总数<70)返回“C-6”;
如果(总数<80)返回“D-7”;
如果(总数<90)返回“HD-8”;
如果(总数<100)返回“HD-9”;
返回“HD-10”;
}

问题不在于您的开关,而在于
total/10
。因为(int)109/10 =如果你的输入总是“代码>100 < /代码>或更大,考虑减去<代码> 100 <代码>而不是做除法,它避免了任何舍入错误造成的混乱,如果某人进入99,它应该显示什么?”所以109不应该返回10,但99应该返回9,最好在上面加一个if,如果totale>100…mark=11,否则…原因是我想以浮点形式输入标记,比如说94.5,它应该返回9,因为int为94.5/10=9@JamesWong那么您已经做错了,因为您使用的是
sc.nextInt
,如果在其中键入
94.5
,您将得到一个异常。如果您正在使用
nextInt
则没有理由对其使用浮点。请使用
.nextFloat()
然后,将其更改回
浮点值
,并将其转换为int值,就像您刚才所做的那样,我的代码应该仍然可以工作。@James Wong我添加了一个编辑来向您演示如何修复它。这对其他情况无效,如果您键入
75
,它将返回
5
,而不是
7
mark = (int)total % 10;
case 10: 
System.out.println("HD-10");
case 0: 
System.out.println("HD-10");
if(total>=0 && total <=100)
    switch...
else
    System.out.println("Invalid");