【问题标题】:Why is my program entering a while loop when the condition is false?当条件为假时,为什么我的程序会进入 while 循环?
【发布时间】:2017-03-15 03:43:03
【问题描述】:

当我输入一个字符串运算符时,无论是加法(+)、减法(-)、乘法(*)、除法(/)还是模块(%),即使我输入了有效的输入,它仍然会进入 while 循环.我不知道问题出在哪里,因为 while 循环工作正常,我必须为变量 num2 输入一个 int 值。

import java.util.Scanner;

public class PolishNotationCalc {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        int num1;
        int num2;
        String operator;

        System.out.println("Polish notation calculator");

        System.out.print("Please enter an operation(+, -, *, /, %) ");
        operator = input.nextLine();

        while (!operator.equals("+") || !operator.equals("-") || !operator.equals("*") || !operator.equals("/") || !operator.equals("%")) {
            System.out.println("Please enter a valid operation ");
            operator = input.nextLine();
            if (operator.equals("+") || operator.equals("-") || operator.equals("*") || operator.equals("/") || operator.equals("%"))
                break;
        }

        System.out.print("");
        System.out.print("Please enter the first number ");
        num1 = input.nextInt();

        System.out.print("Please enter the second number ");
        num2 = input.nextInt();

        while (num2 == 0 && operator.equals("/")) {
            System.out.println("Please pick a non zero number: ");
            num2 = input.nextInt();
        }
        while (num2 == 0 && operator.equals("%")) {
            System.out.println("Please pick a non zero number: ");
            num2 = input.nextInt();

        }

        if (operator.equals("+"))
            System.out.println(num1 + " + " + num2 + " = " + (num1 + num2));

        else if (operator.equals("-"))
            System.out.println(num1 + " - " + num2 + " = " + (num1 - num2));

        else if (operator.equals("*"))
            System.out.println(num1 + " * " + +num2 + " = " + (num1 * num2));

        else if (operator.equals("/"))
            System.out.println(num1 + " / " + num2 + " = " + (num1 / num2));

        else if (operator.equals("%"))
            System.out.println(num1 + " % " + num2 + " = " + (num1 % num2));

    }

}

【问题讨论】:

  • 因为operator 总是不等于其中至少一个:例如如果等于+,则不等于-。你的意思是&&,而不是||

标签: java if-statement while-loop polish-notation


【解决方案1】:

如果您用英语编写布尔选择,它会显示“虽然运算符不等于“+”或不等于“-”或不等于“/”或不等于“*”或确实如此不等于 "%" 做循环。

您需要它说“虽然运算符不等于“+”且不等于“-”且不等于“/”且不等于“*”且不等于“%”循环。

改变 ||到 && 它应该可以工作

要执行 while 循环,所有参数都必须为真。因此,如果其中一个参数为 false,则不会激活 while 循环。

【讨论】:

    【解决方案2】:

    operator 总是不等于这些字符串中的至少一个:例如如果等于+,则不等于-。如果您将一个或多个真实条件与|| 组合在一起,则整体结果将为真实。

    你需要使用&&而不是||,这样如果任何一个条件匹配,循环就会中断:

    while (!operator.equals("+") && !operator.equals("-") && ... ) {
    

    然后您不需要在循环内再次检查operator 的值;让新的循环保护检查它并中断。


    语法上更简洁的替代方法是使用集合:

    List<String> allowedOperators = Arrays.asList("+", "-", "*", "/", "%");
    
    while (!allowedOperators.contains(operator)) {
      System.out.println("Please enter a valid operation ");
      operator = input.nextLine();
    }
    

    同样,当您检查 num2 == 0 时:

    List<String> zeroDenominatorOps = Arrays.asList("/", "%");
    
    if (zeroDenominatorOps.contains(operator)) {
      while (num2 == 0) {
        // ...
      }
    }
    

    【讨论】:

    • @LukeLee,不应该,因为在 do-while 循环中至少执行一次,如果输入正确,则根本不应该执行。
    • @LukeLee,首先,当且仅当命令输入错误时,您才需要执行循环内的内容,这意味着该操作不存在,因此循环证明了这一点。其次,检查我的回答,你会发现他的问题是条件。
    【解决方案3】:
     while (!operator.equals("+") || !operator.equals("-") || !operator.equals("*") || !operator.equals("/") || !operator.equals("%")) {
            System.out.println("Please enter a valid operation ");
            operator = input.nextLine();
            if (operator.equals("+") || operator.equals("-") || operator.equals("*") || operator.equals("/") || operator.equals("%"))
                break;
        }
    

    例如,当您输入“+”时,它变为 while(false || true|| true || true)。所以它总是进入while循环

    【讨论】:

      【解决方案4】:

      你应该替换 || (或) 与 && (和)

      所以

      while (!operator.equals("+") || !operator.equals("-") || !operator.equals("*") || !operator.equals("/") || !operator.equals("%")) {
      

      变成

      while (!operator.equals("+") && !operator.equals("-") && !operator.equals("*") && !operator.equals("/") && !operator.equals("%")) {
      

      编辑

      您需要 AND 而不是 OR。 假设您输入“+”,这是一个有效的运算符。 您将输入 while,因为“+”不等于“-”,这是您的第二个条件。这是因为 while 条件在 OR 中。 如果将这些条件放在 AND (&&) 中,则“+”不会进入 while,因为其中一个条件不成立(!operator.equals("+"))

      【讨论】:

      • 请解释原因,而不是仅仅说“做这个而不是那个”。
      • 您需要 AND 而不是 OR。假设您输入“+”,这是一个有效的运算符。您将输入 while,因为“+”不等于“-”,这是您的第二个条件。这是因为 while 条件在 OR 中。如果将这些条件放在 AND (&&) 中,则 "+" 不会进入 while,因为其中一个条件不成立 (!operator.equals("+"))
      • 在你的回答中解释原因Edit您的答案以添加更多内容。
      【解决方案5】:

      通过改变来试试这个!到while循环中的整个参数,它将开始工作

        while (!(operator.equals("+") || operator.equals("-") || operator.equals("*") || operator.equals("/") || operator.equals("%"))) {
                  System.out.println("Please enter a valid operation ");
                  operator = input.nextLine();
                  if ((operator.equals("+") || operator.equals("-") || operator.equals("*") || operator.equals("/") || operator.equals("%")))
                      break;
              }
      

      【讨论】:

      • 你真的不需要在 while 循环中使用 if 语句。
      • 是的,卢克你是对的,但我只是告诉了为什么在输入输入后即使我们传递了正确的参数,它也没有退出 while 循环。如果我们查看整个代码的性能在 while 中不需要 if 循环
      【解决方案6】:

      这是一个简单的数学,有时人们会忘记。

      让我们简化案例。

      1 或 x = 1;

      1 AND x = x;

      让我们更具体一些。让我们有一些变量,A、B 和 C。

      在第一种情况下,OR,我们有:

      这意味着如果至少有一个为真,则所有表达式为真。在您的情况下,有一个没有出现的操作意味着循环必须为真。因此,你应该这样写:

      这意味着 不是 A AND 不是 B AND 不是 C

      我希望我有所帮助。

      祝你有美好的一天。 :)

      【讨论】:

        【解决方案7】:

        循环条件的含义与您想象的不同。 对于任何输入字符串都是如此。这是一种你永远不必编写的条件(希望如此)。

        为了更好地理解这一点,让我们首先定义什么时候可以接受运算符,用英文:

        如果是以下五个运算符之一,则接受该运算符:+, -, *, /, %

        “一个”的基本意思是“或”。因此对应的代码是

        operator.equals("+") ||
        operator.equals("-") ||
        operator.equals("*") ||
        operator.equals("/") ||
        operator.equals("%")
        

        我们可以将它包装在一个方法中:

        private static boolean acceptable(String operator) {
            return operator.equals("+") ||
                   operator.equals("-") ||
                   operator.equals("*") ||
                   operator.equals("/") ||
                   operator.equals("%");
        }
        

        现在读取检查循环的逻辑非常简单:

        String operator;
        
        do {
            System.out.println("Please enter a valid operation ");
            operator = input.nextLine();
        } while (!acceptable(operator));
        

        @SaclyrBarlonium,这就是我要说的。 :P

        旁注

        恕我直言,每个程序员都应该非常了解De Morgan's laws,以至于他们可以本能地检测代码中的逻辑不一致。这种情况下的不一致是在循环条件和循环体中的 if 语句之间。如果我们将它们并排放置,我们知道它们是不等价的,根据德摩根定律:

        !operator.equals("+") || !operator.equals("-") || !operator.equals("*") || !operator.equals("/") || !operator.equals("%")
         operator.equals("+") ||  operator.equals("-") ||  operator.equals("*") ||  operator.equals("/") ||  operator.equals("%")
        

        但是它们应该是等价的,因为它们的意图是相同的:当用户输入一个无效的操作符时继续循环,否则终止。

        【讨论】:

          猜你喜欢
          • 2016-01-09
          • 2020-07-21
          • 1970-01-01
          • 2019-10-26
          • 2021-08-20
          • 2017-12-14
          • 1970-01-01
          • 1970-01-01
          • 2012-11-07
          相关资源
          最近更新 更多