为什么我的程序在条件为假时进入while循环?

时间:2016-11-01 22:28:57

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

当我输入字符串运算符时,无论是加法(+),减法( - ),乘法(*),除法(/)还是模块(%),即使输入有效输入,它仍会进入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));

    }

}

7 个答案:

答案 0 :(得分:5)

如果你用英语写你的布尔选择它会读“当运算符不等于”+“或它不等于” - “或它不等于”/“或它不等于”*“或它是不等于“%”做循环。

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

更改||和&&它应该工作

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

答案 1 :(得分:3)

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) {
    // ...
  }
}

答案 2 :(得分:0)

您应该替换|| (或)与&amp;&amp; (和)

SO

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

Becames

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

修改

你需要AND而不是OR。 假设您输入&#34; +&#34;这是一个有效的运算符。 你将进入,因为&#34; +&#34;不等于&#34; - &#34;,你的第二个条件。这是因为while条件是OR。 如果你把这些条件放在AND(&amp;&amp;)中,&#34; +&#34;不会输入while,因为其中一个条件不正确(!operator.equals(&#34; +&#34;))

答案 3 :(得分:0)

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

例如,当您输入&#34; +&#34;它变成了while(false || true || true || true)。所以它总是进入while循环

答案 4 :(得分:0)

通过改变来试试这个!对于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;
        }

答案 5 :(得分:0)

简单的数学有时会让人忘记。

让我们简化案例。

  

1 OR x = 1;

     

1 AND x = x;

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

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

A OR B OR C]

这意味着如果至少有一个为真,那么all表达式为真。在这种情况下,有一个操作没有出现意味着循环必须为真。因此,你应该这样做:

!A AND !B AND !C

这意味着不是A AND 不是B AND 而不是C 。< / p>

我希望我有所帮助。

祝你有个愉快的一天。 :)

答案 6 :(得分:0)

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

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

如果运营商是五个运营商之一,则会接受该运营商:+, -, *, /, %

“其中一个”基本上是指“或”。因此相应的代码是

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("%")

但是它们应该是等价的,因为意图是相同的:当用户输入无效的运算符时继续循环并以其他方式终止。