programacion-bucle-dowhile

El bucle DOWHILE

El bucle DO-WHILE es una estructura de control que repite un bloque de código al menos una vez, y luego verifica una condición para decidir si continuar o salir del bucle.

En lenguaje natural, el bucle WHILE significa,

Haz esto -> mientras se cumpla esto

El bucle DO-WHILE es el “hermano” del bucle WHILE, y su funcionamiento es muy parecido.

La diferencia es que en el bucle DO-WHILE la condición se verifica después de ejecutar el cuerpo del bucle. Por tanto, el bucle se ejecuta al menos una vez.

programacion-bucle-do-while

Esquema DO-WHILE

En general, la sintaxis de un bucle DO-WHILE tiene la siguiente forma,

do
{
    // Bloque de código a ejecutar mientras la condición sea verdadera
}
while(condicion)

// resto de código

El bloque de código se ejecuta primero y luego se verifica la condición. Si la condición se evalúa como verdadera, el bucle se repite y el bloque de código se ejecuta nuevamente. Si la condición se evalúa como falsa, el bucle se detiene y el programa continúa con la siguiente instrucción después del bucle.

Equivalencia con bucle WHILE

En realidad ambos bucles son prácticamente equivalentes. De hecho es posible convertir fácilmente uno en el otro.

Elegir entre ambos depende cómo funcione tu programa. Tiene sentido usar un DO-WHILE cuando la condición depende de un proceso, que es el mismo proceso que se ejecuta dentro del bucle.

Por ejemplo, imagina que tienes una función que calculaCosas(), y devuelve un resultado. Si el resultado cumple una condición, por ejemplo es menor que 10, debes volver a calcularlo.

Eso con un bucle WHILE queda así:

resultado = calcularCosas()
while(resultado < 10)
{
    resultado = calcularCosas()
}

// resto de código

Como vemos, la instrucción que tengo encima del WHILE es igual a la que tengo en el cuerpo del bucle. Esta situación “huele a DO-WHILE

Efectivamente, si cambias el bucle por un DO-WHILE, queda así, que es más conciso y limpito:

do
{
    resultado = calcularCosas()
}
while(resultado < 10)

// resto de código

Ejemplos de bucle DO-WHILE en distintos lenguajes

Como decíamos, el bucle DO-WHILE y WHILE son hermanos cercanos. Así que no esperamos grandes diferencias en la sintaxis entre ellos.

Por ejemplo, en C, C++, C# y Java un bucle DO-WHILE tiene la siguiente pinta

int contador = 0;
do
{
	// hacer algo
    contador++;
} while (contador < 10);

En JavaScript la sintaxis del bucle DO-WHILE es idéntica. En el ejemplo cambia únicamente la forma de definir contador, pero la sintaxis del bucle es igual

let contador = 0;
do
{
    console.log("Iteración", contador);
    contador++;
} while (contador < 3);

De igual forma, en PHP el bucle DO-WHILE es idéntico, únicamente cambia la forma de acceder a las variables

$contador = 0;
do {
    // hacer algo
    $contador++;
} while ($contador < 10);

Por último, Python no tiene bucle DO-WHILE, únicamente tiene bucle WHILE. Por lo que habría que convertirlo al equivalente, como hemos visto más arriba

contador = 0
# hacer cosas
while contador < 10:
    # hacer cosas
    contador += 1

Funcionamiento interno Avanzado

El funcionamiento interno de un bucle DO-WHILE es muy similar al del bucle WHILE. La diferencia es que el salto condicional se ubica al final del cuerpo del bucle, en lugar de al principio.

programacion-bucle-do-while-saltos

Salto condicional generado por el DO-WHILE

En este caso, el flujo de programa entra directamente en el cuerpo del bucle, por lo que siempre se va a ejecutar una vez.

Al finalizar, se encuentra con un salto condicional. Si se cumple, se retorna el flujo de control al inicio del cuerpo del bucle. En caso contrario, se sigue con el programa “y tan amigos”.

En realidad, para los que tengáis el ojo más fino, veréis que en este caso el salto se realiza cuando se cumple la condición, mientras que en el bucle WHILE era cuando no se cumplía.

Pero tampoco os preocupéis de ello, es solo un ejemplo de las muchas formas de hacer la bifurcación de código. Además, la CPU tiene saltos condicionales “para aburrir”, incluidos saltos cuando se cumple y cuando no se cumple una condición. Así que no le deis demasiada importancia😉.