Cargando...

Bucles en C# (for, foreach, while, do-while)

Aprende a usar los bucles for, foreach, while y do-while en C# para gestionar acciones repetitivas con ejemplos prácticos.

En C#, los bucles permiten ejecutar el mismo bloque de código repetidamente mientras una condición sea verdadera. Ahorran tiempo al programador y facilitan las tareas repetitivas. Los bucles más utilizados en C# son: for, foreach, while y do-while.


Bucle for

El bucle for se usa generalmente cuando se conoce el número de repeticiones. Se controla con una variable contador.

Conteo ascendente: El contador i aumenta en 1 cada vez. El bucle termina antes de que llegue a 5.


for (int i = 0; i < 5; i++)
{
    Console.WriteLine("Paso: " + i);
}
// Salida:
Paso: 0
Paso: 1
Paso: 2
Paso: 3
Paso: 4

Conteo descendente: El contador i disminuye en 1 cada vez. El bucle termina antes de que llegue a 0.


for (int i = 5; i > 0; i--)
{
    Console.WriteLine("Cuenta regresiva: " + i);
}
// Salida:
Cuenta regresiva: 5
Cuenta regresiva: 4
Cuenta regresiva: 3
Cuenta regresiva: 2
Cuenta regresiva: 1

Incrementos de 5: El contador i aumenta en 5 cada vez. El bucle termina cuando llega a 25.


for (int i = 0; i <= 25; i += 5)
{
    Console.WriteLine("Número: " + i);
}
// Salida:
Número: 0
Número: 5
Número: 10
Número: 15
Número: 20
Número: 25

Bucle for anidado: Con contadores anidados i y j, cada uno contando hasta 3, el programa imprime sus productos.


for (int i = 1; i <= 3; i++)
{
    for (int j = 1; j <= 3; j++)
    {
        Console.Write($"{i * j}\t");
    }
    Console.WriteLine();
}
// Salida:
1    2    3
2    4    6
3    6    9

break y continue

A veces, en los bucles se utilizan las palabras clave break y continue para controlar el flujo.

break: Termina completamente el bucle.


for (int i = 1; i <= 5; i++)
{
    if (i == 3)
        break; // cuando i es igual a 3, el bucle termina

    Console.WriteLine("i: " + i);
}
// Salida:
i: 1
i: 2

continue: Omite solo la iteración actual y continúa con el resto del bucle.


for (int i = 1; i <= 5; i++)
{
    if (i == 3)
        continue; // cuando i es igual a 3, se omite este paso

    Console.WriteLine("i: " + i);
}
// Salida:
i: 1
i: 2
i: 4
i: 5

Bucle foreach

El bucle foreach se utiliza para recorrer colecciones (arrays, listas, etc.). No es necesario conocer el número de elementos.


string[] frutas = { "Manzana", "Pera", "Plátano" };

foreach (string fruta in frutas)
{
    Console.WriteLine(fruta);
}

En este ejemplo, cada elemento del array frutas se imprime en la consola en orden.


Bucle while

El bucle while se repite mientras la condición sea verdadera. El número de repeticiones puede no conocerse de antemano.

Contador simple: La variable numero comienza en 1 y se imprime hasta 3.


int numero = 1;

while (numero <= 3)
{
    Console.WriteLine("Número: " + numero);
    numero++;
}
// Salida:
Número: 1
Número: 2
Número: 3

Imprimir caracteres de una cadena: En este ejemplo, un bucle while imprime cada carácter de un texto. Si se encuentra un espacio, se omite con continue. Si se encuentra un punto (.), el bucle termina con break.


string texto = "Hoy hace buen tiempo. Vamos afuera.";
int index = 0;

while (index < texto.Length)
{
    char c = texto[index];

    if (c == ' ')
    {
        index++;
        continue; // omitir espacios
    }

    if (c == '.')
        break; // terminar bucle al encontrar un punto

    Console.WriteLine(c);
    index++;
}
// Salida:
H
o
y
h
a
c
e
b
u
e
n
t
i
e
m
p
o

Bucle infinito while(true): En los bucles infinitos, se puede salir con break. En este ejemplo, se pide al usuario que introduzca la contraseña correcta para salir del bucle.


while (true)
{
    Console.Write("Ingrese la contraseña: ");
    string contrasena = Console.ReadLine();

    if (contrasena == "1234")
    {
        Console.WriteLine("¡Acceso exitoso!");
        break; // contraseña correcta, salir del bucle
    }

    Console.WriteLine("Contraseña incorrecta, intente de nuevo.");
}
// Ejecución de ejemplo:
Ingrese la contraseña: 1111
Contraseña incorrecta, intente de nuevo.
Ingrese la contraseña: 2222
Contraseña incorrecta, intente de nuevo.
Ingrese la contraseña: 1234
¡Acceso exitoso!

Bucle do-while

El bucle do-while se ejecuta al menos una vez y luego verifica la condición. Esto significa que se ejecuta al menos una vez incluso si la condición es falsa.

Ejemplo simple: Aunque la condición no se cumpla al principio, el bucle se ejecuta una vez.


int x = 5;

do
{
    Console.WriteLine("Valor de x: " + x);
    x++;
} while (x < 5);
// Salida:
Valor de x: 5

Encontrar divisores: Los divisores de un número ingresado por el usuario se encuentran con un bucle do-while.


Console.Write("Ingrese un número: ");
int numero = int.Parse(Console.ReadLine());

if (numero <= 0)
{
    Console.WriteLine("Ingrese un número mayor que 0.");
}
else
{
    int divisor = numero;

    Console.WriteLine($"Divisores de {numero}:");

    do
    {
        if (numero % divisor == 0)
        {
            Console.WriteLine(divisor);
        }
        divisor--;
    } while (divisor >= 1);
}
// Ejecución de ejemplo:
Ingrese un número: 12
Divisores de 12:
12
6
4
3
2
1

Resumen


Aplicación: Menú y gestión de productos con las flechas

En este ejemplo escribimos un menú sencillo que funciona con un bucle infinito y permite la selección usando las flechas (↑/↓) y la tecla Enter. Se utilizan arreglos para almacenar el nombre y el precio de 5 productos. Menús: Mostrar productos, Actualizar producto, Eliminar producto, Salir.


using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        string[] nombresProductos = { "Bolígrafo", "Cuaderno", "Borrador", "Mochila", "Regla" };
        decimal[] preciosProductos = { 12.5m, 45m, 7.9m, 350m, 22.75m };

        string[] menu = { "Mostrar productos", "Actualizar producto", "Eliminar producto", "Salir" };
        int seleccionado = 0;

        while (true) // Bucle infinito
        {
            Console.Clear();
            Console.WriteLine("=== Gestión de productos ===\n");

            // Dibujar menú
            for (int i = 0; i < menu.Length; i++)
            {
                if (i == seleccionado)
                {
                    Console.ForegroundColor = ConsoleColor.Black;
                    Console.BackgroundColor = ConsoleColor.Cyan;
                    Console.WriteLine($"> {menu[i]}");
                    Console.ResetColor();
                }
                else
                {
                    Console.WriteLine($"  {menu[i]}");
                }
            }

            Console.WriteLine("\nUsa las flechas para navegar, Enter para seleccionar, Esc para salir.");

            var key = Console.ReadKey(true);

            if (key.Key == ConsoleKey.UpArrow)
                seleccionado = (seleccionado - 1 + menu.Length) % menu.Length;
            else if (key.Key == ConsoleKey.DownArrow)
                seleccionado = (seleccionado + 1) % menu.Length;
            else if (key.Key == ConsoleKey.Escape)
                break;
            else if (key.Key == ConsoleKey.Enter)
            {
                if (seleccionado == 0) // Mostrar productos
                {
                    Console.Clear();
                    Console.WriteLine("=== Lista de productos ===\n");
                    for (int i = 0; i < nombresProductos.Length; i++)
                    {
                        string nombre = string.IsNullOrWhiteSpace(nombresProductos[i]) ? "(eliminado)" : nombresProductos[i];
                        Console.WriteLine($"{i + 1}. {nombre,-15} | {preciosProductos[i],8:0.00} EUR");
                    }
                    Console.WriteLine("\nPresiona una tecla para continuar...");
                    Console.ReadKey(true);
                }
                else if (seleccionado == 1) // Actualizar producto
                {
                    int index = 0;
                    while (true)
                    {
                        Console.Clear();
                        Console.WriteLine("=== Selecciona un producto para actualizar ===\n");
                        for (int i = 0; i < nombresProductos.Length; i++)
                        {
                            string nombre = string.IsNullOrWhiteSpace(nombresProductos[i]) ? "(eliminado)" : nombresProductos[i];
                            if (i == index)
                            {
                                Console.ForegroundColor = ConsoleColor.Black;
                                Console.BackgroundColor = ConsoleColor.Yellow;
                                Console.WriteLine($"> {i + 1}. {nombre,-15} | {preciosProductos[i],8:0.00} EUR");
                                Console.ResetColor();
                            }
                            else
                            {
                                Console.WriteLine($"  {i + 1}. {nombre,-15} | {preciosProductos[i],8:0.00} EUR");
                            }
                        }
                        Console.WriteLine("\nFlechas para navegar, Enter para seleccionar, Esc para volver.");
                        var k = Console.ReadKey(true);
                        if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + nombresProductos.Length) % nombresProductos.Length;
                        else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % nombresProductos.Length;
                        else if (k.Key == ConsoleKey.Escape) break;
                        else if (k.Key == ConsoleKey.Enter)
                        {
                            Console.Clear();
                            Console.WriteLine("=== Actualizar producto ===\n");
                            Console.WriteLine($"Seleccionado: {nombresProductos[index]} | Precio anterior: {preciosProductos[index]:0.00} EUR\n");

                            Console.Write("Nuevo nombre (dejar en blanco para mantener): ");
                            string nuevoNombre = Console.ReadLine();
                            if (!string.IsNullOrWhiteSpace(nuevoNombre))
                                nombresProductos[index] = nuevoNombre.Trim();

                            Console.Write("Nuevo precio (dejar en blanco para mantener): ");
                            string precioStr = Console.ReadLine();
                            if (decimal.TryParse(precioStr, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal nuevoPrecio))
                                preciosProductos[index] = Math.Max(0, nuevoPrecio);

                            Console.WriteLine("\nActualización completada. Presiona una tecla para continuar...");
                            Console.ReadKey(true);
                            break;
                        }
                    }
                }
                else if (seleccionado == 2) // Eliminar producto
                {
                    int index = 0;
                    while (true)
                    {
                        Console.Clear();
                        Console.WriteLine("=== Selecciona un producto para eliminar ===\n");
                        for (int i = 0; i < nombresProductos.Length; i++)
                        {
                            string nombre = string.IsNullOrWhiteSpace(nombresProductos[i]) ? "(eliminado)" : nombresProductos[i];
                            if (i == index)
                            {
                                Console.ForegroundColor = ConsoleColor.Black;
                                Console.BackgroundColor = ConsoleColor.Red;
                                Console.WriteLine($"> {i + 1}. {nombre,-15} | {preciosProductos[i],8:0.00} EUR");
                                Console.ResetColor();
                            }
                            else
                            {
                                Console.WriteLine($"  {i + 1}. {nombre,-15} | {preciosProductos[i],8:0.00} EUR");
                            }
                        }
                        Console.WriteLine("\nFlechas para navegar, Enter para seleccionar, Esc para volver.");
                        var k = Console.ReadKey(true);
                        if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + nombresProductos.Length) % nombresProductos.Length;
                        else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % nombresProductos.Length;
                        else if (k.Key == ConsoleKey.Escape) break;
                        else if (k.Key == ConsoleKey.Enter)
                        {
                            nombresProductos[index] = string.Empty;
                            preciosProductos[index] = 0m;
                            Console.WriteLine("\nProducto eliminado. Presiona una tecla para continuar...");
                            Console.ReadKey(true);
                            break;
                        }
                    }
                }
                else if (seleccionado == 3) // Salir
                {
                    return;
                }
            }
        }
    }
}

Notas: