Implementación de un Sistema de Gestión de Inventario de Motocicletas en C con Ficheros Binarios
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 13,04 KB
Sistema de Gestión de Inventario en C: Implementación Sin Punteros Explícitos
El siguiente código implementa un sistema básico de gestión de inventario para motocicletas utilizando estructuras y almacenamiento en ficheros binarios, evitando el uso de punteros para la manipulación de la lista de productos.
1. Estructura del Programa y Definiciones Globales
1.1. Inicio del Programa y Librerías
// LIBRERÍAS
#include <stdio.h>
#include <stdlib.h.h>
#include <string.h>1.2. Definiciones de Constantes
// DEFINICIONES
#define MAXIMO 100
#define LARGO 251.3. Estructuras de Datos
Definición de la estructura moto para almacenar los atributos de cada producto y la estructura listado para gestionar el inventario completo mediante un vector estático y un cursor.
Estructura de la Moto
struct moto{
char marca[LARGO];
char modelo[LARGO];
int cilindrada;
int unidades;
float precio;
};Estructura del Listado
struct listado{
struct moto vector[MAXIMO];
int cursor;
};
struct listado lista;
int num_producto = 0;
FILE *Carpeta; // Definimos el puntero al archivo (carpeta) que contendrá la dirección donde se almacenará la información.2. Funciones de Interfaz y Operaciones CRUD
2.1. Función Menú
Esta función presenta las opciones disponibles al usuario y valida la entrada.
int menu(){
int num;
do{
system("cls");
printf("\n\n MENU:\n\n");
printf("\t 1. Mostrar la lista de todos los productos\n\n");
printf("\t 2. Inserción de un nuevo producto\n\n");
printf("\t 3. Consulta de los datos de alguno de los productos\n\n");
printf("\t 4. Modificación de los datos de algún producto (por nombre del modelo)\n\n");
printf("\t 5. Borrado de algún producto de la lista\n\n");
printf("\t 6. Guardar la lista actualizada en disco\n\n");
printf("\t 7. Recuperar datos de la lista guardada en disco\n\n");
printf("\t 8. Salir\n\n");
printf("Elija una opción: \n\n");
scanf("%d", &num); // Almacenamos el valor en la dirección de memoria de 'num' (uso del operador &)
if(num < 1 || num > 8){
printf("Opción no válida\n");
system("pause");
}
}while(num < 1 || num > 8);
return num;
}2.2. Función Insertar Producto (Intro_Producto)
Permite la introducción interactiva de nuevos productos en el inventario.
void Intro_Producto(){
char opcion;
system("cls");
do{
printf("Inserte el nombre de la marca: \n");
fflush(stdin);
gets(lista.vector[lista.cursor].marca); // 'gets' lee la cadena de caracteres y la almacena en la posición X.
printf("Inserte el nombre del modelo: \n");
fflush(stdin);
gets(lista.vector[lista.cursor].modelo);
printf("Inserte la cilindrada: \n");
fflush(stdin);
scanf("%d",&lista.vector[lista.cursor].cilindrada);
printf("Introducir el número de unidades disponibles: \n");
fflush(stdin);
scanf("%d", &lista.vector[lista.cursor].unidades);
printf("Introducir el precio de venta unitario: \n");
fflush(stdin);
scanf("%f", &lista.vector[lista.cursor].precio);
lista.cursor ++;
printf("Producto agregado con éxito. \n");
fflush(stdin);
printf("Desea insertar otro producto? (S/N): \n ");
fflush(stdin);
scanf("%c", &opcion);
}
while(opcion == 'S' || opcion == 's');
system("pause");
}2.3. Función Mostrar Productos (Mostrar_Productos)
Muestra todos los productos actualmente cargados en la lista.
// FUNCIÓN PARA MOSTRAR LOS PRODUCTOS
void Mostrar_Productos() {
int i=0;
system("cls"); // Limpiamos pantalla
if(lista.cursor==0){
printf("No hay productos en la lista.\n");
}
while(i<lista.cursor){
printf("Moto #%d\n", i + 1);
printf("\n Marca del producto: %s", lista.vector[i].marca);
printf("\n Nombre del modelo: %s", lista.vector[i].modelo);
printf("\n Cilindrada: %d", lista.vector[i].cilindrada);
printf("\n Unidades disponibles: %d", lista.vector[i].unidades);
printf("\n Precio de venta unitario: %.2f\n\n", lista.vector[i].precio);
i=i+1;
}
system("pause");
}2.4. Función Consultar Producto (Consultar)
Permite buscar y mostrar los datos de un producto específico por su nombre de modelo.
void Consultar() {
char nombre_modelo[MAXIMO];
int i;
int opcion;
do {
system("cls");
if (lista.cursor != 0) {
printf("Introduce el nombre del modelo: \n");
fflush(stdin); // Limpia buffer
gets(nombre_modelo);
i = 0;
while (strcmp(lista.vector[i].modelo, nombre_modelo) != 0 && (i < lista.cursor)) {
i++;
}
if (i < lista.cursor && strcmp(lista.vector[i].modelo, nombre_modelo) == 0) {
printf("\n Marca del producto: %s", lista.vector[i].marca);
printf("\n Nombre del modelo: %s", lista.vector[i].modelo);
printf("\n Cilindrada: %d", lista.vector[i].cilindrada);
printf("\n Unidades disponibles: %d", lista.vector[i].unidades);
printf("\n Precio de venta unitario: %.2f\n", lista.vector[i].precio);
} else {
printf("Producto no está en la lista.\n");
}
} else {
printf("No hay productos en la lista.\n");
}
printf("\nSi desea buscar otro modelo, pulse 1; de lo contrario, pulse 0: ");
scanf("%d", &opcion);
} while (opcion == 1);
}2.5. Función Modificar Producto (Modificar)
Permite buscar un producto por modelo y modificar cualquiera de sus campos.
void Modificar() {
system("cls");
char Nombre_Producto[LARGO];
int i, opcion, modif;
if (lista.cursor == 0) {
printf("La lista está vacía.\n");
system("pause");
return;
}
do {
printf("Introduzca el nombre del modelo del producto:\n");
fflush(stdin);
gets(Nombre_Producto);
// Buscar producto
i = 0;
while (i < lista.cursor && strcmp(Nombre_Producto, lista.vector[i].modelo) != 0) {
i++;
}
if (i < lista.cursor) { // encontrado
printf("\n Marca del producto: %s", lista.vector[i].marca);
printf("\n Nombre del modelo: %s", lista.vector[i].modelo);
printf("\n Cilindrada: %d", lista.vector[i].cilindrada);
printf("\n Unidades disponibles: %d", lista.vector[i].unidades);
printf("\n Precio de venta unitario: %.2f\n", lista.vector[i].precio);
do {
printf("\n Elija campo a modificar: \n");
printf("1 - Marca del producto \n");
printf("2 - Nombre del modelo \n");
printf("3 - Cilindrada \n");
printf("4 - Unidades disponibles \n");
printf("5 - Precio de venta unitario \n");
scanf("%d", &opcion);
if (opcion < 1 || opcion > 5) {
printf("\n Opción no válida.\n");
system("pause");
}
} while (opcion < 1 || opcion > 5);
fflush(stdin); // limpiar buffer antes de pedir nuevos datos
switch(opcion) {
case 1:
printf("Introduce la nueva marca del producto:\n");
gets(lista.vector[i].marca);
break;
case 2:
printf("Introduce el nuevo nombre del modelo:\n");
gets(lista.vector[i].modelo);
break;
case 3:
printf("Introduce la nueva cilindrada:\n");
scanf("%d", &lista.vector[i].cilindrada);
break;
case 4:
printf("Introduce las nuevas unidades disponibles:\n");
scanf("%d", &lista.vector[i].unidades);
break;
case 5:
printf("Introduce el nuevo precio de venta unitario:\n");
scanf("%f", &lista.vector[i].precio);
break;
}
} else {
printf("Producto no encontrado.\n");
}
printf("Desea modificar otro producto? (1 = SI, 0 = NO): ");
scanf("%d", &modif);
} while (modif == 1);
system("pause");
}2.6. Función Borrar Producto (Borrar)
Elimina un producto del inventario desplazando los elementos subsiguientes.
void Borrar() {
char nombre_prod[MAXIMO];
int i, j, opcion;
do {
system("cls");
if (lista.cursor == 0) {
printf("No hay productos en la lista.\n");
break;
}
printf("Introduce el nombre del modelo a borrar: \n");
fflush(stdin);
gets(nombre_prod);
// Buscar producto
int encontrado = -1;
for (i = 0; i < lista.cursor; i++) {
if (strcmp(nombre_prod, lista.vector[i].modelo) == 0) {
encontrado = i;
break;
}
}
if (encontrado != -1) {
// Desplazar elementos hacia atrás
for (j = encontrado; j < lista.cursor - 1; j++) {
lista.vector[j] = lista.vector[j + 1];
}
lista.cursor--;
printf("Producto borrado.\n");
} else {
printf("Modelo no encontrado.\n");
}
printf("Desea borrar otro producto? (1 = Si, 0 = No): ");
scanf("%d", &opcion);
} while (opcion == 1);
system("pause");
}3. Gestión de Ficheros Binarios
3.1. Función Guardar (Guardar)
Almacena la lista actual de productos en un fichero binario (ListaMotos.dat).
void Guardar(){
system("cls");
int i=0;
Carpeta = fopen("ListaMotos.dat", "wb"); // "wb" - Write Binary (Escritura binaria)
for (i ; i < lista.cursor; i++){
fwrite(&lista.vector[i], sizeof(struct moto), 1, Carpeta); // Escribimos en el fichero
}
fclose(Carpeta);
printf("Lista guardada correctamente.\n");
system ("pause");
}3.2. Función Recuperar (Recuperar)
Carga los datos de productos desde el fichero binario al listado en memoria.
void Recuperar() {
system("cls");
lista.cursor = 0;
Carpeta = fopen("ListaMotos.dat", "rb"); // "rb" - Read Binary (Lectura binaria)
if (Carpeta == NULL) {
printf("Error al abrir el archivo o el archivo no existe.\n");
system("pause");
return;
}
// Nota: El bucle original contenía una lógica de lectura duplicada y un uso incorrecto de feof.
// Se mantiene la estructura original del código proporcionado, pero se recomienda revisar la lógica de lectura de ficheros.
while(!feof(Carpeta)){
fread(&lista.vector[lista.cursor], sizeof(struct moto), 1, Carpeta);
lista.cursor ++;
}
while (fread(&lista.vector[lista.cursor], sizeof(struct moto), 1, Carpeta) == 1) {
lista.cursor++;
}
fclose(Carpeta);
printf("Información recuperada con éxito.\n");
system("pause");
}4. Función Principal del Programa
Controla el flujo de ejecución llamando a la función menú y gestionando las opciones seleccionadas.
int main() { // Se corrige la firma de main a int main() por estándar C.
lista.cursor=0;
int opcion=0;
while (opcion != 8) {
opcion = menu();
switch (opcion) {
case 1:
Mostrar_Productos();
break;
case 2:
Intro_Producto();
break;
case 3:
Consultar();
break;
case 4:
Modificar();
break;
case 5:
Borrar();
break;
case 6:
Guardar();
break;
case 7:
Recuperar();
break;
case 8:
//Salir();
printf("Saliendo...\n");
break;
default:
printf("Opción no válida.\n");
break;
}
}
return 0;
}