1

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

    }

}
4

7 回答 7

5

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

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

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

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

于 2016-11-01T22:35:32.800 回答
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) {
    // ...
  }
}
于 2016-11-01T22:40:35.867 回答
0

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

让我们简化案例。

1 或 x = 1;

1 和 x = x;

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

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

A 或 B 或 C]

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

!A 和 !B 和 !C

这意味着not A AND not B AND not C

我希望我有所帮助。

祝你今天过得愉快。:)

于 2016-11-01T23:44:32.803 回答
0

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

所以

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

于 2016-11-01T22:33:54.880 回答
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;
    }

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

于 2016-11-01T22:38:16.640 回答
0

Try this by changing ! to the whole parameters inside the while loop,It will start working

  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;
        }
于 2016-11-01T22:41:31.213 回答
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

边注

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

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

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

于 2016-11-02T00:14:53.567 回答