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

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.