Ejercicio 05 — Define Fecha {dia, mes, anio} y compara dos fechas indicando cual es…

Dificultad: amarillo · Módulo 08 (Structs)

Enunciado

Define Fecha {dia, mes, anio} y compara dos fechas indicando cual es anterior.

Diagrama de flujo

Diagrama de flujo del ejercicio 05

Cómo se resuelve

Fecha agrupa tres enteros: dia, mes, anio. Lo interesante es cómo se comparan dos fechas, porque no basta con mirar un campo: hay que ir del más significativo al menos significativo.

La función int fecha_anterior(Fecha a, Fecha b) compara primero el año, luego el mes, y solo si empatan, el día, y devuelve un código: -1 si a es anterior, 1 si es posterior, 0 si son iguales.

if (a.anio != b.anio) return (a.anio < b.anio) ? -1 : 1;
if (a.mes  != b.mes)  return (a.mes  < b.mes)  ? -1 : 1;
if (a.dia  != b.dia)  return (a.dia  < b.dia)  ? -1 : 1;
return 0;

El operador ternario condicion ? valor_si : valor_no es un if/else compacto que devuelve un valor. En cuanto un campo difiere, se decide y se sale con return; si nunca difieren, las fechas son iguales. En main se traduce ese -1/0/1 a un mensaje con if/else if/else.

Trampa habitual: intentar comparar los structs directamente con if (a == b). En C eso no compila (o no hace lo que crees): el == no compara struct campo a campo. Siempre necesitas una función que recorra los campos uno a uno, como esta.

Para practicar — cópialo en Dev-C++

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
 * Curso de C — Modulo 08: Structs
 * Ejercicio 05 — PRACTICA (rellena los TODO)
 * Enunciado: Define Fecha {dia, mes, anio} y compara dos fechas indicando cual es anterior.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej05_practica.c -o ej05 && ./ej05
 */
 
#include <stdio.h>
 
// TODO 1: Define typedef struct Fecha con tres campos int: dia, mes, anio.
 
// TODO 2: Escribe int fecha_anterior(Fecha a, Fecha b).
//         Logica: compara anio primero. Si son iguales, compara mes. Si son iguales, compara dia.
//         Devuelve -1 si a es anterior, 1 si a es posterior, 0 si son iguales.
//         Pista: usa if anidados o el operador ternario (condicion ? valor_si : valor_no).
 
int main(void) {
    // TODO 3: Declara f1 y f2 de tipo Fecha.
    //         Leelas con scanf("%d %d %d", &f1.dia, &f1.mes, &f1.anio).
 
    // TODO 4: Llama a fecha_anterior(f1, f2) y guarda el resultado en una variable int.
 
    // TODO 5: Con if/else if/else imprime:
    //         -1 -> "La primera fecha es anterior.\n"
    //          1 -> "La primera fecha es posterior.\n"
    //          0 -> "Las fechas son iguales.\n"
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 08: Structs
 * Ejercicio 05 — MODELO (resuelto)
 * Enunciado: Define Fecha {dia, mes, anio} y compara dos fechas indicando cual es anterior.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej05_modelo.c -o ej05 && ./ej05
 */
 
#include <stdio.h>
 
typedef struct {
    int dia;
    int mes;
    int anio;
} Fecha;
 
/*
 * Devuelve:
 *  -1 si a es anterior a b
 *   0 si son iguales
 *   1 si a es posterior a b
 */
int fecha_anterior(Fecha a, Fecha b) {
    // Comparar anio primero, luego mes, luego dia
    if (a.anio != b.anio) return (a.anio < b.anio) ? -1 : 1;
    if (a.mes  != b.mes)  return (a.mes  < b.mes)  ? -1 : 1;
    if (a.dia  != b.dia)  return (a.dia  < b.dia)  ? -1 : 1;
    return 0;
}
 
int main(void) {
    Fecha f1, f2;
 
    printf("Introduce fecha 1 (dia mes anio): ");
    scanf("%d %d %d", &f1.dia, &f1.mes, &f1.anio);
 
    printf("Introduce fecha 2 (dia mes anio): ");
    scanf("%d %d %d", &f2.dia, &f2.mes, &f2.anio);
 
    int resultado = fecha_anterior(f1, f2);
 
    if (resultado == -1) {
        printf("La primera fecha es anterior.\n");
    } else if (resultado == 1) {
        printf("La primera fecha es posterior.\n");
    } else {
        printf("Las fechas son iguales.\n");
    }
 
    return 0;
}

Cómo usarlo

Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.

Conexiones