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 25

1.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;
}

Entradas relacionadas: