






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Aprenda a trabajar con bucles for en C#, su sintaxis y cómo se anidan. Comprenda el funcionamiento de los bucles while y continue. Adquira habilidades para programar eficazmente.
Tipo: Diapositivas
1 / 12
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
Las estructuras iterativas de control de flujo se ocupan de repetir una serie de líneas de código tantas veces como el programador indique o bien hasta que se de una cierta condición. A estas estructuras también se les llama bucles.
Los bucles for van asignando valores a una variable desde un valor inicial hasta un valor final, y cuando la variable contiene un valor que está fuera del intervalo el bucle termina. Veamos la sintaxis para hacernos mejor a la idea: for (var=inicial;condición;siguientevalor) { Instrucciones } Se sabe que esto es algo difícil de leer, incluso para aquellos que hayan programado en otros lenguajes, puesto que los bucles for de C no se parecen mucho, en cuanto a su sintaxis, al resto de los bucles for de los otros lenguajes, así que trataré de explicarlo con detenimiento. Como veis, tras la sentencia for se indican las especificaciones del bucle entre paréntesis. Dichas especificaciones están divididas en tres partes separadas por punto y coma: la parte de asignación del valor inicial en primer lugar; la parte que verifica la continuidad del bucle (mediante una condición) en segundo lugar; y la parte en que se calcula el siguiente valor en tercer lugar. Pongamos un ejemplo: vamos a calcular el factorial de un número dado, que se encuentra almacenado en la variable num. Se podría hacer de dos formas: for ( byte i=num ; i>1 ; i-- ) { fact*=i; } O bien:
for ( byte i= 1 ; i<=num ; i++ ) { fact=i; } 1º paso: for ( byte i=num ; i>1 ; i-- ) { fact=i; } 2º paso: for ( byte i=num ; i>1 ; i-- ) { fact=i; } 3º paso: for ( byte i=num ; i>1 ; i-- ) { fact=i; } 4º paso: for ( byte i=num ; i>1 ; i-- ) { fact=i; } 5º paso: for ( byte i=num ; i>1 ; i-- ) { fact=i; } 6º paso: for ( byte i=num ; i>1 ; i-- ) { fact*=i; }
Se pueden colocar bucles for dentro de otros bucles for, con lo que obtendríamos lo que se llaman los bucles for anidados. Son también muy útiles: por ejemplo, piensa que tienes almacenadas unas cuantas facturas en una base de datos, y quieres leerlas todas para presentarlas en pantalla. El problema está en que cada factura tiene una o varias líneas de detalle. ¿Cómo podríamos hacer para cargar cada factura con todas sus líneas de detalle? Pues usando bucles anidados. Colocaríamos un bucle for para cargar las facturas, y otro bucle for dentro de él para que se cargaran las líneas de detalle de cada factura. Así, el segundo bucle se ejecutará completo en cada iteración del primer bucle. Veamos un ejemplo que nos aclare todo esto un poco más: using System; namespace BuclesAnidados { class BuclesAnidadosApp { static void Main() { for (int i=1; i<=3; i++) { Console.WriteLine("Factura número {0}", i); Console.WriteLine("Detalles de la factura");
7º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } }
for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 9º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 10º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 11º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 12º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 13º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 14º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 15º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 16º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 17º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } 18º paso: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } } Otra forma de anidar los bucles es utilizando solamente una única sentencia for, aunque no es un modo muy recomendable de hacerlo puesto que resulta mucho más difícil de leer. El siguiente código: for (int i=1, int j=1; i<=3, j<=3; i++, j++) { ... }
Sería el equivalente a esto otro: for (int i=1; i<=3; i++) { for (int j=1; j<=3; j++) { ... } }
Bien, para los que no sepan inglés, "while" significa "mientras", de modo que ya podemos hacer la idea: un bucle while se repetirá mientras una condición determinada se cumpla, o sea, devuelva true. Veamos su sintaxis: while (expresión bool) { Instrucciones } Efectivamente, las "Instrucciones" que se hallen dentro del bucle while se ejecutarán continuamente mientras la expresión de tipo boolean retorne true. Por ejemplo, podemos escribir un bucle while para pedir una contraseña de usuario. Algo así: using System; namespace BuclesWhile { class BuclesWhileApp { static void Main() { string Clave="Compadre, cómprame un coco"; string Res=""; while (Res!=Clave) { Console.Write("Dame la clave: "); Res=Console.ReadLine(); } Console.WriteLine("La clave es correcta");
La clave es correcta Ya que la ejecución no pasa por el bucle. Bueno, ya veis que es muy sencillo. Por cierto, luego os propondré algunos ejercicios para que practiquéis un poco todo esto de los bucles (a ver si pensabais que os ibais a escaquear).
Ciertamente, estos bucles tienen mucho que ver con los bucles while. La diferencia es que estos se ejecutan siempre al menos una vez, mientras que los bucles while, como acabamos de ver antes, pueden no ejecutarse ninguna vez. Veamos la sintaxis de los bucles "do": do { Instrucciones } while (expresión bool); Como se puede ver, también hay un while y una expresión boolean, pero en este caso se encuentra al final. De este modo, la ejecución pasará siempre por las instrucciones del bucle una vez antes de evaluar dicha expresión. Vamos a rehacer el ejemplo anterior cambiando el bucle while por un bucle do: using System; namespace BuclesDo { class BuclesDoApp { static void Main() { string Clave="Compadre, cómprame un coco"; string Res=""; do { Console.Write("Dame la clave: "); Res=Console.ReadLine(); } while (Res!=Clave); Console.WriteLine("La clave es correcta"); string a=Console.ReadLine(); }
El resultado sería el mismo que antes. La diferencia está en que aquí daría exactamente lo mismo lo que valiera la variable Res antes de llegar al bucle, puesto que este se va a ejecutar antes de comprobar dicho valor, y al ejecutarse, el valor de Res se sustituye por lo que se introduzca en la consola. Por lo tanto, repito, los bucles do se ejecutan siempre al menos una vez. Por otro lado tenemos otro tipo de bucle, los bucles foreach , pero no hablaremos de ellos hasta que hayamos visto arrays e indizadores. Tened un poco de paciencia, que todo se andará.
Las instrucciones de salto permiten modificar también el flujo del programa, forzando la siguiente iteración de un bucle antes de tiempo, o la salida del mismo o bien mandando la ejecución directamente a un punto determinado del programa (esto último está altamente perseguido y penado por la ley, o sea, los jefes de proyecto). Son pocas y muy sencillas, así que podéis estar tranquilos, que no os voy a soltar otra biblia con esto...
Algo hemos visto ya sobre la instrucción break. ¿Cómo que no? Anda, repásate la entrega anterior, hombre... Mira que se te ha olvidado pronto... En fin... a lo que vamos. La instrucción break fuerza la salida de un bucle antes de tiempo o bien de una estructura de control de flujo condicional en la que se encuentre (un switch). Ahora nos fijaremos en los bucles, que es donde andamos. Pondremos un ejemplo sencillo: El siguiente programa escribirá múltiplos de 5 hasta llegar a 100: using System; namespace InstruccionBreak { class InstruccionBreakApp { static void Main() { int num=0; while (true)
En este ejemplo, el bucle for va asgnando valores a la variable i entre 1 y 20. Sin embargo, cuando el valor de i es tres o múltiplo de tres (es decir, cuando el resto de la división entre i y 3 es cero) se ejecuta una instrucción continue, de modo que se fuerza una nueva iteración del bucle sin que se haya escrito el valor de i en la consola. Por este motivo, aparecerían todos los números del uno al veinte a excepción de los múltiplos de tres.
El goto, aparte de ser el principal baluarte de la "programación des-estructurada", es un maestro de la supervivencia... de lo contrario no se explicaría que siguiera vivo. En fin... Trataré de explicaros cómo funciona sin dejarme llevar por mis sentimientos... De momento te diré que goto hace que la ejecución del programa salte hacia el punto que se le indique. Simple y llanamente. Luego te pongo ejemplos, pero antes quiero contarte alguna cosilla sobre esta polémica instrucción. En realidad, el problema no es la instrucción goto en sí misma, sino el uso inadecuado que algunos programadores le dan, Ciertamente, hay ocasiones en las que una instrucción goto hace la lectura de un programa mucho más fácil y natural. switch (opcion) { case 1: descuento=10; break; case 2: case 3: if (opcion==2) regalo="Cargador de CD"; descuento=5; break; default: descuento=0; break; } En este ejemplo, si opción valía 2 se asignaba una cadena a la variable regalo y, además se asignaba 5 a la variable descuento. Pues bien, en este caso un goto habría resultado mucho más natural, intuitivo y fácil de leer. Veámoslo:
switch (opcion) { case 1: descuento=10; break; case 2: regalo="Cargador de CD"; goto case 3; case 3: descuento=5; break; default: descuento=0; break; } Como veis, hemos resuelto el problema anterior de un modo mucho más natural que antes, sin tener que usar una sentencia if. Veamos ahora un ejemplo de cómo NO se debe usar un goto : if (opcion==1) goto Uno; if (opcion==2) goto Dos; if (opcion==3) goto Tres; goto Otro; Uno: { descuento=10; goto Fin; } Dos: { regalo="Cargador de CD"; } Tres: { descuento=5; goto Fin; } Otro: descuento=0; Fin: Console.WriteLine("El descuento es {0} y el regalo {1}", descuento, regalo); Este fragmento de código hace lo mismo que el anterior, pero, indudablemente, está muchísimo más enredado, es mucho más difícil de leer, y hemos mandado a paseo a todos los principios de la programación estructurada. Como ves, un mal uso del goto puede hacer que un programa sencillo en principio se convierta en un auténtico desbarajuste. En resumen, no hagáis esto nunca.