Controlar el flujo de un programa significa decirle al código qué hacer según cada situación, usando estructuras como if y switch.
Cuando el programa necesita decidir
Imagina que trabajas en el área de sistemas de Liverpool. Tienes que escribir un programa que calcule el descuento de un cliente según su nivel de membresía. Un cliente básico recibe 5%. Un cliente premium recibe 15%. Si el programa no puede distinguir entre los dos, siempre aplica el mismo descuento. Eso es un error que cuesta dinero.
Aquí entran las estructuras condicionales. Son las herramientas que le permiten a tu programa tomar decisiones. Sin ellas, el código siempre hace lo mismo, sin importar la situación.
El sistema DECIDE: cómo pensar las condiciones
Antes de escribir código, usa el sistema DECIDE para organizar tu lógica:
- Define la pregunta: ¿qué debe evaluar el programa?
- Establece las opciones: ¿cuáles son los posibles casos?
- Conecta cada caso con una acción específica.
- Identifica si los casos son exclusivos o pueden combinarse.
- Decide qué estructura usar:
ifoswitch. - Escribe el código limpio y pruébalo.
Este sistema te evita escribir condicionales desordenadas que son difíciles de leer y mantener.
La estructura if: la decisión más básica
El if evalúa una condición. Si es verdadera, ejecuta un bloque de código. Si es falsa, lo salta.
Así se ve la sintaxis:
if (condicion) {
// código si la condición es verdadera
}
Puedes agregar un else para manejar el caso contrario:
if (condicion) {
// verdadero
} else {
// falso
}
Y si tienes más de dos casos, usas else if:
if (condicion1) {
// caso 1
} else if (condicion2) {
// caso 2
} else {
// cualquier otro caso
}
Ejemplo real: descuentos en Liverpool
Supón que escribes un programa para aplicar descuentos según el nivel de cliente:
#include <iostream>
using namespace std;
int main() {
int nivel;
double precio = 1500.0;
double precioFinal;
cout << "Ingresa tu nivel (1=Basico, 2=Silver, 3=Premium): ";
cin >> nivel;
if (nivel == 1) {
precioFinal = precio * 0.95; // 5% de descuento
} else if (nivel == 2) {
precioFinal = precio * 0.88; // 12% de descuento
} else if (nivel == 3) {
precioFinal = precio * 0.80; // 20% de descuento
} else {
precioFinal = precio;
cout << "Nivel no reconocido. Sin descuento." << endl;
}
cout << "Precio final: $" << precioFinal << endl;
return 0;
}
Si el usuario escribe 3, el programa muestra:
Precio final: $1,200
Nota cómo cada else if cubre un caso distinto. El else al final actúa como red de seguridad.
Condiciones combinadas con operadores lógicos
Recuerdas los operadores lógicos de la lección anterior. Aquí los usas directo en el if.
Ejemplo: un empleado de FEMSA recibe bono si lleva más de 2 años en la empresa Y su evaluación es mayor a 80:
int anios = 3;
int evaluacion = 85;
if (anios > 2 && evaluacion > 80) {
cout << "El empleado recibe bono." << endl;
} else {
cout << "El empleado no califica para bono." << endl;
}
Salida:
El empleado recibe bono.
Si cambias anios a 1, la condición falla y el programa muestra el mensaje alternativo. Así de directo.
La estructura switch: cuando hay muchos casos fijos
El switch es ideal cuando evalúas una sola variable contra varios valores concretos. Es más legible que escribir diez else if seguidos.
Su sintaxis:
switch (variable) {
case valor1:
// código
break;
case valor2:
// código
break;
default:
// código si no hay coincidencia
break;
}
El break es obligatorio. Sin él, el programa sigue ejecutando los casos siguientes aunque no coincidan. Ese error se llama "fall-through" y es muy común en principiantes.
Ejemplo real: menú de productos de Bimbo
Imagina un sistema de pedidos internos en Bimbo. El empleado elige una categoría de producto con un número:
#include <iostream>
using namespace std;
int main() {
int categoria;
cout << "Elige categoria de producto:" << endl;
cout << "1 - Pan de caja" << endl;
cout << "2 - Pastelitos" << endl;
cout << "3 - Tortillas" << endl;
cout << "4 - Donas" << endl;
cin >> categoria;
switch (categoria) {
case 1:
cout << "Seleccionaste: Pan de caja" << endl;
break;
case 2:
cout << "Seleccionaste: Pastelitos" << endl;
break;
case 3:
cout << "Seleccionaste: Tortillas" << endl;
break;
case 4:
cout << "Seleccionaste: Donas" << endl;
break;
default:
cout << "Categoria no valida." << endl;
break;
}
return 0;
}
Si el usuario escribe 2, el programa muestra:
Seleccionaste: Pastelitos
El default maneja cualquier número que no esté en la lista. Siempre inclúyelo.
¿Cuándo usar if y cuándo usar switch?
| Situación | Usa esto |
|---|---|
Comparas rangos (> 100, < 50) |
if / else if |
Combinas condiciones con && o || |
if / else if |
| Tienes muchos valores exactos y fijos | switch |
| El código se lee más claro con lista de opciones | switch |
| Solo tienes dos casos | if / else |
Usa switch cuando las opciones son como un menú. Usa if cuando las condiciones son más complejas o involucran rangos.
Errores comunes al usar condicionales
Error 1: usar = en lugar de ==
Este es el error más frecuente. Recuerda de la lección anterior: = asigna, == compara.
// MAL: esto siempre es verdadero y sobreescribe la variable
if (nivel = 3) { ... }
// BIEN: esto compara correctamente
if (nivel == 3) { ... }
Error 2: olvidar el break en switch
Sin break, el programa ejecuta todos los casos que vienen después:
switch (categoria) {
case 1:
cout << "Pan de caja" << endl;
// falta break aqui!
case 2:
cout << "Pastelitos" << endl; // esto tambien se ejecuta si categoria == 1
break;
}
Siempre pon break al final de cada case.
Error 3: no manejar el caso else o default
Si el usuario ingresa un valor inesperado y no tienes else ni default, el programa no hace nada. Peor aún, puede continuar con variables sin valor correcto.
Error 4: condiciones imposibles
int edad = 25;
if (edad > 18 && edad < 18) { // esto NUNCA es verdadero
cout << "Imposible" << endl;
}
Revisa tus condiciones lógicas antes de compilar. Una condición que nunca se cumple es código muerto.
Cómo aplicar esto en tu próximo programa
Sigue estos pasos cada vez que necesites una condicional:
- Identifica qué variable estás evaluando.
- Lista todos los casos posibles en papel o en comentarios.
- Decide si usas
ifoswitchsegún la tabla de arriba. - Escribe siempre el caso
elseodefaultaunque creas que no se necesita. - Prueba el programa con cada valor posible, incluyendo datos raros o incorrectos.
Por ejemplo, si construyes un simulador de nómina para una empresa mediana, prueba con salarios de $0, $10,000, $50,000 y valores negativos. El programa debe responder correctamente en todos los casos.
Combinar if y switch en un mismo programa
No tienes que elegir solo uno. Puedes usarlos juntos cuando la lógica lo requiere.
Supón un sistema de recursos humanos en Mercado Libre. Primero validas si el empleado está activo con un if. Luego usas switch para determinar su área:
bool activo = true;
int area = 2;
if (activo) {
switch (area) {
case 1:
cout << "Area: Logistica" << endl;
break;
case 2:
cout << "Area: Tecnologia" << endl;
break;
case 3:
cout << "Area: Ventas" << endl;
break;
default:
cout << "Area no registrada" << endl;
break;
}
} else {
cout << "Empleado inactivo. Sin acceso al sistema." << endl;
}
Este patrón es muy común en aplicaciones reales. El if externo actúa como guardia. El switch interno maneja la lógica de negocio.
Un programa que no puede decidir solo genera problemas para todos los usuarios.