26 de octubre de 2016

Repeticiones híbridas.

   El lenguaje de programación C incorpora dos sentencias bastante prácticas y útiles en diferentes contextos: break y continue. Dichas sentencias permiten implementar un tipo de repetición híbrida, en cuanto a que es posible construir ciclos que incorporen los mecanismos de repetición controlada por contador y centinela de manera combinada.

   El programa del Ejemplo 3.20 muestra el uso de la sentencia continue dentro de un ciclo for, pero tanto break como continue pueden utilizarse también en los ciclos while y do-while.

   En principio, la estructura de repetición for está gobernada por un tipo de repetición controlada por contador, y también en principio, dicho ciclo se repetirá NUM veces. Sin embargo, la sentencia continue de la línea 13 indica un cambio en el flujo de ejecución secuencial, de tal forma que cuando el flujo de ejecución procesa la sentencia continue, el flujo de ejecución brinca a la verificación de la expresión3, para después seguir con la secuencia de ejecución usual de la estructura for, es decir, hacia la validación de la expresión condicional (expresión2).

   En resumen, el ciclo for se repite NUM veces, pero no así todas las sentencias del ciclo, ya que cuando el flujo de ejecución alcanza la sentencia continue, las sentencias posteriores a ella serán ignoradas, por lo que la salida del Ejemplo 3.20, es la impresión de los números del uno al diez, uno por renglón, excepto el CENTINELA, tal y como se muestra en la siguiente figura:

Salida del Ejemplo 3.20.
 
    Ahora bien, el Ejemplo 3.21 muestra una situación análoga. Para empezar, note que dicho ejemplo es exactamente el mismo que el Ejemplo 3.20 excepto por la línea 13, donde se ha cambiado la sentencia continue por la sentencia break.

   La sentencia break ha sido descrita en la entrada referente a la estructura de selección switch, en donde servía para romper el flujo de ejecución y brincar al final de dicha estructura de selección. Para el caso del ciclo for funciona de manera análoga, ya que cuando el flujo de ejecución la procesa, es como si se diera un salto a la expresión condicional (expresión2) del ciclo y ésta fuera evaluada como cero (falsa), lo que implicaría la terminación del ciclo.

   En términos prácticos es válido decir que la sentencia break rompe el ciclo en el que se encuentre la sentencia sin importar la expresión condicional que lo gobierna. Vale pena mencionar que, si se encuentran varios ciclos anidados, la sentencia break rompe únicamente el ciclo más interno que la contenga, los demás ciclos permanecen inalterados (compruebe lo anterior probando el Ejemplo 3.21_1).

   Observe que en principio el ciclo for del Ejemplo 3.21 está también gobernado, al menos en su expresión condicional, por un tipo de repetición controlada por contador, y que en principio se repetirá NUM veces. Sin embargo, cuando el valor del contador coincida con el del CENTINELA, la sentencia break será procesada y el ciclo terminará, por lo que el efecto del programa es ver los números del uno al CENTINELA - 1, uno por renglón, tal y como se muestra en la siguiente figura:

Salida del Ejemplo 3.21.
 
    Finalmente se presenta el Ejemplo 3.25 el cual muestra una variación del Ejemplo 3.21. Tome en cuenta que el Ejemplo 3.25 genera una salida distinta y se deja como ejercicio al lector determinar su salida antes de ejecutarlo y corroborar su respuesta con su correspondiente ejecución.

   El Ejemplo 3.25 declara una variable entera llamada bandera. Una bandera es muy común en la programación y se utiliza como indicador para señalar una determinada situación. Para el caso de nuestro ejemplo, la bandera se ha "encendido" o inicializado en 1 (línea 12) para garantizar la continuidad del ciclo en la expresión condicional (expresión2) del ciclo for, por lo que su continuidad depende en principio, estrictamente de la variable de control (i). Ahora bien, cuando la expresión condicional de la línea 13 se cumple, es decir, la variable de control tiene el mismo valor que el CENTINELA, la variable bandera se "apaga" (se le asigna 0 en la línea 14) y la sentencia de la línea 15 se ejecuta independientemente de la condición de la línea 13.

   El efecto derivado de apagar la bandera es el siguiente: al llegar al fin del bloque del ciclo for, el flujo de control brinca a la modificación de la variable de control (expresión3 del for), para posteriormente pasar el control a la expresión condicional del ciclo for (expresión2) y, al determinarse que la bandera ha sido apagada (0), toda la expresión condicional es evaluada a cero (como si fuera falso) terminando así el ciclo antes de que la variable de control terminara con sus NUM iteraciones.

   En resumen, el Ejemplo 3.25 implementa una repetición controlada por contador (i), pero si se verifica la aparición del CENTINELA, la continuidad de ciclo se interrumpe por medio de una bandera.