2016-11-01 5 views
1

문자열 연산자를 더하기 (+), 빼기 (-), 곱하기 (*), 나누기 (/) 또는 모듈 (%)으로 입력하면 유효한 입력을 입력해도 while 루프를 계속 입력합니다. while 루프가 num2 변수의 int 값을 입력해야하는 곳에서 잘 작동하기 때문에 문제가 무엇인지 알 수 없습니다.조건이 거짓 일 때 내 프로그램이 while 루프를 입력하는 이유는 무엇입니까?

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

    } 

} 
+5

'연산자'는 항상 둘 중 하나 이상이 아니기 때문에 예 : '+'와 같으면'-'와 같지 않습니다. '||'이 아니라'&&'를 의미합니다. –

답변

0

|| (나) & & (과)

와 함께 SO

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

Becames

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

편집

당신은 아닌 OR이 필요합니다. 유효한 연산자 인 "+"를 입력한다고 가정 해 보겠습니다. 두 번째 조건 인 "+"가 아닌 "-"이기 때문에 잠시 동안을 입력합니다. 이것은 while 조건이 OR이기 때문입니다. 조건 중 하나에 해당하지 않기 때문에 이러한에서 조건 (& &)의 "+"그동안를 입력하지 않습니다 넣으면 (! operator.equals ("+"))

+2

이유를 설명하십시오. 단지 "대신에 이것을하는 것"이라고 말하십시오. –

+0

OR이 아닌 AND가 필요합니다. 유효한 연산자 인 "+"를 입력한다고 가정 해 보겠습니다. 두 번째 조건 인 "+"가 아닌 "-"이기 때문에 잠시 동안을 입력합니다. 이것은 while 조건이 OR이기 때문입니다. 이러한 조건을 AND (&&)로 입력하면 조건 중 하나가 참이 아니기 때문에 "+"가 입력되지 않습니다 (! operator.equals ("+")) – Massimo

+0

답변 *에 *를 입력하십시오. 답변을 추가하려면 [편집]하십시오. –

5

당신이 당신의 부울을 작성하는 경우 영어로 선택 "연산자가"+ "또는"- "와 같지 않거나"/ "또는 같지 않음"* "또는"% "와 같지 않은 동안 루프를 수행합니다 .

"연산자가"+ "같지 않고"- "와 같지 않고"/ "와 같지 않고"* "와 같지 않고" % "루프를 수행하십시오.

변경 || to & &이고 작동해야합니다.

while 루프가 제정되기 위해서는 모든 매개 변수가 참이어야합니다. 따라서 매개 변수 중 하나가 false이면 while 루프가 활성화되지 않습니다.

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 루프가됩니다.

3

operator은 항상 다음 문자열 중 적어도 하나와 같지 않습니다. +과 같으면 -과 같지 않습니다. 하나 이상의 실제 조건을 ||과 결합하면 전체 결과가 true가됩니다.

당신은, || 대신 &&를 사용할 필요가 그래서 루프 나누기 경우 조건에 일치 하나 :

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

@LukeLee, do not-while 루프는 적어도 한 번 수행되고 입력이 맞으면 전혀 수행되어서는 안된다. –

+0

@LukeLee, 먼저 명령 입력이 틀린 경우에만 루프 내부의 작업을 수행하면됩니다. 즉, 작업이 존재하지 않으므로 루프가이를 인증합니다. 둘째, 내 대답을 확인하면 그 문제가 그 상태임을 알 수 있습니다. –

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

while 루프에는'if' 문이 꼭 필요한 것은 아닙니다. –

+0

네, 루크가 맞습니다.하지만 필자는 올바른 매개 변수를 전달하더라도 입력을 입력 한 후에 왜 while 루프에서 나오지 않는지 설명했습니다. 성능에 대한 전체 코드를 살펴보면 실제로 필요하지 않습니다. 잠시 동안 반복하다 –

0

때때로 사람들은 단지 잊어 버리는 단순한 계산법입니다.

사례를 단순화합니다.

1 OR x = 1;

1 AND x = x;

더 구체적으로 설명합니다. 우리가, 우리가 첫 번째 경우에 일부 변수 A, B와 C

보자, OR :

A OR B OR C]

적어도 하나에 해당하는 경우 모든 표현이 참되다는 것을 의미합니다 . 루프가 참이어야한다는 것을 의미하지 않는 한 번의 작업이있는 경우에 해당합니다. 따라서이 같은 것을 넣어해야합니다

!A AND !B AND !C

하지 C을 B하지하지 을 의미합니다.

도움이 되었기를 바랍니다.

좋은 하루 보내십시오. :)

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

사이드 참고

IMHO, 모든 프로그래머들은 본능적으로 코드에서 논리적 일관성을 감지 할 수 있도록 잘 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("%") 

그러나 그들은 동일해야 : 우리가 그들에게 나란히 두는 경우에, 우리는 드 모건의 법칙에 따라, 그들은 동등하지 않은 것을 알고 루프를 계속 사용자가 유효하지 않은 연산자를 입력하고 그렇지 않으면 종료합니다.