Modulo 02: Condicionales en C

Idea central

Un programa sin condicionales ejecuta siempre las mismas instrucciones. Los condicionales permiten que el programa tome decisiones: ejecutar un bloque de codigo u otro dependiendo de si una condicion es verdadera o falsa. En C, 0 es falso y cualquier valor distinto de 0 es verdadero.


Que aprendes

ConceptoPara que sirve
if / else if / elseElegir entre dos o mas ramas de ejecucion segun una condicion
switch / caseElegir entre muchos casos discretos de forma limpia (sin anidamientos)
Operadores relacionales == != < > <= >=Comparar dos valores; producen 1 (verdadero) o 0 (falso)
Operadores logicos && || !Combinar o negar condiciones
Operador ternario ?:Forma compacta de un if-else de una sola expresion

Explicacion

Patron 1 — if / else if / else

Categoria: decision secuencial; se evaluan las condiciones de arriba hacia abajo y solo se ejecuta el primer bloque cuya condicion sea verdadera.

Sintaxis:

if (condicion1) {
    // bloque A
} else if (condicion2) {
    // bloque B
} else {
    // bloque por defecto
}

Ejemplo corto:

int x = 7;
if (x > 0) {
    printf("positivo\n");
} else if (x < 0) {
    printf("negativo\n");
} else {
    printf("cero\n");
}
// Imprime: positivo

Regla practica: el else es opcional, pero si lo omites y ninguna condicion se cumple, no se ejecuta nada. Eso puede ser lo que quieres o puede ser un bug silencioso; piensalo antes.


Patron 2 — switch / case

Categoria: seleccion por valor entero (o caracter); mas legible que una cadena de if-else cuando los casos son discretos y conocidos.

Sintaxis:

switch (expresion_entera) {
    case VALOR_A:
        // codigo
        break;
    case VALOR_B:
        // codigo
        break;
    default:
        // si ningun case coincide
        break;
}

Importante: sin break, la ejecucion “cae” al siguiente case (fall-through). A veces es intencional; casi siempre es un error.

Ejemplo corto:

char op = '+';
switch (op) {
    case '+': printf("suma\n");   break;
    case '-': printf("resta\n");  break;
    default:  printf("otro\n");   break;
}
// Imprime: suma

Patron 3 — Operadores relacionales y logicos

OperadorSignificadoEjemplo (a=3, b=5)Resultado
==iguala == 31 (verdad)
!=distintoa != b1
<menor quea < b1
>mayor quea > b0
<=menor o igualb <= 51
>=mayor o iguala >= 40
&&AND logicoa > 0 && b > 01
||OR logicoa > 4 || b > 41
!NOT logico!(a == 3)0

Cortocircuito: en A && B, si A es falso, B nunca se evalua. En A || B, si A es verdadero, B nunca se evalua. Util para evitar divisiones por cero o accesos invalidos.


Patron 4 — Operador ternario ?:

Categoria: expresion (no sentencia), produce un valor; util para asignaciones condicionales en una linea.

Sintaxis:

variable = (condicion) ? valor_si_verdad : valor_si_falso;

Ejemplo corto:

int n = 8;
char *paridad = (n % 2 == 0) ? "par" : "impar";
printf("%s\n", paridad);   // par

Cuando la logica es mas compleja que una asignacion simple, usa if-else para mayor claridad.


Worked example

Enunciado: Dado un entero leido por teclado, indica si es par o impar, si es positivo/negativo/cero, y si es divisible por 3.

Razonamiento paso a paso:

  1. Leer el entero con scanf.
  2. Paridad: n % 2 == 0 es par.
  3. Signo: tres casos excluyentes if / else if / else.
  4. Divisibilidad por 3: n % 3 == 0.
#include <stdio.h>
 
int main(void) {
    int n;
    printf("Introduce un entero: ");
    scanf("%d", &n);                        // &n: scanf necesita la DIRECCION
 
    // --- Paridad ---
    if (n % 2 == 0) {
        printf("%d es par\n", n);
    } else {
        printf("%d es impar\n", n);
    }
 
    // --- Signo ---
    if (n > 0) {
        printf("Es positivo\n");
    } else if (n < 0) {
        printf("Es negativo\n");
    } else {
        printf("Es cero\n");
    }
 
    // --- Divisibilidad ---
    if (n % 3 == 0) {
        printf("Es divisible por 3\n");
    } else {
        printf("No es divisible por 3\n");
    }
 
    return 0;
}

Traza con n = -6:

  • -6 % 2 == 0 par
  • -6 < 0 negativo
  • -6 % 3 == 0 divisible por 3

Salida esperada:

-6 es par
Es negativo
Es divisible por 3

Errores tipicos en C

  1. = en lugar de == en la condicion

    if (x = 5) { ... }   // ASIGNA 5 a x, siempre verdadero
    if (x == 5) { ... }  // CORRECTO: compara

    Truco: escribe 5 == x (yoda condition); si pones = el compilador da error.

  2. Olvidar break en switch Sin break, el flujo cae al siguiente case. El compilador no avisa por defecto; -Wall ayuda poco aqui. Pon siempre break salvo que el fall-through sea deliberado y lo documentes.

  3. scanf sin &

    scanf("%d", n);    // undefined behavior: pasa el VALOR, no la direccion
    scanf("%d", &n);   // correcto: pasa la DIRECCION de n
  4. Comparar floats con == Los numeros de punto flotante tienen error de representacion. Nunca hagas if (f == 0.0); usa if (fabs(f) < 1e-9) (requiere math.h). En este modulo trabajamos con enteros, pero conviene saberlo.

  5. else colgante (dangling else)

    if (a > 0)
        if (b > 0)
            printf("ambos positivos\n");
    else               // pertenece al segundo if, NO al primero
        printf("a negativo\n");

    Usa siempre llaves {} para evitar ambiguedad, aunque el cuerpo sea una sola linea.


Ejercicios

Practica lo de este módulo. Cada enlace abre el ejercicio con su enunciado, diagrama de flujo, explicación y el código listo para copiar.


Conexiones