Está en la página 1de 26

Algoritmos y Programación - Período 2022-2

Sesión 24
Arreglos
Bidimensionales
Ing. Ernesto Amaru Galvis Lista MSc. PhD. Ing. Alexander Armando Bustamante Martínez MSc. PhD.
Profesor Titular – Universidad del Magdalena Profesor Ocasional Auxiliar – Universidad del Magdalena
egalvis@unimagdalena.edu.co abustamente@unimagdalena.edu.co
DEBIDO A SU ÉXITO EN VENTAS LA EMPRESA
CINECOSTA HA REALIZADO IMPORTANTES CAMBIOS
Ha ampliado el tamaño de la sala de Santa Marta a
121 puestos.

Algoritmos y programación 2
Los puestos de la sala están distribuidos en diez filas que van desde la A hasta
la K, cada una de estas filas tiene 11 puestos, numerados del 1 al 11 como se
muestra en la parte inferior.

A-1 A-2 A-3 A-4 A-5 A-6 A-7 A-8 A-9 A –10 A –11
B-1 B-2 B-3 B-4 B-5 B-6 B-7 B-8 B-9 B –10 B –11
C-1 C-2 C-3 C-4 C-5 C-6 C-7 C-8 C-9 C –10 C –11
D-1 D– 2 D-3 D-4 D-5 D-6 D-7 D-8 D-9 D –10 D –11
E-1 E– 2 E-3 E-4 E-5 E-6 E-7 E-8 E-9 E –10 E –11
F-1 F– 2 F-3 F-4 F-5 F-6 F-7 F-8 F-9 F –10 F –11
G-1 G– 2 G-3 G-4 G-5 G-6 G-7 G-8 G-9 G –10 G –11
H-1 H– 2 H-3 H-4 H-5 H-6 H-7 H-8 H-9 H –10 H –11
I-1 I– 2 I-3 I-4 I-5 I-6 I-7 I-8 I-9 I – 10 I – 11
J-1 J– 2 J-3 J-4 J-5 J-6 J-7 J-8 J-9 J –10 J –11
K-1 K– 2 K-3 K-4 K-5 K-6 K-7 K-8 K-9 K –10 K –11
2. Los precios de la sala se han ajustados de la siguiente forma.
A-1 A-2 A-3 A-4 A-5 A-6 A-7 A-8 A-9 A –10 A –11
B-1 B-2 B-3 B-4 B-5 B-6 B-7 B-8 B-9 B –10 B –11
C-1 C-2 C-3 C-4 C-5 C-6 C-7 C-8 C-9 C –10 C –11
D-1 D– 2 D-3 D-4 D-5 D-6 D-7 D-8 D-9 D –10 D –11
E-1 E– 2 E-3 E-4 E-5 E-6 E-7 E-8 E-9 E –10 E –11
F-1 F– 2 F-3 F-4 F-5 F-6 F-7 F-8 F-9 F –10 F –11
G-1 G– 2 G-3 G-4 G-5 G-6 G-7 G-8 G-9 G –10 G –11
H-1 H– 2 H-3 H-4 H-5 H-6 H-7 H-8 H-9 H –10 H –11
I-1 I– 2 I-3 I-4 I-5 I-6 I-7 I-8 I-9 I – 10 I – 11
J-1 J– 2 J-3 J-4 J-5 J-6 J-7 J-8 J-9 J –10 J –11
K-1 K– 2 K-3 K-4 K-5 K-6 K-7 K-8 K-9 K –10 K –11

$5.000 Por ejemplo, la venta de los puestos A - 1, A - 4, A – 10, F


$15.000 – 6, H – 8, J – 9 y K - 8 representará un total de 85.000
$20.000 pesos.
Todas las salas de CINECOSTA en las diferentes
ciudades son ahora cuadradas, es decir, tienen igual
número de filas que de puestos por fila.
De manera que:
• La sala de Valledupar es de 7 x 7
• La sala de Santa Marta es de 11 x 11
• La sala de Barranquilla de 13 x 13
Valledupar: Sala 7 x 7
A-1 A–2 A-3 A-4 A-5 A-6 B-7
B-1 B–2 B-3 B-4 B-5 B-6 B-7
C-1 C–2 C-3 C-4 C-5 C-6 C-7
D-1 D–2 D-3 D-4 D-5 D-6 D-7
E-1 E–2 E-3 E-4 E-5 E-6 E-7
F-1 F–2 F-3 F-4 F-5 F-6 F-7
G-1 G–2 G-3 G-4 G-5 G-6 G-7

$5.000
$15.000
$20.000
Valledupar: Sala 7 x 7
0,0 0,1 0,2 0,3 0,4 0,5 0,6
1,0 1,1 1,2 1,3 1,4 1,5 1,6
2,0 2,1 2,2 2,3 2,4 2,5 2,6
3,0 3,1 3,2 3,3 3,4 3,5 3,6
4,0 4,1 4,2 4,3 4,4 4,5 4,6
5,0 5,1 5,2 5,3 5,4 5,5 5,6
6,0 6,1 6,2 6,3 6,4 6,5 6,6

$5.000
$15.000
$20.000
Santa Marta: Sala 11 x 11
A-1 A-2 A-3 A-4 A-5 A-6 A-7 A-8 A-9 A –10 A –11
B-1 B-2 B-3 B-4 B-5 B-6 B-7 B-8 B-9 B –10 B –11
C-1 C-2 C-3 C-4 C-5 C-6 C-7 C-8 C-9 C –10 C –11
D-1 D– 2 D-3 D-4 D-5 D-6 D-7 D-8 D-9 D –10 D –11
E-1 E– 2 E-3 E-4 E-5 E-6 E-7 E-8 E-9 E –10 E –11
F-1 F– 2 F-3 F-4 F-5 F-6 F-7 F-8 F-9 F –10 F –11
G-1 G– 2 G-3 G-4 G-5 G-6 G-7 G-8 G-9 G –10 G –11
H-1 H– 2 H-3 H-4 H-5 H-6 H-7 H-8 H-9 H –10 H –11
I-1 I– 2 I-3 I-4 I-5 I-6 I-7 I-8 I-9 I – 10 I – 11
J-1 J– 2 J-3 J-4 J-5 J-6 J-7 J-8 J-9 J –10 J –11
K-1 K– 2 K-3 K-4 K-5 K-6 K-7 K-8 K-9 K –10 K –11

$5.000
$15.000
$20.000
Santa Marta: Sala 11 x 11
0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 0 , 10
1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 1 , 10
2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 2,9 2 , 10
3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 3,8 3,9 3 , 10
4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 4,8 4,9 4 , 10
5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 5,8 5,9 5 , 10
6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7 6,8 6,9 6 , 10
7,0 7,1 7,2 7,3 7,4 7,5 7,6 7,7 7,8 7,9 7 , 10
8,0 8,1 8,2 8,3 8,4 8,5 8,6 8,7 8,8 8,9 8 , 10
9,0 9,1 9,2 9,3 9,4 9,5 9,6 9,7 9,8 9,9 9 , 10
10 , 0 10 , 1 10 , 2 10 , 3 10 , 4 10 , 5 10 , 6 10 , 7 10 , 8 10 , 9 10 , 10

$5.000
$15.000
$20.000
Barranquilla: Sala 13 x 13
A-1 A-2 A-3 A-4 A-5 A-6 A-7 A-8 A-9 A –10 A –11 A –12 A –13
B-1 B-2 B-3 B-4 B-5 B-6 B-7 B-8 B-9 B –10 B –11 B –12 B –13
C-1 C-2 C-3 C-4 C-5 C-6 C-7 C-8 C-9 C –10 C –11 C –12 C –13
D-1 D– 2 D-3 D-4 D-5 D-6 D-7 D-8 D-9 D –10 D –11 D –12 D –13
E-1 E– 2 E-3 E-4 E-5 E-6 E-7 E-8 E-9 E –10 E –11 E –12 E –13
F-1 F– 2 F-3 F-4 F-5 F-6 F-7 F-8 F-9 F –10 F –11 F –12 F –13
G-1 G– 2 G-3 G-4 G-5 G-6 G-7 G-8 G-9 G –10 G –11 G –12 G –13
H-1 H– 2 H-3 H-4 H-5 H-6 H-7 H-8 H-9 H –10 H –11 H –12 H –13
I-1 I– 2 I-3 I-4 I-5 I-6 I-7 I-8 I-9 I – 10 I – 11 I – 12 I – 13
J-1 J– 2 J-3 J-4 J-5 J-6 J-7 J-8 J-9 J –10 J –11 J –12 J –13
K-1 K– 2 K-3 K-4 K-5 K-6 K-7 K-8 K-9 K –10 K –11 K –12 K –13
L-1 L– 2 L-3 L-4 L-5 L-6 L-7 L-8 L-9 L –10 L –11 L –12 L –13
M-1 M– 2 M-3 M-4 M-5 M-6 M-7 M-8 M-9 M –10 M –11 M –12 M –13
Barranquilla: Sala 13 x 13
0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 0 , 10 0 , 11 0 , 12
1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 1 , 10 1 , 11 1 , 12
2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 2,9 2 , 10 2 , 11 2 , 12
3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 3,8 3,9 3 , 10 3 , 11 3 , 12
4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 4,8 4,9 4 , 10 4 , 11 4 , 12
5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 5,8 5,9 5 , 10 5 , 11 5 , 12
6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7 6,8 6,9 6 , 10 6 , 11 6 , 12
7,0 7,1 7,2 7,3 7,4 7,5 7,6 7,7 7,8 7,9 7 , 10 7 , 11 7 , 12
8,0 8,1 8,2 8,3 8,4 8,5 8,6 8,7 8,8 8,9 8 , 10 8 , 11 8 , 12
9,0 9,1 9,2 9,3 9,4 9,5 9,6 9,7 9,8 9,9 9 , 10 9 , 11 9 , 12
10 , 0 10 , 1 10 , 2 10 , 3 10 , 4 10 , 5 10 , 6 10 , 7 10 , 8 10 , 9 10 , 10 10 , 11 10 , 12
11 , 0 11 , 1 11 , 2 11 , 3 11 , 4 11 , 5 11 , 6 11 , 7 11 , 8 11 , 9 11 , 10 11 , 11 11 , 12
12 , 0 12 , 1 12 , 2 12 , 3 12 , 4 12 , 5 12 , 6 12 , 7 12 , 8 12 , 9 12 , 10 12 , 11 12 , 12
Usted debe modificar el programa
inicial para que soporte esta nueva
forma de cobrar de CINECOSTA.
Considerando las siguientes historias
de usuario.
Algoritmos y programación 12
Historia de usuario # 1
Título
Como usuario del programa deseo poder registrar la venta de un asiento en especifico de
manera que pueda llevar un control de los mismos.
Descripción
Para registrar la venta de un asiento se debe especificar el nombre de la fila, por ejemplo, “A”, “B”, “C” y el número del puesto dentro
de la fila, es decir, “1”, “2”, etc. Por lo cual para vender el primer asiento de la fila A se debe especificar “A” y “1”. Las letras de las filas
y la cantidad de asientos por cada fila variará en función de las dimensiones de la sala.
Criterios de aceptación
1. En las salas de 7 x7 las filas disponibles son la “A”, “B”, “C”, “D”, “E”, “F” y “G”
2. En las salas de 11 x 11 las filas disponibles son la “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J” y “K”
3. En las salas de 13 x 13 las filas disponibles son la “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”, “K”, “L” y “M”
4. La cantidad de asientos por filas que se pueden elegir variantes entre 1 y 7 para las salas de 7 x 7; 1 y 11 para las salas de 11 x
11; 1 y 13 para las salas de 13 x 13.
5. No se puede vender un asiento que ya ha sido vendido.
Historia de usuario # 2
Título
Como usuario del programa deseo poder consultar, en cualquier momento, cuántos
asientos han sido vendidos y cuántos están disponibles para la venta de manera que
pueda tener un reporte rápido de la ocupación de la sala.
Descripción
La cantidad de asientos vendidos más los asientos disponibles es igual a la cantidad total de asientos.
Criterios de aceptación
1. Los valores deben ser números mayores o iguales a cero.
2. La cantidad de asientos vendidos no puede superar la cantidad de asientos totales
3. La cantidad de asientos disponibles no puede superar la cantidad de asientos totales
Historia de usuario # 3
Título
Como usuario del programa deseo calcular la cantidad total de dinero que se lleva
recaudado de manera que pueda tener en todo momento información sobre la
rentabilidad del negocio.
Descripción
La cantidad de dinero recaudado, dado que el precio por asiento es variable dependiendo de la ubicación del asiento. De manera que
unos tendrán un costo de 5.000, unos de 15.000 y otros de 20.000
Criterios de aceptación
1. El valor debe ser un número entero mayor o igual a cero.
Los requisitos: Son las características que debe exhibir tanto un
programa de computador como los elementos que lo conforman.

Requisitos

No
Funcionales
funcionales
Requisitos no funcionales
No se refieren directamente a las funciones específicas suministradas por el
sistema, sino a las propiedades del mismo: rendimiento, seguridad, disponibilidad,
mantenibilidad, extensibilidad, etc. Para el programa se han impuesto los
siguientes requisitos no funcionales:

El mismo programa debe servir para crear cualquier tipo de


sala

La forma de calcular el dinero recaudado se debe ajustar


automáticamente según el tipo de sala

Utilizar buenas prácticas de programación como no usar Hard


Code,
Adicionalmente, usted debe construir un
menú que permita interactuar con el
programa para vender un puesto,
consultar la cantidad de puestos
disponibles, consultar la cantidad de
puestos vendidos y consultar el total de
dinero recaudado.
Algoritmos y programación 18
Se deben incorporar las validaciones
respectivas de manera que no se permita
vender puestos que ya han sido vendidos
o puestos inexistentes.

Algoritmos y programación 19
Solución propuesta
para la
lógica de negocio
1 import numpy as np
2
3 class Sala:
4
5 def __init__(self, nombre:str, filas:int, columnas:int):
6 self.nombre = nombre
7 self.cantidadDeAsientosPorFila = columnas
8 self.cantidadDeFilas = filas
9 self.cantidadTotalDeAsientos = filas * columnas
10 self.númeroAsientoInicial = 1
11 self.númeroAsientoFinal = self.númeroAsientoInicial + self.cantidadDeAsientosPorFila - 1
12 self.asientos = np.full((filas,columnas),False)
13 letrasAlfabeto = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','Ñ','O','P','Q','R','S','T','U','V','W','X','Y','Z‘)
14 self.letrasFilas = letrasAlfabeto[:filas]

Slicing Obtiene una nueva lista, tupla o arreglo que empieza en la posición definida como inicial
(por defecto cero) hasta la posición definida como final (no incluida).

letrasFilas = letrasAlfabeto[:4]

[‘A’, ‘B’, ‘C’, ‘D’]


16 def VenderAsiento(self,letra:str, número:int):
17 ventaRealizada = False
18 if letra in self.letrasFilas and self.númeroAsientoInicial <= número <= self.númeroAsientoFinal:
19 fila = self.letrasFilas.index(letra)
20 columna = número - 1
21 if self.asientos[fila][columna] == False:
22 self.asientos[fila][columna] = True
23 ventaRealizada = True
24 return ventaRealizada
26 def CalcularCantidadAsientosVendidos(self):
27 asientosVendidos = 0
28 for fila in range(0, self.cantidadDeFilas):
29 for columna in range(0, self.cantidadDeAsientosPorFila):
30 if self.asientos[fila][columna] == True:
3| asientosVendidos += 1
32 return asientosVendidos
33
34 def CalcularCantidadAsientosDisponibles(self):
35 cantidadAsientosVendidos = self.CalcularCantidadAsientosVendidos()
36 cantidadAsientosDisponibles = self.cantidadTotalDeAsientos - cantidadAsientosVendidos
37 return cantidadAsientosDisponibles
39 def CalcularIngresosObtenidos(self):
40 dineroRecaudado = 0
41 precioAsientoBajo = 5000
42 precioAsientoMedio = 15000
43 precioAsientoAlto = 20000
44 filaCentral = (self.cantidadDeAsientosPorFila - 1) / 2
45 for fila in range(0,self.cantidadDeFilas):
46 for columna in range(0, self.cantidadDeAsientosPorFila):
47 if self.asientos[fila][columna] == True:
48 if (fila == columna and fila >= filaCentral) or (fila + columna == self.cantidadDeAsientosPorFila -1 and fila >= filaCentral):
49 dineroRecaudado = dineroRecaudado + precioAsientoMedio
50 elif (fila + columna > self.cantidadDeAsientosPorFila -1 and fila > columna):
51 dineroRecaudado = dineroRecaudado +precioAsientoAlto
52 else:
53 dineroRecaudado = dineroRecaudado + precioAsientoBajo
54 return dineroRecaudado
Posición central en
sala de 13 x 13

0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 0 , 10 0 , 11 0 , 12
1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 1 , 10 1 , 11 1 , 12
2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 2,9 2 , 10 2 , 11 2 , 12
3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 3,8 3,9 3 , 10 3 , 11 3 , 12
4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 4,8 4,9 4 , 10 4 , 11 4 , 12
5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 5,8 5,9 5 , 10 5 , 11 5 , 12
6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7 6,8 6,9 6 , 10 6 , 11 6 , 12
7,0 7,1 7,2 7,3 7,4 7,5 7,6 7,7 7,8 7,9 7 , 10 7 , 11 7 , 12
8,0 8,1 8,2 8,3 8,4 8,5 8,6 8,7 8,8 8,9 8 , 10 8 , 11 8 , 12
9,0 9,1 9,2 9,3 9,4 9,5 9,6 9,7 9,8 9,9 9 , 10 9 , 11 9 , 12
10 , 0 10 , 1 10 , 2 10 , 3 10 , 4 10 , 5 10 , 6 10 , 7 10 , 8 10 , 9 10 , 10 10 , 11 10 , 12
11 , 0 11 , 1 11 , 2 11 , 3 11 , 4 11 , 5 11 , 6 11 , 7 11 , 8 11 , 9 11 , 10 11 , 11 11 , 12
12 , 0 12 , 1 12 , 2 12 , 3 12 , 4 12 , 5 12 , 6 12 , 7 12 , 8 12 , 9 12 , 10 12 , 11 12 , 12
Programa de prueba
1 from LógicaDeNegocio import Sala
2
3 salaCinecosta = Sala('Sala 1', 13, 13)
4 salaCinecosta.VenderAsiento('A', 1)
5 salaCinecosta.VenderAsiento('A', 4)
6 salaCinecosta.VenderAsiento('A', 10)
7 salaCinecosta.VenderAsiento('F', 6)
8 salaCinecosta.VenderAsiento('H', 4)
9 salaCinecosta.VenderAsiento('H', 8)
10 salaCinecosta.VenderAsiento('J', 9)
11 salaCinecosta.VenderAsiento('K', 8)
12 print('Asientos vendidos:', salaCinecosta.CalcularCantidadAsientosVendidos())
13 print('Ingresos obtenidos:', salaCinecosta.CalcularIngresosObtenidos())
14 print('Asientos disponibles:', salaCinecosta.CalcularCantidadAsientosDisponibles())

También podría gustarte