[ Foro de Java ]

ejercicio 6.1.5

21-Apr-2015 19:02
Jose Manuel Illanes Juan
1 Respuestas

En este ejercicio hay que pedir al usuario una contraseña y un login y hacer que se repita el bucle hasta que introduzca el login 1809 y la contraseña 1234.

En principio el ejercicio no tiene mayor problema pero me está pasando una cosa rara.
Mi código es el siguiente:


import java.util.Scanner;

public class ejercicio6_1_5 {
	public static void main(String args[]){
		
		Scanner teclado = new Scanner(System.in);
		
/* Creamos un while que se repita mientras el usuario no introduzca la contraseña
 * 1234 y el login 1809 */
		
		int login = 0;
		
		int password = 0;
		
		while ((login != 1809) && (password != 1234)){
			
			System.out.println("Introduce tu login de 4 cifras:");
			login = teclado.nextInt();
			System.out.println("Introduce tu contraseña de 4 cifras:");
			password = teclado.nextInt();
		
		}	
		System.out.print("Felicidades!! Ha entrado al sistema");
	}
	}


Básicamente el tema es:


		while ((login != 1809) && (password != 1234))


Que yo entiendo que dice que si el login no es 1809 y el password no es 1234 se tiene que repetir el bucle.
Si las dos cosas están introducidas mal se repite el bucle y si las dos están bien se para. Pero si introducimos uno de los dos bien el bucle se para y no entiendo por que ya que según yo entiendo mi orden es que no se pare hasta que no se cumplan las dos condiciones.

Esa es mi duda.

Decir que después he cambiado la orden por


		while ((login != 1809) || (password != 1234))


y haciendolo así funciona perfectamente pero no entiendo porque de la otra forma no funciona.

gracias

Saludos!


25-Apr-2015 10:49
Nacho Cabanes (+83)

El comportamiento es el esperable. Lee con detalle la orden:

while ((login != 1809) && (password != 1234))

Es decir "mientras el login no sea 1809 y la clave no sea 1234". Para que se siga repitiendo, se debe cumplir una condición Y la otra condición. En cuanto no se cumpla una de las dos, dejará de repetir. Por tanto, en cuanto el usuario introduzca bien uno de los dos datos, dejará de repetirse (y se le permitirá acceder, lo que es incorrecto).

Por el contrario, si lo planteas como

while ((login != 1809) || (password != 1234))

Estás diciendo "mientras el login no sea 1809 o la clave no sea 1234". Para que se siga repitiendo, se debe cumplir una condición O la otra condición. Si una de ellas no se cumple (porque ha acertado el login o la contraseña) pero la otra sí se cumple (porque no ha acertado el otro dato), seguirá repitiendo. Ése es el comportamiento deseable.

La "letra pequeña" es que un "mientras" y un "hasta" son cosas contrarias. Lo que sería un "y" en una condición de tipo "hasta", se convierte en un "o" si la condición es un "mientras" (y las afirmaciones se convierten en negaciones y viceversa).






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)