Estructuras de Controlc++ifelsecondicionalescontrol de flujo

If-Else: Decisiones en tu Programa

Aprende a usar if, else if y else para controlar el flujo de tu programa

OOI Oaxaca9 de febrero de 20269 min read

¿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.