LP1_practica_1_inventario en c++



Tutorial del Código C++: Gestión de Productos



Este programa en C++ permite registrar información de productos, incluyendo su nombre, marca, calidad y precio. Además, calcula el IVA y el precio total, y luego ordena los productos por precio de mayor a menor utilizando el algoritmo de ordenamiento por inserción.

1. Cabeceras y Espacio de Nombres

C++
#include <iostream>
#include <conio.h>
#include <cstring> // libreria para poder copiar una variable char en otra variable char
using namespace std;
  • #include <iostream>: Esta línea incluye la librería de entrada/salida estándar de C++. Es fundamental para operaciones como leer datos del teclado (cin) y mostrar información en la pantalla (cout).
  • #include <conio.h>: Esta librería proporciona funciones para entrada y salida de consola, como getch() o getchar(), que se usan comúnmente para pausar la ejecución del programa hasta que se presione una tecla.
  • #include <cstring>: Esta librería es crucial para manipular cadenas de caracteres al estilo C (arrays de char). Incluye funciones como strcpy o memcpy, que son necesarias para copiar el contenido de una cadena a otra, ya que las cadenas en C++ no se pueden asignar directamente con el operador =.
  • using namespace std;: Esta línea permite usar los elementos del espacio de nombres std (estándar) directamente, como cout, cin, endl, sin tener que prefijarlos con std::.

2. Función calculo_iva (Plantilla)

C++
template <class IVA>
IVA calculo_iva(IVA precio, IVA porcentaje){
    float iva_producto = precio * porcentaje / 100;
    return iva_producto;
}
  • template <class IVA>: Esto define una plantilla de función. Significa que la función calculo_iva puede trabajar con diferentes tipos de datos (como int, float, double) sin necesidad de reescribirla para cada tipo. El IVA es un nombre genérico para el tipo de dato que se usará.
  • IVA calculo_iva(IVA precio, IVA porcentaje): Declara la función calculo_iva. Recibe dos argumentos del tipo IVA (genérico), precio y porcentaje, y devuelve un valor también del tipo IVA.
  • float iva_producto = precio * porcentaje / 100;: Dentro de la función, calcula el monto del IVA. Multiplica el precio por el porcentaje y divide el resultado entre 100.
  • return iva_producto;: La función devuelve el valor calculado del IVA.

3. Variables Globales

C++
int menA1,menA2; // Variables para el control del menú principal
float porcentaje_iva = 15; // Define el porcentaje de IVA
float arr_iva_producto[100]; // Array para almacenar el IVA calculado de cada producto
float precio_total[100]; // Array para almacenar el precio total (precio + IVA) de cada producto
  • int menA1, menA2;: Estas variables enteras se utilizan para controlar las opciones seleccionadas en el menú principal (menA1) y para decidir si el usuario desea regresar al menú (menA2).
  • float porcentaje_iva = 15;: Declara e inicializa una variable float que guarda el porcentaje de IVA a aplicar a los productos (en este caso, 15%).
  • float arr_iva_producto[100];: Declara un array de tipo float capaz de almacenar el valor del IVA calculado para hasta 100 productos.
  • float precio_total[100];: Declara un array de tipo float para almacenar el precio final (precio base + IVA) de hasta 100 productos.

4. Estructuras para Datos de Productos

C++
struct marca{
    char nombre_marca[35];
    char calidad_marca[35]; // alta, media, baja
};

struct Producto{ //coleccion de datos
    char nombre_producto[35];
    float precio_producto;
    struct marca marca_producto;
}producto[100]; // variable de la estructura producto
  • struct marca: Define una estructura llamada marca para agrupar datos relacionados con la marca de un producto.
    • char nombre_marca[35];: Almacena el nombre de la marca como una cadena de caracteres (máximo 34 caracteres + el terminador nulo).
    • char calidad_marca[35];: Almacena la calidad de la marca (e.g., "alta", "media", "baja") como una cadena de caracteres.
  • struct Producto: Define una estructura llamada Producto para agrupar toda la información de un producto.
    • char nombre_producto[35];: Almacena el nombre del producto.
    • float precio_producto;: Almacena el precio base del producto.
    • struct marca marca_producto;: Incluye una variable de la estructura marca dentro de la estructura Producto, permitiendo así que cada producto tenga su propia información de marca.
  • }producto[100];: Declara un array de 100 elementos de la estructura Producto. Esto significa que se pueden almacenar los datos de hasta 100 productos diferentes.

5. Estructuras Auxiliares para el Ordenamiento

C++
struct aux_marca{
    char aux_nombre_marca[35];
    char aux_calidad_marca[35]; // alta, media, baja
};

struct aux_Producto{ //coleccion de datos
    char aux_nombre_producto[35];
    float aux_precio_producto;
    struct aux_marca aux_marca_producto;
}aux_producto[100]; // variable de la estructura producto
  • struct aux_marca y struct aux_Producto: Estas estructuras son copias de las estructuras marca y Producto, pero con nombres prefijados con aux_. Se utilizan específicamente para almacenar temporalmente los datos de un producto durante el proceso de ordenamiento por inserción, evitando la pérdida de información mientras se reubican los elementos en el array principal.

6. Prototipos de Funciones y Variable Global i

C++
void registrar_productos();
void consultar_productos();
int i=0; // Contador global de productos registrados
  • void registrar_productos();: Declara el prototipo de la función registrar_productos. Esto le indica al compilador que existe una función con este nombre que no recibe argumentos y no devuelve ningún valor.
  • void consultar_productos();: Declara el prototipo de la función consultar_productos. Similar a la anterior.
  • int i=0;: Declara una variable global i inicializada en 0. Esta variable se utiliza como un contador del número de productos registrados y como índice para acceder a los arrays de productos.

7. Función Principal main

C++
int main()
{
    do {
        menA2=0;

        cout<<"\t\n\t PROGRAMA PARCIAL 1\n\n";
        cout<<"\t\n\tMenu\n\n";
        cout<<"1. Registrar productos."<<endl;
        cout<<"2. Consultar productos."<<endl;
        cout<<"3. Salir "<<endl;
        cin>>menA1;

        switch(menA1) {
            case 1:
                registrar_productos();
            break;

            case 2:
                consultar_productos();
            break;

            case 3:
                cout<<"\t\n\tSALIENDO\n\n";
                return 0; // Termina el programa
            break;

            default:
                cout<<"\t\n\tError de opcion\n\n";
            break;
        }

        cout<<"\n"<<"\n";
        cout<<"Desea regresar al menu\n"<<endl;
        cout<<"1.SI/2.NO"<<endl;
        cin>>menA2;

    }while (menA2==1);

    getchar();
    return 0;
}
  • int main(): Es el punto de entrada principal del programa. La ejecución del programa comienza aquí.
  • do { ... } while (menA2==1);: Implementa un bucle do-while para mostrar el menú principal y permitir al usuario interactuar con el programa hasta que decida salir. El bucle se repite mientras menA2 sea igual a 1 (lo que indica que el usuario quiere regresar al menú).
  • menA2=0;: Se asegura de que menA2 se reinicie a 0 al inicio de cada iteración del bucle, para que el usuario sea preguntado explícitamente si desea regresar al menú.
  • cout << ...: Muestra el menú de opciones al usuario.
  • cin >> menA1;: Lee la opción seleccionada por el usuario y la guarda en menA1.
  • switch(menA1): Es una estructura de control switch que ejecuta diferentes bloques de código según el valor de menA1.
    • case 1: registrar_productos(); break;: Si el usuario elige 1, llama a la función registrar_productos.
    • case 2: consultar_productos(); break;: Si el usuario elige 2, llama a la función consultar_productos.
    • case 3: cout<<"\t\n\tSALIENDO\n\n"; return 0; break;: Si el usuario elige 3, muestra un mensaje de salida y return 0; finaliza el programa exitosamente.
    • default: cout<<"\t\n\tError de opcion\n\n"; break;: Si el usuario introduce una opción no válida, muestra un mensaje de error.
  • cout<<"Desea regresar al menu\n"<<endl; cin>>menA2;: Después de cada operación, pregunta al usuario si desea volver al menú y lee su respuesta en menA2.
  • getchar();: Pausa la ejecución del programa, esperando que el usuario presione una tecla antes de cerrar la consola. Esto es útil en algunos entornos de desarrollo para ver la salida antes de que la ventana se cierre automáticamente.

8. Función registrar_productos

C++
void registrar_productos() {
    int n;
    cout << "Indique el numero de registros: de 1 al 10 ";
    cin >> n;
    if (n>0 && n<10) {
        int nregistro;
        for (i=0; i<n; i++) { // Bucle para registrar 'n' productos
            nregistro = i+1;
            cout<<"\n"<<"\n";
            cout<<"Producto: "<<nregistro<<endl;
            printf("\n");
            cin.ignore(); // Limpia el búfer de entrada
            cout << "    Nombre producto    : ";  cin.getline(producto[i].nombre_producto,35 );
            printf("\n");
            cout << "    Nombre de la marca del producto : ";  cin.getline(producto[i].marca_producto.nombre_marca,35);
            printf("\n");
            cout << "    Calidad de la marca : ";  cin.getline(producto[i].marca_producto.calidad_marca,35);
            printf("\n");
            cout << "    Precio producto : ";    cin>>producto[i].precio_producto;

            arr_iva_producto[i]=calculo_iva(producto[i].precio_producto,porcentaje_iva);
            precio_total[i]= arr_iva_producto[i] + producto[i].precio_producto;
        }
    } else {
        printf("\n elija un numero entre el 1 y el 10");
    }
}
  • void registrar_productos(): Implementa la lógica para registrar nuevos productos.
  • int n; cout << "Indique el numero de registros: de 1 al 10 "; cin >> n;: Solicita al usuario el número de productos a registrar y lo guarda en n.
  • if (n>0 && n<10) { ... } else { ... }: Valida que el número de registros esté entre 1 y 9 (excluyendo 10 para evitar un error en la condición n<10). Si no está en el rango, muestra un mensaje de error.
  • for (i=0; i<n; i++): Inicia un bucle for que se repite n veces, una por cada producto a registrar. La variable global i se usa como índice.
  • cin.ignore();: Esta línea es fundamental después de un cin >> y antes de un cin.getline(). Limpia el búfer de entrada para eliminar el carácter de nueva línea (\n) que queda después de presionar Enter, evitando que cin.getline() lo lea como una entrada vacía.
  • cin.getline(producto[i].nombre_producto,35 );: Lee una línea completa de texto (incluyendo espacios) y la almacena en nombre_producto del producto actual. El 35 es el tamaño máximo del array. Similarmente para la marca y calidad.
  • cin >> producto[i].precio_producto;: Lee el precio del producto.
  • arr_iva_producto[i]=calculo_iva(producto[i].precio_producto,porcentaje_iva);: Llama a la función calculo_iva para obtener el IVA del producto actual y lo guarda en arr_iva_producto.
  • precio_total[i]= arr_iva_producto[i] + producto[i].precio_producto;: Calcula el precio total sumando el precio base y el IVA, y lo guarda en precio_total.

9. Función consultar_productos

C++
void consultar_productos() {

    //algoritmo de ordenamiento por insercion
    int y,j;
    float aux1[100],aux2[100]; // Auxiliares para precios e IVA durante el ordenamiento

    for(y=0;y<i;y++){ // Bucle principal del algoritmo de inserción
        j = y;
        aux1[y] = precio_total[y]; // Guarda el precio total actual
        aux2[y] = arr_iva_producto[y]; // Guarda el IVA actual

        // Copia temporal de los datos del producto
        aux_producto[y].aux_precio_producto =  producto[y].precio_producto;
        memcpy(aux_producto[y].aux_marca_producto.aux_calidad_marca, producto[y].marca_producto.calidad_marca, 35);
        memcpy(aux_producto[y].aux_marca_producto.aux_nombre_marca, producto[y].marca_producto.nombre_marca, 35);
        memcpy(aux_producto[y].aux_nombre_producto, producto[y].nombre_producto, 35);

        // Desplaza los elementos mayores hacia la derecha
        while((j>0) && (precio_total[j-1] > aux1[y])){
            precio_total[j] = precio_total[j-1];
            arr_iva_producto[j] = arr_iva_producto[j-1];
            producto[j].precio_producto = producto[j-1].precio_producto;

            memcpy(producto[j].marca_producto.calidad_marca, producto[j-1].marca_producto.calidad_marca,  35);
            memcpy(producto[j].marca_producto.nombre_marca, producto[j-1].marca_producto.nombre_marca,  35);
            memcpy(producto[j].nombre_producto, producto[j-1].nombre_producto, 35);
            j--;
        }
        // Inserta el elemento en su posición correcta
        precio_total[j] = aux1[y];
        arr_iva_producto[j] = aux2[y];
        producto[j].precio_producto = aux_producto[y].aux_precio_producto;

        memcpy(producto[j].marca_producto.calidad_marca, aux_producto[y].aux_marca_producto.aux_calidad_marca,  35);
        memcpy(producto[j].marca_producto.nombre_marca, aux_producto[y].aux_marca_producto.aux_nombre_marca,  35);
        memcpy(producto[j].nombre_producto, aux_producto[y].aux_nombre_producto, 35);
    }

    //mostrar resultados
    int nregistroX, x;
    for (x=i-1; x>=0; x--){ // Bucle para mostrar los productos (ordenados de mayor a menor)
        cout<<"\n"<<"\n";
        nregistroX ++; // Contador para el número de producto mostrado
        cout<<"Producto: "<<nregistroX<<endl;
        cout<<"Nombre del producto: "<<producto[x].nombre_producto<<endl;
        cout<<"Marca del producto: "<<producto[x].marca_producto.nombre_marca<<endl;
        cout<<"Calidad de la marca: "<<producto[x].marca_producto.calidad_marca<<endl;
        cout<<"Precio producto: "<<producto[x].precio_producto<<endl;
        cout<<"IVA: "<<porcentaje_iva<<" % "<<" IVA PRODUCTO: "<<arr_iva_producto[x]<<" bs"<<endl;
        cout<<"Precio total: "<<precio_total[x]<<" bs"<<endl;
        cout<<"\n"<<"\n";
    }
}
  • void consultar_productos(): Se encarga de ordenar y luego mostrar los productos.
  • Algoritmo de Ordenamiento por Inserción:
    • for(y=0; y<i; y++): Este es el bucle principal del algoritmo de ordenamiento por inserción. Recorre el array de productos.
    • aux1[y] = precio_total[y]; aux2[y] = arr_iva_producto[y];: Guarda el precio_total y el arr_iva_producto del elemento actual en variables auxiliares.
    • Las líneas con memcpy copian temporalmente los datos de las cadenas de caracteres y el precio base del producto a las estructuras auxiliares (aux_producto). Esto es esencial porque, a diferencia de los float, las cadenas de caracteres (arrays de char) no pueden ser copiadas directamente con el operador =.
      • memcpy(destino, origen, tamaño);: Copia tamaño bytes desde la dirección de origen a la dirección de destino.
    • while((j>0) && (precio_total[j-1] > aux1[y])): Este bucle interno desplaza los elementos mayores hacia la derecha para hacer espacio para la inserción. Compara el precio_total del elemento actual (aux1[y]) con los elementos a su izquierda.
    • precio_total[j] = precio_total[j-1]; ... memcpy(...);: Desplaza los datos del producto (precio total, IVA, y toda la estructura Producto con sus campos de nombre, marca, calidad y precio base) a la posición actual j.
    • j--;: Decrementa j para moverse a la posición anterior.
    • precio_total[j] = aux1[y]; ... memcpy(...);: Finalmente, inserta los datos del producto que se estaba moviendo (aux1[y], aux2[y], aux_producto[y]) en su posición correcta dentro del array ordenado.
  • Mostrar Resultados:
    • for (x=i-1; x>=0; x--): Este bucle for recorre el array de productos desde el último elemento registrado hasta el primero (i-1 hasta 0). Como el ordenamiento por inserción se hizo de menor a mayor en el while por el condicional precio_total[j-1] > aux1[y], al recorrer el array de atrás hacia adelante, los productos se muestran de mayor a menor precio total.
    • nregistroX ++;: Se utiliza un contador nregistroX para mostrar el número de producto en el listado.
    • cout << ...: Muestra toda la información detallada de cada producto, incluyendo su nombre, marca, calidad, precio base, IVA calculado y precio total.

Código completo:

/* 1 Registrar nombre marca y precio de productos en un array
   2 Ordenar los productos de acuerdo al precio de mayor a menor : algoritmo de ordenamiento por inserción
   3 mostrar productos */
#include <iostream>
#include <conio.h>
#include <cstring> // libreria para poder copiar una variable char en otra variable char
using namespace std;

      template <class IVA>
IVA calculo_iva(IVA precio, IVA porcentaje){
float iva_producto = precio * porcentaje / 100;

return iva_producto;

  int menA1,menA2;
  
  
    float porcentaje_iva = 15;
    float arr_iva_producto[100];
    float precio_total[100];

struct marca{ 
    char nombre_marca[35];
     char calidad_marca[35]; // alta, media, baja
};

struct Producto{ //coleccion de datos

    char nombre_producto[35]; 
    float precio_producto;
     struct marca marca_producto;

}producto[100];// variable de la estructura producto




struct aux_marca{ 
    char aux_nombre_marca[35];
     char aux_calidad_marca[35]; // alta, media, baja
};

struct aux_Producto{ //coleccion de datos

    char aux_nombre_producto[35]; 
    float aux_precio_producto;
     struct aux_marca aux_marca_producto;

}aux_producto[100];// variable de la estructura producto


void registrar_productos();  

void consultar_productos();

int i=0;

int main()  
{
   do { 
  menA2=0; 


        cout<<"\t\n\t PROGRAMA PARCIAL 1\n\n";
        cout<<"\t\n\tMenu\n\n";

        cout<<"1. Registrar productos."<<endl;
        cout<<"2. Consultar productos."<<endl;
        cout<<"3. Salir "<<endl;
      
        
        cin>>menA1;  

        switch(menA1) {

            case 1: 
                registrar_productos();

            break;
            
            case 2:
                consultar_productos();

            break;

            case 3:
                cout<<"\t\n\tSALIENDO\n\n";

                return 0;

            break;

            default:
                cout<<"\t\n\tError de opcion\n\n";

            break;

        }

        cout<<"\n"<<"\n";
        cout<<"Desea regresar al menu\n"<<endl;
        cout<<"1.SI/2.NO"<<endl;

        cin>>menA2;


    }while (menA2==1);


    getchar(); 
    return 0;



}





void registrar_productos() { 

    int n; 
    cout << "Indique el numero de registros: de 1 al 10 ";
    cin >> n; 
    if (n>0 && n<10) { 
    int nregistro;
    for (i=0; i<n; i++) { 

         nregistro = i+1;
          cout<<"\n"<<"\n";
          
        cout<<"Producto: "<<nregistro<<endl;
        printf("\n");
        cin.ignore();  cout << "   Nombre producto   : ";  cin.getline(producto[i].nombre_producto,35  );
        printf("\n");
          cout << "   Nombre de la marca del producto : ";  cin.getline(producto[i].marca_producto.nombre_marca,35);
          printf("\n");
          cout << "   Calidad de la marca : ";  cin.getline(producto[i].marca_producto.calidad_marca,35);
          printf("\n");
          cout << "   Precio producto : ";   cin>>producto[i].precio_producto;
    
arr_iva_producto[i]=calculo_iva(producto[i].precio_producto,porcentaje_iva);
precio_total[i]= arr_iva_producto[i] + producto[i].precio_producto;

    }
    
}else{
printf("\n elija un numero entre el 1 y el 10");
}

}


void consultar_productos() {
//algoritmo de ordenamiento por insercion
int y,j;
float aux1[100],aux2[100];                                               
for(y=0;y<i;y++){
j = y;
aux1[y] = precio_total[y];
aux2[y] = arr_iva_producto[y];
aux_producto[y].aux_precio_producto =  producto[y].precio_producto; 
memcpy(aux_producto[y].aux_marca_producto.aux_calidad_marca, producto[y].marca_producto.calidad_marca, 35);
      memcpy(aux_producto[y].aux_marca_producto.aux_nombre_marca, producto[y].marca_producto.nombre_marca, 35);
    memcpy(aux_producto[y].aux_nombre_producto, producto[y].nombre_producto, 35);
   
while((j>0) && (precio_total[j-1] > aux1[y])){
precio_total[j] = precio_total[j-1];
arr_iva_producto[j] = arr_iva_producto[j-1];
producto[j].precio_producto = producto[j-1].precio_producto; 
memcpy(producto[j].marca_producto.calidad_marca, producto[j-1].marca_producto.calidad_marca,  35);
      memcpy(producto[j].marca_producto.nombre_marca, producto[j-1].marca_producto.nombre_marca,  35);
    memcpy(producto[j].nombre_producto, producto[j-1].nombre_producto, 35);

j--;
}

precio_total[j] = aux1[y];
arr_iva_producto[j] = aux2[y];
producto[j].precio_producto = aux_producto[y].aux_precio_producto;
memcpy(producto[j].marca_producto.calidad_marca, aux_producto[y].aux_marca_producto.aux_calidad_marca,  35);
      memcpy(producto[j].marca_producto.nombre_marca, aux_producto[y].aux_marca_producto.aux_nombre_marca,  35);
    memcpy(producto[j].nombre_producto, aux_producto[y].aux_nombre_producto, 35);
}

//mostrar resultados
    int nregistroX, x;

    for (x=i-1; x>=0; x--){
         
          cout<<"\n"<<"\n";
     nregistroX ++;
     
    
     
        cout<<"Producto: "<<nregistroX<<endl;
        cout<<"Nombre del producto: "<<producto[x].nombre_producto<<endl;

        
        cout<<"Marca del producto: "<<producto[x].marca_producto.nombre_marca<<endl;
        cout<<"Calidad de la marca: "<<producto[x].marca_producto.calidad_marca<<endl;
        
        cout<<"Precio producto: "<<producto[x].precio_producto<<endl;
        cout<<"IVA: "<<porcentaje_iva<<" % "<<" IVA PRODUCTO: "<<arr_iva_producto[x]<<" bs"<<endl;
        cout<<"Precio total: "<<precio_total[x]<<" bs"<<endl;
         cout<<"\n"<<"\n";

    }

}

Comentarios