BUCLES (WHILE)

Los bucles son muy utilizados para aquellas tareas repetitivas, cuando hay que iterar por varios elementos o simplemente cuando queremos repetir muchas veces una misma acción mientras que una condición se cumpla. Por ejemplo, si queremos dividir dos números que le vamos a pedir al usuario tenemos que tener en cuenta que el segundo número tiene que ser distinto de cero. Para esto podríamos verificar si el segundo número es cero, y en tal caso, pedirle al usuario que lo reingrese. El tema es… El usuario podría volver a ingresar mal el número. Podríamos pedirle el valor muchísimas veces y el usuario podría seguir ingresándolo mal. Este es un ejemplo sencillo, pero aplicado a un videojuego, podríamos querer realizar la misma secuencia de acciones mientras que el usuario esté en una misma zona, o mientras siga dentro del juego, o mientras no haya ganado, o mientras…. Muchas cosas más.

Para esta tarea, y muchas más, es para lo que vamos a usar los bucles. Como vamos a ver, hay muchos tipos de bucles, y los vamos a usar para tareas diferentes. Vamos a empezar con el ejemplo que dije primero.

Imaginemos que tenemos que dividir dos números ingresados por el usuario, pero el segundo ingresado podría ser cero. Antes de hacer la división, deberíamos primero chequear que el valor sea correcto. Veamos primero el ejercicio sin el chequeo:

 

using System;
          
public class Program
{
  public static void Main()
  {
    float num1;
    float num2;
    float result;
    
    Console.WriteLine("Ingrese primer número: ");
    num1 = float.Parse(Console.ReadLine());
    
    Console.WriteLine("Ingrese segundo número: ");
    num2 = float.Parse(Console.ReadLine());
    
    result = num1 / num2;
    
    Console.WriteLine("Presione ENTER para terminar...");
    Console.ReadLine();
  }
}

 

Traten de antes de seguir avanzando entender correctamente qué hace el código anterior, y cuál es el problema (o posible problema). Vamos a aplicar ahora una solución parcial (con un if), y ver el problema que soluciona y el que no.

 

using System;
          
public class Program
{
  public static void Main()
  {
    float num1;
    float num2;
    float result;
    
    Console.WriteLine("Ingrese primer número: ");
    num1 = float.Parse(Console.ReadLine());
    
    Console.WriteLine("Ingrese segundo número: ");
    num2 = float.Parse(Console.ReadLine());
    
    if(num2 != 0)
    {
      result = num1 / num2;
      Console.WriteLine("El resultado es: " + result);
    }else
    {
      Console.WriteLine("No se puede dividir por cero.");
    }
    
    Console.WriteLine("Presione ENTER para terminar...");
    Console.ReadLine();
  }
}

 

Este if soluciona el problema parcialmente, puesto que si el usuario ingresa mal el número el programa sólo muestra un mensaje y termina. En el caso de muchas calculadoras, es esto básicamente lo que hacen. Ahora, si querémos ser “más amables” con el usuario y permitirle el reingreso del valor (porque se pudo haber equivocado), podemos modificar el código de la siguiente manera:

 

using System;
          
public class Program
{
  public static void Main()
  {
    float num1;
    float num2;
    float result;
    
    Console.WriteLine("Ingrese primer número: ");
    num1 = float.Parse(Console.ReadLine());
    
    Console.WriteLine("Ingrese segundo número: ");
    num2 = float.Parse(Console.ReadLine());
    
    if(num2 != 0)
    {
      result = num1 / num2;
      Console.WriteLine("El resultado es: " + result);
    }else
    {
      Console.WriteLine("Reingrese el segundo número: ");
      num2 = float.Parse(Console.ReadLine());
      
      result = num1 / num2;
      Console.WriteLine("El resultado es: " + result);
    }
    
    Console.WriteLine("Presione ENTER para terminar...");
    Console.ReadLine();
  }
}

 

Esto sería una solución parcial a la solución parcial anterior, ya que el usuario podría volver a ingresar mal el número (podría haberse equivocado de nuevo). Y así también podría volver a ingresarlo mal todas las veces que se lo permitamos. Entonces, necesitamos una solución diferente. De seguro se habrán dado cuenta que poner otro if no es el mejor camino, ya que tendríamos que escribir demasiados if como para cansar al usuario lo cual no sería lo mejor.

La solución más “elegante” es con un bucle. Vamos a escribirla y a explicar este primer tipo de bucle:

 

using System;
          
public class Program
{
  public static void Main()
  {
    float num1;
    float num2;
    float result;
    
    Console.WriteLine("Ingrese primer número: ");
    num1 = float.Parse(Console.ReadLine());
    
    Console.WriteLine("Ingrese segundo número: ");
    num2 = float.Parse(Console.ReadLine());
    
    while(num2 != 0)
    {
      Console.WriteLine("Reingrese el segundo número: ");
      num2 = float.Parse(Console.ReadLine());
    }
    
    //Podemos resolver acá, sin necesidad de chequearlo, ya que acá estamos seguros
    //de que el usuario ingresó bien el dato ¿Se dan cuenta por qué?
    result = num1 / num2;
    
    Console.WriteLine("El resultado es: " + result);
    
    Console.WriteLine("Presione ENTER para terminar...");
    Console.ReadLine();
  }
}

 

Lo que hacemos acá es pedirle primero el número, como acostumbramos, pero en lugar de hacer la pregunta con un “if“, la hago con un “while“. Básicamente la pregunta es la misma, pero el programa se va a quedar ejecutando las mismas líneas de código (las que están dentro del bucle), hasta que la condición deje de cumplirse. En este caso no haría falta usar un “else“, puesto que sólo va a salir del bucle cuando la condición no se cumpla. Así que podemos asumir que si salió del bucle, la condición se dejó de cumplir, por ende tampoco hace falta preguntar más nada.

 

A TENER EN CUENTA:

Es muy importante que tengan en cuenta que si la condición que ponen en el bucle NUNCA DEJA DE CUMPLIRSE, ese bloque de código se va a ejecutar por siempre, y en la mayoría de los casos la aplicación se va a tildar, lo cual va a provocar que tengan que forzar el cierre con el administrador de tareas. Prueben y vean qué pasa. Les dejo un ejemplo:

using System;
          
public class Program
{
  public static void Main()
  {
    int num1 = 0;
    while(num1 == 0)
    {
      Console.WriteLine("Estamos en un loop!!");
    }
  }
}

 

Este tipo de bucle se suele utilizar cuando no saben la cantidad de veces que tienen que repetir algo. O sea, pueden ser 2, 1000 o 1 vez. Básicamente es cuando la cantidad de repeticiones dependen de un suceso, como que el usuario continúe ingresando números negativos, a pesar de haberle dicho que no lo haga. Como no sabemos la cantidad de veces que puede hacerlo, usamos este tipo de bucle.