3.5 Operaciones con matrices y listas

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 nombre 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 DNI 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:




def ingresar_venta(mat, dni):
    print("Ingresar")
    dv=int(input("Ingrese DNI del vendedor:"))
    pos = buscar(dni,dv)
    while pos == -1:
        dv=int(input("Ingrese DNI del vendedor:"))
    cv=int(input("Ingrese nro de sucursal:"))
    while cv < 0 or cv>=n:
        cv=int(input("Ingrese nro de sucursal:"))
    venta=float(input("Ingrese el importe de la venta:"))   
    mat[pos][cv] = mat[pos][cv]+venta


El usuario ingresa un DNI. Mediante la función buscar que vimos anteriormente, obtengo la posición del vector en la que está dicho DNI, y me aseguro de que sea un DNI 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 DNIs 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 DNI esté en la misma posición de la lista de DNIs. 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 podemos ver en el segundo punto:



def total_sucursal(mat,totsuc):
    for i in range (0,n):
        for j in range (0,m):
            totsuc[i] = totsuc[i] + mat[j][i]
    for i in range (0,n):
        print("La sucursal ",i," recaudó ", totsuc[i]," pesos.")




En este caso, cada posición de la lista totsuc está acumulando el total de las ventas de la fila. Este uso se llama lista acumuladora o totalizadora.

Si vemos el último punto:


def listado_vendedores(mat,totven,nom,dni):
    for i in range (0,n):
        for j in range (0,m):
            totven[j]=totven[j] + mat[j][i]
    for i in range (0,m-1):
        for j in range(i+1,m):
            if totven[i]<totven[j]:
                aux=totven[i]
                totven[i]=totven[j]
                totven[j]=aux
               
                aux2=mat[i]
                mat[i]=mat[j]
                mat[j]=aux2
               
                aux=nom[i]
                nom[i]=nom[j]
                nom[j]=aux
               
                aux=dni[i]
                dni[i]=dni[j]
                dni[j]=aux
               
    print("NOMBRE      DNI   TOTAL VENDIDO")
    for i in range (0,m):
        print(nom[i],dni[i],totven[i])





Hace lo mismo, pero con una complejidad adicional: El listado debe estar ordenado por total vendido. Debo ordenar la lista totalizadora, pero cuando tengo que intercambiar dos posiciones de la lista, también debo intercambiar toda la información asociada: las posiciones respectivas de la lista de nombres, de la lista de dnis que actua como indice, 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 listas y matrices combinadas. 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 código completo, incluyendo el programa principal que llama a las funciones:



m=5 #Cantidad de filas(vendedores)
n=3 #Cantidad de columnas (sucursales)

def buscar(L, elem):
    for i in range(0, len(L)):
        if L[i]==elem:
                   return i
    return -1

def ingresar_venta(mat, dni):
    print("Ingresar")
    dv=int(input("Ingrese DNI del vendedor:"))
    pos = buscar(dni,dv)
    while pos == -1:
        dv=int(input("Ingrese DNI del vendedor:"))
    cv=int(input("Ingrese nro de sucursal:"))
    while cv < 0 or cv>=n:
        cv=int(input("Ingrese nro de sucursal:"))
    venta=float(input("Ingrese el importe de la venta:"))   
    mat[pos][cv] = mat[pos][cv]+venta
   
def total_sucursal(mat,totsuc):
    for i in range (0,n):
        for j in range (0,m):
            totsuc[i] = totsuc[i] + mat[j][i]
    for i in range (0,n):
        print("La sucursal ",i," recaudó ", totsuc[i]," pesos.")

def listado_vendedores(mat,totven,nom,dni):
    for i in range (0,n):
        for j in range (0,m):
            totven[j]=totven[j] + mat[j][i]
    for i in range (0,m-1):
        for j in range(i+1,m):
            if totven[i]<totven[j]:
                aux=totven[i]
                totven[i]=totven[j]
                totven[j]=aux
               
                aux2=mat[i]
                mat[i]=mat[j]
                mat[j]=aux2
               
                aux=nom[i]
                nom[i]=nom[j]
                nom[j]=aux
               
                aux=dni[i]
                dni[i]=dni[j]
                dni[j]=aux
               
    print("NOMBRE      DNI   TOTAL VENDIDO")
    for i in range (0,m):
        print(nom[i],dni[i],totven[i])


def Matrices():
    m=5 #Cantidad de filas
    n=3 #Cantidad de columnas
    mat = []  #Crear la matriz
    for i in range(0,m):
        mat.append([]) #Crear las filas de la matriz
        for j in range(0,n):
            mat[i].append(int(0))
    TotVend = []
    TotSuc = []
    nom = []
    dni = []
    for i in range(0,m):
        TotVend.append(0)
    for j in range(0,n):
        TotSuc.append(0)
    for i in range(0,m):
        nombre=input("Ingrese nombre del vendedor:")
        doc=int(input("Ingrese su DNI:"))
        nom.append(nombre)
        dni.append(doc)
    op=0
    while op!=4:
        print("MENU PRINCIPAL")
        print("1-Ingresar una venta")
        print("2-Total por sucursal")
        print("3-Listado de vendedores")
        print("4-Salir.")
        op=int(input("Ingrese opción:"))
        if op==1:
            ingresar_venta(mat,dni)
        elif op==2:
            total_sucursal(mat,TotSuc)
        elif op==3:
            listado_vendedores(mat,TotVend,nom,dni)
             
Matrices()






Hay formas más sencillas de resolver algunos de estos puntos en Python con funciones específicas. En este programa están resueltas de esta manera para poder comprender cómo actúa lógicamente el programa. Además, el programa puede "traducirse" más sencillamente a cualquier otro lenguaje de programación.

No hay comentarios:

Publicar un comentario