Ejercicios array de structs
Defina una estructura Libro que contenga los campos titulo, autor y fechaPublicacion. Escriba un programa que cree un arreglo de cinco libros, pida al usuario que ingrese los datos de cada libro y luego muestre los datos almacenados. Utilice la función antes definida para realizar un procedimiento que dado un arreglo de N libros, imprima en pantalla solo aquellos que cumplen que su fecha de publicación es menor a la fecha ingresada por parámetro.
void imprimirMenores (Libro arr[], int N, Fecha f);
#include <stdio.h>
#include <string.h>
#define MAX_LIBROS 5 // límite máximo de libros
// Estructura Fecha
typedef struct {
int dia;
int mes;
int anio;
} Fecha;
// Estructura Libro
typedef struct {
char titulo[50];
char autor[50];
Fecha fechaPublicacion;
} Libro;
// Estructura Biblioteca que contiene array y tope
typedef struct {
Libro arr[MAX_LIBROS];
int tope;
} Biblioteca;
// Función para saber si un año es bisiesto
int esBisiesto(int anio) {
return (anio % 4 == 0 && (anio % 100 != 0 || anio % 400 == 0));
}
// Función para validar fecha
int validarFecha(Fecha f) {
if (f.anio < 1) return 0;
if (f.mes < 1 || f.mes > 12) return 0;
int diasMes[] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (esBisiesto(f.anio)) diasMes[1] = 29;
if (f.dia < 1 || f.dia > diasMes[f.mes - 1]) return 0;
return 1;
}
// Función para comparar fechas: devuelve 1 si f1 < f2
int fechaMenor(Fecha f1, Fecha f2) {
if (f1.anio < f2.anio) return 1;
if (f1.anio > f2.anio) return 0;
if (f1.mes < f2.mes) return 1;
if (f1.mes > f2.mes) return 0;
if (f1.dia < f2.dia) return 1;
return 0;
}
// Función para imprimir libros con fecha menor a f
void imprimirMenores(Biblioteca b, Fecha f) {
printf("\nLibros publicados antes de %02d/%02d/%04d:\n", f.dia, f.mes, f.anio);
for (int i = 0; i < b.tope; i++) {
if (fechaMenor(b.arr[i].fechaPublicacion, f)) {
printf("Titulo: %s\n", b.arr[i].titulo);
printf("Autor: %s\n", b.arr[i].autor);
printf("Fecha: %02d/%02d/%04d\n\n",
b.arr[i].fechaPublicacion.dia,
b.arr[i].fechaPublicacion.mes,
b.arr[i].fechaPublicacion.anio);
}
}
}
// Función para agregar un libro validando fecha
void agregarLibro(Biblioteca *b) {
if (b->tope >= MAX_LIBROS) {
printf(" No se pueden agregar más libros (máximo %d).\n", MAX_LIBROS);
return;
}
int i = b->tope;
printf("Ingrese titulo del libro %d: ", i + 1);
fgets(b->arr[i].titulo, 50, stdin);
b->arr[i].titulo[strcspn(b->arr[i].titulo, "\n")] = '\0';
printf("Ingrese autor del libro %d: ", i + 1);
fgets(b->arr[i].autor, 50, stdin);
b->arr[i].autor[strcspn(b->arr[i].autor, "\n")] = '\0';
do {
printf("Ingrese fecha de publicacion (dd mm aaaa): ");
scanf("%d %d %d", &b->arr[i].fechaPublicacion.dia,
&b->arr[i].fechaPublicacion.mes,
&b->arr[i].fechaPublicacion.anio);
if (!validarFecha(b->arr[i].fechaPublicacion)) {
printf(" Fecha invalida, intente nuevamente.\n");
}
} while (!validarFecha(b->arr[i].fechaPublicacion));
getchar(); // limpiar buffer
b->tope++;
}
int main() {
Biblioteca biblioteca;
Fecha limite;
biblioteca.tope = 0;
int cantidad;
printf("¿Cuántos libros desea ingresar? (máximo %d): ", MAX_LIBROS);
scanf("%d", &cantidad);
getchar(); // limpiar buffer
if (cantidad > MAX_LIBROS) cantidad = MAX_LIBROS;
for (int i = 0; i < cantidad; i++) {
agregarLibro(&biblioteca);
}
// Mostrar todos los libros
printf("\nLista de libros ingresados:\n");
for (int i = 0; i < biblioteca.tope; i++) {
printf("Titulo: %s\n", biblioteca.arr[i].titulo);
printf("Autor: %s\n", biblioteca.arr[i].autor);
printf("Fecha: %02d/%02d/%04d\n\n",
biblioteca.arr[i].fechaPublicacion.dia,
biblioteca.arr[i].fechaPublicacion.mes,
biblioteca.arr[i].fechaPublicacion.anio);
}
// Pedir fecha límite
do {
printf("Ingrese una fecha limite (dd mm aaaa): ");
scanf("%d %d %d", &limite.dia, &limite.mes, &limite.anio);
if (!validarFecha(limite)) {
printf(" Fecha invalida, intente nuevamente.\n");
}
} while (!validarFecha(limite));
// Mostrar libros anteriores a la fecha límite
imprimirMenores(biblioteca, limite);
return 0;
}
Comentarios
Publicar un comentario