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