Skip to content

johannes-rodriguez/QuickLibrary

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

77 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

QuickLibrary: Sistema de Gestión de Préstamos de Libros

1. Descripción del Proyecto

QuickLibrary es una aplicación de consola desarrollada en Java diseñada para resolver los problemas de organización, seguimiento y control de préstamos de libros en una biblioteca universitaria. El sistema permite administrar un catálogo de libros y gestionar eficientemente una cola de solicitudes de préstamo enviadas por los estudiantes.

La característica principal de este proyecto es que no utiliza las colecciones nativas de Java (como LinkedList, Queue, TreeMap, etc.). En su lugar, implementa estructuras de datos lineales y no lineales de forma totalmente genérica y propia, garantizando un control óptimo de la memoria y algoritmos eficientes para la búsqueda, inserción y eliminación de registros.


2. Arquitectura del Sistema

El proyecto sigue el patrón de diseño arquitectónico MVC (Modelo-Vista-Controlador), organizado en los siguientes paquetes:

  • Estructura: Contiene las estructuras de datos fundamentales implementadas desde cero.
    • Nodo.java: Estructura base para componentes enlazados.
    • Cola.java: Cola genérica enlazada para las solicitudes de préstamo (FIFO).
    • Pila.java: Pila genérica enlazada utilizada para el historial de transacciones (LIFO).
    • LinkedBST.java: Árbol Binario de Búsqueda genérico encargado de ordenar los libros por su código.
  • Modelo: Define las entidades de datos del sistema.
    • Libro.java: Representa un libro con atributos como código, título, autor, categoría, año y estado. Implementa Comparable<Libro>.
    • Solicitud.java: Contiene la información del estudiante y el libro solicitado.
    • Transaccion.java: Registra los eventos lógicos del sistema (préstamos, devoluciones, fallos).
  • Controlador: Contiene la lógica de negocio.
    • BibliotecaControlador.java: Gestiona las operaciones de los libros sobre el árbol binario de búsqueda.
    • MotorTransacciones.java: Coordina los préstamos atendiendo la cola, realiza las devoluciones y genera los reportes estadísticos.
  • Util: Módulos auxiliares y de soporte.
    • LectorCSV.java: Lector encargado de la persistencia inicial de datos.
    • ExceptionIsEmpty.java: Excepción personalizada para el control de estructuras vacías.
  • Vista: Interfaz de usuario de la aplicación.
    • Vista.java: Maneja la interacción por consola con menús interactivos y capturas de teclado.

3. Estructuras de Datos Propias y Complejidad

Para dar cumplimiento estricto a las restricciones técnicas del proyecto, se diseñaron las siguientes estructuras de datos:

3.1. Árbol Binario de Búsqueda Genérico (LinkedBST<E>)

Se utiliza como la estructura principal para organizar el catálogo de libros mediante su atributo código. Al implementar la interfaz Comparable<Libro>, permite inserciones y búsquedas eficientes en tiempo logarítmico.

  • Operaciones principales:
    • insert(E data): O(log n) promedio / O(n) peor caso (árbol desbalanceado).
    • search(E data): O(log n) promedio / O(n) peor caso.
    • delete(E data): O(log n) promedio / O(n) peor caso.
    • inOrder(): Recorrido que lista los libros ordenados ascendentemente por código en tiempo O(n).
    • countNodes() y countByEstado(String estado): Métodos recursivos de conteo con complejidad O(n).

3.2. Cola Genérica (Cola<T>)

Implementada mediante nodos enlazados simples con referencias al frente (head) y al final (tail). Garantiza que las solicitudes de préstamo se procesen estrictamente bajo el principio FIFO (First-In, First-Out), respetando el orden de llegada de los estudiantes.

  • Operaciones principales:
    • enqueue(T dato): Inserción al final en tiempo constante O(1).
    • dequeue(): Extracción del frente en tiempo constante O(1).
    • peek(): Consulta del frente sin extraer en tiempo constante O(1).
    • size(): Retorna el número de elementos recorriendo la cola en tiempo O(n).

3.3. Pila Genérica (Pila<T>)

Implementada con nodos enlazados utilizando una referencia fija al tope (top). Administra el historial de transacciones en orden LIFO (Last-In, First-Out), permitiendo auditar las últimas operaciones realizadas en el sistema.

  • Operaciones principales:
    • push(T dato): Apilar al tope en tiempo constante O(1).
    • pop(): Desapilar del tope en tiempo constante O(1).
    • peek(): Inspeccionar el tope en tiempo constante O(1).

4. Manual Breve de Usuario

4.1. Requisitos del Sistema

Para compilar y ejecutar de forma correcta la aplicación QuickLibrary, el entorno de desarrollo debe contar con:

  1. Java Development Kit (JDK): Versión 8 o superior instalado y configurado en las variables de entorno (JAVA_HOME).
  2. Entorno de Desarrollo (IDE): Visual Studio Code (con la extensión Extension Pack for Java), Eclipse, NetBeans o IntelliJ IDEA.
  3. Archivo de Datos Iniciales: El archivo libros.csv debe estar obligatoriamente ubicado en la raíz del proyecto para realizar la carga masiva automatizada al iniciar.

4.2. Pasos de Instalación y Ejecución

  1. Clonar o Descargar el Repositorio:
    git clone [https://github.com/usuario/QuickLibrary.git](https://github.com/usuario/QuickLibrary.git)
  2. Abrir el Proyecto: Iniciar su IDE de preferencia y seleccionar la carpeta raíz QuickLibrary.
  3. Verificar Persistencia: Asegúrese de que el archivo libros.csv contenga registros válidos estructurados de la siguiente forma:
    codigo,titulo,autor,categoria,anio,estado
    101,Harry Potter y la Piedra Filosofal,J.K. Rowling,Fantasia,1997,Disponible
  4. Ejecutar: Localice el archivo Vista.java dentro del paquete Vista, haga clic derecho y seleccione la opción Run (Ejecutar).

4.3. Guía de Uso del Menú de Consola

Al iniciar el programa, se leerá el archivo CSV y se desplegará el siguiente menú interactivo. Digite el número de la opción deseada y presione Enter.

==== QUICKLIBRARY =====
1. Registrar solicitud de préstamo
2. Mostrar cola de solicitudes
3. Atender siguiente solicitud de préstamo
4. Registrar devolución de libro
5. Mostrar reporte básico
6. Mostrar historial de transacciones
7. Registrar libro
8. Mostrar catálogo de libros
9. Buscar libro
10. Modificar libro
11. Eliminar libro
12. Salir
Seleccione una opción:

Flujos de Operación y Ejemplos Prácticos:

  • Paso 1: Consultar el catálogo inicial (Opción 8) Muestra todos los libros cargados desde el archivo CSV ordenados de menor a mayor código a través del recorrido Inorden del Árbol Binario. Ejemplo de salida:

    CATÁLOGO DE LIBROS:
    Código: 101 | Título: Harry Potter y la Piedra Filosofal | Autor: J.K. Rowling | Categoría: Fantasia | Año: 1997 | Estado: Disponible
    Código: 102 | Título: Harry Potter y la Cámara Secreta | Autor: J.K. Rowling | Categoría: Fantasia | Año: 1998 | Estado: Disponible
    
  • Paso 2: Registrar una solicitud de préstamo (Opción 1) Agrega a un estudiante a la cola de espera para un libro en específico. Entrada:

    Ingrese código del estudiante: EST2026
    Ingrese nombre del estudiante: Carlos Mendoza
    Ingrese código del libro solicitado: 101
    

    Salida: Solicitud registrada correctamente.

  • Paso 3: Ver la cola de espera (Opción 2) Muestra de forma lineal todas las solicitudes pendientes por atender en el estricto orden de registro. Salida:

    ======= COLA DE SOLICITUDES =======
      1. Estudiante: Carlos Mendoza | Código: EST2026 | Libro: 101 | Fecha: 30/06/2026 12:00
      Total en cola: 1
    ===================================
    
  • Paso 4: Atender la solicitud (Opción 3) El sistema extrae de forma automática la primera solicitud de la cola empleando el método dequeue(). Busca el libro en el árbol (search) y, si está Disponible, cambia su estado a Prestado. Salida: Préstamo realizado correctamente. Nota: Si intenta atender la solicitud y el libro ya está "Prestado" o no existe, el sistema denegará el préstamo y guardará el fallo en el historial.

  • Paso 5: Registrar la devolución de un libro (Opción 4) Cambia el estado de un libro de "Prestado" a "Disponible" para que pueda ser solicitado nuevamente. Entrada:

    Ingrese el código del libro a devolver: 101
    

    Salida: Devolución registrada correctamente.

  • Paso 6: Buscar Libros con Filtros Avanzados (Opción 9) Permite realizar búsquedas exactas o parciales divididas en sub-métodos:

    1. Por Código: Utiliza la eficiencia O(log n) del árbol binario.
    2. Por Título / Autor / Categoría: Convierte temporalmente el árbol en un arreglo de objetos nativos (toArray()) para realizar búsquedas avanzadas que ignoren mayúsculas y minúsculas.
  • Paso 7: Consultar Reportes Estadísticos e Historial (Opciones 5 y 6) La Opción 5 genera un reporte cuantitativo en tiempo real basado en la cantidad de nodos y el filtrado por estados. La Opción 6 recorre la Pila de transacciones mostrando de manera inversa (desde la más reciente hasta la más antigua) todas las actividades ejecutadas en el sistema.


5. Licencia

Este proyecto está bajo la Licencia Apache 2.0. Consulte el archivo LICENSE en la raíz de este repositorio para conocer los términos y condiciones detallados de uso, reproducción y distribución.

About

Sistema de gestión de préstamos de libros en Java. Implementa colas, pilas y árboles binarios de búsqueda (BST) genéricos desde cero, prescindiendo de colecciones nativas.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages