Capítulo 3: Estructuras de Control
3.1 Nivel Introductorio
Estructuras condicionales: if, else
Las estructuras condicionales permiten que un programa tome decisiones basadas en condiciones evaluadas en tiempo de ejecución.
Estructura if
Sintaxis:
if (condición) {
// Código a ejecutar si la condición es verdadera
}Ejemplo:
int edad = 18;
if (edad >= 18) {
std::cout << "Eres mayor de edad." << std::endl;
}Estructura if-else
Permite ejecutar un bloque de código alternativo si la condición es falsa.
Sintaxis:
if (condición) {
// Código si la condición es verdadera
} else {
// Código si la condición es falsa
}Ejemplo:
int numero = 5;
if (numero % 2 == 0) {
std::cout << "El número es par." << std::endl;
} else {
std::cout << "El número es impar." << std::endl;
}Bucles: for, while, do-while
Los bucles permiten repetir un bloque de código múltiples veces.
Bucle for
Se utiliza cuando se conoce el número exacto de iteraciones.
Sintaxis:
for (inicialización; condición; actualización) {
// Código a ejecutar en cada iteración
}Ejemplo:
for (int i = 0; i < 5; i++) {
std::cout << "Iteración número: " << i << std::endl;
}Bucle while
Se utiliza cuando no se conoce el número exacto de iteraciones. El bloque de código se ejecuta mientras la condición sea verdadera.
Sintaxis:
while (condición) {
// Código a ejecutar mientras la condición sea verdadera
}Ejemplo:
int contador = 0;
while (contador < 3) {
std::cout << "Contador: " << contador << std::endl;
contador++;
}Bucle do-while
Similar al while, pero garantiza que el bloque de código se ejecute al menos una vez.
Sintaxis:
do {
// Código a ejecutar
} while (condición);Ejemplo:
int numero;
do {
std::cout << "Ingresa un número positivo: ";
std::cin >> numero;
} while (numero <= 0);3.2 Nivel Intermedio
Estructuras de selección múltiple: switch
Permiten ejecutar diferentes bloques de código según el valor de una expresión.
Sintaxis:
switch (expresión) {
case valor1:
// Código para el caso valor1
break;
case valor2:
// Código para el caso valor2
break;
// Más casos...
default:
// Código si no coincide ningún caso
}Ejemplo:
char opcion;
std::cout << "Selecciona una opción (a, b, c): ";
std::cin >> opcion;
switch (opcion) {
case 'a':
std::cout << "Elegiste la opción A." << std::endl;
break;
case 'b':
std::cout << "Elegiste la opción B." << std::endl;
break;
case 'c':
std::cout << "Elegiste la opción C." << std::endl;
break;
default:
std::cout << "Opción no válida." << std::endl;
}Control de bucles: break, continue
break
Sale inmediatamente del bucle o estructura switch.
Ejemplo en un bucle:
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // Sale del bucle cuando i es 5
}
std::cout << i << std::endl;
}continue
Salta a la siguiente iteración del bucle, omitiendo el código restante en la iteración actual.
Ejemplo:
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // Salta los números pares
}
std::cout << i << std::endl;
}Bucles basados en rango (C++11 y posteriores)
Simplifican la iteración sobre contenedores y arrays.
Sintaxis:
for (tipo elemento : contenedor) {
// Código que usa elemento
}Ejemplo con un array:
int numeros[] = {1, 2, 3, 4, 5};
for (int n : numeros) {
std::cout << n << std::endl;
}Ejemplo con un vector:
std::vector<std::string> palabras = {"Hola", "Mundo", "C++"};
for (const std::string& palabra : palabras) {
std::cout << palabra << std::endl;
}3.3 Nivel Avanzado
Estructuras de control avanzadas
Bucles anidados
Se pueden colocar bucles dentro de otros bucles para iterar sobre estructuras multidimensionales.
Ejemplo:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
std::cout << "(" << i << ", " << j << ") ";
}
std::cout << std::endl;
}Etiquetas y goto
El uso de goto no es recomendable, pero es parte del lenguaje.
Ejemplo:
int i = 0;
inicio:
if (i < 5) {
std::cout << i << std::endl;
i++;
goto inicio;
}Nota: El uso de goto puede hacer que el código sea difícil de seguir y mantener.
Expresiones lambda como condiciones
Las expresiones lambda son funciones anónimas que pueden ser definidas en línea.
Sintaxis básica:
[captura](parámetros) -> tipo_retorno {
// Cuerpo de la función
}Uso en estructuras de control:
auto esPar = [](int n) -> bool { return n % 2 == 0; };
int numero = 4;
if (esPar(numero)) {
std::cout << numero << " es par." << std::endl;
}Implementación de máquinas de estado
Una máquina de estado es un modelo de comportamiento que consiste en un conjunto de estados y transiciones entre ellos basadas en eventos o condiciones.
Ejemplo:
Implementemos una máquina de estados simple para un semáforo.
enum EstadoSemaforo { Rojo, Amarillo, Verde };
EstadoSemaforo estadoActual = Rojo;
void cambiarEstado() {
switch (estadoActual) {
case Rojo:
estadoActual = Verde;
std::cout << "Cambiar a Verde." << std::endl;
break;
case Verde:
estadoActual = Amarillo;
std::cout << "Cambiar a Amarillo." << std::endl;
break;
case Amarillo:
estadoActual = Rojo;
std::cout << "Cambiar a Rojo." << std::endl;
break;
}
}
int main() {
for (int i = 0; i < 6; i++) {
cambiarEstado();
}
return 0;
}Salida esperada:
Cambiar a Verde.
Cambiar a Amarillo.
Cambiar a Rojo.
Cambiar a Verde.
Cambiar a Amarillo.
Cambiar a Rojo.Explicación:
- El semáforo inicia en Rojo.
- La función
cambiarEstadomodifica el estado actual según el estado en el que se encuentre. - Utilizamos un
switchpara manejar las transiciones.
