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:
- 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.
- Listar todos los libros disponibles: Mostrar un listado de todos los libros registrados en el sistema.
- Buscar libros: Permitir a los usuarios buscar libros por título, autor, o categoría.
- Eliminar libros del catálogo: Dar la opción de eliminar registros de libros específicos del sistema.
- 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.
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.