El ciclo do-while
La tercera de las estructuras de control de flujo cíclicas básicas es el ciclo do-while, o hacer-mientras. En este artículo te hablaré de este ciclo.
El ciclo controlado por condición final (do-while).
Al ciclo do-while también se le conoce como ciclo controlado por condición final porque se caracteriza por evaluar la condición al final del ciclo. Esta estructura permite que primero se ejecute el cuerpo del ciclo y después se evalúe la condición para saber si se puede repetir el ciclo una vez más.
En cuanto a su forma y reglas de operación tiene más en común con el ciclo while que con el ciclo for, a excepción de que la condición se evalúa al final y no al inicio del ciclo. En la figura 1 te muestro la forma general de la estructura do-while, en tres diferentes notaciones: el diagrama de flujo, el pseudocódigo, y el lenguaje de programación Java.

Figura 1. La estructura cíclica do-while representada en tres notaciones.
Otros lenguajes de programación pueden utilizar nombres diferentes para este ciclo. Por ejemplo, en el lenguaje Pascal, este ciclo se llama “repeat-until”, y a diferencia del do-while de Java, la ejecución del ciclo continúa hasta que la condición sea verdadera. (En Java, como en C, termina cuando la condición sea falsa). Por otro lado, el lenguaje BASIC utiliza la sintaxis DO-LOOP WHILE.
Funcionamiento del ciclo do-while
El ciclo do-while funciona de la siguiente forma:
- Se inicia entrando en el cuerpo del ciclo y ejecutando las instrucciones que se encuentran en éste.
- Después se evalúa la condición al final del ciclo.
- Si la condición es verdadera, se tiene “permiso” para entrar de nuevo en el cuerpo del ciclo y ejecutar sus instrucciones.
- Y nuevamente se evalúa la condición, la cual, si sigue siendo verdadera, permite que el flujo del programa vuelva a entrar al cuerpo del ciclo y a ejecutar las instrucciones ahí contenidas.
- Cuando se evalúe la condición y ésta sea falsa, el flujo del programa sale del ciclo y ahora se ejecuta la Acción2, que representa cualquier instrucción (o conjunto de instrucciones) que estén fuera del ciclo y que, por lo tanto, no se repetirán.
Este procedimiento puede quedar más claro con la animación que se aprecia en la figura 2.

Figura 2. Funcionamiento del ciclo do-while.
El ciclo do-while a detalle.
Esta estructura de control de flujo se compone de dos partes:
- El cuerpo del ciclo, en el cual se colocan las instrucciones que se quieren repetir. Puede estar compuesto únicamente por una sentencia simple, como una asignación, una llamada a un método, o incluso otra estructura de control de flujo: if, while, switch o for. Esta parte debe iniciar con la palabra clave do, seguida de las { }. En este caso, el uso de las llaves no es opcional, aunque el cuerpo del ciclo sólo se componga de una instrucción.
- La condicional del ciclo, la cual se compone de la palabra clave while, la expresión condicional encerrada entre paréntesis, y el símbolo de ;. Este signo de puntuación es muy importante, y una diferencia importante con respecto a su contraparte, el ciclo mientras. En esta ocasión, es obligatorio terminar el ciclo con ; ya que efectivamente se trata del final de la estructura de control, y no como en el ciclo while, el inicio de la estructura.
En la figura 3 puedes observar los componentes de este ciclo.

Figura 3. Componentes del ciclo do-while en las tres notaciones más comunes.
Observaciones sobre el uso de diagramas de flujo.
Los diagramas de flujo han sido una de las herramientas más utilizadas para describir los algoritmos. Tienen algunas ventajas al tratarse de una representación gráfica, pues para muchos estudiantes es más fácil leer esta representación. Pero aunque siguen usándose, algunos preferimos el pseudocódigo, pues su estructura es más parecida a un lenguaje de programación.
Considero que usar un diagrama de flujo para describir la estructura do-while puede generar más confusiones en los estudiantes novicios que beneficios. Por ejemplo, considera el siguiente problema:
Elabora un programa que cuente el numero de pares e impares que existen en el rango de 1 a n. Utiliza un ciclo do-while.
Para resolver el problema, creamos su algoritmo, en esta ocasión decido utilizar la notación de diagrama de flujo:

Figura 4. Algoritmo en notación diagrama de flujo para el problema propuesto.
Antes de explicar el funcionamiento del algoritmo, observa como existen dos símbolos condicionales (rombos). Me he encontrado que los estudiantes encuentran difícil entender cuando ese símbolo expresa una estructura if, una while o una do-while. En este caso, el primer rombo representa a una estructura if, y el segundo a una estructura do-while, la cual se puede reconocer por la flecha lateral que se encuentra antes del primer rombo.
El funcionamiento del algoritmo es el siguiente:
- Pide el valor de n
- Inicializa las variables pares, impares e i.
- Comprueba si i es divisible entre 2, de ser así, se incrementa en 1 la variable pares. De lo contrario, se incrementa en 1 la variable impares.
- Se incrementa en 1 a la variable i
- Se comprueba si i aún es menor o igual a n, de ser así, se repiten los pasos 3 y 4. De lo contrario se imprimen los valores de las variables pares e impares.
Ahora, observa como escribir este mismo algoritmo utilizando la notación de diagrama de flujo puede clarificar mucho las cosas, y sobre todo, ofrecer una traducción más fácil hacia el lenguaje de programación:

Figura 5. Algoritmo en notación pseudocódigo para el problema propuesto
¿Puedes observar cómo ésta notación ofrece más estructura que el diagrama de flujo? A continuación te presento el programa correspondiente en lenguaje Java, para que compares como la traducción de pseudocódigo a código es casi natural. Pero tú saca tus propias conclusiones.
/* * dCodinGames - Programa que cuenta el numero de pares e impares * que existen en un rango de 1 a n enteros. */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * * @author Gaby Nieva Paredes - dCodinGames */ public class ConteoParesImpares { public static void main(String[] args) throws IOException { int i=1, n, pares = 0, impares = 0; BufferedReader bufer = new BufferedReader(new InputStreamReader(System.in)); String entrada; System.out.println("Escribe el valor de n: "); entrada = bufer.readLine(); n = Integer.parseInt(entrada); do{ if ( i% 2 == 0) pares++; else impares++; i++; } while ( i<= n); System.out.println("El total de pares es: " + pares); System.out.println("El total de impares es: " + impares); } }
Reglas del ciclo do-while.
1. La variable de control (o variables) pueden ser de cualquier tipo de dato:
Para este tipo de estructura, cualquiera de los tipos de datos primitivos: int, char, float, double y boolean pueden ser el tipo de la variable de control del ciclo.
Sin embargo, es importante recordar que este ciclo no necesariamente depende de una variable de control (como la estructura for), sino más bien de la evaluación de una expresión condicional. El uso de una variable de control como un contador dependerá del tipo de problema a resolver, pero de necesitarla, puedes utilizar cualquiera los tipos de datos primitivos de Java.
Ejemplo:
Escribe un programa para imprimir cada uno de los primeros 100 caracteres de la tabla ASCII
Para este caso, una variable contador a la que llamaré x, será de tipo char. Sin embargo, x “lleva la cuenta” de la repetición en la que se encuentra el proceso. Por lo tanto, x es la variable de control. La solución te la presento a continuación:
/** * Ejemplo de uso del ciclo do-while * dCodinGames.com * @author Gaby Nieva Paredes */ public class EjDoWhile1 { public static void main(String[] args) { char x=0; do{ System.out.println("El valor de x es: " + Integer.toString(x) + " y su caracter es: " + x); x++; }while (x <= 100); } }
2. A la variable de control se le puede asignar incrementos o decrementos diferentes de 1
De manera similar al ciclo while, el do-while trabajar con una variable de control a la que se le puede asignar incrementos diferentes de 1. Es decir, puede moverse de 2 en 2, o incrementarse de 0.5 en 0.5.
3. Si el ciclo depende de una variable de control, ésta debe cambiar su valor dentro del cuerpo del ciclo, para evitar ciclos infinitos
Es necesario recordar que el ciclo do-while, así como el while, no tienen integrada la función para incrementar la variable de control, por lo que es necesario hacerlo explícitamente dentro del cuerpo del ciclo. De lo contrario, corremos el riesgo de generar un ciclo infinito.
4. Se debe realizar una prueba de escritorio para comprobar que el ciclo tendrá fin:
Por situaciones como la que se explica en la regla # 2, es necesario realizar una prueba de escritorio (o utilizar herramientas de depuración integradas en el IDE) para comprobar que no se caiga en una situación de ciclo infinito.
5. Este ciclo se debe utilizar cuando primero se requiere ejecutar un conjunto de acciones, y después comprobar si se deben repetir.
El ciclo do-while debe usarse para los problemas donde primero necesites ejecutar las acciones y después evaluar para saber si debes repetir las acciones o no. En cierto sentido, esto implica primero “dejar pasar” y después “preguntar”.
Sin embargo, no todos los problemas requieren esto. Para esos casos, recuerda que el ciclo while representa un ciclo “más estricto”, pues requiere que la condición sea evaluada antes de ejecutar las acciones dentro del cuerpo del ciclo.
Te sorprenderá saber la multitud de problemas para los que la estructura do-while es un mejor enfoque para solucionarlos. Por ejemplo, en el mundo de los videojuegos, es utilizado ampliamente, pues considera que la forma general en la que se comportan es la siguiente:
- Entras al juego
- Juegas
- Si ya no tienes vidas o ya no quieres jugar, cierras el juego. De lo contrario, repites paso 2.
En este sencillo algoritmo, puedes deducir que se trata claramente de un ciclo do-while, el cual permitirá jugar primero, y después evaluar si se siguen cumpliendo las condiciones para jugar o si el usuario quiere terminar.
6. Se pueden utilizar datos centinelas para terminar el ciclo.
Si bien el uso de una variable de control o contador es lo más popular para controlar un ciclo, otra forma es emplear datos “centinelas” o también llamados “banderas” para usarlos en la expresión condicional. Esta situación es muy común cuando se desconoce el tamaño de datos a procesar.
Ejemplo:
Escribir un programa que obtenga el promedio de las estaturas de un grupo de n personas
Como se desconoce el tamaño de los datos a procesar, se le puede preguntar al usuario si desea seguir introduciendo datos, y en base a esa respuesta, decidir continuar con el ciclo o detenerse. En la figura 4, puedes observar el algoritmo para este problema.

Figura 6 – Algoritmo para el ejemplo # 2 usando el ciclo do-while.
La solución a este ejemplo la puedes ver a continuación:
/** * Ejemplo de uso del ciclo do-while * dCodinGames.com * @author Gaby Nieva Paredes */ public class EjDoWhile2 { public static void main(String[] args) throws IOException { char respuesta; double promedio=0, estatura; int n=0; BufferedReader bufer = new BufferedReader(new InputStreamReader(System.in)); String entrada; do{ System.out.println("Escribe el valor de estatura: "); entrada = bufer.readLine(); estatura = Double.parseDouble(entrada); promedio += estatura; n++; System.out.println("¿Agregar otro dato de estatura? (S/N): "); entrada = bufer.readLine(); respuesta = entrada.charAt(0); } while(respuesta == 'S' || respuesta == 's'); promedio /= n; System.out.println("Se recibieron " + n + " datos."); System.out.println("La estatura promedio es: " + promedio); } }
Un centinela es un guardia o vigía militar emplazado en un puesto de observación para proteger un lugar, instalaciones, material o personas.
En programación, le llamamos centinela a una variable que se puede encargar de avisar al programa de alguna situación. Particularmente, en este ejemplo, la variable respuesta, funciona como un dato centinela, el cual controla cuando el ciclo debe terminar.
Con esto concluyo con la información básica sobre el ciclo do- while.
Si consideras que este artículo te fue útil, compártelo en tus redes sociales. Y si tienes alguna duda sobre el tema, no dudes en dejar tu comentario y/o pregunta.
¡Hasta la próxima!