13 de junio de 2016

La estructura de control while.

   La estructura de control o ciclo while tiene la siguiente estructura general:

                    while (expresión) {
                        sentencia(s);
                   }

   El ciclo while procesa o ejecuta el grupo de sentencia(s) delimitadas por su bloque de manera repetida, mientras la expresión, al ser evaluada, sea distinta de cero, es decir: expresión != 0. La llave izquierda “{” delimita el inicio de su bloque, mientras que la llave derecha “}” delimita su final.

   Cuando el conjunto de sentencia(s) delimitadas por el bloque del ciclo while se procesan y la secuencia de ejecución alcanza el delimitador de fin del bloque, la estructura de repetición while modifica el flujo secuencial de ejecución, de tal forma que el flujo de ejecución brinca hacia expresión para que ésta vuelva a ser evaluada y nuevamente, si expresión != 0, se repite el procesamiento de la(s) sentencia(s) delimitadas por su bloque. En caso contrario, se procesa la siguiente sentencia que se encuentre después de su delimitador de fin de bloque.

   El Ejemplo 3.8 imprime en la salida estándar los números del uno al diez, uno por renglón. La salida se muestra en la siguiente figura:

Salida del Ejemplo 3.8.
 
    La expresión condicional de la línea 10 está compuesta por una constante (10) y, aunque ayuda a entender mejor la intención del ejemplo, en la práctica de la programación a este tipo de constantes se les conoce como “números mágicos” y en general no se consideran una buena práctica de programación.

   Quizá se pregunte por qué se considera como una mala práctica de programación. Reflexione en lo siguiente: Suponga que está escribiendo un programa con un número considerable de líneas de código, digamos unas 300, 5 000 o 13 000 líneas de código, y en algunas de ellas hace uso de constantes o números mágicos para controlar ciclos, longitudes, capacidades o algo parecido, y que por alguna razón (y esa razón aparecerá), las constantes o números mágicos utilizados tienen que cambiar, quizá todos, quizá sólo algunos, ¿a qué situación se enfrenta?, ¿es posible realizar los cambios sin efectos colaterales?,  ¿recordará todas las líneas que contenían la constante a modificar?

   Si bien es cierto que puede utilizar el IDE o un editor de texto para realizar búsquedas y apoyarse de ellas para realizar los cambios, la latencia a introducir errores sigue presente, debido a que no deja de ser una búsqueda manual y a que los seres humanos somos propensos a cometer errores, por ello, es mejor dejarle toda la responsabilidad a la computadora, específicamente al compilador, y siendo más precisos y específicos: al pre procesador del compilador del lenguaje C.

   Tomando en cuenta esta propuesta, el Ejemplo 3.9 muestra el uso de la directiva del pre procesador #define, en base a lo descrito con anterioridad y al Ejemplo 3.8. Compile el Ejemplo 3.9, ejecútelo (no lo mate, sólo póngalo a funcionar), y asegúrese que la salida es la misma que la del Ejemplo 3.8.

   Tanto el Ejemplo 3.8 como el Ejemplo 3.9 hacen uso en las líneas 12 y 15 respectivamente, de la expresión:

i = i + 1;

la cual es una operación de incremento, también conocida como expresión de acumulación. Dicha expresión se utiliza normalmente para modificar la variable de control, que para el caso de ambos ejemplos es i. Se le denomina variable de control porque de ella depende la expresión condicional del ciclo, y porque su valor controla la continuación o la terminación del ciclo.

   El lenguaje de programación C incorpora el operador de incremento (++) para simplificar este tipo de expresiones de incremento, por lo que las líneas 12 y 15 de los Ejemplos 3.8 y 3.9 respectivamente, pueden ser substituidas por:

i++;
ó
++i;

   Se deja como ejercicio incorporar dicha substitución para comprobar su equivalencia.

   El operador de incremento puede ser utilizado como prefijo (antes de la variable) o como postfijo (después de la variable), y en ambos casos el efecto es el mismo (utilizado como expresión aislada, es decir, sin usarse dentro de otra expresión): incrementar la variable en una unidad.

   Si el operador de incremento se utiliza como prefijo, a la expresión se le denomina de pre incremento debido a que el valor de la variable es incrementado antes de que su valor se utilice, en tanto que si el operador es utilizado como postfijo, el valor de la variable es incrementado después de que su valor se ha utilizado, y a esta expresión se le denomina de pos incremento. Lo anterior significa que, en un contexto en donde el valor de la variable afectada está siendo utilizado, el pre incremento y el pos incremento tienen resultados distintos.

   El Ejemplo 3.10 muestra la diferencia de utilizar el operador de incremento como prefijo y como postfijo. En base a la explicación del párrafo anterior, determine la salida el programa antes de ejecutarlo y asegúrese de entender lo que sucede antes de continuar.

   Finalmente, se debe mencionar que C incorpora también un operador que funciona de manera análoga para los decrementos, el operador de decremento (- -), el cual sigue las mismas reglas que se comentaron para el operador de incremento. Más adelante se revisarán otros ejemplos y se trabajará más con la estructura de repetición while así como con los operadores de incremento y decremento.