If-Else: Decisiones en tu Programa
Aprende a usar if, else if y else para controlar el flujo de tu programa
¿Qué son los condicionales?
Imagina que estás en un cruce de caminos. Dependiendo de la dirección que elijas, llegarás a un lugar diferente. Los condicionales son exactamente eso en programación: puntos donde tu programa decide qué camino seguir.
Sin condicionales, tu programa haría siempre lo mismo, sin importar los datos que reciba. Con condicionales, puede reaccionar y adaptarse.
La instrucción if
La forma más simple de tomar una decisión:
if (condición) {
// Este código se ejecuta SOLO si la condición es verdadera
}
Analogía: "Si está lloviendo, lleva paraguas."
int temperatura = 38;
if (temperatura > 37) {
cout << "¡Tienes fiebre!" << endl;
}
Si temperatura es mayor a 37, imprime el mensaje. Si no, no pasa nada y el programa continúa.
Las llaves {} son importantes
Las llaves encierran el bloque de código que pertenece al if. Si tienes una sola instrucción, las llaves son opcionales (pero se recomienda siempre usarlas):
// ✅ Con llaves (recomendado)
if (x > 0) {
cout << "Positivo" << endl;
}
// ✅ Sin llaves (funciona, pero no recomendado)
if (x > 0)
cout << "Positivo" << endl;
// ❌ Error común sin llaves:
if (x > 0)
cout << "Positivo" << endl;
cout << "¡Seguro!" << endl; // ¡Esta línea SIEMPRE se ejecuta!
// Solo la primera línea pertenece al if
Siempre usa llaves, incluso para una sola línea. Es más seguro y evita errores sutiles cuando agregas más instrucciones después.
La instrucción if-else
¿Qué pasa si quieres hacer algo cuando la condición es falsa? Usas else:
if (condición) {
// Se ejecuta si la condición es verdadera
} else {
// Se ejecuta si la condición es falsa
}
Analogía: "Si llueve, lleva paraguas. Si no, lleva lentes de sol."
int edad = 16;
if (edad >= 18) {
cout << "Eres mayor de edad" << endl;
} else {
cout << "Eres menor de edad" << endl;
}
El programa siempre ejecutará exactamente uno de los dos bloques: nunca ambos, nunca ninguno.
La instrucción else if
¿Y si hay más de dos opciones? Usas else if para encadenar condiciones:
if (condición1) {
// Se ejecuta si condición1 es verdadera
} else if (condición2) {
// Se ejecuta si condición1 es falsa Y condición2 es verdadera
} else if (condición3) {
// Se ejecuta si las anteriores son falsas Y condición3 es verdadera
} else {
// Se ejecuta si NINGUNA condición fue verdadera
}
Analogía: Un semáforo tiene tres opciones:
string color;
cin >> color;
if (color == "verde") {
cout << "Avanza" << endl;
} else if (color == "amarillo") {
cout << "Precaución" << endl;
} else if (color == "rojo") {
cout << "Alto" << endl;
} else {
cout << "Color no válido" << endl;
}
Importante: Las condiciones se evalúan de arriba a abajo. En cuanto una es verdadera, se ejecuta su bloque y se salta todas las demás. El else final es opcional y actúa como un "si ninguna de las anteriores":
int calificacion = 85;
if (calificacion >= 90) {
cout << "A (Excelente)" << endl;
} else if (calificacion >= 80) {
cout << "B (Bueno)" << endl; // ← Se ejecuta este
} else if (calificacion >= 70) {
cout << "C (Regular)" << endl; // No se evalúa
} else if (calificacion >= 60) {
cout << "D (Suficiente)" << endl; // No se evalúa
} else {
cout << "F (Reprobado)" << endl; // No se evalúa
}
Aunque 85 también es >= 70 y >= 60, como ya entró en la primera condición verdadera (>= 80), ignora el resto.
Condicionales anidados
Puedes poner un if dentro de otro if:
int edad = 16;
bool tienePermiso = true;
if (edad >= 15) {
cout << "Tienes la edad mínima" << endl;
if (tienePermiso) {
cout << "¡Puedes participar!" << endl;
} else {
cout << "Necesitas permiso de tus padres" << endl;
}
} else {
cout << "Aún no tienes la edad suficiente" << endl;
}
Sin embargo, los condicionales anidados pueden volverse difíciles de leer. A menudo es mejor combinar condiciones con && y ||:
// Equivalente y más legible:
if (edad >= 15 && tienePermiso) {
cout << "¡Puedes participar!" << endl;
} else if (edad >= 15) {
cout << "Necesitas permiso de tus padres" << endl;
} else {
cout << "Aún no tienes la edad suficiente" << endl;
}
El operador ternario ? :
Es un atajo para if-else simples, todo en una línea:
// Con if-else
int resultado;
if (a > b) {
resultado = a;
} else {
resultado = b;
}
// Con operador ternario (equivalente)
int resultado = (a > b) ? a : b;
La sintaxis es: condición ? valor_si_verdadero : valor_si_falso
int edad = 16;
string status = (edad >= 18) ? "Mayor" : "Menor";
cout << status << endl; // Menor
// Puede usarse directamente en cout
cout << "Eres " << ((edad >= 18) ? "mayor" : "menor") << " de edad" << endl;
El operador ternario es útil para asignaciones simples, pero no abuses de él. Si la lógica es compleja, un if-else normal es más legible.
Switch: otra forma de elegir
Cuando comparas una variable contra múltiples valores constantes, switch puede ser más limpio que una cadena de else if:
int dia;
cin >> dia;
switch (dia) {
case 1:
cout << "Lunes" << endl;
break;
case 2:
cout << "Martes" << endl;
break;
case 3:
cout << "Miércoles" << endl;
break;
case 4:
cout << "Jueves" << endl;
break;
case 5:
cout << "Viernes" << endl;
break;
case 6:
cout << "Sábado" << endl;
break;
case 7:
cout << "Domingo" << endl;
break;
default:
cout << "Día no válido" << endl;
break;
}
¡No olvides el break! Sin él, la ejecución "cae" al siguiente caso:
int x = 1;
switch (x) {
case 1:
cout << "Uno" << endl;
// Sin break, continúa al siguiente case
case 2:
cout << "Dos" << endl;
break;
}
// Imprime: "Uno" Y "Dos" (porque falta el break después del case 1)
switch solo funciona con valores enteros o char (no con string ni double). Para comparar strings o condiciones complejas, usa if-else.
Patrones comunes en competencias
Patrón 1: Encontrar el máximo de varios números
int a, b, c;
cin >> a >> b >> c;
int maximo;
if (a >= b && a >= c) {
maximo = a;
} else if (b >= a && b >= c) {
maximo = b;
} else {
maximo = c;
}
// O más simple con la función max:
int maximo2 = max({a, b, c});
Patrón 2: Clasificar un número
int n;
cin >> n;
if (n > 0) {
cout << "Positivo" << endl;
} else if (n < 0) {
cout << "Negativo" << endl;
} else {
cout << "Cero" << endl;
}
Patrón 3: Verificar múltiples condiciones
int anio;
cin >> anio;
// Un año bisiesto si:
// - Es divisible entre 4 Y no entre 100
// - O es divisible entre 400
if ((anio % 4 == 0 && anio % 100 != 0) || anio % 400 == 0) {
cout << "Bisiesto" << endl;
} else {
cout << "No bisiesto" << endl;
}
Errores comunes
1. Usar = en lugar de ==
int x = 5;
// ❌ Esto ASIGNA 10 a x (siempre es "verdadero")
if (x = 10) {
cout << "x es 10" << endl; // Siempre se ejecuta
}
// ✅ Esto COMPARA x con 10
if (x == 10) {
cout << "x es 10" << endl;
}
2. Punto y coma después del if
// ❌ El punto y coma termina el if prematuramente
if (x > 5);
{
cout << "Mayor que 5" << endl; // Siempre se ejecuta
}
// ✅ Sin punto y coma
if (x > 5) {
cout << "Mayor que 5" << endl;
}
3. Condiciones que siempre son verdaderas o falsas
int x = 5;
// ❌ Siempre verdadero (no es una comparación válida)
if (x) { // Cualquier número diferente de 0 es true
cout << "Verdadero" << endl;
}
// ❌ Comparación incorrecta
if (x == 3 || 4) { // 4 siempre es true
// Debería ser: if (x == 3 || x == 4)
}
Ejercicio de práctica
Lee tres números que representan los lados de un triángulo. Determina si es equilátero (tres lados iguales), isósceles (dos lados iguales) o escaleno (tres lados diferentes). Primero verifica que sea un triángulo válido.
Ver solución
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
// Primero verificar que es un triángulo válido
if (a + b <= c || a + c <= b || b + c <= a) {
cout << "No es un triangulo valido" << endl;
} else if (a == b && b == c) {
cout << "Equilatero" << endl;
} else if (a == b || a == c || b == c) {
cout << "Isosceles" << endl;
} else {
cout << "Escaleno" << endl;
}
return 0;
}
Nota: El orden importa. Verificamos equilátero antes que isósceles porque un triángulo equilátero también cumple la condición de isósceles (tiene dos lados iguales... ¡y tres!).
Siguiente paso
Aprende el Ciclo For para repetir instrucciones un número determinado de veces.
