2016-09-24 8 views
0

入力が有効でない場合はメニューを作成する必要があります。それは有効な入力を求め続ける必要があります。私は(Cで)以下複数の条件のテスト(C言語)

#include <stdio.h> 
int main() 
{ 
    int input = 0; 
    printf("What would you like to do? \n 1 (Subtraction) \n 2 (Comparison) \n 3 (Odd/Even) \n 4 (Exit) \n "); 
    scanf_s("%d", &input); 

    while (input != 1 || input != 2 || input != 3|| input != 4) 
    { 
     printf("Please enter a valid option \n"); 
     scanf_s("%d", &input); 
} // At this point, I think it should keep testing variable input and if it's not either 1 or 2 or 3 or 4. It would keep looping. 

しかし、何が起こっているのである、それは例えば、入力された場合でもループ、2

+1

すべての入力がどちらか1から、または異なっているので、あなたの中の状態は常に 'true'をあります2. '&|'で '||'を変更する必要があります。 – Franck

+1

入力が1 *と* 2 *、* 3 *と* 4(同時に)の場合、ループは停止します。これは不可能です。だから永遠にループします。 – alk

+0

@Franckしかし、私が2を入力した場合、条件がこの場合真ではないのですか? – Ansh

答えて

3

あなたのコードが言っているさ:ループ限り、以下が真である:コードの周りにこれを回す

(input != 1 || input != 2 || input != 3 || input != 4) 

は言う:上記の条件がfalseの場合、ループをブレーク、

!(input != 1 || input != 2 || input != 3 || input != 4) 

のために真これは今度は、上記の式にDe Morgan's Lawを適用してみましょう、我々は(ループのブレーク条件など)論理等しい発現を得ることができます:

(input == 1 && input == 2 && input == 3 && input == 4) 

上記が真であれば、ループは壊れます。 input1,,,4と同時に同じ場合は真です。これは不可能なので、ループは永遠に実行されます。

しかし、何が起こっている、それが入力された場合でもループ、例えば、2

input2であれば、それはループ条件が真となりますこれは、まだ134不平等ですループが繰り返されます。

あなたが少なくとも一度実行するループのコードをしたいと、あなたがdo {...} while -loopを使用するべきである:あなたの問題に関連していない:-)


do 
{ 
    printf("Please enter a valid option \n"); 
    scanf_s("%d", &input); 
} while (!(input == 1 || input == 2 || input == 3 || input == 4)) 

または(再びド・モルガンの次):

do 
{ 
    printf("Please enter a valid option \n"); 
    scanf_s("%d", &input); 
} while (input != 1 && input != 2 && input != 3 && input != 4) 

かさえタイト:

do 
{ 
    printf("Please enter a valid option \n"); 
    scanf_s("%d", &input); 
} while (input < 1 || input > 4) 
+1

私はDeMorganの法則が大好きです!ここでかなり良い説明です。 – Vucko

+0

@alkあなたの最初のことは、入力が1と2、3と4に等しくない間にコードが言っている間に何かしてください。これは、3を入力してもdo部分が実行されることを意味します。これは3と4の右に等しくないためですか? – Ansh

+0

@Ansh:私の恥...:} - 修正済み!ありがとう! – alk

2

何が書いたことは変数がない場合ということですが、それを書きましたどちらか一方がループします。 何が欲しいのはwhile(input < 1 || 4 < input)またはwhile(input != 1 && input != 2 && input != 3 && input != 4)

+0

私の入力は1と2と3と4になることはありません。いずれかの入力になります。そうではないでしょうか? – Ansh

+1

たとえば2を入力すると、入力!= 1がtrueになるため、trueと評価されます。しかし、あなたが私の例を使用している場合、それはfalseであると評価されます。= 1は、入力= 2のANDのために真です:いくつかの入力に対してあなたのIDEでそれを実行する必要があります。おそらくあなたの問題をよりよく理解する助けになります – eavidan

+0

@Anshすべての条件を同時にtrueにします。 'input'は全てのオプションと異なります –