Developer's Diary

26 agosto, 2010

Curso C# – Estructuras de repeticion

Todas las estructuras de repetición tienen que tener una variable de condición, es decir, al igual que las estructuras de condición

Volvemos de nuevo a realizar un nuevo artículo de nuestro curso de C#.

En está ocasión explicaremos un poco, como funciona las estructuras de repetición o como comúnmente son denominadas, bucles.

(more…)

Un bucle, estructura de repetición o iteración. No deja de ser un fragmento que se repetirá hasta que se cumpla la condición del bucle indicado.

Las personas que estén siguiendo el curso y que ya tengan algunos conocimientos de programación sabrán cuales son estas estructuras y como usarlas. Pero vamos a repasarlas y ver como se implementan dentro de C#

En C# se usan principalmente las siguientes cuatro estructuras de iteración que vamos a indicar.

Antes de ver cada uno de los tipos de existen, vamos a hablar de las caracteristicas que tienen en común.

Todas las estructuras de repetición,  tienen una condición, esta evalúa que se ejecutará el código del interior de la estructura hasta que esta se cumpla. Al igual que ocurría con los IF, estás condiciones pueden ser muy variadas y normalmente se encuentran relacionadas con el código dentro de la estructura de repetición.

Tenemos que tener cuidado al usar los bucles, aunque no vaya a ocurrir algo demasiado desastroso, como que el equipo salga ardiendo o tengamos que formatearlo de nuevo. Si es cierto, que fallar en una estructura de control puede producir que nos salgamos de un array o creemos un bucle infinito.

Un bucle infinito se produce cuando la condición que le hemos marcado a nuestra estructura de repetición nunca se cumple y por lo tanto, se repite la ejecución una y otra vez sin poder salir de ella. Si este bucle se encuentra en el proceso principal de la aplicación está se quedará colgada en esa parte de la ejecución.

Ahora vamos a explicar las distintas estructuras de repetición.

For

Mediante esta estructura tendremos la posibilidad de generar un bucle que se repita una cantidad indicada de veces. En la cabecera indicaremos la variable de control, la condición de repetición y el incremento o decremento de la misma. Un ejemplo de cabecera podría ser este:

For(int i = 0 ; i < 10 ; i++)

{

//codigo a ejecutar.

}

En la cabecera hemos indicado que nuestra variable de control, un entero, hará que el código dentro de la misma se ejecute diez veces (i < 10) incrementandose cada vez que la ejecutemos.

El incremento se hará cuando se termine de ejecutar todo el código dentro de la estructura de repetición.  También podemos, hacer que esa variable se decremente quedando la cabecera de la siguiente manera:

For(int i = 10 ; i == 0 ; i–)

{

//Código a ejecutar

}

En esta ocasión, se repetirá también diez veces, pero el valor del entero después de salir de la estructura de control será 0.

Normalmente dentro de este bucle de repetición, también se usa la variable de control. Por ejemplo para recorrer una array o una lista. Pudiendo indicar que el valor de condición sea el valor total de la condición.

Siendo una cabecera como esta:

For(int i = 0 ; i < lista.Count  ; i ++)

{

//Codigo a ejecutar.

}

¿Cómo o cuando se produce un bucle infinito dentro de un for?

Podemos generar un bucle infinito mediante un for, dejando la cabecera completamente vacia. Como en el siguiente ejemplo:

For( ; ; )

{

//Codigo a ejecutar

}

También produciríamos un bucle infinito si la variable control, no se incrementa. Como lo que indicamos ahora:

For (int i = 0 ; i < 10 ; z++)

{

//Codigo a ejecutar

}

Al menos que dentro del código de la estructura de repetición incrementemos la variable i, nos encontraremos también con un bucle infinito.

While


Nuestro segundo tipo de estructura de control,  es el bucle While. Este tipo de iteración,  se diferencia porque seguirá ejecutándose hasta que la condición deje de cumplirse y no cuando se cumpla, como indicábamos en el For.

Dentro de este tipo de bucles, no solo podemos usar condiciones numericas, si no también de muy distintos tipos, desde un booleano que activaremos cuando se cumpla una condición desde otra parte del programa, hasta una cadena de texto.

La ejecución del while, no se realiza si la condición no se encuentra cumplida cuando accedemos al código, lo mostrare con un ejemplo.

bool entra_bucle = false;

While(entra_bucle == true)

{

//Codigo a ejecutar…

}

En este caso, no accederíamos dentro del bucle, debido a que la condición, la variable entra_bucle se encuentra en falso y nuestra condición indica que solo se puede acceder a ella cuando se encuentra en true. Hubiesemos accedido al bucle, si la variable booleana hubiera tenido el valor true o si la condición hubiese indicado falso.

En un bucle while, es mucho más fácil producirse un bucle infinito, ya que si la condición no deja de cumplirse, este continúa ejecutándose hasta que el proceso termine, por un método externo.  Cuando usamos una estructura de iteración de este tipo, debemos saber que la condición se cumplirá, si no, nos encontraremos con un grave error, en la aplicación.

do… while

Nuestra tercera estructura iterativa, es muy similar a la de while, con la particularidad de que la condición se comprobará al final de ejecución del código y no al principio, como ocurría tanto con los bucles For y While. Teniendo esta premisa en cuenta, sabremos siempre, que el código a ejecutar, se ejecutará al menos una vez, aunque la condición sea falsa.

Posteriormente, la condición se aplicará igual que en los bucles de tipo While. Pongamos un ejemplo fácil.

do

{

//Codigo a ejecutar

}while(i == 10)

En el código de ejemplo, tenemos un bucle, que ejecutará el cógido una vez, comprobará si la variable i tiene un valor 10, en caso de que lo tenga continuará ejecutándose el código y en caso contrario, continuará la ejecución de la aplicación.

Puede sernos útil, cuando queramos que se realiza la ejecución una vez o cuando queremos que la condición de nuestra estructura de iteración se verifique al final del bloque de código.

Para tener un bucle infinito aquí, debe ocurrir algo similar a lo que ocurría dentro de los bucles de tipo while.

For each

Este tipo de bucle nos permite recorrer colecciones o arreglos completamente. No existe ningún tipo de condición, excepto que debemos completar toda la colección que hayamos querido ver. Este tipo de bucles, nos pueden resultar bastantes útiles para evitar las excepciones del tipo fuera del indice. Ya que evitamos tener que controlar nosotros porque parte accedemos del mismo.

La sentencia es tan simple como esta:

string[] arreglo = new string[5];

Foreach(string cad in arreglo)

{

//codigo a ejecutar

}

De esta manera en cada vuelta, la variable cad, tomará el valor que tenga ese elemento de la condición. Comenzando por el primero y llegando hasta el último.

Sinceramente, no he encontrado la manera de lograr un bucle infinito en esta estructura iterativa y creo que es imposible. Debido a que la estructura se encuentra controlada ya de por sí.

Palabras reservas demonizadas

Finalmente, debemos tener en cuenta que existen ciertas palabras clave, que no se debería abusar del uso de las mismas. No obstante, es conveniente saber que existen. Ya que nos pueden permitir salir de ciertos «apuros» dentro de los bucles. No obstante, estas palabras en cierta parte destruyen los preceptos de la programación estructurada, ya que existen desde tiempos memoriales.

Debemos evitarlas en todo lo posible, porque su uso es un grave problema para el mantenimiento de la aplicación, además de resultar un gravisimo problema de seguridad.

break;

Mediante esta palabra clave, podemos salir de ese bloque de código en cualquier momento. Esta palabra clave provoca que vayamos directamente a la siguiente línea que continúa al bloque donde se encuentre incluida la palabra. Pongamos un ejemplo:

Console.WriteLine(«Buenos dias»);

for(i = 0 ; i < 10 ; i ++)

{

Console.WriteLine(i);

if(i == 5)

{

break;

}

}

Console.ReadKey();

En este fragmento de código que hemos expuesto arriba, nos encontramos que el bucle se ira repitiendo y si en alguna ocasión llegamos al valor 5 de nuestra variable i, saldremos  del bloque de código, llegando hasta la siguiente línea que es Console.ReadKey(). En este ejemplo, era bastante claro que íbamos a llegar al valor cinco y por eso hemos salido.

El uso de break se puede encontrar aún en la actualidad, pero no es demasiado recomendable, tenemos que tener por cuenta, que los bucles se deben ejecutar hasta que cumplan su condición, salir antes, puede implicar un error posterior en la aplicación.

goto

Ni siquiera me podía imaginar que está palabra reservada, se encontrara aún disponible en lenguajes tan actuales y tan orientados a la programación estructurada como C#.  La palabra goto, se encuentra disponible desde los tiempos inmemoriales de Basic.

Nos permite dirigirnos hasta otro bloque de código indiscrinadamente. Pudiendo también realizar un bucle con la misma palabra de la siguiente manera:

:Bucle1

//Codigo a ejecutar

i++

if(i > 10)

{

goto Bucle1;

}

En este ejemplo de código, hemos mostrado como hacer un estructura iterativa con la palabra goto. En este caso podría llegar a ser respetable incluso para su uso según el concepto de la programación estructurada, debido a que la función que realizamos con ella es muy similar a un bucle for.

Pero y si hicieramos lo siguiente:

:Bucle1

//Codigo a ejecutar

i++

if(i > 10)

{

goto Bucle1;

}

else

{

goto Bucle2;

}

//Lineas de código

//Más lineas de código

:Bucle2

//Lineas de código

En este segundo caso, nos hemos saltado gran cantidad del código que tal vez tuviese que ejecutarse, hemos destuido la capacidad de la programación estructurada. Además de ser muy peligroso referente a seguridad de la aplicación. Ya que el uso de estas condiciones son agujeros de seguridad que cualquier hacker podría usar para lo que se le ocurriese por su imaginación.

Debemos evitar por todos los medios usar este tipo de palabras clave, que solo pueden provocar errores en nuestra aplicación.

Hasta aquí la explicación del uso de las estructuras de repetición. Los ejercicios que podeis realizar en este capitulo es practicar con los bucles, ir probando sus utilidades, provocar bucles infinitos para comprobar por vosotros mismos lo que ocurren y saber que debeis usarlas siempre que haya una repetición del código.

Un saludo!

1 comentario »

  1. […] aplicación de consola. – Nuestra primera aplicación de ventana. – Estructuras de control. – Estructuras de repetición. – Manejo de los controles básicos I , II , III. – Varios formularios – Tipos de datos. – […]

    Pingback por Curso C# « Developer's Diary — 3 enero, 2011 @ 7:31 AM


RSS feed for comments on this post. TrackBack URI

Deja un comentario