2017-01-21 6 views
0

このコードが意図したとおりに機能しない理由はわかりません。 "入力%7!= 3 ||入力%7!= 4)"。私はモジュロ7が3または4に等しくなく、ループにとどまっていると言っています。私は10を入力したときに10モジュロ7は、入力されたモジュロ7が3または4は、ループにとどまると等しくない場合、私は言っている3ループとモジュロ

#include <iostream> 
#include <string> 

using namespace std; 

int main(){ 
int input; 
int count = 1; 
cout << "Please Enter a positive integer that is 3 or 4 modulo 7: "; 
cin >> input; 

while (input <= 0 || input % 7 != 3 || input % 7 != 4){ 
count++; 
cout << count << "tries, " << "please try again: "; 
cin >> input; 
} 

cout << "Congratulations, you passed"; 
return 0;  
} 
+2

これらの条件のうちどれかが真であればループします。 ** 1。**入力は0以下です。** 2。** '入力/ 7は、3の余りがありません。 '** 3。**'入力/ 7はありません。残りの4つの部分を持っています---あなたがどのように期待通りに働いていないのか今すぐに知ることができますか? – byxor

+0

OR(||)でAND(&&)ではないですか? '10%7!= 3'は偽ですが、' 10%7!= 4'は真です。したがって、ループは次の反復に正常に移動します。コントロールが3と4の場合に移動するようにするには、&&を使用する必要があります。 –

答えて

1

に等しいときしかし、それはまだ動作しません。

その場合

、あなたがこれにあなたの状態を変更する必要があります。

while (input <= 0 || (input % 7 != 3 && input % 7 != 4)) 
1

論理エラーがあり、ここでは、これはあなたが必要な場合があります状態です。

while (input <= 0 || (input % 7 != 3 && input % 7 != 4)){ 

あなたはループの中でモジュルが3と4の両方と異なるのに対し、モジュルが異なるとします。

+3

読者のための注意:これらの論理エラーを避けるための素敵で簡単な方法は、テスト可能な関数に分割することです。例えば'while(input <= 0 || remainderIsInvalid(input)){...}'となります。論理的な間違いがある場合、通常はそれを読むだけで気付くでしょう。 – byxor

1

私はいませんこのコードが意図したとおりに機能しない理由を確認してください。 "入力%7!= 3 ||入力%7!= 4)"と入力します。私はモジュロ7が3または4に等しくなく、ループにとどまっていると言っています

いいえ、そうではありません!

あなたはループに滞在、入力モジュロ7が等しい、または入力モジュロ7が等しくないていない場合は言っています。

入力モジュロ7が及び同時に両​​方とすることができないので、条件が常に成立します。

論理結合の書き換えのこの種のは、実際に英語の間違いです。口語的には英語で受け付けていますが、C++ではありません。あなたがを意味

「入力モジュロ7が等しい3、及び入力モジュロ7は4と等しくないない場合は、ループにとどまる」、すなわちinput % 7 != 3 && input % 7 != 4