sábado, 22 de enero de 2022

Curso avanzado de C#: Instrucciones While

La instrucción while actúa de forma similar a la instrucción for porque  permite ejecutar una instrucción o conjunto de instrucciones repetidamente hasta que se cumpla una condición ( y devuelve falso). La forma más fácil de  comprender la declaración while es: "mientras la condición permanezca verdadera, ejecuta el ciclo".

// Sintaxis de while
while(condicion) { intrucciones; }

La instrucción while comienza con la palabra clave while, entre paréntesis la condición de  prueba. Si la condición devuelve verdadero, se ejecutarán las instrucciones incluidas en las llaves. Cuando la condición devuelve falso, la ejecución cae en la línea de código después de la llave de cierre de la declaración.

int Valor = 0;
while (Valor < 10)
{
      Console.WriteLine(Valor);
      Valor++;
}

El código anterior establece la variable valor a 0. El ciclo while prueba la condición para ver si valor es menor que 10. En este caso, 0 es menor que 10, por lo que el ciclo while se ejecuta y muestra el valor de valor en la ventana de la consola. Después  incrementa  en 1 la condición de bucle y verifica nuevamente, el ciclo se ejecuta  de nuevo porque valor es igual a 1, que es aún inferior a 10. 

Instrucción While de C#


Una vez que el valor de condición  supera 10, la condición se hace false y la ejecución continúa después de la llave de cierre del ciclo while. El valor 10 no se imprime debido a que condición de retorno se hace falsa. Se puede pensar que se mostrarán los valores hasta 10 incluido, pero esto no sucederá. 

Hay que tener en cuenta las diferencias entre los ciclos while y for. El bucle for establece una variable, una condición, y un incremento dentro del paréntesis. El ciclo while se basa en variables previamente establecidas y requiere que el incremento tenga lugar dentro del ciclo. La falta de incremento dentro del ciclo puede crear un bucle infinito.

Instrucciones do-while

Esta estructura de bucle opera de una forma similar al ciclo while con la excepción de que, el ciclo do-while ejecuta el bloque de instrucción al menos una vez independientemente de la condición. Esto sucede porque la condición de evaluación se encuentra al final del bucle en vez de al principio. 

// sintaxis de bucles do-while: do { instruccion; } while (condicion);

Como se puede ver en la sintaxis precedente, se ejecutan primero las instrucciones del bucle y luego se comprueba la condición. También es importante tener en cuenta el uso del punto y coma al final del while además de la llave de cierre. Olvidar este punto y coma da como resultado que el compilador genera un error. 

int AlgunValor = 0;
do { Console.WriteLine(AlgunValor);
   AlgunValor++;
    }
while (AlgunValor < 10);

El ejemplo de código anterior produce el mismo resultado que el enunciado while anterior. 0,1,2,3,4,5,6,8,9. Pero en realidad estos dos bucles se comportan de manera diferente, por lo que modificando un poco el código:

int AlgunValor = 10;
do { Console.WriteLine(AlgunValor);
         AlgunValor++;
   } while (AlgunValor < 10);

Lo que cambia en este código es el valor inicial de la variable. Ahora  se establece en 10. Como resultado, el do-while se ejecutará al menos una vez, y como resultado: 10.
El resultado muestra solo un valor único, 10. Este fue el valor inicial establecido en la variable, y es la salida por pantalla que muestra que do-while ejecuta el bloque de instrucción al menos una vez. Cuando la condición se verifica al final del ciclo, devuelve falso porque AlgunValor es menor que 10, y el ciclo ya no se ejecuta.

Entonces, ¿por qué elegir un do-while frente a un While? Hay varias razones para elegir uno frente el otro, pero un escenario típico es cuando esperamos una entrada del usuario y necesitamos asegurarnos de pasar al menos una vez.

do
 {
       AlgunValor = (char)Console.Read();
       Console.WriteLine(AlgunValor);
 } while (AlgunValor != 'q');

Este ejemplo muestra un código con el que la declaración de variables que  declara que AlgunValor de tipo char, representa un solo carácter. Dentro del bucle do, establece un valor igual a un carácter introducido por el usuario cuando se ejecuta el programa. La línea Console.Read () es un método de la clase Console que lee un carácter de la consola de entrada. (char) es un molde explícito que convierte la entrada a un valor de char para usar en el programa.

La entrada que introduce el usuario se repite en la pantalla con el método Console.WriteLine.
La condición while comprueba si el valor ingresado por el usuario es la letra q. Si es así, cierra el ciclo; en caso contrario, continúa hasta que se ingrese q en la consola. Este tipo de control de bucle se conoce como centinela.
El valor centinela, es el que hace que el ciclo se detenga. La 
Salida será de este tipo: rr  hh tt qq.

Trabajando con bucles

Iniciamos una nueva aplicación llamada Bucles, ponemos un botón y un listBox y pegamos este código en la función del botón:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnBucles_Click(object sender, EventArgs e)
        {
            // utilizar un bucle para contar uno a uno
            listBox1.Items.Add("Cuenta una a uno");
            for (int i = 0; i < 10; i++)
            {
                listBox1.Items.Add(i);
            }
            listBox1.Items.Add("");
            // utilizar un bucle para contar hacia abajo de uno en uno
            listBox1.Items.Add("Cuenta hacia abajo de uno en uno");
            for (int i = 10; i > 0; i--)
            {
                listBox1.Items.Add(i);
            }
            listBox1.Items.Add("");
            // utilizar un bucle para contar de dos en dos
            listBox1.Items.Add("Cuenta de dos en dos");
            for (int i = 0; i < 10; i += 2)
            {
                listBox1.Items.Add(i);
            }
            listBox1.Items.Add("");
            // utilizar un bucle para contar con multiplos de 5
            listBox1.Items.Add("Cuenta con multiplos de 5");
            for (int i = 5; i < 1000; i *= 5)
            {
                listBox1.Items.Add(i);
            }
            listBox1.Items.Add("");
            // utilizar un foeach sobre un array de enteros
            listBox1.Items.Add("foeach sobre un array de enteros");
            int[] arrEnteros = new int[] { 1, 2, 3, 4, 5 };
            foreach (int numero in arrEnteros)
            {
                listBox1.Items.Add(numero);
            }
            listBox1.Items.Add("");
            //utilizar un bucle  foreach con cadenas
            listBox1.Items.Add("foreach sobre un array con cadenas");
            string[] arrStrings = new string[] { "Primero" , "Segundo", "Tercero", "Cuarto" , "Quinto" };
            foreach (string texto in arrStrings)
            {
                listBox1.Items.Add(texto);
            }
            listBox1.Items.Add("");
            // utilizar un bucle while
            int whileContador = 0;
            listBox1.Items.Add("Contando uno a uno con un bucle while");
            while (whileContador < 10)
            {
                listBox1.Items.Add(whileContador);
                whileContador++;
            }
            listBox1.Items.Add(""); Console.WriteLine();
            // utilizar un bucle do-while
            int doContador = 0;
            listBox1.Items.Add("Contando con un bucle do-while");
            do
            {
                listBox1.Items.Add(doContador);
                doContador++;
            } while (doContador < 10);
            listBox1.Items.Add("");
        }
    }
}

El resultado será de este estilo

While en lenguaje C#


No hay comentarios:

Publicar un comentario