CICLO WHILE REGLAS

 

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:




xy
05
0.56.5
18
1.59.5
1035 

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.



Y a continuación puedes observar el programa en lenguaje Java correspondiente:



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?



¡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:

  1. a) Empezar con cualquier entero positivo.
  2. b) Si es par, divídase entre 2, si es impar, multiplicarlo por 3 y agregarle 1.
  3. c) Obtener enteros sucesivamente repitiendo el proceso hasta llegar a 1.

La siguiente es la descripción narrada de la serie que se llama “Conjetura de Ulam”:

Por ejemplo, si el entero inicial es 26, se tiene la siguiente secuencia:

            Vv26, 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:


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



Y ahora muestro el correspondiente programa en lenguaje Java:


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.





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.



¿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 ;.
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:

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);




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  sea verdadera y permite entrar al cuerpo del ciclo.





Comentarios

Publicar un comentario

Entradas más populares de este blog

EL CICLO WHILE

SQL SERVER