2016-07-07 8 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

質問デバッグヘルプ(「なぜこれではない?コードは動作していますか? ")には、目的の動作、特定の問題またはエラー、および質問自体にそれを再現するのに必要な最短コードが含まれていなければなりません。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 1 – Olaf

+6

'&&'ではなく '||'が必要です。そうしないと、論理式は常に成功します。これは、 '!(operator == '+' || operator == ' - ' operator == '*' || operator == '/')' – lurker

+0

と同等でなければなりません。 '||'を「or」と言います。 – Olaf

答えて

3

あなたは持っている:whileの条件で||

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

使用することは間違っています。

operatorの値が'+'であるとします。その後、whileがあると評価:

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

while (true); 

と評価されたどんなにoperatorの値が何であるか、それらのサブ式の少なくとも3つがtrueに評価されません。したがって、条件式は常にtrueと評価されます。

||の代わりに&&を使用する必要があります。

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

コードをより明確にするための1つの可能な方法は次のとおりです。

あなたが使用して isValidOperatorでコードを短くすることができます

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

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

:追求

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

ありがとう、より短いコードで同じ結果を達成する方法はありますか? – AGN

+0

@AGN while(strchr( "+ - * /"、演算子)&&演算子);をより短くすることができます。 – chux