• No se han encontrado resultados

La estructura de control while

3.2. Estructuras de control para la repetici´ on

3.2.1. La estructura de control while

La estructura de control o ciclo while, tiene la siguiente estructura gene- ral:

while (expresi´on) { sentencia(s); }

38 CAP´ITULO 3. ESTRUCTURAS DE CONTROL

El ciclo while procesa o ejecuta el grupo de sentencia(s) delimitadas por su bloque de manera repetida, mientras la expresi´on, al ser evaluada, sea distinta de cero, es decir: expresi´on 6= 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´on alcanza el delimitador de fin del bloque, la estructura de repetici´on while modifica el flujo secuencial de ejecuci´on, de tal forma que el flujo de ejecuci´on brinca hacia expresi´on para que ´esta vuelva a ser evaluada, y nuevamente, si expresi´on 6= 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´es de su delimitador de fin de bloque.

1 /∗ Ejemplo de l a e s t r u c t u r a de c o n t r o l de r e p e t i c i o n w h i l e . 2 @autor R i c a r d o Ruiz R o d r i g u e z 3 ∗/ 4 #include < s t d i o . h> 5 6 i n t main ( ) { 7 i n t i ; /∗ v a r i a b l e de c o n t r o l ∗/ 8 9 i = 1 ; /∗ i n i c i a l i z a c i o n de l a v a r i a b l e de c o n t r o l ∗/ 10 while ( i <= 1 0 ) { /∗ e x p r e s i o n c o n d i c i o n a l ∗/ 11 p r i n t f ( ” i = % d\n” , i ) ; 12 i = i + 1 ; /∗ m o d i f i c a c i o n de l a v a r i a b l e de c o n t r o l ∗/ 13 } 14 return 0 ; 15 }

Ejemplo 3.8: Uso de la estructura de control while

El Ejemplo 3.8 imprime en la salida est´andar los n´umeros del uno al diez, uno por rengl´on. La salida se muestra en la Figura 3.6.

La expresi´on condicional de la l´ınea 10 est´a compuesta por una constan- te (10), y aunque ayuda a entender mejor la intenci´on del ejemplo, en la pr´actica de la programaci´on a ´este tipo de constantes se les conoce como “n´umeros m´agicos”, y en general no se consideran una buena pr´actica de programaci´on.

Quiz´a se pregunte por qu´e se considera como una mala pr´actica de progra- maci´on. Reflexione en lo siguiente: Suponga que est´a escribiendo un programa con un n´umero considerable de l´ıneas de c´odigo, digamos unas 300, 5 000 o 13 000 l´ıneas de c´odigo, y en algunas de ellas hace uso de constantes o n´umeros m´agicos para controlar ciclos, longitudes, capacidades o algo parecido, y que

3.2. ESTRUCTURAS DE CONTROL PARA LA REPETICI ´ON 39

Figura 3.6: Salida de los ejemplos de ciclos while, do-while y for

por alguna raz´on (y esa raz´on aparecer´a), las constantes o n´umeros m´agicos utilizados tienen que cambiar, quiz´a todos, quiz´a s´olo algunos, ¿a qu´e situa- ci´on se enfrenta?, ¿es posible realizar los cambios sin efectos colaterales?, ¿recordar´a 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 rea- lizar b´usquedas y apoyarse de ellas para realizar los cambios, la latencia a introducir errores sigue presente, debido a que no deja de ser una b´usqueda manual, y a que los seres humanos somos propensos a cometer errores, por ello, es mejor dejarle toda la responsabilidad a la computadora, espec´ıfica- mente al compilador, y siendo m´as 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, ejec´utelo (no lo mate, s´olo p´ongalo a funcionar), y aseg´urese que la salida es la misma que la indicada en la Figura 3.6.

Tanto el Ejemplo 3.8 como el Ejemplo 3.9 hacen uso en las l´ıneas 12 y 15 respectivamente, de la expresi´on:

i = i + 1;

la cual es una operaci´on de incremento, tambi´en conocida como expresi´on de acumulaci´on. Dicha expresi´on 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 en funci´on de ella se escribe la expresi´on condi- cional del ciclo, y de alguna manera controla la continuaci´on o la terminaci´on del ciclo.

40 CAP´ITULO 3. ESTRUCTURAS DE CONTROL 1 /∗ Ejemplo de l a e s t r u c t u r a de c o n t r o l de r e p e t i c i o n w h i l e 2 y l a d i r e c t i v a d e f i n e . 3 @autor R i c a r d o Ruiz R o d r i g u e z 4 ∗/ 5 #include < s t d i o . h> 6 7 #d e f i n e NUM 10 8 9 i n t main ( ) { 10 i n t i ; /∗ v a r i a b l e de c o n t r o l ∗/ 11 12 i = 1 ; /∗ i n i c i a l i z a c i o n de l a v a r i a b l e de c o n t r o l ∗/ 13 while ( i <= NUM) { /∗ e x p r e s i o n c o n d i c i o n a l ∗/ 14 p r i n t f ( ” i = % d\n” , i ) ; 15 i = i + 1 ; /∗ m o d i f i c a c i o n de l a v a r i a b l e de c o n t r o l ∗/ 16 } 17 return 0 ; 18 }

Ejemplo 3.9: Uso de la estructura de control while y la directiva define

El lenguaje de programaci´on 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++; ´ o ++i;

En la secci´on de ejercicios se le pedir´a que realice dicho cambio, para que compruebe el funcionamiento del operador.

El operador de incremento puede ser utilizado como prefijo (antes de la variable) o como postfijo (despu´es de la variable), y en ambos casos el efecto es el mismo5: incrementar la variable en una unidad.

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

3.2. ESTRUCTURAS DE CONTROL PARA LA REPETICI ´ON 41 1 /∗ Programa p a r a m o s t r a r l a d i f e r e n c i a d e l 2 pre−i n c r e m e n t o y e l p o s t −i n c r e m e n t o . 3 @autor R i c a r d o Ruiz R o d r i g u e z 4 ∗/ 5 #include < s t d i o . h> 6 7 i n t main ( ) { 8 i n t m, n ; 9 10 n = 5 ; 11 m = n++; 12 p r i n t f ( ”m = % d y n = % d\n” , m, n ) ; 13 14 n = 5 ; 15 m = ++n ; 16 p r i n t f ( ”m = % d y n = % d\n” , m, n ) ; 17 18 return 0 ; 19 }

Ejemplo 3.10: Programa para mostrar la diferencia entre el pre incremento y el pos incremento

El Ejemplo 3.10 muestra la diferencia de utilizar el operador de incremen- to como prefijo y como postfijo. En base a la explicaci´on del p´arrafo anterior, determine la salida el programa antes de ejecutarlo, y aseg´urese de entender lo que sucede antes de seguir.

Finalmente, se debe mencionar que C incorpora tambi´en un operador que funciona de manera an´aloga para los decrementos, el operador de de- cremento (- -), el cual sigue las mismas reglas que se comentaron para el operador de incremento. En la secci´on 3.4, se revisar´an otros ejemplos y se trabajar´a m´as con la estructura de repetici´on while y con los operadores de incremento y decremento.