Java switch语句的荒谬用法

Java switch语句的荒谬用法,java,switch-statement,Java,Switch Statement,我和我的朋友在做一些Java作业。讲师希望他编写一个Java程序,将整数输入转换为数字等级。100-90=A,依此类推。唯一的问题是他必须使用switch语句。他还必须: 在switch语句中包含一个case,它将显示礼貌的 如果用户输入任何小于或大于0的数字,则显示错误消息 超过100人。” 原来我想到这个 import java.util.Scanner; public class grade { public static void main(String[] args)

我和我的朋友在做一些Java作业。讲师希望他编写一个Java程序,将整数输入转换为数字等级。100-90=A,依此类推。唯一的问题是他必须使用switch语句。他还必须:

在switch语句中包含一个case,它将显示礼貌的 如果用户输入任何小于或大于0的数字,则显示错误消息 超过100人。”

原来我想到这个

import java.util.Scanner;
public class grade
{
    public static void main(String[] args)
    {
        int ng;//number grade
        String lg = "";//letter grade

        System.out.println("enter grade");

        Scanner in = new Scanner(System.in);

        ng = in.nextInt();

        switch (ng/10) 
        {
            case 10: 
            case 9:     
                lg = "A";  
                break;
            case 8:
                lg = "B";  
            break;
            case 7:     
                lg = "C";  
            break;
            case 6:     
                lg = "D";  
            break;
            default:     
                lg = "F";  
            break;
        }   
         System.out.println("You got an " + lg);
      }
}
这并不完美,因为它允许大于100和小于0的值,但我试图避免键入100-0之间的每个整数。这似乎是一个荒谬的开关语句用法,我无法想象为什么大学教授会教它,而不是说明干燥原理

是否有更好的方法仍然使用switch语句,但不从100-0键入每个int?

如何:

String lg = null;
switch (ng/10) 
{
    case 10:
        if (ng > 100) {
            // polite error
            break;
        }
    case 9:
        lg = "A"
        break;
    case 8:
        lg = "B";  
        break;
    case 7:     
        lg = "C";  
        break;
    case 6:
        lg = "D";
        break;
    default:
         if (ng < 0) {
             // polite error
             break;
         }
         lg = "F";
         break;
}

是的,你根本不可能想在这个lol中使用switch语句。但是你建议的方式是我能想到的最好的方式


不过,我会将默认设置为错误场景,因为这可能是小于0或大于100的任何整数。在0和100之间,至少有有限的情况(尽管必须多次重复“F”情况)。

整数除法的使用很好;)

好吧,这段代码正式让我难堪,让我哭泣。但在这里,只使用switch语句

import java.util.Scanner;
public class grade
{
    public static void main(String[] args)
    {
        int ng;//number grade
        String lg = "";//letter grade
        boolean error = false;

        System.out.println("enter grade");

        Scanner in = new Scanner(System.in);

        ng = in.nextInt();

        switch (ng/10) 
        {
            case 10: 
                switch (ng)
                {
                     case 100:
                         lg = "A";
                         break;
                     default:
                         error = false;
                         break;
                }
                break;
            case 9:     
                lg = "A";  
                break;
            case 8:
                lg = "B";  
            break;
            case 7:     
                lg = "C";  
            break;
            case 6:     
                lg = "D";  
            break;
            case 5:     
            case 4:     
            case 3:     
            case 2:     
            case 1:     
            case 0:     
                lg = "F";  
                break;
            default:     
                error = true;
            break;
        }   

         if (error) {
           System.out.println("Sorry, the grade must be between 0 and 100");
         } else {
           System.out.println("You got an " + lg);
         }
      }
}

Blech.

你可以给你的开关表达式增加一些小的复杂度,使情况更简单;这将把
90-100计算为10
80-89计算为9
,依此类推,
101及以上将变为11及以上
,每一个低于0的
输入将变为0或负
,因此它们将属于默认值

switch ((ng-ng/100+10)/10)
{
    case 10:
        lg = "A";
        break;
    case 9:
        lg = "B";
        break;
    case 8:
        lg = "C";
        break;
    case 7:
        lg = "D";
        break;
    case 6: case 5: case 4: 
    case 3: case 2: case 1:
        lg = "F";
        break;
    default:
        System.out.println("Polite Error");
        lg = "";
}

你的方法似乎很好。为什么不把switch包装在一个
if
语句中,检查
ng>=0&&ng我会的,但要求是把测试放在switch语句中。我知道这很愚蠢。使用switch语句的目的是让学生能够了解switch语句是如何工作的……以及一些技巧来帮助他们让它工作得更好(比如你的射程缩小技巧).这个例子对你来说可能很可笑……但这完全是离题的。@StephenC教学生识别适合这份工作的工具不是最好的吗?如果我教某人使用锤子,我会让他们泡一杯茶,让他们获得握锤子的经验。但你是对的,这与p无关另一件事是你需要小心帮助他,而不是(有效地)除了他的道德操练之外,他认为练习的要点是让他学会实际的编程技巧。如果他能完成所有的工作,他会学得更好。此外,你认为所有关于干燥原理的学习建议、XYZ的最佳方法等都会直接在一只耳朵里和另一只耳朵里进行。仍在努力学习Java语句的基础知识。但是9-0是无效的输入,但9-0是有效的分数(如果你不学习的话)@沙卡布拉:如果你的
case 0:
包含在
F
案例中,则不会出现这种情况。唯一的特例是
100
,它不能仅使用
case 10:
检测,因为它也会捕获
101
。是的。我忘记了那一个。重新编辑它以解释坏的范围。没有理由将所有这些分开用自己的
-break
语句对0-5进行测试。哦,天哪。这太恶心了。但这可能是在约束条件下最好的方法。@shakabra你想用
-1
作为一个值进行测试。这是我一直在寻找的。这似乎是让这个恶心的练习变得更可口的最好方法。@shakabra是的,它缩小了测试范围只需编写一点代码,就可以省去一点额外的错误检查。不过,这需要额外的一两条注释,因为表达式并不完全是直截了当的。
switch ((ng-ng/100+10)/10)
{
    case 10:
        lg = "A";
        break;
    case 9:
        lg = "B";
        break;
    case 8:
        lg = "C";
        break;
    case 7:
        lg = "D";
        break;
    case 6: case 5: case 4: 
    case 3: case 2: case 1:
        lg = "F";
        break;
    default:
        System.out.println("Polite Error");
        lg = "";
}