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

Entradas populares de este blog