Los bucles while y do while
Los bucles while y do while permiten repetir un bloque de código mientras se cumpla una condición.
A diferencia del bucle for, no necesitamos saber de antemano cuántas veces se repetirá el código.
El bucle continuará ejecutándose hasta que una cierta condición deje de ser verdadera.
Por este motivo, while y do while son especialmente útiles cuando el número de repeticiones depende de algo que ocurre durante la ejecución del programa y no se sabe al inicio del progrma cuántas veces se repetirá.
El bucle while
El bucle while permite repetir un bloque de código mientras una condición sea verdadera.
Imagina que estás llenando una botella con agua.
No sabes exactamente cuánto tardará en llenarse.
Lo único que sabes es que debes seguir echando agua mientras la botella no esté llena.
En cuanto la botella se llena, dejas de hacerlo.
El bucle while funciona exactamente igual.
En lugar de indicar un número fijo de repeticiones como hacíamos con el for, le damos una condición.
Mientras esa condición sea verdadera, el código seguirá ejecutándose.
Cuando la condición deje de cumplirse, el bucle terminará automáticamente.
Sintaxis del while
La sintaxis del bucle while es muy sencilla.
Es bastante similar a la estructura if, ya que ambas trabajan sobre una condición.
while (condición) {
// Código que se repetirá
}
Primero se comprueba la condición.
- Si es verdadera, se ejecuta el bloque de código.
- Cuando termina el bloque, la condición vuelve a comprobarse.
- Si sigue siendo verdadera, el bloque vuelve a ejecutarse.
- En el momento en que la condición sea falsa, el bucle termina.
¿Cómo funciona paso a paso?
Observa el siguiente ejemplo.
int numero = 1;
while (numero <= 3) {
System.out.println(numero);
numero++;
}
Veamos qué ocurre.
Valor de numero | ¿Se cumple numero <= 3? | Se ejecuta |
|---|---|---|
| 1 | Sí | Se muestra 1 y se incrementa el número |
| 2 | Sí | Se muestra 2 y se incrementa el número |
| 3 | Sí | Se muestra 3 y se incrementa el número |
| 4 | No | El bucle termina |
Salida:
1
2
3
Es importante observar que la variable en la que se basa la condición cambia dentro del bucle (se incrementa en numero++;).
Si nunca cambiara, la condición podría seguir siendo verdadera para siempre.
Por eso es muy importante que dentro del bucle while exista algún cambio que permita que la condición llegue a ser falsa.
La variable de control
En muchos bucles while existe una variable cuyo valor cambia en cada repetición.
A esta variable se le suele llamar variable de control.
int contador = 1;
while (contador <= 5) {
System.out.println(contador);
contador++;
}
En este ejemplo, contador controla cuándo debe finalizar el bucle.
Comienza valiendo 1 y aumenta en cada repetición.
Cuando llega a 6, la condición:
contador <= 5
deja de cumplirse y el bucle termina.
Ejemplos
Ejemplo 1. Contar del 1 al 5
int numero = 1;
while (numero <= 5) {
System.out.println(numero);
numero++;
}
Salida:
1
2
3
4
5
Ejemplo 2. Cuenta atrás
También podemos utilizar un while para disminuir una variable.
int numero = 5;
while (numero >= 1) {
System.out.println(numero);
numero--;
}
Salida:
5
4
3
2
1
En este caso utilizamos:
numero--;
para disminuir el valor de la variable en cada repetición.
Ejemplo 3. Ahorrar dinero
Una persona guarda 20 € cada semana hasta reunir al menos 100 €.
int ahorro = 0;
while (ahorro < 100) {
ahorro += 20;
System.out.println("Ahorro actual: " + ahorro + " €");
}
Salida:
Ahorro actual: 20 €
Ahorro actual: 40 €
Ahorro actual: 60 €
Ahorro actual: 80 €
Ahorro actual: 100 €
No sabemos cuántas repeticiones habrá con solo mirar el bucle, pero sí sabemos cuándo terminará.
El bucle continuará mientras el ahorro sea inferior a 100 €.
Ejemplo 4. Vaciar una batería
Una batería comienza al 100 % y pierde 25 puntos cada vez hasta llegar a 0.
int bateria = 100;
while (bateria > 0) {
System.out.println("Batería: " + bateria + "%");
bateria -= 25;
}
Salida:
Batería: 100%
Batería: 75%
Batería: 50%
Batería: 25%
El bucle termina cuando bateria deja de ser mayor que 0.
El bucle do while
El bucle do while también permite repetir un bloque de código mientras una condición sea verdadera.
La principal diferencia respecto al while es cuándo se comprueba la condición.
En un while, la condición se comprueba antes de ejecutar el código.
En un do while, primero se ejecuta el código y después se comprueba la condición.
Por este motivo, un do while siempre ejecutará su bloque de código al menos una vez.
Sintaxis
La sintaxis del do while es:
do {
// Código que se repetirá
} while (condición);
Observa que después de la condición aparece un ;.
} while (condición);
Este punto y coma es obligatorio.
¿Cómo funciona paso a paso?
Observa el siguiente ejemplo.
int numero = 1;
do {
System.out.println(numero);
numero++;
} while (numero <= 3);
El funcionamiento sería:
Valor de numero | Se ejecuta el código | ¿Se cumple numero <= 3? |
|---|---|---|
| 1 | Sí | Sí |
| 2 | Sí | Sí |
| 3 | Sí | Sí |
| 4 | No | No |
Salida:
1
2
3
La diferencia está en que primero se ejecuta el código y después se comprueba la condición.
Diferencia entre while y do while
La diferencia más importante es qué ocurre cuando la condición es falsa desde el principio.
Observa este while:
int numero = 10;
while (numero < 5) {
System.out.println(numero);
}
La condición es falsa desde el principio:
10 < 5
Por lo tanto, el código no se ejecuta ninguna vez.
Ahora observa un do while:
int numero = 10;
do {
System.out.println(numero);
} while (numero < 5);
Aunque la condición sea falsa, el código se ejecuta una vez.
Salida:
10
Esto ocurre porque en el do while la condición se comprueba después de ejecutar el código.
Podemos resumir la diferencia de esta forma:
while | do while |
|---|---|
| Comprueba la condición antes | Comprueba la condición después |
| Puede ejecutarse 0 veces | Se ejecuta al menos 1 vez |
| Útil cuando primero debemos comprobar una condición | Útil cuando necesitamos ejecutar algo al menos una vez |
Por ejemplo, si queremos mostrar un menú y después preguntar al usuario si quiere continuar, un do while puede ser especialmente útil.
Ejemplo do while con Scanner
Una situación habitual para utilizar do while es pedir información al usuario.
Imagina que queremos pedir un número al usuario y continuar preguntándolo mientras introduzca un número negativo.
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
int numero;
do {
System.out.print("Introduce un número positivo: ");
numero = scanner.nextInt();
} while (numero < 0);
System.out.println("Número válido: " + numero);
En este caso queremos que la pregunta se realice al menos una vez.
Por eso un do while resulta adecuado.
Primero preguntamos el número.
Después comprobamos si es negativo.
Si es negativo, volvemos a preguntar.
Si no es negativo, terminamos el bucle.
Ejemplo de menú
Los do while son muy utilizados para crear menús que deben mostrarse al usuario al menos una vez.
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
int opcion;
do {
System.out.println("1. Ver perfil");
System.out.println("2. Ver mensajes");
System.out.println("3. Salir");
System.out.print("Elige una opción: ");
opcion = scanner.nextInt();
} while (opcion != 3);
System.out.println("Programa finalizado.");
El menú aparece al menos una vez.
Después de elegir una opción, se comprueba:
opcion != 3
Mientras la opción no sea 3, el menú volverá a mostrarse.
Cuando el usuario elija 3, la condición será falsa y el bucle terminará.
Errores frecuentes
Olvidar modificar la variable de control
int numero = 1;
while (numero <= 5) {
System.out.println(numero);
}
Este bucle nunca termina porque numero siempre vale 1.
Debemos actualizar la variable:
numero++;
Utilizar una condición incorrecta
int numero = 10;
while (numero < 5) {
System.out.println(numero);
}
Como la condición es falsa desde el principio, el bucle no se ejecutará ninguna vez.
Modificar la variable equivocada
int numero = 1;
int otro = 0;
while (numero <= 5) {
otro++;
}
La condición depende de numero, pero quien cambia es otro.
Como numero nunca cambia, el bucle será infinito.
Olvidar el punto y coma en do while
En un do while, el punto y coma después de la condición es obligatorio.
Incorrecto:
do {
System.out.println("Hola");
} while (true)
Correcto:
do {
System.out.println("Hola");
} while (true);
Buenas prácticas
- Utiliza
whilecuando no conozcas el número exacto de repeticiones y pueda ocurrir que el código no se ejecute ninguna vez. - Utiliza
do whilecuando necesites que el código se ejecute al menos una vez. - Comprueba que la condición pueda llegar a ser falsa.
- Modifica correctamente la variable que controla la condición.
- Mantén la condición sencilla y fácil de entender.
- Presta atención al
;que aparece al final de la condición de undo while.