3.5 Operaciones con matrices y vectores

Vamos a ver con un ejemplo algunas de las principales aplicaciones de matrices. Consideremos el siguiente problema:
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;
}

El usuario ingresa un legajo. Mediante la función buscar que vimos anteriormente, obtengo la posición del vector en la que está dicho legajo, y me aseguro de que sea un legajo existente o lo vuelvo a pedir.
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