Pruebas mientras para múltiples condiciones (lenguaje C)

Tengo que crear un menú en el que si la entrada no es válida. Debe seguir pidiendo una entrada válida. Lo he escrito abajo (en C)

#include  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. 

Pero lo que sucede es que se repite incluso cuando la entrada es, por ejemplo, 2.

Su código está diciendo: Bucle siempre que se cumpla lo siguiente:

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

Dando vuelta a esto, el código dice: rompa el ciclo si la condición anterior es falsa, lo cual es cierto para

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

Ahora apliquemos la ley de De Morgan a la expresión anterior y obtendremos la expresión lógica igual (como condición de interrupción del bucle):

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

El bucle se romperá si lo anterior es cierto. Es cierto si la input es igual a 1 y 2 y 3 y 4 al mismo tiempo. Esto no es posible, por lo que el bucle se ejecutará para siempre.

Pero lo que sucede es que se repite incluso cuando la entrada es, por ejemplo, 2.

Si la input es 2 , sigue siendo desigual 1 , 3 y 4 , lo que hace que la condición de bucle se vuelva verdadera y el bucle continúe. 🙂


No relacionado con su problema:

Como desea que el código del bucle se ejecute al menos una vez, debe usar un do {...} while -loop.

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

o (siguiendo de nuevo a De Morgan):

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

o incluso más apretado:

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

Lo que has escrito es que si la variable no es una de ellas, haces un bucle. Lo que desea es while(input < 1 || 4 < input) o while(input != 1 && input != 2 && input != 3 && input != 4)

    Intereting Posts