martes, 16 de octubre de 2012

La idea detrás de un ciclo...

El concepto de ciclo y el por qué

La idea detrás de un ciclo comienza cuando teníamos que realizar ciertos procesos repetidas veces. Aún habiendo algunos mecanismos alternos para llevar esta tarea a cabo, hay ciertos programas que requieren realizar un procedimiento un número grande de veces o peor aún, un número indefinido de veces.

Una forma un poco inocente de abordar este problema sería planteando en principio un conjunto seguido de instrucciones:

  • Instrucción
  • Instrucción
  • Instrucción
  • Instrucción
  • ...(hasta completar N veces)
Aún así el problema no se resuelve, porque si tuviéramos que ejecutar una instrucción una cantidad enorme de veces, la cantidad de líneas de código se volvería inmanejable, por otro lado, esta solución tampoco es viable si no conocemos ese numero N de veces que esa instrucción debe ejecutarse.

El ciclo viene de la idea de especificar una instrucción y una cantidad de veces que podría estar indefinida, consideremos una estructura así:

Ejecute N veces: Instrucción

No lo sé de primera mano, pero posiblemente hay lenguajes que tenían ciclos de esta manera, sin embargo hay problemas para los cuales no es suficiente utilizar una estructura tan simple. Por ejemplo, hay problemas que simplemente no tienen definido un número de veces como este:

Muestre el menú de opciones hasta que el usuario seleccione la opción salir

Bueno, literalmente este problema no tiene un número de opciones definido ya que el usuario en cuestión podría usar indefinidamente el susodicho menú de opciones y por ende jamas terminar. Esto implica que no necesariamente un ciclo debe tener un numero definido de iteraciones (llamemos así la cantidad de veces que un ciclo funciona). Para solucionar esto, muchos lenguajes optaron por soluciones de este estilo:

Mientras la condición X se cumpla, ejecute la instrucción Y

Esta forma es muchísimo más general y corresponde a la implementación de ciclos que varios lenguajes de programación poseen.

Bueno, y eso en JAVA ¿Cómo se hace?

Las instrucciones repetitivas (ciclos) en JAVA requieren en principio de la definición de una expresión booleana (osea, con valor true o false) que defina si el ciclo seguirá iterando. También requiere del conjunto de instrucciones que va a ejecutar repetidas veces. La estructura es muy similar a la que usa un condicional:

while ( expresionBooleana )
{
 //instrucciones a repetir
}

La palabra reservada while, se utiliza para definir un ciclo, le sigue un paréntesis que encierra la expresión booleana que controla el ciclo y un par de llaves que encierran el codigo que ejecutará de manera repetida. Veamos un pequeño ejemplo:

int i=0;
while ( i<10 )
{
 System.out.println("Valor de i:"+i);
}

En las anteriores instrucciones he declarado una variable entera llamada i, cuyo valor inicial es cero. He usado la palabra while y he puesto como condición i<10. (Léase "mientras i sea menor que 10"). Dentro de las instrucciones del ciclo he llamado al método que me permite mostrar texto en la pantalla e intento mostrar el valor de i.
Aún así hay un serio inconveniente con este ciclo.... la variable entera i tiene valor inicial cero, el ciclo por ende debería funcionar porque i cumple la condición de ser menor que 10, también se mostrará el valor de i en la pantalla, pero el valor de i nunca está variando en el ciclo. Esto significa que este programa tiene dos problemas: 1. Que siempre va a imprimir "Valor de i:0" y 2. Que nunca va a terminar de hacerlo, porque la condición se cumplirá eternamente (a menos que usted "mate" el proceso o apague el computador).
Una versión correcta de este ciclo sería:

int i=0;
while ( i<10 )
{
 System.out.println("Valor de i:"+i);
 i++;
}

Ahora este ciclo funciona y funcionará las veces que son necesarias (10 en este caso) porque la instrucción i++ garantiza que en algún momento la condición del ciclo deje de ser cierta y por ende el ciclo deje de iterar. Este programa mostrará en pantalla:

  • Valor de i: 0
  • Valor de i: 1
  • Valor de i: 2
  • Valor de i: 3
  • Valor de i: 4
  • Valor de i: 5
  • Valor de i: 6
  • Valor de i: 7
  • Valor de i: 8
  • Valor de i: 9
El anterior ciclo es un ciclo que tiene una cantidad constante de iteraciones, pero en general los ciclos podrían ser escritos con comportamientos diferentes. En general un ciclo requiere de una condición que evalúe verdadero cuando se quiere que el ciclo funcione y evalúe falso cuando no. También requiere de que dentro del ciclo hayan instrucciones que modifiquen el estado de esa condición para lograr que termine en algún momento.

La instrucción for

Es muy común el ciclo que hemos usado anteriormente, especialmente si se trata de recorrer conjuntos de tamaño especifico (por ejemplo las letras de una palabra, las posiciones de un arreglo o de una matriz). Es tan común el uso de este ciclo que algunos lenguajes implementaron una estructura de ciclo que permitiera lo siguiente:

Instrucción de inicialización, Mientras la condición X se cumpla, ejecute Y y Ejecute la instrucción de avance. 

El mismo while del ejemplo anterior se escribe así en un for:


for (int i=0; i<10 ;i++)
{
 System.out.println("Valor de i:"+i);
}

Nótese que la declaración de la variable i se movió al paréntesis del for, al igual que la instrucción de avance del ciclo i++. Este for hace exactamente lo mismo que el while anterior, solamente reorganiza las instrucciones con el fin de hacer un poco más organizada la escritura. El paréntesis de un for tiene entonces una instrucción de inicialización que sucederá antes de comenzar el ciclo, una condición del ciclo y una instrucción de avance que sucederá al final de cada iteración. Dentro de sus llaves lleva las instrucciones a repetir.

Algunas conclusiones

Los ciclos son mecanismos de control de un programa que permiten repetir instrucciones, para usarlos se debe tener una cierta seguridad de saber en que casos el ciclo debe iterar o no y también se debe considerar que el ciclo debe garantizar una terminación (aunque hay excepciones para esta última norma). Esta terminación se garantiza haciendo que alguna de las instrucciones del ciclo afecte la condición del mismo con el fin de hacerla falsa en algún momento.

La implementación de un ciclo en JAVA puede realizarse por medio de las instrucciones while o for. Los dos formatos permiten representar los mismos ciclos de manera indiferente (es cuestión de gustos usar uno o el otro, aquí entrarían a jugar criterios de legibilidad del código u otros).

No hay comentarios:

Publicar un comentario