2017-01-21 4 views
0

Я не уверен, почему этот код не работает должным образом. "input% 7! = 3 || input% 7! = 4)". Я говорю, если ввод modulo 7 не равен 3 или 4, тогда оставайтесь в цикле. Однако, когда я вхожу 10 он по-прежнему не работает, когда 10 по модулю 7 равна 3.Loops and Modulo

#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

Он будет зацикливаться, если _any_ из этих условий верны. ** 1. ** 'Входной сигнал равен 0 или меньше. ** ** **. ** Вход/7 не содержит остатка 3.' ** 3. **' Вход/7 не есть остаток 4.' --- Теперь вы видите, почему он не работает, как вы ожидаете? – byxor

+0

Вы уверены в OR (||), а не AND (&&)? '10% 7! = 3' неверно, но' 10% 7! = 4' истинно. Таким образом, цикл успешно переходит к следующей итерации. Вам нужно использовать '&&', если вы хотите, чтобы элемент управления выходил в случае 3 и 4. –

ответ

1

Я говорю, если вход по модулю 7 не равно 3 или 4, то остаться в петле.

В этом случае вам нужно изменить свое состояние так:

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 || остаток IsInvalid (ввод)) {...}'. Если есть логическая ошибка, вы обычно заметите, просто прочитав ее. – byxor

1

Я не конечно, почему этот код не работает должным образом. "input% 7! = 3 || input% 7! = 4)". Я говорю, если ввод modulo 7 не равен 3 или 4, тогда оставайтесь в петле

Нет, вы не!

Вы хотите сказать, что если вход по модулю 7 не равна или вход по модулю 7 не равна , пребывание в петле.

Это условие всегда имеет место, поскольку вход по модулю 7 не может быть одновременно и в то же самое время.

Этот вид перезаписи логических соединителей на самом деле является ошибкой английского языка; хотя разговорно принято на английском языке, это не на C++.

Вы имели в виду «если вход по модулю 7 не равно 3, и вход по модулю 7 не равно 4, пребывание в петле», т.е.input % 7 != 3 && input % 7 != 4.