sábado, 15 de enero de 2022

Curso avanzado de C#.Instrucciones de bucle (for)

El uso de estructuras de bucle permite repetir un número determinado de veces una serie de instrucciones para realizar una tarea. 

Son necesarias para calcular el promedio de una serie de datos que se almacenan en una estructura tal como una matriz, o para iterar sobre una colección de elementos, como un conjunto de datos almacenados en una base de datos. C # proporciona cuatro estructuras de bucle:

for
foreach 
while
do-while

Aquí veremos for y foreach y en la siguiente entrada while y do-while. La decisión de cual usar depende de los requisitos, pero en última instancia, todas estas estructuras proporcionan bucles de repetición. La primera estructura de bucle que es la base para la estructura.

Bucles for

La estructura de bucle for para C # permite repetir una instrucción o serie de sentencias hasta que se cumpla una condición especificada. La instrucción for contiene un inicializador una condición y un incremento o iterador (un iterador es una porción de un bucle que cambia un valor cada vez que realiza un ciclo).

// sintaxis de la instruccion for
for (inicializador; condicion; iterador)
{
instruccion o instrucciones;
}

En el ejemplo anterior, la instrucción for incluye entre paréntesis los componentes que controlan la propia declaración. El inicializador se utiliza para declarar y / o inicializar (establecer un valor inicial) una variable (Contador) que se utilizará en el bucle. La condición se utiliza para determinar qué causará que el bucle se detenga, y el iterador se utiliza para modificar la variable del contador. Cada componente Está separado por un punto y coma. Un ejemplo:

// Cuenta de 0 a 20 en incrementos de  3
for (int contador = 0; contador <= 20; contador += 3)
{
Console.WriteLine(contador);
}

En este ejemplo, la instrucción for inicializa una variable llamada contador, aunque es posible utilizar cualquier nombre, pero hay que tener en cuenta que:

No se pueden utilizar palabras clave para nombres de variables.

La variable declarada aquí no debe tener el mismo nombre que una variable que se utilice para otro propósito dentro del bucle for.

La variable utilizada como inicializador puede utilizarse en el bucle for. Como se puede ver en la instrucción Console.WriteLine(contador).

No se puede utilizar esta variable fuera del bucle for debido a su alcance local.

La instrucción for comprueba la condición para ver si el contador es menor o igual a 20. Como el bucle no se ha ejecutado aun y el contado vale 0, la  condición devuelve true y se ejecuta la instrucción del bucle Console.WriteLine(contador).

El iterador de incremento aumentará en 3 debido al operador + =, pero sólo después de que el bucle itera sobre el bloque de instrucciones. Se pueden utilizar diferentes aspectos de la modificación de contador en los bucles for como operadores de incremento y decremento ++, -, + =, * =, etc.

Las siguientes capturas de pantalla muestran cómo funciona el bucle for. En la figura, el código acaba de iniciar la ejecución del bucle for y el contador se ha inicializado a cero. La imagen muestra la ventana de código con el punto de ruptura y también muestra la ventana de donde se puede ver el valor del contador aún está a cero.

Curso avanzado de C#. Intrucciones de bucle for.



En la siguiente imagen, se ha avanzado a través del código. El bucle ha ejecutado la sentencia dentro de las llaves, pero ahora, La Figura de abajo muestra la instrucción de incremento resaltada. Esto es clave para entender cómo funciona el bucle for. El incremento ocurre después de ejecutar las instrucciones internas al bucle. Sin embargo, el valor del contador sigue siendo 0, con lo que el incremento no ha ocurrido todavía. 

bucle for en C#

La inicialización sólo ocurre una vez; La primera vez que se ejecuta el bucle. La  condición se comprueba para cada iteración del bucle, incluyendo la primera iteración. Sucede antes del incremento y después de la inicialización. Entonces se ejecuta el bloque del bucle que contiene las instrucciones, y finalmente se actúa sobre la variable de contador.
En cada iteración posterior del bucle, la condición se comprueba de nuevo, y si devuelve true, el bucle ejecuta otra vez el bloque de instrucciones y luego incrementa la variable del contador. Si la condición devuelve false, el bucle detiene la ejecución. Las sentencias del bloque ya no se ejecutarán, y el contador no se incrementará más. En este último caso, la ejecución continúa en la siguiente línea después de la instrucción for, lo podemos ver en la siguiente figura de la ejecución.

funcionamiento de un bucle for de C#


Bucles infinitos

Al escribir un bucle, un error muy frecuente es poner una condición de salida para el bucle que no se cumple nunca. Esto producirá un bucle infinito. Es decir un bucle que no sale nunca. Esto es un problema porque puede bloquear rápidamente un ordenador consumiendo recursos de la CPU. Por supuesto, es posible crear un bucle infinito a propósito.
C # permite crear un bucle infinito. Es posible hacerlo creando simplemente el bucle for sin la condición o sin el iterador. Se puede utilizar un bucle infinito en aplicaciones en tiempo real donde se realiza una espera continua de entradas, o para hacer una prueba de estrés a una aplicación o servidor. Sólo que hay asegúrese de que es posible salir del bucle, de no ser así hay que forzar la finalización de la aplicación.

static void Main(string[] args)
{
// bucle infinito for en C#
     for (;;)
     {
     instruccion;
      }
}

Otra consideración para crear bucles, es cuando el bucle no tiene que hacer nada. Un bloque de sentencia vacío significa que no se ejecuta ningún código durante el bucle. El ciclo simplemente itera hasta que la condición es verdadera:

// blucle vacío
for(int contador = 0; contador >= 10; contador++)
{
      ;
}

Hasta ahora, sólo se ha visto el iterador de bucle como contador. Pero se puede utilizar cualquiera de los operadores de incremento C # en esta parte del bucle for, lo que significa que es posible incrementar o decrementar (para disminuir un cierto valor). Los siguientes operadores están permitidos para su uso en el iterador del bucle for:

++ es el operador de incremento donde los valores se incrementan en uno.

-- es el operador de decremento donde los valores se reducen en uno.

+ = es el operador que permite utilizar literales para establecer el paso como + = 2, que produce incrementos de 2 en cada iteracción.

- = es la disminución del operador anterior.

* = es el incremento por un factor de multiplicación.

/ = es el decremento por un factor de división.

Anidación de bucles for

Los bucles for se pueden anidar. Esto le permite crear construcciones de bucle más complejas que pueden resultar útiles en varias aplicaciones.
A continuación un ejemplo de bucles anidados para una aplicación que permite elegir  números al azar. Este ejemplo de código no necesita incluir lógica para evitar duplicados.


// Se utiliza para configurar un rango de valores a elegir, en este caso 50
            int[] rango = new int[50];
            // Utilizado para simular números elegidos, en este caso 5
            int[] elegido = new int[5];
            // retorna un número aleatorio
            Random rnd = new Random();
            // Toma sólo números aleatorios en el rango de valores entre 1 y 50
            for (int i = 0; i < 50; i++)
            {
                rango[i] = i + 1;
            }
            // toma 5 números aleatorios del rango anterior
            for (int limite = 0; limite < 50; limite++)
            {
                for (int selecciona = 0; selecciona < 5; selecciona++)
                {
                    elegido[selecciona] = rango[rnd.Next(50)];
                }
            }
            Console.WriteLine("Los números elegidos son:");
            for (int j = 0; j < 5; j++)
            {
                Console.Write(" " + elegido[j] + " ");
            }
            Console.WriteLine();

En este código se configuran dos arrays para contener los valores para el rango (50) del que elige (5). El generador de números aleatorios se utiliza para obtener  una secuencia de números aleatoria. Para elegir un número aleatorio del rango de 1 a 50. El primer bucle rellena el rango con valores de 1 a 50; i + 1 se utiliza porque los arrays en C # comienzan en 0, pero 0 no es un valor válido para el rango 1-50.

El bucle anidado establece la porción externa para iterar sobre los 50 valores posibles y escoger cinco valores aleatorios. Esta no es la forma más óptima de hacer esto, pero sirve para mostrar Un ejemplo de anidamiento.


Intrucciones foreach

El bucle for se puede considerar un bucle en el que se determina cuando termina a través del uso de un contador. Normalmente, se usa cuando se conoce cuando debe finalizar. Cuando se trabaja con colecciones de elementos en el código cuya cantidad es desconocida a priori en tiempo de ejecución, o en asignaciones basadas en entradas del usuario. 

C # proporciona la sentencia foreach para iterar sobre colecciones de elementos. Las colecciones suelen ser arrays pero también otros objetos .NET que han implementado las interfaces IEnumerable. (IEnumerable es un componente de código en C # que admite la iteración.)
Es posible que exista una matriz o una colección que contenga un número de valores conocidos o desconocidos. Aunque se puede utilizar un bucle estándar para estos tipos de colección con un número de valores conocido, es casi imposible saber cuántos valores habrá en una colección en todos los casos. Por ejemplo, una matriz de caracteres de una cadena de texto introducida por un usuario en tiempo de ejecución.

Otras posibilidades podrían ser un conjunto de datos creado después de acceder a una base de datos. En ambos casos, no se conocer el número de valores en el momento de escribir el código. La sintaxis de la instrucción foreach es la siguiente:

// Sintaxis foreach
foreach (tipo in coleccion)
{
       intrucciones;
     }

En este ejemplo de sintaxis, type es un tipo de datos que contendrá la colección. Un ejemplo sencillo puede ser una matriz que almacena valores enteros con calificaciones que un profesor puede querer promediar, como se muestra a continuación.

// bucles forreach para calcular una media de los valores de un array
            // se carga un array con valores enteros
            int[] arrCalificaciones = new int[] { 7, 8, 9, 7, 9, 6, 5 };
            // crea tres variables para almacenar la suma, el número de calificaciones y la media
            int total = 0;
            int CuentaCalificaciones = 0;
            double media = 0.0;
            // bucle que itera para cada valor entero en el array
            // foreach no conoce el tamaño del array, lo recorre en tiempo de ejecución hasta su final.
            foreach (int nota in arrCalificaciones)
            {
                total = total + nota; // va sumando cada calificación (nota) a un total
                CuentaCalificaciones++; // incrementa el contador para calcular la media
            }
            media = total / CuentaCalificaciones; // calcula la media de las calificaciones
            Console.WriteLine(media);

En el ejemplo anterior, se conoce de antemano el número de calificaciones del array, pero es para simplificar el ejemplo. Es posible un escenario en el que el usuario introduzca las calificaciones de forma manual y rellene dinámicamente el array.

Se crean tres variables:
La variable total se utiliza para sumar los valores de las calificaciones. CuentaCalificaciones se utiliza para conocer el número de calificaciones para posteriormente calcular el promedio.
El promedio (variable media) se declara como tipo doble (double)  pues el promedio puede ser fraccionario.

El bucle foreach declara una variable entera llamada nota. Utiliza una variable entera porque los valores de la matriz son enteros. Es importante asegurarse de que la variable del bucle foreach  coincide con los tipos de datos esperados en la colección. La variable nota se utiliza para iterar sobre cada valor de la matriz. Las sentencias en el bucle foreach agregan el valor de la calificación a la variable total e incrementan la variable CuentaCalificaciones cada vez para utilizarla posteriormente para calcular el promedio. Una vez finalizado el ciclo, se calcula el promedio y se envía a la ventana de la consola. El bucle foreach facilita a los programadores establecer un medio para iterar sobre los elementos de una colección Sin tener que preocuparse de saber el número de elementos de antemano.


No hay comentarios:

Publicar un comentario