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