当我输入字符串运算符时,无论是加法(+),减法( - ),乘法(*),除法(/)还是模块(%),即使输入有效输入,它仍会进入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));
}
}
答案 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,我们有:
这意味着如果至少有一个为真,那么all表达式为真。在这种情况下,有一个操作没有出现意味着循环必须为真。因此,你应该这样做:
这意味着不是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("%")
但是它们应该是等价的,因为意图是相同的:当用户输入无效的运算符时继续循环并以其他方式终止。