BUCLE FOR: Programa q realiza la suma de los primeros 20 numeros pares y manda el resultado a pantalla madiante un ciclo for.
#include <stdio.h> int main(void) { int a,b; a=0; for(b=2;b<=40;b+=2) { a=a+b; } printf("%d\n",a); return 0; } Bucle While
La palabra "while" en ingls significa "mientras". Es obvio que una estructura iterativa while contiene por tanto, una pregunta o condicin de finalizacin del bucle del estilo "mientras ocurra tal condicin contina iterando". Esta condicin es en realidad cualquier expresin que devuelva un valor numrico entero. Un valor de la expresin igual a 0 hace que la condicin se evale como falsa, y cualquier otro valor, distinto de 0, hace que se evale como verdadera. El pseudocdigo de un bucle que se escriba con esta sentencia sera del estilo:
Inicializacin Mientras se cumpla la condicin: Operaciones Siguiente iteracion
Dentro de las operaciones del bucle lo normal ser encontrarse alguna sentencia que actualice la condicin del bucle. En lenguaje C la forma de escribir un bucle while (la sintaxis) es similar:
while (condicion) <sentencia>;
Como siempre, la sentencia puede ser una nica lnea de cdigo o un bloque entero rodeado de llaves. La sentencia sera el "cuerpo" del bucle, y en general contendr la actualizacin necesaria de la condicin que se evaluar en el while. Por ejemplo, para escribir un bucle que debe iterarse un nmero N fijo de veces usando un bucle while se debe recurrir a una variable que acte de "contador", y que se vaya incrementando dentro del cuerpo del bucle. As la traduccin a C de tal figura sera:
i=0; while (i<N) { <operaciones a realizar>; i++; }
Como se observa claramente, en la primera iteracin la variable que hace de contador, i, tiene el valor 0, de forma que se ejecutara una primera iteracin (suponiendo que N es distinto de cero). Al final de la misma se incrementa el valor de i, y entonces se vuelve hacia atrs, donde se evala la condicin del bucle while, comparando i con N. As se repetiran las operaciones del cuerpo del bucle, hasta que i alcance el valor de N (N iteraciones). Hay que advertir aqu, que siempre ha de comprobarse con certeza que la condicin del bucle es la deseada. Cometer un error en la misma es bastante frecuente, y conduce a un error de programacin difcil de depurar. En nuestro ejemplo, es probable que el programador cometa una equivocacin o dude entre el uso del operador de comparacin < y el <=. En este ejemplo, si se hubiese usado este ltimo, el bucle habra iterado una vez ms, es decir N+1 veces. Como ya hemos visto en otros ejemplos, el lenguaje C puede combinar varias operaciones en cada lnea de cdigo, de forma que podemos encontrarnos el bucle anterior escrito de la siguiente manera:
i=0; while (i++<N) { <operaciones a realizar>; /*Aqui i vale 1 unidad mas en cada iteracion */ }
Ntese que el operador elegido para incrementar i, es el de post-incremento, concordando as con el cdigo anterior. Si se hubiera usado el operador de pre-
incremento, habramos cometido un error, puesto que el bucle iterara una vez menos, desde i=1 hasta i=N-1. Es importante tener en cuenta el comentario que se ha aadido, ya que el uso del operador de post-incremento, conduce a que la variable i se incremente antes de la ejecucin de las operaciones del cuerpo del bucle. Sin embargo, en general en lenguaje C es ms usual iterar los bucles empezando por el valor 0 de la variable contador, y llegando hasta el valor N-1. Por tanto, as lo haremos en el resto de ejemplos salvo indicacin contraria. En ocasiones, nos interesar que el contador cuente hacia atrs. Esto no es mayor problema, si la condicin del while se cambia para que sea falso en cuanto que el contador rebase el lmite inferior de la cuenta y se utilice el operador de decremento en lugar del de incremento. Por otra parte, dado que la condicin del while puede ser cualquiera, los bucles cuyo nmero de iteraciones no es constante o est contenido en alguna variable se pueden escribir bastante directamente con bucles while. Slo habra que poner la condicin requerida en el parntesis del while. Incluso tal condicin puede estar compuesta de varias comparaciones unidas por los operadores lgicos Y u O (que en C son: && o ||). De momento analizaremos un ejemplo donde la condicin del bucle no es fcil de conocer cuando se escribe el cdigo, sino que depende de la computacin que se realiza al ejecutarlo, y, por tanto, no se sabe a priori cuantas iteraciones ha de realizar el bucle. Se trata de hallar el primer elemento de la serie
Frmula en MathML: Sumatorio desde ka igual a uno hasta ka igual a eme de ka al cubo
que supera el valor 10000. La forma ms simple de encontrar tal elemento es calcular todos los trminos de la serie y preguntar cuando se supera el valor 10000 (condicin de finalizacin del bucle). Si desarrollamos la serie usando la calculadora y anotamos los diferentes trminos en una tabla, obtenemos esto: Serie de m al cubo m3
Suma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 8 27 64 125 216 343 512 729 1000 1331 1728 2197 2744 3375
1 9 36 100 225 441 784 1296 2025 3025 4356 6084 8271 11015 14390
La tercera fila se halla fcilmente sabiendo que
Frmula en MathML: El sumatorio desde ka igual a cero hasta ka igual a eme de ka al cubo es igual al sumatorio desde ka igual a cero hasta ka igual a eme menos uno de ka al cubo ms eme al cubo
Es decir, para hallar el trmino m-simo de la serie basta con coger el trmino anterior y sumarle el valor de m al cubo.
Para calcular los trminos de la serie, se van acumulando en una variable (suma) los cubos de los nmeros enteros, representados por la variable n. Recuerde que el operador += permite acumular o incrementar una variable. Inicialmente tenemos que poner a 0 la variable acumuladora suma, y valorar n con 1, para que n vaya luego recorriendo los nmeros enteros. Entonces tal algoritmo podra escribirse con un bucle while as:
k=1; suma=0; while ( suma <= 10000 ) { suma += k*k*k; k++; } printf ("El primer elemento que supera 10000 es el %d\n", k-1);
La solucin del ejemplo anterior es el nmero 14 (compruebe la tabla anterior), luego
Frmula en MathML: El sumatorio desde ka igual a uno hasta ka igual a catorce de ka al cubo es mayor que diez mil
. Obsrvese que la solucin se corresponde con k-1, y no con k, puesto que antes de salir del bucle se haba ejecutado la sentencia k++;. Sin embargo, en los bucles que obedecen a esquemas donde la condicin de finalizacin depende de lo que introduzca el usuario, es necesario leer tal nmero siempre antes de evaluar la condicin. Esto quiere decir que el fragmento que lee tal nmero debe repetirse en dos sitios si se quiere usar un bucle while. Por ejemplo el esquema de la Figura 4.4 se escribira en C como:
#include <math.h> ... ... printf ("Dame numero (negativo para salir): "); scanf ("%f", &x); while (x>=0) {
printf ("La raiz cuadrada es: %f\n", sqrt(x) ); printf ("Dame numero (negativo para salir): "); scanf ("%f", &x); }
Observemos que antes del bucle se solicita un nmero, entonces la condicin de finalizacin del mismo pregunta si es negativo. Si es negativo, el bucle acaba, pero si no lo es, se calcula la raz cuadrada y al final del bucle se vuelve a pedir otro nmero para as volver a empezar. Para hallar la raz cuadrada se est usando la funcin sqrt (del ingls square root). Para usar esta funcin debe incluirse al principio del fichero de cdigo la lnea #include <math.h>
Dame numero (negativo para salir): La raiz cuadrada es: 2 Dame numero (negativo para salir): La raiz cuadrada es: 12 Dame numero (negativo para salir): La raiz cuadrada es: 27.31263443 Dame numero (negativo para salir): 4 144 745.98 -6
Bucle For
Los bucles se usan a menudo para recorrer una serie de elementos, indexar un vector, contar algo, etc.. A causa de lo comn de estas operaciones dentro de un programa medianamente til, C incorpora una notacin ms legible para este tipo de bucle: el bucle for. La palabra inglesa "for" se corresponde con la preposicin espaola "para". En concreto un bucle for, podra traducirse en pseudocdigo algo como: "para todos los elementos que cumplen cierta condicin, realiza la sentencia del cuerpo del bucle, y tras cada iteracin ejecuta ciertas actualizaciones". Un ejemplo de un "para" lo tenemos tambin en el signo que se emplea en la notacin matemtica para formular teoremas. Por ejemplo: significara "para todos los nmeros naturales entre 1 y 10, hacer...". Las palabras que hemos sealado en cursiva son las acciones de que consta un bucle for, y su sintaxis es as:
for (inicializacion; condicion; actualizacion) <sentencia>;
Igualmente a los otros dos bucles, la sentencia ("cuerpo" del bucle) puede ser una nica lnea de cdigo o un bloque entero rodeado de llaves {}. Pero lo que da legibilidad al for, es que se incluyen en su sintaxis la inicializacin y la actualizacin, las cuales pueden incluir lo que el programador desee, de forma que para bucles simples no es necesario que en la sentencia se incluyan las actualizaciones necesaria para evaluar la condicin del bucle, como pasaba en los
bucles anteriores. Tambin las operaciones de inicializacin permiten evitar que el bucle vaya precedido de forma poco elegante de las mismas.
Recordar cul es cul dentro de los tres campos separados por ';' del bucle for puede no ser fcil al principio; por eso aconsejamos que se recuerde el caso ms tpico de bucle que itera N veces (como siempre desde 0 hasta N-1, pues es lo habitual en lenguaje C), y que escrito con for y usando i como variable contadora, queda como:
for (i=0; i<N; i++) { <operaciones a realizar>; }
Aqu se distingue claramente como inicializamos la variable contador a 0, establecemos como condicin de salida que se alcance el valor N, y tras cada iteracin se incrementa i. Ntese la elegancia de este cdigo respecto del escrito
con un bucle while, puesto que todo lo relativo a la iteracin de las operaciones queda encerrado en los parntesis del for.
En un bucle for se puede inicializar ms de una variable. Para ello basta separar las sentencias de asignacin por comas, de esta forma:
for (i=0, j=0 ; ...... ; .......)
La accin de actualizacin puede ser indistintamente la sentencia i++; como la ++i; puesto que se ejecutan independientemente del cuerpo del bucle: despus del cuerpo y antes de volver a evaluar la condicin. Tambin es importante recordar que cuando el bucle se acaba, la actualizacin se ha realizado una vez ms, precisamente para que la condicin no sea cierta. Esto significa, por ejemplo en el bucle anterior, que la variable i vale N al salir del bucle y no N-1, aunque la ltima iteracin hubiese sido la i=N-1. O lo que es lo mismo, en este bucle tipo, N conserva el nmero de veces que se ha ejecutado el bucle.
Al igual que en los otros bucles, la condicin para continuar iterando puede ser cualquiera, incluso compuesta por varias comparaciones. Y adems las acciones de inicializacin y actualizacin tambin pueden ser cualesquiera sentencias vlidas de C, o incluso dejarse vacas. Por todo eso el bucle for es muy flexible y denso, permitiendo representar muy diversos bucles en slo una lnea. Por ejemplo, con ste se puede escribir un bucle while de forma obvia:
for (; condicion;) <sentencia>;
equivaldra a:
while (condicion) <sentencia>;
puesto que se han dejado vacas las acciones de inicializacin y actualizacin (ntese que los ';' del bucle for deben permanecer para no cometer un error sintctico). Como ejercicio, trate de poner en la forma ms compacta posible con un bucle for, el ejemplo visto para el bucle while que trataba de hallar el primer elemento de la serie
Frmula en mathML: Sumatorio desde ka igual a uno hasta ka igual a eme de ka al cubo
que superase el valor 10000 (y por supuesto, la solucin debe ser la misma!). De forma anloga, las acciones de inicializacin y actualizacin pueden ser cualesquiera, permitiendo muchas posibilidades. A continuacin se muestran algunas posibilidades, en las que se la sentencia elegida sirve para comprobar el valor que va tomando la variable ndice del bucle:
El bucle que muestra solo los primeros N nmeros pares (anlogo para los impares)
Obsrvese como i va "saltando" de dos en dos:
for (i=2; i<=2*N; i+=2) printf ("Valor de i: %d\n", i); Valor de i: 2 Valor de i: 4 Valor de i: 6 ... ...
El bucle que itera N veces usando i como variable contadora, pero contando hacia atrs desde N-1 hasta 0, inclusive
for (i=N-1; i>=0; i--) printf ("Valor de i: %d\n", i); Valor Valor Valor Valor Valor de de de de de i: i: i: i: i: 4 (suponemos que N vale 5 al entrar en el for) 3 2 1 0
Un bucle donde la variable contador no se incrementa sino que se multiplica como una progresin geomtrica de razn r
Aqu x es variable real, float o double.
for (x=r; x<=r*r*r*r*r*r; x=x*r) printf ("Valor de x: %f\n", x); Valor de i: 0.5 (suponemos que r vale 0.5 al entrar en el for) Valor de i: 0.25 Valor de i: 0.125 Valor de i: 0.0625 Valor de i: 0.03125 Valor de i: 0,00048828125
El alfabeto del cdigo ASCII
Se pueden usar como contadores variables de tipo char
char c; for (c='A'; c<='Z'; c++) printf ("%c", c); ABCDEFGHIJKLMNOPQRSTUVWXYZ
Suma de trminos de una progresin
Las variables implicadas en la inicializacin, condicin y actualizacin son iguales a cualesquiera otras, y por tanto pueden ser modificadas en cualquier parte del cuerpo del bucle o de nuestro programa. La suma de m+1 trminos una progresin geomtrica de razn
Frmula en MathML: Uno partido de dos
(serie
Frmula en MathML: Sumatorio desde ka igual a cero hasta ka igual a eme de uno partido de dos elevado a ka
) que se puede codificar de muchas formas con los bucles que ya hemos visto, podra escribirse as:
suma=1.0; k=1; /* el primer termino se inicializa fuera del bucle*/ for (increm=1.0; k++<=m; suma+=increm) increm=increm/2.0; printf ("La suma de %d terminos es: %f\n", k-1, suma);
Como puede observarse la variable contador del bucle es k, pero la inicializacin se ha puesto (como simple evidencia del funcionamiento) fuera del mismo. Por el contrario, en la inicializacin se ha colocado la variable increm, que va calculando los trminos de la progresin geomtrica. El post-incremento de k introducido en la condicin es correcto, y el bucle itera justamente m veces, pero k contiene m+2 al finalizar, lo cual se tiene en cuenta en la impresin de
resultados. De todas formas, en general no es aconsejable escribir este tipo de cdigos enrevesados, ya que son ms difciles de depurar, y aqu se ha mostrado solamente como ejemplo de la flexibilidad del bucle for. Intente como ejercicio escribir tal cdigo de una manera ms sencilla, al estilo del primer for que se mostr en esta seccin y dejando para el cuerpo las operaciones de las otras variables (por supuesto no olvide comprobar que obtiene los mismos resultados).