Desarrollando un Sistema de Gestión de Biblioteca en C

En el ámbito de la programación, los proyectos prácticos no solo refuerzan el aprendizaje de conceptos teóricos, sino que también mejoran las habilidades de resolución de problemas y la capacidad de aplicar el conocimiento a situaciones reales. Con esto en mente, presentamos un ejercicio de programación en C orientado a estudiantes intermedios y avanzados: el desarrollo de un sistema de gestión de biblioteca.

Este proyecto tiene como objetivo crear un programa en C que permita a los usuarios gestionar un catálogo de libros en una biblioteca. A través de este ejercicio, los programadores podrán practicar la manipulación de estructuras, archivos, y la gestión dinámica de la memoria, elementos cruciales en la programación en C.

Objetivos del Ejercicio

El sistema de gestión de biblioteca deberá ser capaz de realizar las siguientes operaciones:

  1. Agregar libros al catálogo: Permitir a los usuarios introducir datos de libros, como título, autor, año de publicación, y categoría.
  2. Listar todos los libros disponibles: Mostrar un listado de todos los libros registrados en el sistema.
  3. Buscar libros: Permitir a los usuarios buscar libros por título, autor, o categoría.
  4. Eliminar libros del catálogo: Dar la opción de eliminar registros de libros específicos del sistema.
  5. Guardar y cargar el catálogo desde archivos: Mantener la persistencia de los datos permitiendo guardar el catálogo actual en un archivo y cargarlo posteriormente.

Esqueleto del Código

A continuación, se ofrece un esquema básico del programa:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LIBROS 100

typedef struct {
    char titulo[100];
    char autor[100];
    int anio;
    char categoria[50];
} Libro;

Libro biblioteca[MAX_LIBROS];
int contadorLibros = 0;

void agregarLibro() {
    if (contadorLibros < MAX_LIBROS) {
        printf("Introduzca el título del libro: ");
        scanf("%s", biblioteca[contadorLibros].titulo);
        printf("Introduzca el autor del libro: ");
        scanf("%s", biblioteca[contadorLibros].autor);
        printf("Introduzca el año de publicación: ");
        scanf("%d", &biblioteca[contadorLibros].anio);
        printf("Introduzca la categoría del libro: ");
        scanf("%s", biblioteca[contadorLibros].categoria);
        contadorLibros++;
        printf("Libro agregado exitosamente.\n");
    } else {
        printf("La biblioteca está llena. No se pueden agregar más libros.\n");
    }
}

void listarLibros() {
    printf("Listado de libros:\n");
    for (int i = 0; i < contadorLibros; i++) {
        printf("%d. %s - %s (%d) [%s]\n", i + 1, biblioteca[i].titulo, biblioteca[i].autor, biblioteca[i].anio, biblioteca[i].categoria);
    }
}

void buscarLibro() {
    char buscar[100];
    printf("Ingrese el título del libro a buscar: ");
    scanf("%s", buscar);

    for (int i = 0; i < contadorLibros; i++) {
        if (strcmp(biblioteca[i].titulo, buscar) == 0) {
            printf("Libro encontrado: %s - %s (%d) [%s]\n", biblioteca[i].titulo, biblioteca[i].autor, biblioteca[i].anio, biblioteca[i].categoria);
            return;
        }
    }
    printf("Libro no encontrado.\n");
}

void eliminarLibro() {
    int posicion;
    listarLibros();
    printf("Ingrese el número del libro a eliminar: ");
    scanf("%d", &posicion);

    if (posicion < 1 || posicion > contadorLibros) {
        printf("Posición inválida.\n");
    } else {
        for (int i = posicion - 1; i < contadorLibros - 1; i++) {
            biblioteca[i] = biblioteca[i + 1];
        }
        contadorLibros--;
        printf("Libro eliminado.\n");
    }
}

void guardarCatalogo() {
    FILE *archivo = fopen("catalogo.txt", "w");
    if (archivo == NULL) {
        printf("No se pudo abrir el archivo para escribir.\n");
        return;
    }

    for (int i = 0; i < contadorLibros; i++) {
        fprintf(archivo, "%s,%s,%d,%s\n", biblioteca[i].titulo, biblioteca[i].autor, biblioteca[i].anio, biblioteca[i].categoria);
    }

    fclose(archivo);
    printf("Catálogo guardado con éxito.\n");
}

void cargarCatalogo() {
    FILE *archivo = fopen("catalogo.txt", "r");
    if (archivo == NULL) {
        printf("No se pudo abrir el archivo para leer.\n");
        return;
    }

    contadorLibros = 0; // Reiniciar el contador de libros
    while (fscanf(archivo, "%[^,],%[^,],%d,%[^\n]\n", biblioteca[contadorLibros].titulo, biblioteca[contadorLibros].autor, &biblioteca[contadorLibros].anio, biblioteca[contadorLibros].categoria) == 4) {
        contadorLibros++;
        if (contadorLibros >= MAX_LIBROS) break;
    }

    fclose(archivo);
    printf("Catálogo cargado con éxito.\n");
}

int main() {
    int opcion;
    do {
        printf("\nSistema de Gestión de Biblioteca\n");
        printf("1. Agregar libro\n");
        printf("2. Listar libros\n");
        printf("3. Buscar libro\n");
        printf("4. Eliminar libro\n");
        printf("5. Guardar catálogo\n");
        printf("6. Cargar catálogo\n");
        printf("0. Salir\n");
        printf("Seleccione una opción: ");
        scanf("%d", &opcion);

        switch (opcion) {
            case 1:
                agregarLibro();
                break;
            case 2:
                listarLibros();
                break;
            case 3:
                buscarLibro();
                break;
            case 4:
                eliminarLibro();
                break;
            case 5:
                guardarCatalogo();
                break;
            case 6:
                cargarCatalogo();
                break;
            case 0:
                printf("Saliendo...\n");
                break;
            default:
                printf("Opción no válida.\n");
        }
    } while (opcion != 0);

    return 0;
}

Desafíos y Aprendizajes

Al desarrollar este sistema, los programadores enfrentarán varios desafíos, como la gestión adecuada de la memoria al crear y eliminar registros de libros, la implementación de búsqueda y filtrado de datos, y la manipulación de archivos para guardar y cargar el catálogo. Este proyecto también ofrece una excelente oportunidad para practicar el uso de punteros, estructuras y manejo de archivos en C, conceptos esenciales para cualquier programador que trabaje con este lenguaje.

Además, este ejercicio puede ser extendido o modificado de varias maneras para aumentar su complejidad y utilidad, como implementar una interfaz gráfica de usuario (GUI) utilizando bibliotecas como GTK o Qt, o añadir funcionalidades adicionales, como la gestión de préstamos de libros.

En resumen, el desarrollo de un sistema de gestión de biblioteca en C es un proyecto desafiante y educativo que ofrece a los programadores la oportunidad de aplicar y profundizar en sus conocimientos del lenguaje, al tiempo que desarrollan una aplicación práctica y útil.

black laptop computer turned on showing computer codes
Photo by Markus Spiske on Pexels.com

Gracias por visitar mi blog de informática, mi nombre es Tomás y soy formador y desarrollador web. Si quiere usted dejarme alguna sugerencia, ayuda o quiere un servicio de formación estoy escuchando ofertas en tomas.gonzalez@infogonzalez.com, en Facebook a https://www.facebook.com/Infogonzalez estoy deseando escucharle. Su duda o sugerencia NO molesta.

Deja un comentario

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

error: Content is protected !!

Descubre más desde InfoGonzalez - Blog de formador e informático

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo

Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad