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
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
Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.