Ciclos. Cuándo usarlos

Por J. F. Díaz (jfdiaz98@hotmail.com)
Lic. en Ciencias de la Computación

Los ciclos (bucles o loops) son estructuras de control muy importantes en la programación. Su función principal es repetir bloques de instrucciones un número (a veces indeterminado) de veces.

Existen 3 tipos básicos de ciclos: Para...Hacer, Mientras...Hacer y Repetir...Hasta. Todos los lenguajes de programación modernos implementan al menos estos tres tipos básicos, pero muchos lenguajes primitivos sólo ofrecen uno o dos de ellos debiéndose simular los otros utilizando los existentes (p. ej. COBOL y su instrucción PERFORM). Otros por el contrario ofrecen tipos adicionales (p. ej. FoxPro y su SCAN-ENDSCAN).

Dos de los mayores problemas que enfrentan los principiantes en programación es saber cuándo deben usar ciclos y cuál tipo, de las tres disponibles, es el más idóneo para emplearlo en la solución de un problema de programación específico. La causa radica precisamente en su falta de experiencia y dominio de las características de los diferentes tipos de ciclos. En este artículo se brindan una serie de criterios y recomendaciones que ayuden a determinar si se debe utilizar una instrucción de este tipo. En un artículo futuro abordaremos el problema de decidir cuál tipo, de los 3 antes mencionados, se ajusta mejor a la solución de problemas de programación.

¿Cuándo se deben usar ciclos?

La clave para contestar esta pregunta está en el análisis cuidadoso del planteamiento del problema. Los criterios siguientes pueden ayudarte a descubrir si necesitas o no utilizar un ciclo en la solución a implementar.
  1. Cuando debas aplicar un mismo proceso a distintos grupos de datos
    Si detectas en el análisis del problema que debes procesar un conjunto de datos usando las mismas operaciones para todos ellos, necesitarás un ciclo. No es importante por ahora cómo se procesarán los datos, sino el reconocer esta característica como parte del problema. Un ejemplo obvio donde se emplean ciclos en el procesamiento de nóminas.

  2. Cuando sepas de antemano que el programa debe iterar varias veces
    O sea, repetirse una cantidad determinada o indeterminada de ocasiones. Por lo general el planteamiento del problema lo sugiere de algún modo. El número de iteraciones puede estar implícito en el planteamiento, ser proporcionado interactivamente por el usuario o estar limitado por alguna condición lógica, como el fin de un archivo de entrada. Ejemplos de este tipo de programas son los utilizados en la captura y el proceso de formas o registros de datos, tales como facturas, inventarios, calificaciones, etc.

  3. Cuando debas procesar estructuras de datos
    Si el planteamiento del problema sugiere el uso de una estructura lógica de almacenamiento de datos, el programa a diseñar es un fuerte candidato a usar ciclos. Los arreglos, listas, archivos, árboles, etc. son estructuras finitas (tienen un tamaño o una cantidad de elementos específicos) y a menudo sus datos son lógica o algorítmicamente secuenciales, o están almacenados en localidades físicamente contiguas de la memoria, conveniencias que podemos explotar exitosamente usando ciclos para su procesamiento.

  4. Cuando debas procesar archivos
    Aunque los archivos son también estructuras de datos, solo que almacenadas en discos o cintas, se tratan aquí de manera independiente. Puesto que a menudo no se conoce el número de registros o datos guardados en ellos, los programas que los accesen deben emplear ciclos para su procesamiento. Otra razón para emplear ciclos al trabajar con archivos es que los datos que contienen son del mismo tipo o comparten la misma estructura, justificándose su uso por los argumentos del tips 1 y 2 de esta sección.

  5. Cuando debas ofrecer menús de opciones
    Si el problema indica de algún modo que deberás dar al usuario opciones para controlar el programa, entonces necesitarás ciclos. Los programas que ofrecen opciones al usuario son siempre administrados dentro de un ciclo principal, normalmente un REPEAT puesto que al menos debe ejecutarse una vez. El programa finaliza normalmente cuando el usuario elige una opción específica y predefinida para salir del programa (en realidad, del ciclo principal). Mientras, se mantendrá seleccionando las demás opciones y utilizando las funcionalidades del programa.

  6. Cuando debas validar datos de entrada
    Si debes asegurarte que los datos que reciba el programa (provenientes del teclado, archivos u otros dispositivos de entrada) son válidos o razonablemente aceptables, debes usar ciclos para implementar rutinas que verifiquen la validez de la información a capturar y procesar en cuanto a tipo de datos (si es entero, de carácter, de cadena, etc.), magnitud numérica (valor cuantitativo del dato), dominio (si pertenece, por ejemplo al conjunto de los número naturales) o rango en el que debe estar incluido (p. ej. los números entre 1 y 100 para una variable de calificación.) Estas validaciones aseguran la calidad de la información recibida y garantizan la estabilidad de la ejecución del programa al ser procesada. Ejemplos de validaciones de datos son: que un valor numérico no sea negativo (n > 0), que el dato de la edad no sea mayor a 60 (Edad < 60), o que el caracter que identifica el sexo de una persona sea una 'F' o una 'M' (Sexo = 'F' OR Sexo = 'M'). Lee el último tip del siguiente artículo, Cómo Decidir Cuál Tipo de Ciclo Usar, como complemento de este.

Los últimos dos tips de esta sección, así como los de la siguiente, requieren de un conocimiento más profundo de los ciclos, en particular de los tipos y subtipos que existen, y de las diferencias, ventajas y desventajas que tienen entre sí. Por tal razón, a fin de tener una base teórica que sustente el resto de nuestras recomendaciones, se ofrece al final de este documento un resumen de las características más importantes de estas estructuras de control.
  1. Cuando la finalización del programa dependa del usuario o de un dato especial
    En estos casos se deben emplear ciclos controlados por datos centinelas. Los centinelas son datos especiales que especifican el final de la entrada de datos (vía teclado, archivo, etc.) y por ende determinan el final de las iteraciones del programa. Un centinela puede ser un dato ordinal (un número, una letra, un elemento de un conjunto o de una secuencia, etc.), una cadena de texto o un carácter particular. Debe ser un valor válido y del mismo tipo que el resto de los datos de entrada, pero lo suficientemente distinguible de ellos. Como ejemplo de centinelas podemos mencionar el valor -1 al final de una lectura de calificaciones, un carácter como '$' al final de una lectura de carácteres alfabéticos, la palabra "fin" al final de una lectura de cadenas de texto, etc.

  2. Cuando la finalización del programa dependa del cumplimiento de una meta
    Si debe alcanzarse una meta particular se deben emplear ciclos controlados por tareas. Las metas son generalmente de dos tipos diferentes: cuantificables (numéricas) y cualificables (de tipo lógico), y determinan el final de las iteraciones del programa o subrutina. El código dentro del ciclo se repetirá hasta alcanzar la meta propuesta, que generalmente se expresa por medio de una expresión lógica la cual incluye variables y valores involucrados. Ejemplos de metas son: el acumular más de 1000 unidades en una variable (ACUMULADO > 1000) o determinar si una bandera --una variable booleana-- se ha activado (Lleno = TRUE).

Características generales más importantes de los ciclos

El siguiente es un resumen de las características más importantes de los distintos tipos y subtipos de ciclos. A partir de ellas podemos intuir diferencias, ventajas y desventajas particulares entre ellos que pueden ayudarnos a elegir cuál deberemos emplear al intentar resolver un problema específico de programación.
Ciclos FOR
  • Se les cataloga como Ciclos No Condicionales, aún cuando en algunos lenguajes se requiere especificar una expresión booleana como parte de su encabezado que debe Chequearse para determinar si debe continar o no iterando, como en C. En la mayoría de los lenguajes, esta expresión está implícita y no se incluye en su estructura.
  • Necesita una variable de control entera usada como contador del número de iteraciones dadas, la cual está involucrada en la expresión lógica que rige la continuidad de su ejecución
  • Requiere la especificación de dos valores límites que restrinjan la cantidad de veces que debe iterar. Dichos valores (uno para especificar el valor inicial de las iteraciones del ciclo y otro para el final) deben ser del mismo tipo y concordar respecto a si el número de iteraciones va en incremento (límite inicial < límite final) o en decremento (límite inicial > límite final). Pueden ser otras variables, valores o constantes literales, resultados de funciones o expresiones aritméticas.
  • El incremento de su variable de control es automático y constante
  • Generalmente su ejecución no puede ser detenida hasta que alcance su número total de iteraciones
  • El valor de su variable de control puede ser empleado como parte de una instrucción del cuerpo del ciclo, pero no puede y/o no debe ser alterado explícitamente durante las iteraciones.
Nota: Algunos lenguajes (C por ejemplo) ofrecen ciclos FOR cuyas características difieren enormemente de las antes mencionadas: permiten emplear variables de control de tipo numérica con decimales, con incrementos variables, y su valor puede ser alterado durante la ejecución del ciclo. Además, la expresión booleana de su encabezado puede ser tan compleja como se desee y puede ser detenido en cualquiera de sus iteraciones.
Ciclos WHILE y REPEAT
Son conocidos en su conjunto como Ciclos Condicionales debido a que ambos requieren obligatoriamente una expresión lógica (simple o compleja) para funcionar, la cual determina si debe o no continuar iterando. Aunque ambos tipos de ciclos comparten muchas características en común, existe entre ellos una diferencia clave, relacionada directamente con sus diseños estructurales. El siguiente esquema algorítmico ilustra esta diferencia:

Ciclo Mientras...Hacer (WHILE)
Mientras (Expresión Lógica) Hacer
     {Instrucciones del Cuerpo del Ciclo}
Fin Mientras-Hacer
Ciclo Repetir...Hasta (REPEAT)
Repetir
     {Instrucciones del Cuerpo del Ciclo}
Hasta que (Expresión Lógica)

Como se observa, el WHILE comprueba su expresión lógica antes de ejecutar su bloque de instrucciones, al contrario del REPEAT que lo hace después. Por tal razón el REPEAT ejecuta al menos una vez el bloque de instrucciones que contiene. Si después de ello no se satisface su expresión lógica, transfiere el control a la siguiente instrucción del programa que le sigue. Mientras que el WHILE, por su parte, puede que no ejecute el bloque de instrucciones que contiene ni una sola si si la expresión lógica de su encabezado no se cumple, prohibiendo así la entrada a su interior. Esta diferencia clave de funcionamiento es el factor relevante que hace preferible a uno sobre el otro bajo determinadas circunstancias.

Los ciclos WHILE y REPEAT se dividen a su vez en 3 subtipos:

Controlados por Contador
Se asemejan mucho al FOR, excepto que la variable de control de sus iteraciones puede ser de tipo entero o de punto flotante, deben inicializarse antes del inicio del ciclo y su incremento dentro del mismo debe ser explícitamente definido por el programador para acercarse paulatinamente al final de sus iteraciones, determinado estrictamente por la construcción lógica. Su valor, además de poderse emplear como parte de las instrucciones del cuerpo del ciclo, puede ser alterado a conveniencia durante cualquiera de sus iteraciones. Un ciclo FOR puede ser sustituido fácilmente por un ciclo WHILE o REPEAT controlado por contador. Sin embargo, estructurar un ciclo FOR es a menudo más fácil y rápido, y se prefiere en muchos casos, especialmente para procesar estructuras de datos como estática como los arreglos.

Controlados por Centinela
En este subtipo de ciclo condicional la construcción lógica del encabezado del ciclo contempla la finalización de las iteraciones una vez que se reciba este valor especial, previa verificación. Dicho valor debe ser capturado de algún modo dentro del cuerpo del ciclo desde algún dispositivo.

Controlados por Tarea
Para este subtipo, la construcción lógica del encabezado del ciclo debe incluir una representación cualitativa o cuantitativa de la meta para que, en caso de ser alcanzada determine, previa verificación, la finalización de las iteraciones del ciclo. Dentro del cuerpo de este último subtipo de ciclo deben incluirse instrucciones que garanticen el acercamiento paulatino a la meta contemplada en la construcción lógica.

Para mayores detalles y ejemplos que ilustren lo expuesto en este anexo, se sugiere la lectura de textos sobre programación introductoria.-


Ir al inicio de este artículo | Versión imprimible
Ir a la Página Principal de NeoProgramadores

Lecturas Relacionadas

Cómo decidir cuál tipo de ciclo emplear

Ciclos. Consejos para su mejor utilización

Cómo Ser un Buen Codificador de Software


¡Mándame un mensaje!