CSharp
Tutorial CSharp: Estructuras de control iterativo
Aprende las estructuras de control iterativo en C# como for, foreach, while, do-while, break y continue con ejemplos claros y aplicaciones prácticas.
Aprende CSharp y certifícateFor y foreach
Las estructuras de control iterativo nos permiten ejecutar un bloque de código repetidamente. En C#, los bucles for
y foreach
son dos de las herramientas más utilizadas para realizar iteraciones sobre colecciones de datos o ejecutar código un número determinado de veces.
Bucle for
El bucle for
es ideal cuando conocemos de antemano el número de iteraciones que queremos realizar. Su sintaxis consta de tres partes principales:
for (inicialización; condición; incremento)
{
// Código a ejecutar en cada iteración
}
Donde:
- Inicialización: Se ejecuta una sola vez al inicio y establece el valor inicial del contador.
- Condición: Se evalúa antes de cada iteración. Si es
true
, el bucle continúa; si esfalse
, el bucle termina. - Incremento: Se ejecuta después de cada iteración, normalmente para actualizar el contador.
Veamos un ejemplo básico que imprime los números del 1 al 5:
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
Este código:
- Inicializa
i
con el valor 1 - Verifica si
i
es menor o igual a 5 - Ejecuta el bloque de código (imprime el valor de
i
) - Incrementa
i
en 1 - Repite desde el paso 2 hasta que la condición sea falsa
También podemos usar el bucle for
para recorrer arrays:
int[] numeros = { 10, 20, 30, 40, 50 };
for (int i = 0; i < numeros.Length; i++)
{
Console.WriteLine($"Elemento {i}: {numeros[i]}");
}
El bucle for
es muy flexible y permite variaciones interesantes:
- Bucle descendente:
for (int i = 10; i > 0; i--)
{
Console.WriteLine(i);
}
Console.WriteLine("¡Despegue!");
- Incrementos personalizados:
// Mostrar números pares del 2 al 10
for (int i = 2; i <= 10; i += 2)
{
Console.WriteLine(i);
}
- Bucles for anidados:
// Crear un patrón de asteriscos (triángulo)
for (int fila = 1; fila <= 5; fila++)
{
for (int columna = 1; columna <= fila; columna++)
{
Console.Write("*");
}
Console.WriteLine();
}
Este último ejemplo produce:
*
**
***
****
*****
Bucle foreach
El bucle foreach
está diseñado específicamente para recorrer colecciones de elementos (arrays, listas, etc.) de manera más sencilla que el bucle for
. Su sintaxis es:
foreach (tipo elemento in colección)
{
// Código a ejecutar para cada elemento
}
Donde:
- tipo: Es el tipo de datos de los elementos en la colección.
- elemento: Es una variable que representa el elemento actual en cada iteración.
- colección: Es la colección que queremos recorrer.
Veamos un ejemplo con un array de strings:
string[] frutas = { "manzana", "banana", "naranja", "uva", "pera" };
foreach (string fruta in frutas)
{
Console.WriteLine($"Me gusta comer {fruta}");
}
La principal ventaja del foreach
es que no necesitamos preocuparnos por los índices o el tamaño de la colección. El bucle automáticamente recorre todos los elementos desde el primero hasta el último.
Otro ejemplo con un array de enteros:
int[] calificaciones = { 85, 92, 78, 95, 88 };
int suma = 0;
foreach (int calificacion in calificaciones)
{
suma += calificacion;
}
double promedio = (double)suma / calificaciones.Length;
Console.WriteLine($"El promedio de calificaciones es: {promedio}");
Diferencias clave entre for y foreach
Control: El bucle
for
ofrece más control sobre la iteración (podemos saltar elementos, recorrer en orden inverso, etc.), mientras queforeach
siempre recorre todos los elementos en orden.Simplicidad: El bucle
foreach
es más simple y legible cuando solo necesitamos acceder a cada elemento de una colección.Modificación: Con
for
podemos modificar los elementos de un array usando su índice, mientras que conforeach
solo podemos leer los valores (la variable de iteración es de solo lectura).
// Modificación con for
int[] numeros = { 1, 2, 3, 4, 5 };
for (int i = 0; i < numeros.Length; i++)
{
numeros[i] *= 2; // Multiplicamos cada elemento por 2
}
// Lectura con foreach
foreach (int numero in numeros)
{
Console.WriteLine(numero); // Muestra: 2, 4, 6, 8, 10
}
Cuándo usar cada uno
Usa
for
cuando:Necesites el índice durante la iteración
Quieras recorrer solo una parte de la colección
Necesites modificar los elementos de la colección
Quieras iterar en orden inverso o con incrementos personalizados
Usa
foreach
cuando:Quieras recorrer toda la colección
No necesites el índice de los elementos
Solo necesites leer los valores (no modificarlos)
Quieras un código más limpio y legible
Los bucles for
y foreach
son herramientas fundamentales para cualquier programador en C#, y dominarlos te permitirá escribir código más eficiente y elegante para manejar colecciones de datos y repeticiones.
While y do-while
Los bucles while
y do-while
son estructuras de control iterativo que nos permiten ejecutar un bloque de código repetidamente mientras se cumpla una condición específica. A diferencia del bucle for
, que normalmente se usa cuando conocemos el número exacto de iteraciones, los bucles while
y do-while
son ideales cuando queremos repetir código basándonos en una condición que puede cambiar durante la ejecución.
Bucle while
El bucle while
evalúa una condición antes de ejecutar el bloque de código. Si la condición es verdadera, el bloque se ejecuta; si es falsa, el bucle termina y el programa continúa con la siguiente instrucción.
La sintaxis básica es:
while (condición)
{
// Código a ejecutar mientras la condición sea verdadera
}
Veamos un ejemplo sencillo que imprime los números del 1 al 5:
int contador = 1;
while (contador <= 5)
{
Console.WriteLine(contador);
contador++; // Importante: actualizar la variable de control
}
Este código:
- Inicializa
contador
con el valor 1 - Verifica si
contador
es menor o igual a 5 - Si es verdadero, ejecuta el bloque de código (imprime el valor y lo incrementa)
- Vuelve al paso 2 y repite hasta que la condición sea falsa
Es crucial actualizar la variable que controla la condición dentro del bucle. Si no lo hacemos, podríamos crear un bucle infinito:
// ¡CUIDADO! Bucle infinito
while (contador <= 5)
{
Console.WriteLine(contador);
// Olvidamos incrementar contador, por lo que siempre será 1
}
El bucle while
es muy útil cuando no sabemos exactamente cuántas iteraciones necesitaremos. Por ejemplo, para leer datos hasta encontrar un valor específico:
int numero = 0;
int suma = 0;
Console.WriteLine("Introduce números para sumar (0 para terminar):");
while (numero != 0)
{
suma += numero;
Console.Write("Introduce un número: ");
numero = Convert.ToInt32(Console.ReadLine());
}
Console.WriteLine($"La suma total es: {suma}");
También podemos usar while
para validar entradas del usuario:
string contraseña = "";
while (contraseña != "secreto")
{
Console.Write("Introduce la contraseña: ");
contraseña = Console.ReadLine();
if (contraseña != "secreto")
{
Console.WriteLine("Contraseña incorrecta. Inténtalo de nuevo.");
}
}
Console.WriteLine("¡Acceso concedido!");
Bucle do-while
El bucle do-while
es similar al while
, pero con una diferencia importante: evalúa la condición después de ejecutar el bloque de código. Esto garantiza que el bloque se ejecute al menos una vez, incluso si la condición es falsa desde el principio.
La sintaxis es:
do
{
// Código a ejecutar
} while (condición);
Veamos el ejemplo anterior adaptado a do-while
:
int contador = 1;
do
{
Console.WriteLine(contador);
contador++;
} while (contador <= 5);
La diferencia clave se nota cuando la condición es falsa desde el inicio:
int x = 10;
// Este bloque no se ejecutará
while (x < 5)
{
Console.WriteLine("Esto no se imprimirá");
}
// Este bloque se ejecutará una vez
do
{
Console.WriteLine("Esto se imprimirá una vez");
} while (x < 5);
El bucle do-while
es perfecto para menús y situaciones donde necesitamos ejecutar código al menos una vez:
int opcion;
do
{
Console.WriteLine("\n--- MENÚ PRINCIPAL ---");
Console.WriteLine("1. Ver datos");
Console.WriteLine("2. Insertar dato");
Console.WriteLine("3. Modificar dato");
Console.WriteLine("4. Eliminar dato");
Console.WriteLine("0. Salir");
Console.Write("Selecciona una opción: ");
opcion = Convert.ToInt32(Console.ReadLine());
switch (opcion)
{
case 1:
Console.WriteLine("Has seleccionado: Ver datos");
break;
case 2:
Console.WriteLine("Has seleccionado: Insertar dato");
break;
case 3:
Console.WriteLine("Has seleccionado: Modificar dato");
break;
case 4:
Console.WriteLine("Has seleccionado: Eliminar dato");
break;
case 0:
Console.WriteLine("Saliendo del programa...");
break;
default:
Console.WriteLine("Opción no válida. Inténtalo de nuevo.");
break;
}
} while (opcion != 0);
También es útil para validar entradas con más claridad:
int edad;
do
{
Console.Write("Introduce tu edad (entre 1 y 120): ");
edad = Convert.ToInt32(Console.ReadLine());
if (edad < 1 || edad > 120)
{
Console.WriteLine("Edad no válida. Inténtalo de nuevo.");
}
} while (edad < 1 || edad > 120);
Console.WriteLine($"Has introducido: {edad} años");
Comparación entre while y do-while
Evaluación de la condición:
while
: Evalúa la condición antes de ejecutar el bloquedo-while
: Evalúa la condición después de ejecutar el bloqueNúmero mínimo de ejecuciones:
while
: Puede ejecutarse 0 veces (si la condición es falsa inicialmente)do-while
: Siempre se ejecuta al menos 1 vezCasos de uso típicos:
while
: Cuando no sabemos si queremos ejecutar el código basándonos en una condicióndo-while
: Cuando queremos ejecutar el código al menos una vez y luego decidir si continuar
Cuándo usar cada uno
Usa
while
cuando:Quieras verificar una condición antes de ejecutar cualquier código
No estés seguro de si el código debe ejecutarse en absoluto
Estés procesando datos hasta encontrar un valor específico
Usa
do-while
cuando:Necesites ejecutar el código al menos una vez
Estés implementando menús de usuario
Estés validando entradas y quieras mostrar el mensaje de solicitud antes de la validación
Ejemplo práctico: Juego de adivinanza
Este ejemplo muestra cómo usar while
para crear un simple juego de adivinanza:
Random random = new Random();
int numeroSecreto = random.Next(1, 101); // Número entre 1 y 100
int intento = 0;
int contador = 0;
Console.WriteLine("¡Adivina el número entre 1 y 100!");
while (intento != numeroSecreto)
{
Console.Write("Introduce tu intento: ");
intento = Convert.ToInt32(Console.ReadLine());
contador++;
if (intento < numeroSecreto)
{
Console.WriteLine("El número es mayor. ¡Sigue intentando!");
}
else if (intento > numeroSecreto)
{
Console.WriteLine("El número es menor. ¡Sigue intentando!");
}
}
Console.WriteLine($"¡Correcto! Has adivinado el número en {contador} intentos.");
Los bucles while
y do-while
son herramientas fundamentales que te permitirán crear programas más interactivos y dinámicos, especialmente cuando trabajas con entradas de usuario o situaciones donde el número de iteraciones no se conoce de antemano.
Break y continue
Las sentencias break
y continue
son herramientas fundamentales para controlar el flujo de ejecución dentro de bucles en C#. Estas instrucciones nos permiten alterar el comportamiento normal de los bucles for
, foreach
, while
y do-while
que hemos visto anteriormente.
La sentencia break
La instrucción break
termina inmediatamente la ejecución del bucle más cercano que la contiene, transfiriendo el control a la primera instrucción después del final del bucle. Es como una "salida de emergencia" que nos permite abandonar un bucle antes de que su condición normal de finalización se cumpla.
Veamos un ejemplo sencillo donde buscamos un número específico en un array:
int[] numeros = { 4, 8, 15, 16, 23, 42 };
int buscar = 16;
for (int i = 0; i < numeros.Length; i++)
{
if (numeros[i] == buscar)
{
Console.WriteLine($"¡Número {buscar} encontrado en la posición {i}!");
break; // Salimos del bucle una vez encontrado
}
}
En este ejemplo, una vez que encontramos el número que buscamos, no necesitamos seguir recorriendo el array, así que usamos break
para salir del bucle inmediatamente.
La sentencia break
es especialmente útil en bucles while cuando encontramos una condición que hace innecesario continuar iterando:
int contador = 1;
while (contador <= 100)
{
if (contador % 7 == 0 && contador % 11 == 0)
{
Console.WriteLine($"El primer número entre 1 y 100 divisible por 7 y 11 es: {contador}");
break; // Encontramos lo que buscábamos, no necesitamos seguir
}
contador++;
}
También podemos usar break
para implementar una condición de salida adicional en un bucle:
int suma = 0;
int numero;
Console.WriteLine("Introduce números para sumar (introduce un número negativo para terminar):");
while (true) // Bucle infinito que romperemos con break
{
Console.Write("Número: ");
numero = Convert.ToInt32(Console.ReadLine());
if (numero < 0)
{
break; // Salimos si el número es negativo
}
suma += numero;
}
Console.WriteLine($"La suma total es: {suma}");
La sentencia continue
A diferencia de break
, la instrucción continue
no termina el bucle, sino que salta a la siguiente iteración, omitiendo el resto del código en la iteración actual. Es como decir "vamos a pasar a la siguiente vuelta" sin ejecutar las líneas que quedan en esta iteración.
Veamos un ejemplo que imprime solo los números pares:
for (int i = 1; i <= 10; i++)
{
if (i % 2 != 0)
{
continue; // Si el número es impar, saltamos a la siguiente iteración
}
Console.WriteLine(i); // Solo se ejecuta para números pares
}
En este código, cuando i
es impar, la instrucción continue
hace que el bucle salte directamente a la siguiente iteración, omitiendo la instrucción Console.WriteLine(i)
.
La sentencia continue
es útil para filtrar elementos durante el procesamiento:
int[] calificaciones = { 65, 78, 92, 55, 43, 87, 91, 60 };
int aprobados = 0;
foreach (int calificacion in calificaciones)
{
if (calificacion < 60)
{
continue; // Saltamos los reprobados
}
aprobados++;
Console.WriteLine($"Calificación aprobatoria: {calificacion}");
}
Console.WriteLine($"Total de estudiantes aprobados: {aprobados}");
También podemos usar continue
en bucles while
y do-while
, pero debemos tener cuidado de no crear bucles infinitos:
int i = 0;
while (i < 10)
{
i++; // Importante: incrementar antes del continue
if (i % 3 == 0)
{
continue; // Saltamos los múltiplos de 3
}
Console.WriteLine(i); // Imprime: 1, 2, 4, 5, 7, 8, 10
}
Observa que en este ejemplo incrementamos i
antes de la instrucción continue
. Si lo hiciéramos después, el incremento nunca se ejecutaría cuando i
sea múltiplo de 3, creando un bucle infinito.
Diferencias entre break y continue
break:
Termina completamente el bucle
El control pasa a la primera instrucción después del bucle
Útil cuando encontramos lo que buscamos y no necesitamos seguir iterando
continue:
Salta a la siguiente iteración del bucle
Omite el resto del código en la iteración actual
Útil para filtrar o saltar elementos que no cumplen ciertos criterios
Ejemplos prácticos
Filtrado de datos con continue
Este ejemplo muestra cómo usar continue
para procesar solo ciertos elementos de una colección:
string[] frutas = { "manzana", "banana", "kiwi", "naranja", "pera", "uva", "sandía" };
Console.WriteLine("Frutas con más de 5 letras:");
foreach (string fruta in frutas)
{
if (fruta.Length <= 5)
{
continue; // Saltamos las frutas con 5 o menos letras
}
Console.WriteLine(fruta); // Imprime: banana, naranja, sandía
}
Búsqueda eficiente con break
Este ejemplo muestra cómo usar break
para detener una búsqueda una vez que encontramos lo que necesitamos:
int[] edades = { 25, 18, 42, 16, 30, 22, 17 };
bool hayMenores = false;
for (int i = 0; i < edades.Length; i++)
{
if (edades[i] < 18)
{
Console.WriteLine("¡Hay al menos un menor de edad en el grupo!");
hayMenores = true;
break; // No necesitamos seguir buscando
}
}
if (!hayMenores)
{
Console.WriteLine("Todos son mayores de edad.");
}
Validación de entrada con bucles y break
Este ejemplo muestra cómo usar break
para salir de un bucle de validación:
int pin;
int intentos = 3;
while (intentos > 0)
{
Console.Write($"Introduce tu PIN (intentos restantes: {intentos}): ");
pin = Convert.ToInt32(Console.ReadLine());
if (pin == 1234) // PIN correcto
{
Console.WriteLine("PIN correcto. Acceso concedido.");
break; // Salimos del bucle si el PIN es correcto
}
intentos--;
if (intentos > 0)
{
Console.WriteLine("PIN incorrecto. Inténtalo de nuevo.");
}
else
{
Console.WriteLine("Has agotado todos tus intentos. Cuenta bloqueada.");
}
}
Procesamiento condicional con continue
Este ejemplo muestra cómo usar continue
para procesar solo ciertos números:
int suma = 0;
for (int i = 1; i <= 100; i++)
{
// Saltamos los números que no son múltiplos ni de 3 ni de 5
if (i % 3 != 0 && i % 5 != 0)
{
continue;
}
suma += i;
}
Console.WriteLine($"La suma de todos los múltiplos de 3 o 5 del 1 al 100 es: {suma}");
Consideraciones importantes
- Usa
break
cuando quieras terminar completamente el bucle. - Usa
continue
cuando quieras saltar a la siguiente iteración sin ejecutar el resto del código en la iteración actual. - Ten cuidado con
continue
en bucleswhile
ydo-while
: asegúrate de que la variable de control se actualice antes delcontinue
. - Ambas instrucciones afectan solo al bucle más cercano que las contiene. En bucles anidados, solo afectan al bucle interno.
- Aunque son herramientas poderosas, el uso excesivo de
break
ycontinue
puede hacer que el código sea más difícil de leer y mantener.
Dominar el uso de break
y continue
te permitirá escribir bucles más eficientes y concisos, evitando iteraciones innecesarias y haciendo que tu código sea más claro y directo.
Otras lecciones de CSharp
Accede a todas las lecciones de CSharp y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A C#
Introducción Y Entorno
Creación De Proyecto C#
Introducción Y Entorno
Variables Y Constantes
Sintaxis
Tipos De Datos
Sintaxis
Operadores
Sintaxis
Control De Flujo
Sintaxis
Funciones
Sintaxis
Estructuras De Control Iterativo
Sintaxis
Interpolación De Strings
Sintaxis
Estructuras De Control Condicional
Sintaxis
Manejo De Valores Nulos
Sintaxis
Clases Y Encapsulación
Programación Orientada A Objetos
Objetos
Programación Orientada A Objetos
Constructores Y Destructores
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Genéricos
Programación Orientada A Objetos
Métodos Virtuales Y Sobrecarga
Programación Orientada A Objetos
Clases Abstractas
Programación Orientada A Objetos
Interfaces
Programación Orientada A Objetos
Propiedades Y Encapsulación
Programación Orientada A Objetos
Métodos De Extensión
Programación Orientada A Objetos
Clases Y Objetos
Programación Orientada A Objetos
Clases Parciales
Programación Orientada A Objetos
Miembros Estáticos
Programación Orientada A Objetos
Tuplas Y Tipos Anónimos
Programación Orientada A Objetos
Arrays Y Listas
Colecciones Y Linq
Diccionarios
Colecciones Y Linq
Conjuntos, Colas Y Pilas
Colecciones Y Linq
Uso De Consultas Linq
Colecciones Y Linq
Linq Avanzado
Colecciones Y Linq
Colas Y Pilas
Colecciones Y Linq
Conjuntos
Colecciones Y Linq
Linq Básico
Colecciones Y Linq
Delegados Funcionales
Programación Funcional
Records
Programación Funcional
Expresiones Lambda
Programación Funcional
Linq Funcional
Programación Funcional
Fundamentos De La Programación Funcional
Programación Funcional
Pattern Matching
Programación Funcional
Testing Unitario Con Xunit
Testing
Excepciones
Excepciones
Delegados
Programación Asíncrona
Eventos
Programación Asíncrona
Lambdas
Programación Asíncrona
Uso De Async Y Await
Programación Asíncrona
Tareas
Programación Asíncrona
Ejercicios de programación de CSharp
Evalúa tus conocimientos de esta lección Estructuras de control iterativo con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
CRUD en C# de modelo Customer sobre una lista
Arrays y listas
Objetos
Excepciones
Eventos
Lambdas
Diccionarios en C#
Variables y constantes
Tipos de datos
Herencia
Operadores
Uso de consultas LINQ
Clases y encapsulación
Uso de consultas LINQ
Excepciones
Control de flujo
Eventos
Diccionarios
Tipos de datos
Conjuntos, colas y pilas
Lambdas
Conjuntos, colas y pilas
Uso de async y await
Tareas
Constructores y destructores
Operadores
Arrays y listas
Polimorfismo
Polimorfismo
Variables y constantes
Proyecto colecciones y LINQ en C#
Clases y encapsulación
Creación de proyecto C#
Uso de async y await
Funciones
Delegados
Delegados
Constructores y destructores
Objetos
Control de flujo
Funciones
Tareas
Proyecto sintaxis en C#
Herencia C Sharp
OOP en C Sharp
Diccionarios
Introducción a C#
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender la sintaxis y uso del bucle for para iteraciones controladas.
- Aprender a utilizar foreach para recorrer colecciones de forma sencilla y segura.
- Diferenciar entre los bucles while y do-while y sus casos de uso apropiados.
- Entender el funcionamiento y aplicación de las sentencias break y continue para controlar el flujo dentro de bucles.
- Saber cuándo usar cada tipo de bucle y sentencia para escribir código eficiente y legible.