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, comogetch()
ogetchar()
, 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 dechar
). Incluye funciones comostrcpy
omemcpy
, 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 nombresstd
(estándar) directamente, comocout
,cin
,endl
, sin tener que prefijarlos constd::
.
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óncalculo_iva
puede trabajar con diferentes tipos de datos (comoint
,float
,double
) sin necesidad de reescribirla para cada tipo. ElIVA
es un nombre genérico para el tipo de dato que se usará.IVA calculo_iva(IVA precio, IVA porcentaje)
: Declara la funcióncalculo_iva
. Recibe dos argumentos del tipoIVA
(genérico),precio
yporcentaje
, y devuelve un valor también del tipoIVA
.float iva_producto = precio * porcentaje / 100;
: Dentro de la función, calcula el monto del IVA. Multiplica elprecio
por elporcentaje
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 variablefloat
que guarda el porcentaje de IVA a aplicar a los productos (en este caso, 15%).float arr_iva_producto[100];
: Declara un array de tipofloat
capaz de almacenar el valor del IVA calculado para hasta 100 productos.float precio_total[100];
: Declara un array de tipofloat
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 llamadamarca
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 llamadaProducto
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 estructuramarca
dentro de la estructuraProducto
, permitiendo así que cada producto tenga su propia información de marca.
}producto[100];
: Declara un array de 100 elementos de la estructuraProducto
. 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
ystruct aux_Producto
: Estas estructuras son copias de las estructurasmarca
yProducto
, pero con nombres prefijados conaux_
. 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ónregistrar_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ónconsultar_productos
. Similar a la anterior.int i=0;
: Declara una variable globali
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 bucledo-while
para mostrar el menú principal y permitir al usuario interactuar con el programa hasta que decida salir. El bucle se repite mientrasmenA2
sea igual a 1 (lo que indica que el usuario quiere regresar al menú).menA2=0;
: Se asegura de quemenA2
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 enmenA1
.switch(menA1)
: Es una estructura de controlswitch
que ejecuta diferentes bloques de código según el valor demenA1
.case 1: registrar_productos(); break;
: Si el usuario elige 1, llama a la funciónregistrar_productos
.case 2: consultar_productos(); break;
: Si el usuario elige 2, llama a la funciónconsultar_productos
.case 3: cout<<"\t\n\tSALIENDO\n\n"; return 0; break;
: Si el usuario elige 3, muestra un mensaje de salida yreturn 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 enmenA2
.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 enn
.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ónn<10
). Si no está en el rango, muestra un mensaje de error.for (i=0; i<n; i++)
: Inicia un buclefor
que se repiten
veces, una por cada producto a registrar. La variable globali
se usa como índice.cin.ignore();
: Esta línea es fundamental después de uncin >>
y antes de uncin.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 quecin.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 ennombre_producto
del producto actual. El35
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óncalculo_iva
para obtener el IVA del producto actual y lo guarda enarr_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 enprecio_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 elprecio_total
y elarr_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 losfloat
, las cadenas de caracteres (arrays dechar
) no pueden ser copiadas directamente con el operador=
.memcpy(destino, origen, tamaño);
: Copiatamaño
bytes desde la dirección deorigen
a la dirección dedestino
.
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 elprecio_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 estructuraProducto
con sus campos de nombre, marca, calidad y precio base) a la posición actualj
.j--;
: Decrementaj
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 buclefor
recorre el array de productos desde el último elemento registrado hasta el primero (i-1
hasta0
). Como el ordenamiento por inserción se hizo de menor a mayor en elwhile
por el condicionalprecio_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 contadornregistroX
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
Publicar un comentario