2016-07-07 4 views
0

2 개의 값과 연산자를 허용하는 간단한 "계산기"예제를 내 교과서에서 복사했습니다. 그러나 입력 된 표현식이 유효한지 여부는 확인하지 않습니다. 코드는 적절한 표현식이 입력 될 때까지 사용자에게 프롬프트해야합니다.Do ... 논리 연산자가있는 루프 while 문

내 스타일을 염두에두고 어떻게 수정해야합니까? 이 일을하는 더 좋은 방법은 무엇입니까?

/* 
Input: A simple expression with 2 values and 1 operator 
Format: value1 (operator) value2 
Ex: 5*5 
Output: Answer 
*/ 

#include <stdio.h> 

int main (void) 
{ 
float value1, value2; 
char operator = ' '; 

//Issue Area, the while section does not work 
do 
{ 
    printf ("Type in your expression:"); 
    scanf ("%f %c %f", &value1, &operator, &value2); 
} 
while ((operator != '+' || operator != '-' || operator != '*' || operator != '/')); 

//This is fine, code is for an else...if example in textbook 
if (operator == '+') 
    printf ("%.2f\n",value1 + value2); 
else if (operator == '-') 
    printf ("%.2f\n",value1 - value2); 
else if (operator == '*') 
    printf ("%.2f\n",value1 * value2); 
else if (operator == '/') 
    printf ("%.2f\n",value1/value2); 

return 0; 
} 
+0

질문 디버깅 도움말 ("왜 이것이 아닌가요? 코드 작동? ")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. See : 최소한의 완전하고 검증 가능한 예제를 만드는 방법. 1 – Olaf

+6

'||'이 아니라'&&'가 필요합니다. 그렇지 않으면 논리적 표현이 항상 성공합니다. '! (연산자 =='+ '| 연산자 =='- '연산자 =='* '연산자 연산자 =='/ ')' – lurker

+0

루프 몸체를 읽고 크게 소리내어 읽습니다. '||'을 "or"로 말합니다. – Olaf

답변

3

당신은이 다음 while의 조건에 ||

do 
{ 
    ... 
} 
while ((operator != '+' || operator != '-' || operator != '*' || operator != '/')); 

사용이 잘못되었습니다.

operator의 값이 '+'이라고 가정 해 보겠습니다. 에 그런 다음, while가 평가 :

while ((false || true || true || true)); 

상관없이 operator의 값이 무엇인지

while (true); 

로 평가하지 않는, 그 하위 표현의 적어도 세 true로 평가됩니다. 따라서 조건부는 항상 true으로 평가됩니다.

|| 대신 &&을 사용해야합니다.

do 
{ 
    ... 
} 
while ((operator != '+' && operator != '-' && operator != '*' && operator != '/')); 

코드를 명확하게하는 한 가지 방법은 다음과 같습니다

do 
{ 
    ... 
} 
while (!isValidOperator(operator)); 

int isValidOperator(char operator) 
{ 
    return (operator == '+' || 
      operator == '-' || 
      operator == '*' || 
      operator == '/'); 
} 

당신은 사용하여 isValidOperator의 코드를 짧게 할 수있는 : 추구

int isValidOperator(char operator) 
{ 
    return (operator != '\0' && strchr("+-*/", operator) != NULL); 
} 
+0

감사합니다. 더 짧은 코드에서 동일한 결과를 얻을 수있는 방법이 있습니까? – AGN

+0

@AGN while (strchr ("+ - * /", 연산자) && 연산자);는 더 짧을 수도 있습니다. – chux