Saltar al contenido principal

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
1Se muestra 1 y se incrementa el número
2Se muestra 2 y se incrementa el número
3Se muestra 3 y se incrementa el número
4NoEl 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 numeroSe ejecuta el código¿Se cumple numero <= 3?
1
2
3
4NoNo

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:

whiledo while
Comprueba la condición antesComprueba la condición después
Puede ejecutarse 0 vecesSe 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 while cuando no conozcas el número exacto de repeticiones y pueda ocurrir que el código no se ejecute ninguna vez.
  • Utiliza do while cuando 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 un do while.