Curso de C · Módulo 3 de 12

Condicionales en C: if, else y switch

Qué aprenderás en este módulo

que tus programas tomen decisiones.

Incluye 4 ejercicios con pistas y solución y un quiz de 5 preguntas. Tiempo estimado: 50 minutos.

1. Verdadero y falso en C

No existe el tipo booleano "clásico": 0 es falso y cualquier otro valor es verdadero. Las comparaciones devuelven 1 o 0. (Con #include <stdbool.h> tienes bool, true y false, que son simples alias de eso.)

2. Operadores

Tipo Operadores
Comparación == != < > <= >=
Lógicos && (y) &#124;&#124; (o) ! (no)
Asignación = += -= *= /= %=

🐛 El error clásico: if (x = 5) asigna 5 y siempre es verdadero. Se compara con ==.

&& y || hacen cortocircuito: if (p != NULL && p->x > 0) no evalúa lo segundo si lo primero es falso (esto te salvará de crashes).

3. if / else if / else

if (nota >= 9)       printf("Sobresaliente\n");
else if (nota >= 7)  printf("Notable\n");
else if (nota >= 5)  printf("Aprobado\n");
else                 printf("Suspenso\n");

Usa siempre llaves { } aunque haya una sola sentencia; evita un clásico fallo al añadir líneas después:

if (x > 0) {
    printf("positivo\n");
}

4. switch

Para comparar un entero o char con varios valores constantes:

switch (opcion) {
    case 1:  printf("Uno\n");  break;
    case 2:
    case 3:  printf("Dos o tres\n"); break;   // varios case juntos
    default: printf("Otro\n");
}

Sin break, la ejecución cae al siguiente case (fall-through). No funciona con cadenas ni double.

5. Operador ternario

int mayor = (a > b) ? a : b;

6. Operadores de bits (avance)

& | ^ ~ << >>. Los verás más adelante; ahora solo ten presente que & (bits) no es && (lógico).

7. El resto de la división con negativos

En C99+ el resto toma el signo del dividendo: -7 % 2 vale -1. Por eso para "es impar" se usa n % 2 != 0, no n % 2 == 1.

Prueba esto

  1. Predice y comprueba: printf("%d\n", 5 > 3 && 2 > 4);
  2. Escribe un switch sin break y observa el fall-through.
  3. Haz if (x = 0) y mira qué avisa el compilador con -Wall.

Resumen

  • 0 = falso; todo lo demás = verdadero.
  • == compara, = asigna.
  • switch necesita break en cada rama (salvo que busques el fall-through).

Ejercicios prácticos del módulo 3

Programar se aprende programando: intenta cada ejercicio antes de mirar las pistas, y usa la solución solo para comparar. Marca los que resuelvas y tu progreso se guarda en este navegador.

3.1 Par o impar
Lee un entero e imprime "par" o "impar" (en minusculas). Ojo con los negativos: -3 es impar.

Entrada de ejemplo

4

Salida esperada

par

Tu punto de partida

#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    // TODO

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

El resto de dividir entre 2 (n % 2) es 0 en los pares.

Pista 2

En C, -3 % 2 vale -1 (no 1): compara con 0, no con 1.

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    if (n % 2 == 0) printf("par\n");
    else printf("impar\n");
    return 0;
}
3.2 El mayor de tres
Lee tres enteros e imprime el mayor con el texto: El mayor es 9

Entrada de ejemplo

3 9 5

Salida esperada

El mayor es 9

Tu punto de partida

#include <stdio.h>

int main(void) {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    // TODO

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

Guarda en una variable 'm' el mayor visto hasta ahora y comparalo con cada numero.

Pista 2

int m = a; if (b > m) m = b; if (c > m) m = c;

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    int m = a;
    if (b > m) m = b;
    if (c > m) m = c;
    printf("El mayor es %d\n", m);
    return 0;
}
3.3 Anio bisiesto
Lee un anio e imprime "bisiesto" o "no bisiesto". Regla: es bisiesto si es divisible por 4, EXCEPTO los divisibles por 100, salvo que lo sean tambien por 400. (2000 y 2024 si; 1900 y 2023 no.) Usa operadores logicos && y ||.

Entrada de ejemplo

2024

Salida esperada

bisiesto

Tu punto de partida

#include <stdio.h>

int main(void) {
    int anio;
    scanf("%d", &anio);
    // TODO

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

Son dos casos que se suman: (div por 4 Y no por 100) O (div por 400).

Pista 2

if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0)

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int anio;
    scanf("%d", &anio);
    if ((anio % 4 == 0 && anio % 100 != 0) || anio % 400 == 0)
        printf("bisiesto\n");
    else
        printf("no bisiesto\n");
    return 0;
}
3.4 Calculadora con switch
Lee una operacion en la forma "a op b" (por ejemplo "6 * 7") con op en + - * / e imprime el resultado con 2 decimales: 42.00 Casos de error (imprime exactamente): - division por cero -> Error: division por cero - operador distinto -> Error: operador invalido Usa switch. Para leer el operador usa " %c" (con un espacio delante, para saltar blancos).

Entrada de ejemplo

6 * 7

Salida esperada

42.00

Tu punto de partida

#include <stdio.h>

int main(void) {
    double a, b;
    char op;
    scanf("%lf %c %lf", &a, &op, &b);
    // TODO: switch (op) { ... }

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

Cada case termina con break; si no, "cae" al siguiente (fall-through).

Pista 2

Dentro de case '/' comprueba b == 0 antes de dividir.

Pista 3

default: cubre cualquier otro operador.

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    double a, b;
    char op;
    scanf("%lf %c %lf", &a, &op, &b);
    switch (op) {
        case '+': printf("%.2f\n", a + b); break;
        case '-': printf("%.2f\n", a - b); break;
        case '*': printf("%.2f\n", a * b); break;
        case '/':
            if (b == 0) printf("Error: division por cero\n");
            else printf("%.2f\n", a / b);
            break;
        default:
            printf("Error: operador invalido\n");
    }
    return 0;
}

Quiz del módulo 3

5 preguntas para comprobar que has fijado los conceptos. Las opciones se barajan cada vez.