Ciclos iterativos L. Franco S., A. Snchez V., V. Fuentes G.
La mayora de los programas escritos en C, incluyen repeticiones o ciclos tambin son conocidos como iteraciones, que permiten repetir un bloque de instrucciones mientras se conserve verdadera alguna condicin de continuacin. Las instrucciones que se repiten forman lo que se llama el cuerpo del ciclo. El lenguaje C incorpora tres sentencias de este tipo: while, do- while y for.
Cada uno de estos ciclos esta formado por: Valor inicial; Valor final; Incremento; ndice.
Cada uno de estos ciclos requiere adems de dos elementos bsicos de programacin: acumulador y contador.
Contador: Es una variable que nos permite incrementar y/o decrementar el ndice durante el ciclo. Un contador (variable) puede ser declarada de tipo (int, float, long, etc.).
Acumulador: Es una variable que nos permite almacenar resultados parciales durante el ciclo.
En C se manejan dos tipos de repeticiones, la repeticin controlada por un contador que se le conoce comnmente como repeticin definida, ya que antes de que inicie la ejecucin del ciclo, el nmero de iteraciones es conocido. Y la repeticin controlada por un centinela que se conoce a menudo como repeticin indefinida, debido a que el nmero de iteraciones no es conocido.
Ciclo While
El bucle while se ejecuta mientras una condicin es cierta. Cuando esta condicin se torna falsa, el ciclo termina su operacin.
/* Este es un ejemplo del bucle while. */ # include <stdio.h> int main() { int contador; contador = 0; while (contador < 6) { printf ("El valor de contador es %d\n", contador); contador = contador + 1; } return 0; }
En este programa empezamos con un comentario y el punto de entrada main(), despus definimos una variable de tipo entero a la que llamamos contador dentro del cuerpo del programa, esta variable es inicializada a cero para despus entrar en el bucle while. La sintaxis del bucle while es
FACULTAD DE INGENIERA-UNAM
Boletn de Computacin, Programacin e Informtica
AO 2 Nm. 3 19 de mayo de 2004
justamente como se muestra en el programa. A la palabra clave while le sigue una expresin entre parntesis y luego una serie de enunciados encerrados entre llaves.
Mientras la condicin sea verdadera, los enunciados entre llaves se ejecutarn repetidamente. En este caso, debido a que la variable contador es incrementada en 1 cada que los enunciados entre llaves son ejecutados, eventualmente se alcanzar el valor de 6. En este punto los enunciados no se ejecutarn mas porque contador ya no es menor que 6 finalizando as el bucle. El programa continuar entonces con los enunciados que siguen a las llaves. La variable contador es inicializada con un valor mayor de que 5, los enunciados dentro de las llaves podran no ejecutarse por lo que es posible tener un bucle que jams se ejecute. Si la variable no se incrementa dentro del bucle este jams terminara y por ende el programa.
Ciclo do-while
Tenemos ahora una variacin del ciclo while en nuestro siguiente ejemplo, este programa es casi idntico al ejemplo anterior excepto que el bucle inicia con la palabra clave do, seguida por una serie de enunciados compuestos entre llaves, despus viene la palabra clave while y finalmente la expresin de evaluacin entre parntesis.
/* Este es un ejemplo del bucle do-while */ # include <stdio.h> int main() { int i;
i = 0; do { printf ( "El valor de i es ahora %d\n", i ); i = i + 1; } while (i < 5); return 0; }
Los enunciados entre llaves se ejecutan iterativamente en tanto que la expresin entre parntesis sea verdadera. Cuando la expresin es falsa, la ejecucin del bucle termina y el control del programa pasa a los enunciados siguientes. Respecto al bucle do-while debemos apuntar lo siguiente: en primer lugar, debido a que la condicin verdadero-falso se hace al final del bucle, los enunciados dentro de las llaves se ejecutan al menos una vez. En segundo, si la variable i no cambia dentro del bucle entonces el programa jams terminara.
El ciclo for
El bucle for consiste de la palabra clave for seguida de una expresin entre parntesis. Esta expresin se compone realmente de tres campos cada uno separado por un punto y coma, como se observa en el siguiente ejemplo:
FACULTAD DE INGENIERA-UNAM
Boletn de Computacin, Programacin e Informtica
AO 2 Nm. 3 19 de mayo de 2004
/* Este es un ejemplo del bucle for */ #include <stdio.h>
int main() { int indice;
for(indice = 0 ; indice < 6 ; indice = indice + 1) printf ( "El valor de indice es %d\n", indice); return 0; }
El primer campo contiene la expresin "indice = 0" y se le llama campo de inicializacin. Cualquier expresin en este campo se ejecuta antes del inicio del bucle, en trminos generales se puede decir que no existe lmite en el contenido del primer campo ya que es posible contener varios enunciados separados por comas. El segundo campo, que en este caso contiene "indice < 6 " es la prueba que se hace al principio de cada ciclo del bucle y puede ser cualquier expresin que pueda evaluarse a verdadero falso. La expresin del tercer campo se utiliza para incrementar el valor del ndice en una unidad cada vez que se ejecute el cuerpo del for.
En seguida de la expresin for ( ) estn uno o varios enunciados que conforman el cuerpo ejecutable del bucle. Un enunciado compuesto es cualquier grupo de instrucciones vlidas en C encerradas entre llaves.
Programa ejemplo
El siguiente ejemplo muestra la manera de utilizar las estructuras de control descritas anteriormente. El programa calcula la desviacin estndar de una serie de datos que se almacenan en un arreglo. La funcin LeeDatos() permite ingresar los datos al arreglo mediante un ciclo for; la funcin Impdatos() muestra los datos que se ingresaron y el usuario podr verificar si los datos se ingresaron correctamente, para hacer esto, utiliza la estructura while. La funcin DesEst() es la encargada de realizar el clculo de la desviacin y utiliza el ciclo for.
El programa despliega un men en el cual se describen las operaciones que se podrn realizar, el usuario solamente tiene que seleccionar una de las opciones que se muestran y seguir las indicaciones que se van mostrando. Para hacer que este men sea iterativo hasta que el usuario selecciona la opcin salir, se hace uso de la estructura do-while, que permite ejecutar por lo menos una vez el men.
int LeeDatos(float[], int); float DesEst(float[], int); void ImpDatos(float[], int);
FACULTAD DE INGENIERA-UNAM
Boletn de Computacin, Programacin e Informtica
AO 2 Nm. 3 19 de mayo de 2004
int main() { int n = 0, opcion; float des_est, Arreglo[NUM_DAT_MAX];
do { clrscr(); printf("\n 1. Ingresar datos "); printf("\n 2. Ver datos ingresados "); printf("\n 3. Calcular desviacion estandar "); printf("\n 4. salir "); printf("\n\n\t Seleccione una opcion... ");
opcion = getch();
switch (opcion) { case '1': n = LeeDatos(Arreglo, NUM_DAT_MAX); break; case '2': clrscr(); if(n) ImpDatos(Arreglo, n); else printf("\nPrimero es necesario ingresar los datos");
getch(); break; case '3': clrscr(); if(n) { des_est = DesEst(Arreglo, n); printf("\nLa desviacion estandar es %f ", des_est); } else printf("\nPrimero es necesario ingresar los datos");
getch(); break; case '4': clrscr(); gotoxy(39, 10); printf("\n Gracias por utilizar nuestro programa"); break; default: clrscr();
FACULTAD DE INGENIERA-UNAM
Boletn de Computacin, Programacin e Informtica
AO 2 Nm. 3 19 de mayo de 2004
printf("\a\nLa seleccion no es valida"); getch(); } } while (opcion != '4'); getch(); return (0); }
int LeeDatos(float Arreglo[], int NMAX) { int i, n;
clrscr(); printf("Ingrese el numero de datos a procesar "); scanf("%i", &n);
if(n > NMAX) n = NMAX - 1;
for (i = 1; i <= n; i++) { printf("Ingrese el dato %i ", i); scanf("%f", &Arreglo[i]); } return n; }
void ImpDatos(float Arreglo[], int n) { int i;
i = 1; printf("Los datos a procesar son: ["); while (i <= n) { printf("%4.2f, ", Arreglo[i]); i += 1; } printf("\b\b]"); }
float DesEst(float Arreglo[], int n) { int i; float s, s2, varianza;
s = s2 = 0; for (i = 1; i <= n; i++) { s += Arreglo[i];
FACULTAD DE INGENIERA-UNAM
Boletn de Computacin, Programacin e Informtica
AO 2 Nm. 3 19 de mayo de 2004
s2 += Arreglo[i]*Arreglo[i]; } varianza = (s2 - s * s / n) / (n - 1); return sqrt(varianza); }