【问题标题】:Ridiculous use of a switch statement荒谬地使用 switch 语句
【发布时间】:2013-02-13 05:47:55
【问题描述】:

我正在和我的朋友一起做一些 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 语句的荒谬使用,我无法想象为什么大学教授会教它,除了说明 DRY 原则。

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

【问题讨论】:

  • 你的方法看起来不错。为什么不直接将 switch 包装在 if 语句中,以检查 ng >= 0 && ng <= 100 是否存在?
  • 我会,但要求是将测试放在 switch 语句中。我知道这很愚蠢。
  • 使用 switch 语句的目的是让学生了解 switch 语句是如何工作的......以及一些让它更好地工作的技巧(比如你的范围缩小技巧)。这个例子对你来说可能看起来很荒谬......但这完全不是重点。
  • @StephenC 教学生识别适合工作的工具不是最好吗?如果我在教某人使用锤子,我会让他们泡一杯茶,这样他们就可以获得握锤子的经验。但你是对的,这是题外话
  • 另一件事是你需要小心你在帮助他..而不是(有效地)为他做功课。除了道德之外,考虑到练习的重点是让他学习实用的编程技能。如果他能完成所有的工作,他会更好地学习它们。此外,如果他仍在努力学习 Java 语句的基础知识,请考虑您在 DRY 原则、执行 XYZ 的最佳方式等方面学到的所有建议将直接进入另一只耳朵 .

标签: java switch-statement


【解决方案1】:

你总是可以在你的 switch 表达式中添加一些小的复杂性,以使案例更简单;这将计算90-100 as 1080-89 as 9 等等、101 and above will become 11 and above 以及每个输入 below 0 will become 0 or negative,因此它们将属于默认值;

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 = "";
}

【讨论】:

  • 这就是我要找的。这似乎是让这种令人作呕的练习变得更可口的最佳方式。
  • @shakabra 是的,它稍微缩小了代码并减少了一些额外的错误检查。不过,这需要一两条额外的评论,因为表达式并不完全直截了当。
【解决方案2】:

是的,你绝对不会想为这个大声笑使用 switch 语句。但是你建议的方式是我能想到的最好的方式。

我会为错误场景设置默认值,因为它可以是任何小于 0 或大于 100 的整数。在 0 到 100 之间,至少你有有限数量的情况(尽管你必须重复"F" 大小写多次)。

【讨论】:

    【解决方案3】:

    很好地使用整数除法;)

    好的,这段代码让我很尴尬,让我哭了。但在这里,只使用 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);
             }
          }
    }
    

    布莱赫。

    【讨论】:

    • 没有理由让 0-5 的所有这些单独的案例都有自己的 break 声明。
    • 天哪。真恶心。但这可能是限制条件下的最佳方式。
    • @shakabra 您需要使用 -1 作为值进行测试。
    【解决方案4】:

    怎么样:

    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;
    }
    

    switch 之后,您必须检查是否设置了等级。

    if (lg == null) {
        System.out.println("The input score was > 100 or < 0");
    } else {
        System.out.println("You got an " + lg);
    }
    

    【讨论】:

    • 然后 9-0 是无效输入,但 9-0 是有效成绩(如果您不学习)
    • @shakabra:如果您将case 0: 列为您的F 案例之一,则不会
    • 唯一的特殊情况是100,它不能仅使用case 10: 检测到,因为它也会捕获101
    • 是的。我忘了那个。
    • 重做以解决错误范围。
    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 2016-06-04
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2023-03-08
    • 2011-04-16
    • 2011-12-04
    相关资源
    最近更新 更多