Un comercio tiene 5 vendedores, cada uno de los cuales registrado con su número de legajo y DNI. Cada vendedor realiza ventas a través de alguna de las tres cajas que posee el comercio. Se quiere un programa que permita al usuario las siguientes opciones:
- Ingresar una venta: Se ingresa el legajo del vendedor, el número de caja y el importe vendido.
- Total por caja: Al final del día, se quiere saber el total facturado en cada caja, para facilitar el arqueo correspondiente.
- Vendedores: Listado de ventas por vendedor, ordenado por cantidad vendida de mayor a menor.
Veremos las funciones que ejecutan estas opciones. En el caso de la primera (ingresar una venta) usamos la función siguiente:
void
ingresar_venta(float m[][C], int leg[], int f, int c)
{
int legajo,pos,caja;
float venta;
do
{
cout<<"Ingrese
legajo del vendedor:";
cin >> legajo;
pos
= buscar(leg, f, legajo);
}
while (pos == -1);
do
{
cout<<"Ingrese
numero de caja:";
cin >> caja;
}
while (caja < 0 || caja >= c);
cout
<< "Ingrese monto de la venta:";
cin
>> venta;
m[pos][caja]
= m[pos][caja]+venta;
}
Luego ingreso la caja por la que se vendió (me aseguro de que sea un número válido) y el monto de la venta.
En este ejemplo, el vector de legajos está usado como índice de la matriz: No me importa en qué fila de la matriz está un dato, sé que corresponde al vendedor cuyo legajo esté en la misma posición. Así, por ejemplo la fila [0] de la matriz puede corresponder al legajo 1.230.
Distinto es el caso de las columnas, donde la columna [0] corresponde a la caja 0 y no se puede cambiar.
Finalmente, la matriz la estoy usando como acumulador: Un vendedor puede realizar varias ventas distintas en la misma caja, y debo ir sumando sus importes para calcular el total.
Otras operaciones con matrices las podemso ver en el segundo punto:
void
total_sucursal(float m[][C], float ts[], int f, int c)
{
int i,j;
// Inicializo el vector en cero
for (j=0; j<c; j++)
ts[j]=0;
// Acumulo cada fila de la matriz en la
posición correspondiente del vector
for (i=0; i<f; i++)
for
(j=0; j<c; j++)
ts[j] = ts[j] + m[i][j];
for (j=0;
j<c; j++)
cout <<"La caja "<<j<< " ha facturado "<< ts[j] <<" pesos." <<endl;
}
En este caso, cada posición del vector ts está acumulando el total de las ventas de la fila. Este uso se llama vector acumulador o totalizador.
Si vemos el último punto:
void
listado_vendedores(float m[][C], float tv[], int
leg[], long dni[], int
f, int c)
{
int
i,j,k,auxi;
float
auxf;
long
auxl;
for (i=0;
i<f; i++)
tv[i]=0;
for (i=0;
i<f; i++)
for
(j=0; j<c; j++)
tv[i] = tv[i] + m[i][j];
for (i=0; i<f-1; i++)
for (k=i+1; k<f; k++)
if (tv[i] < tv[k]) //Si voy a
intercambiar debo intercambiar no sólo el vector
{
auxf = tv[i];
tv[i] = tv[k];
tv[k] = auxf;
for (j=0; j<c; j++)
{
auxf
= m[i][j]; // También las filas correspondientes de la matriz
m[i][j]
= m[k][j];
m[k][j] =
auxf;
}
auxi
= leg[i]; // Y los vectores de legajo y DNI
leg[i]
= leg[k];
leg[k] = auxi;
auxl = dni[i];
dni[i] = dni[k];
dni[k] = auxl;
}
cout
<<endl<<" LEGAJO DNI
TOTAL VENDIDO"<<endl;
for (i=0; i<f; i++)
{
cout <<" "<<leg[i]<<" "<<dni[i]<<" "<<tv[i]<<endl;
}
}
Hace lo mismo, pero con una complejidad adicional: El listado debe estar ordenado por total vendido. Debo ordenar el vector totalizador, pero cuando tengo que intercambiar dos posiciones del vector, también debo intercambiar toda la información asociada: las posiciones respectivas del vector de legajos que actúa como índice, del vector de dni, y las filas correspondientes de la matriz, sino la información resultante sería inconsistente.
Estas son algunas formas fundamentales en las que se puede trabajar con vectores y matrices combinados, hay muchas más, pero casi todos los problemas que surgen en las aplicaciones reales pueden solucionarse con estas técnicas.
Para completar el ejercicio, agregamos el programa principal:
#include
"stdafx.h"
#include
<iostream>
using
namespace std;
#define
F 5
#define
C 3
void
ingresar_venta(float [][C], int[], int, int);
void
total_sucursal(float [][C], float[], int, int);
void
listado_vendedores(float[][C], float[], int[], long[], int, int);
int
buscar(int[], int,
int);
void
main()
{
int
i,j,op;
float
m[F][C];
int
leg[F];
long
dni[F];
float
TotVend[F];
float
TotSuc[C];
for(i=0;
i<F; i++)
TotVend[i]=0;
for(j=0;
i<C; j++)
TotSuc[j]=0;
for(i=0;
i<F; i++)
for(j=0;
j<C; j++)
m[i][j]=0;
for(i=0; i<F; i++)
{
cout
<<"Ingrese legajo y DNI de un
vendedor:";
cin>>leg[i]>>dni[i];
}
do
{
cout<<"MENU PRINCIPAL"<<endl<<endl;
cout<<"1-Ingresar
una venta"<<endl;
cout<<"2-Total por sucursal"<<endl;
cout<<"3-Listado de vendedores"<<endl;
cout<<"4-Salir."<<endl;
cin>>op;
switch(op)
{
case 1: ingresar_venta(m,leg,F,C);
break;
case
2: total_sucursal(m,TotSuc,F,C);
break;
case
3: listado_vendedores(m,TotVend,leg,dni,F,C);
break;
case
4: break;
default:
cout<<"Opcion Incorrecta."<<endl;
}
}
while
(op!=4);
}
Este programa resuelve cada punto con llamadas a funciones específicas. Todo está organizado en un menú que utiliza la instrucción de selección múltiple switch.
No hay comentarios:
Publicar un comentario