El ciclo while
Se dice que todo programa se puede escribir usando sólo dos estructuras de control de flujo: la condicional if, y el ciclo while. En esta entrada les hablaré sobre el ciclo while o también conocido en español como mientras.
El ciclo controlado por condición inicial (while).
Recuerda que un ciclo (loop, lazo) es una estructura de control de flujo cuya función es repetir un conjunto de instrucciones varias veces. Esto nos permite escribir la solución una vez, y que se repita con un conjunto diverso de datos.
Por ejemplo, si necesitas obtener el promedio general de un estudiante, preocúpate sólo de escribir la solución para un estudiante. Después esa solución colócala dentro de un ciclo, y éste se repetirá tantas veces tú lo necesites.
Uno de estos ciclos es el ciclo while al cual también se le conoce también como ciclo controlado por condición inicial, porque en este tipo de ciclos, se repite un proceso mientras una condición sea verdadera. En la figura 1 te muestro la forma general de éste, en tres diferentes notaciones: el diagrama de flujo, el pseudocódigo, y el lenguaje de programación Java.

Figura 1. La estructura cíclica while representada en tres notaciones.
Funcionamiento del ciclo while
El ciclo while funciona de la siguiente forma:
- Se inicia evaluando la condición que es parte del encabezado del ciclo.
- Si la condición es verdadera, se dice que el flujo del programa entra al cuerpo del ciclo, y por lo tanto se puede ejecutar la Acción1. En la práctica, el cuerpo del ciclo puede estar conformado por más de una instrucción, pero para simplificar, he escrito solo la palabra Acción1. Recuerda que si el cuerpo sólo se compone de una acción, no requiere ser encerrado entre llaves, pero si el cuerpo tiene dos o más acciones, requiere las {}. (Este asunto puedes consultarlo aquí)
- Si se ejecutó la Acción1, se regresa a evaluar nuevamente la condición del ciclo. Si esta sigue siendo verdadera, nuevamente el flujo del programa vuelve a entrar al cuerpo del ciclo.
- 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 while.
El ciclo while a detalle.
Como puedes deducir, esta estructura de control se compone de dos partes fundamentales:
- El encabezado del ciclo: esta parte se compone de la palabra clave while, seguida de la expresión condicional que se escribe entre paréntesis. Por favor, observa que al final del encabezado no se debe escribir el símbolo ; dado que el fin de la línea NO implica el fin de la instrucción. (Más adelante te muestro con detalle un ejemplo con el que podrás entender por qué no se debe escribir ; .
- El cuerpo del ciclo: en esta parte se colocan las instrucciones que quieres repetir. Puede ser tan simple como una sola instrucción, pero también pueden escribirse un conjunto de n instrucciones, un llamado a un método, o incluso, otra estructura de control de flujo, como un if u otro ciclo while.
En la figura 3 puedes observar con detenimiento estos componentes.

Figura 3. Componentes del ciclo while en las tres notaciones más comunes.
Reglas del ciclo while.
La siguiente lista es una serie de observaciones que incluso pueden pasar como reglas que te ayudarán a utilizar de la forma adecuada la estructura while.
1. Si el ciclo tiene una variable de control, ésta puede ser de cualquier tipo de dato numérico (int, float, o double):
Una variable de control lleva la cuenta de la repetición en la que se encuentra el ciclo. Por ejemplo, si una tarea debe repetirse 10 veces, la variable de control irá del 1, 2, 3, 4, al 10. Entonces en un momento determinado, te indicará en cuál de estas 10 repeticiones se encuentra el ciclo.
Con el ciclo while no necesariamente debes usar una variable de control, pues eso dependerá del problema a solucionar. Sin embargo, si la utilizas, tienes la ventaja de que puede ser de cualquier tipo de dato numérico. Esto a diferencia del ciclo for, en el que la variable de control sólo puede ser de tipo int.
Ejemplo # 1:
Para explicar mejor esta característica del ciclo while, observa el siguiente enunciado de problema:
“Escribe un programa para calcular cada uno de los valores de y en la ecuación: y = 3x + 5, en donde x toma valores de 0 a 10, en incrementos de 0.5”
Esto quiere decir que se busca obtener algo como esto:
x | y |
---|---|
0 | 5 |
0.5 | 6.5 |
1 | 8 |
1.5 | 9.5 |
… | … |
10 | 35 |
Claramente la variable x no puede ser entera, por lo que deberá ser ya sea tipo float o double. Pero aunque x no sea entera, sí “lleva la cuenta” de la repetición en la que se encuentra el proceso. Por lo tanto, x es la variable de control. Debido a que x no es int, no se puede utilizar el ciclo for para resolver este probema, por lo que podemos proceder a solucionar el problema con el ciclo while. El algoritmo que da solución a este problema, te lo presento en la figura 4.

Figura 4. Algoritmo para el problema propuesto.
Y a continuación puedes observar el programa en lenguaje Java correspondiente:
public class EjemploWhile1 { public static void main(String[] args) { double x, y; x = 0; while (x<=10){ y = 3 * x + 5; System.out.println("x = " + x + " y = " + y); x = x + 0.5; } } }
2. A la variable de control se le puede asignar incrementos o decrementos diferentes de 1
Otra ventaja que tiene el ciclo while con respecto al ciclo for es que a la variable de control se le puede asignar incrementos diferentes de 1. Es decir, puede moverse de 2 en 2, o como lo vimos en el ejemplo anterior 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
Esta regla es sumamente importante de recordar, y creo que es una de las que más diferencian a la estructura while de la estructura for. Al trabajar con ciclos, queremos escribir la condición idónea que nos permita que la estructura repita las acciones las veces requeridas, pero que también pueda detenerse y salir del ciclo. La estructura for tiene integrada la instrucción para cambiar incrementar o decrementar a la variable de control dentro del encabezado del ciclo, pero no es así con la estructura while, y desafortunadamente es algo que los programadores novicios olvidan escribir con frecuencia, generando ciclos infinitos.
En la figura 5 te presento la solución al problema del punto 1 de esta serie de reglas, pero he omitido una línea. ¿Puedes indicar cuál será el resultado de este programa?

Figura 5. Otra versión de algoritmo para el ejemplo 1.
¡Exacto! Estamos ante un ciclo infinito. Al omitir la línea donde la variable de control cambia su valor, la estamos manteniendo siempre con el valor inicial, lo que genera que la condición siempre sea verdadera y el cuerpo del ciclo se ejecute infinitamente. ¡Mucho cuidado!
4. Este ciclo se debe utilizar cuando primero se requiere hacer una comparación, y después repetir un número determinado de acciones.
Van a existir problemas donde primero necesites ejecutar las acciones y después evaluar para saber si debes repetir las acciones o no. En ese caso, es mejor utilizar el ciclo do-while (hacer-mientras, conocido en otros lenguajes como repeat). En este sentido, debemos recordar entonces que el ciclo while es más estricto, pues requiere que la condición sea evaluada antes de ejecutar las acciones dentro del cuerpo del ciclo. Esto también podría generar que nunca se entre al cuerpo y que no se ejecuten las acciones ni una vez.
Típicamente casi todos los lenguajes de programación modernos tienen al menos tres tipos de ciclos: while (ciclo controlado por condición inicial), do-while (ciclo controlado por condición final) y for (ciclo controlado por contador). Y aunque en esencia la función de los tres es la misma: repetir un conjunto de acciones, su funcionamiento es ligeramente diferente, lo que los hace una mejor o peor opción para un problema específico. Esto implica que el conocimiento de estas estructuras te llevara a usar la más adecuada para el problema a resolver.
5. Es necesario comprobar, mediante el uso de la prueba de escritorio, que el ciclo va a tener fin.
Aunque esta regla está íntimamente ligada a la regla #3, es necesario mencionar que una variable de control sin cambio dentro del cuerpo del ciclo no es la única forma de caer en un ciclo infinito. Sobre todo, porque tanto el ciclo while como el do-while no siempre dependen de una variable de control, sino que su propia estructura les permite ser controlados por una condición que puede ser muy compleja. Por lo que es importante realizar una prueba de escritorio para verificar que la condición funcione para que se ingrese al cuerpo del ciclo cuando lo necesitemos, pero que también sea falsa cuando se requiera terminar el ciclo.
Recuerda el concepto de una variable de control: “es aquella que lleva la cuenta de las repeticiones a realizar”. Como acabo de mencionar, no todos los problemas requieren una variable de control. Para ejemplificar esto, observa el siguiente enunciado del problema:
Ejemplo # 2:
La siguiente es la descripción narrada de la serie que se llama “Conjetura de Ulam”:
- a) Empezar con cualquier entero positivo.
- b) Si es par, divídase entre 2, si es impar, multiplicarlo por 3 y agregarle 1.
- c) Obtener enteros sucesivamente repitiendo el proceso hasta llegar a 1.
Por ejemplo, si el entero inicial es 26, se tiene la siguiente secuencia:
26, 13, 40, 20, 10, 5, 16, 8, 6, 2, 1
Como puedes observar, este problema, a diferencia del mostrado en la ejemplo #1, no requiere una variable que lleve la cuenta de las repeticiones. ¿Por qué? Porque en realidad no sabemos a las cuantas repeticiones el ciclo terminará. Esto debe quedar más claro con la siguiente tabla, que muestra las salidas esperadas en cada caso acorde con el número inicial:
Número inicial | Conjetura de Ulam | Números en la serie |
---|---|---|
26 | 26, 13, 40, 20, 10, 5, 16, 8, 6, 2, 1 | 11 |
12 | 12, 6, 3, 10, 5, 16, 8, 4, 2, 1 | 10 |
25 | 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1 | 24 |
La columna “Números en la serie” te muestra el total de números que pertenecen a la Conjetura de Ulam, es decir, el total de números que se calculan. Pero como puedes ver, ese dato no es importante, pues lo que se pide en el problema es calcular la serie de Ulam. El texto del problema indica que dejaremos de calcular números cuando se llegue a 1, pero esa situación no depende de una variable de control, sino del número inicial que otorga el usuario. A continuación, en la figura 6 te muestro la solución a este problema.

Figura 6 – Algoritmo para obtener la Conjetura de Ulam
Y ahora muestro el correspondiente programa en lenguaje Java:
package conjeturaulam; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * * @author Gaby Nieva - dCodinGames.com */ public class ConjeturaUlam { public static void main(String[] args) throws IOException { BufferedReader bufer = new BufferedReader(new InputStreamReader(System.in)); String entrada; int numero, i=0; System.out.println("Escriba numero inicial: "); entrada = bufer.readLine(); numero = Integer.parseInt(entrada); while (numero != 1){ if (numero%2 == 0) numero = numero/2; else numero = numero * 3 + 1; i++; System.out.println(numero); System.out.println(i); } } }
Para asegurarnos que este tipo de problemas no vayan a caer en un ciclo infinito, es necesario realizar la prueba de escritorio, la cual te muestro en la figura 7 para el programa de la conjetura de Ulam y el numero inicial igual a 8.

Figura 7. Prueba de escritorio para el algoritmo de la Conjetura de Ulam
La condición numero != 1 define cuando el ciclo debe terminar. ¿Qué pasa si decido escribir la condición de la siguiente forma?:
numero >= 1
Aunque parece la opción más obvia para resolver el problema, observa la prueba de escritorio de la figura 8, en la que se ha cambiado la condición del ciclo while.

Figura 8. Prueba de escritorio del algoritmo modificado para la Conjetura de Ulam
¿Qué es lo que generó el cambio de un operador en la expresión condicional del ciclo? Así es, un ciclo infinito.
6. No terminar el encabezado con ;.
No se debe colocar ; después de while(condicion), pues esto indicaría que en el ; termina la estructura y se convertiría en un ciclo infinito. Recuerda que el símbolo de puntuación ; en Java (y en muchos otros lenguajes) se utiliza para indicar que la instrucción ha terminado. Por ejemplo, en la siguiente expresión:
x = 3 * y – (12 * z + 4 / y ) * (12 + y – z);
El ; indica que la instrucción ha terminado, y que el valor de x se asignará dependiendo del resultado de la evaluación de la expresión aritmética que se encuentra antes del ;. De la misma forma, escribir algo como lo siguiente:
public class WhileInfinito { public static void main(String[] args) { double x = 1; double y; while (x<=10); { y = 3 * x * x + 2 * x - 2; System.out.println("x = " + x + " y = " + y); x = x + 0.5; } } }
Implica que la estructura while termina en el lugar donde se colocó el ; y por lo tanto, las instrucciones que aparentemente se encuentran dentro del cuerpo del ciclo no se repetirán. Esta situación no genera un error de sintaxis como muchos suponen, sino un error de lógica. No es un error de sintaxis porque el programa puede ser ejecutado, pero su comportamiento no será el que se esperaba.
Para que entiendas mejor lo que sucede, observa el video siguiente, en donde he capturado la pantalla de Netbeans al momento en que se ejecuta el programa anterior. En la parte inferior, se muestra la ventana de variables, con el valor de x = 1.0. Esto permite que la expresión condicional del ciclo while seaverdadera y permite entrar al cuerpo del ciclo.
He separado el ; del encabezado del ciclo, para que puedas observar lo que sucederá. Al encontrar el símbolo ; el cuerpo del ciclo no se ejecuta, sino que ahí termina la instrucción. El programa regresa una vez más a evaluar la condición, la cual sigue siendo verdadera puesto que al no poder entrar al cuerpo del ciclo, no se ha cambiado el valor de x. Como puedes ver en la ventana de variables, x sigue valiendo 1.
Por lo tanto la condición será verdadera infinitamente. Dado que nunca entrará al cuerpo del ciclo por el ;, nunca se cambiará el valor de x y el ciclo se convierte en un ciclo infinito.
Esta es la información básica sobre el ciclo 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!
Leído