Fundamentos de Programación · Unidad 4

Estructuras de datos
bidimensionales

Seis ejercicios situados en contextos reales — desde tableros y grillas hasta sistemas de venta — organizados en dos bloques y tres niveles de dificultad.

6
Ejercicios
2
Bloques
3
Niveles
Básico
Creación, acceso directo y recorrido con doble for.
Medio
Lógica de negocio, validación y modificación de celdas.
Avanzado
Procesamiento multicriterio, extremos y reportes complejos.
PARTE 01

Matrices de Números

Contexto: tableros y grillas. Se trabaja con listas anidadas donde cada celda contiene un número entero o flotante. Los ejercicios simulan sistemas reales de gestión de espacios y consumo de datos estructurados en filas y columnas.

01
Parte 1 · Matrices de números
🅿️ Control de Estacionamiento
Un mall necesita saber cuántos espacios están disponibles en su estacionamiento de 3 pisos.
Básico

Un centro comercial tiene un estacionamiento con 3 pisos y 8 espacios por piso. Cada celda de la matriz representa un espacio: 0 = libre, 1 = ocupado.

Debes representar el estado del estacionamiento con una matriz 3×8 y mostrar un resumen de ocupación.

Lo que debe hacer el programa
  • 01 Definir la matriz con el estado inicial dado (hardcodeado)
  • 02 Recorrer toda la matriz y contar los espacios libres y ocupados
  • 03 Mostrar cuántos espacios libres hay en cada piso
  • 04 Mostrar el total de libres y ocupados en todo el estacionamiento
  • 05 Indicar en qué piso hay más espacio disponible
Estado inicial (usa estos datos)
estacionamiento.py
# 0 = libre, 1 = ocupado
estacionamiento = [
    [0,1,1,0,0,1,0,1],  # Piso 1
    [1,1,0,0,1,1,1,0],  # Piso 2
    [0,0,0,1,0,0,0,1],  # Piso 3
]
Salida esperada
Terminal
===== ESTACIONAMIENTO DEL MALL =====
Piso 1: 4 libres, 4 ocupados
Piso 2: 3 libres, 5 ocupados
Piso 3: 6 libres, 2 ocupados

TOTAL: 13 libres / 11 ocupados
El piso con más espacio disponible es el Piso 3
💡
Pista Usa un doble for (fila, columna) para recorrer la matriz. Guarda un contador de libres por fila. Para encontrar el piso con más espacio, recorre la lista de contadores y guarda el índice del máximo.
02
Parte 1 · Matrices de números
🎬 Reserva de Asientos — Cine Online
Una sala de cine necesita un sistema para consultar y reservar asientos en tiempo real.
Medio

Una sala de cine tiene 6 filas de 10 butacas cada una. La matriz representa el estado de cada butaca: 0 = disponible, 1 = reservado, 2 = bloqueado (mantenimiento).

El programa debe permitir al usuario consultar disponibilidad y reservar un asiento ingresando fila y columna.

Lo que debe hacer el programa
  • 01 Mostrar el mapa de sala con: [ ] libre, [X] reservado, [·] bloqueado
  • 02 Pedir al usuario fila y número de butaca para reservar
  • 03 Validar que la fila y butaca existan dentro del rango de la sala
  • 04 Validar que el asiento no esté ya reservado ni bloqueado
  • 05 Si es válido, marcar como reservado y mostrar el mapa actualizado
  • 06 Mostrar el total de asientos disponibles restantes
Estado inicial de la sala
sala.py
# 0=libre 1=reservado 2=bloqueado
sala = [
    [0,0,0,1,1,1,0,0,0,0], # A
    [0,1,1,1,0,0,1,0,0,2], # B
    [2,0,0,0,1,1,0,0,1,0], # C
    [0,0,1,0,0,2,2,0,0,1], # D
    [1,1,0,0,0,0,1,1,0,0], # E
    [0,0,0,0,0,0,0,0,0,0], # F
]
filas = ["A","B","C","D","E","F"]
Ejemplo de interacción
Terminal
===== CINEMAX - SALA 3 =====
     1   2   3   4   5   6   7   8   9  10
A  [ ] [ ] [ ] [X] [X] [X] [ ] [ ] [ ] [ ]
B  [ ] [X] [X] [X] [ ] [ ] [X] [ ] [ ] [·]
C  [·] [ ] [ ] [ ] [X] [X] [ ] [ ] [X] [ ]
D  [ ] [ ] [X] [ ] [ ] [·] [·] [ ] [ ] [X]
E  [X] [X] [ ] [ ] [ ] [ ] [X] [X] [ ] [ ]
F  [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]

Ingrese la fila (A-F): C
Ingrese el número de butaca (1-10): 2
✔ Asiento C2 reservado con éxito.

Asientos disponibles restantes: 30
💡
Pista Para la visualización usa un for por fila y otro por butaca, mapeando 0→"[ ]", 1→"[X]", 2→"[·]". Para convertir la letra a índice usa filas.index(entrada).
03
Parte 1 · Matrices de números
⚡ Red Eléctrica — Consumo por Sector
La empresa distribuidora de energía analiza el consumo diario por zona y período horario.
Avanzado

Una empresa eléctrica organiza su red en 5 sectores (filas) y mide el consumo en 4 períodos del día: madrugada, mañana, tarde, noche (columnas). Cada celda contiene el consumo en kWh (número decimal).

Debes analizar la matriz para generar un reporte de eficiencia: picos de consumo, promedios por sector y alertas de sectores críticos (consumo total > 400 kWh al día).

Lo que debe hacer el programa
  • 01 Calcular el consumo total y promedio por cada sector (fila)
  • 02 Calcular el consumo total y promedio por cada período (columna)
  • 03 Identificar la celda con mayor consumo (sector y período)
  • 04 Identificar la celda con menor consumo (sector y período)
  • 05 Listar los sectores que superan 400 kWh como "CRÍTICO"
  • 06 Mostrar qué período concentra el mayor consumo total de la red
Matriz de consumo (kWh)
red_electrica.py
# [madrug, mañana, tarde, noche]
consumo = [
    [45.2, 120.8,98.5, 87.3 ],# Norte
    [33.1, 210.5,185.2,140.0],# Sur
    [12.0, 88.3, 76.4, 55.1 ],# Este
    [67.8, 198.4,220.1,175.6],# Oeste
    [22.5, 145.0,162.3,110.8],# Centro
]
sectores = ["Norte","Sur","Este",
            "Oeste","Centro"]
periodos = ["Madrugada","Mañana",
            "Tarde","Noche"]
umbral = 400
Salida esperada
Terminal
======= RED ELÉCTRICA - REPORTE DIARIO =======

--- CONSUMO POR SECTOR ---
Sector Norte:  351.8 kWh | Promedio:  87.95 kWh
Sector Sur:    568.8 kWh | Promedio: 142.20 kWh  ⚠ CRÍTICO
Sector Este:   231.8 kWh | Promedio:  57.95 kWh
Sector Oeste:  661.9 kWh | Promedio: 165.48 kWh  ⚠ CRÍTICO
Sector Centro: 440.6 kWh | Promedio: 110.15 kWh  ⚠ CRÍTICO

--- CONSUMO POR PERÍODO ---
Madrugada:  180.6 kWh total
Mañana:     762.0 kWh total  ← PICO DE LA RED
Tarde:      742.5 kWh total
Noche:      568.8 kWh total

--- EXTREMOS ---
Mayor consumo: Sector Oeste, Tarde (220.1 kWh)
Menor consumo: Sector Este, Madrugada (12.0 kWh)

3 sector(es) en estado CRÍTICO.
💡
Pista Para totales por columna invierte el recorrido: el for externo recorre los períodos (0 a 3), el interno recorre los sectores sumando consumo[sector][periodo]. Para el máximo global usa dos variables: max_val y los índices fila_max, col_max, actualizándolos en cada iteración del doble for.

PARTE 02

Matrices de Diccionarios

Contexto: venta de entradas y pasajes. Cada celda ya no es un número simple, sino un diccionario con múltiples atributos (precio, categoría, nombre del pasajero, etc.). Se trabaja con listas de listas donde cada elemento es un dict.

04
Parte 2 · Matrices de diccionarios
🎭 Mapa de Butacas — Teatro Municipal
El teatro necesita mostrar qué butacas están disponibles y cuánto cuestan.
Básico

El Teatro Municipal tiene 4 filas de 5 butacas. Cada butaca es un diccionario con su categoría, precio y si está disponible o no.

El programa debe mostrar el mapa de butacas con su precio y calcular cuántas butacas disponibles hay por categoría.

Lo que debe hacer el programa
  • 01 Recorrer la matriz y mostrar cada butaca con categoría y precio
  • 02 Indicar visualmente disponible () u ocupada ()
  • 03 Contar butacas disponibles por categoría (VIP, Preferente, General)
  • 04 Calcular total de ingresos ya generados (butacas vendidas × precio)
Estructura de cada butaca
teatro.py
teatro = [
  [  # Fila A — VIP $25.000
    {"butaca":"A1","categoria":"VIP",
     "precio":25000,"disponible":False},
    {"butaca":"A2","categoria":"VIP",
     "precio":25000,"disponible":False},
    {"butaca":"A3","categoria":"VIP",
     "precio":25000,"disponible":True },
    # A4 True, A5 False...
  ],
  [  # Fila B — Preferente $15.000
    # 5 butacas, misma estructura
  ],
  [  # Filas C y D — General $8.000
    # 5 butacas, misma estructura
  ],
]
Salida esperada
Terminal
===== TEATRO MUNICIPAL - MAPA DE SALA =====
A1[VIP $25000]✘  A2[VIP $25000]✘  A3[VIP $25000]✔  A4[VIP $25000]✔  A5[VIP $25000]✘
B1[PRE $15000]✔  B2[PRE $15000]✘  B3[PRE $15000]✔  B4[PRE $15000]✔  B5[PRE $15000]✘
C1[GEN $8000]✔   C2[GEN $8000]✔   C3[GEN $8000]✘   C4[GEN $8000]✔   C5[GEN $8000]✔
D1[GEN $8000]✔   D2[GEN $8000]✘   D3[GEN $8000]✔   D4[GEN $8000]✘   D5[GEN $8000]✔

--- DISPONIBILIDAD POR CATEGORÍA ---
VIP       : 2 butacas disponibles
Preferente: 3 butacas disponibles
General   : 7 butacas disponibles

--- INGRESOS GENERADOS ---
Butacas vendidas: 8
Total recaudado : $175.000
💡
Pista Accede a los atributos con butaca["categoria"], butaca["precio"], butaca["disponible"]. Para los ingresos suma el precio solo cuando disponible == False.
05
Parte 2 · Matrices de diccionarios
🚌 Venta de Pasajes — Empresa de Buses
Sistema de venta de pasajes para una empresa de transporte interurbano.
Medio

Una empresa de buses tiene 3 servicios diarios (mañana, tarde, noche) con 5 asientos por bus. Cada asiento es un diccionario con la información del pasajero si está ocupado.

El programa debe permitir vender un pasaje: elegir servicio y asiento, ingresar nombre y RUT, y registrar la compra calculando el precio según el servicio.

Lo que debe hacer el programa
  • 01 Mostrar los 3 servicios con asientos libres u ocupados (con nombre)
  • 02 Pedir al usuario: servicio (1-3) y número de asiento (1-5)
  • 03 Validar que el asiento exista y esté libre
  • 04 Pedir nombre completo y RUT del pasajero
  • 05 Registrar la venta actualizando el diccionario del asiento
  • 06 Mostrar comprobante: mañana=$8.500, tarde=$9.000, noche=$11.000
Estructura de datos
buses.py
buses = [
  [  # Servicio 1 — 08:00 $8.500
    {"asiento":1,"libre":False,
     "pasajero":"Ana Pérez",
     "rut":"12.345.678-9"},
    {"asiento":2,"libre":True,
     "pasajero":"","rut":""},
    # asientos 3, 4, 5 ...
  ],
  [  # Servicio 2 — 14:00 $9.000
    # misma estructura
  ],
  [  # Servicio 3 — 22:00 $11.000
    # misma estructura
  ],
]
precios  = [8500,9000,11000]
horarios = ["08:00","14:00","22:00"]
Ejemplo de interacción
Terminal
==== TRANSBUS - VENTA DE PASAJES ====

[Servicio 1 - 08:00 | $8.500]
  Asiento 1: OCUPADO  - Ana Pérez
  Asiento 2: LIBRE
  Asiento 3: OCUPADO  - Luis Mora
  Asiento 4: LIBRE
  Asiento 5: LIBRE

Elija el servicio (1-3): 2
Elija el asiento (1-5): 3
Ingrese nombre completo: Sofía Tapia
Ingrese RUT: 17.888.999-0

=== COMPROBANTE DE VENTA ===
Servicio  : Tarde (14:00)
Asiento   : 3
Pasajero  : Sofía Tapia
RUT       : 17.888.999-0
Precio    : $9.000
¡Buen viaje, Sofía Tapia!
💡
Pista El usuario ingresa servicio 1-3, pero el índice es 0-2. Recuerda restar 1: idx = int(input(...)) - 1. Para actualizar usa buses[idx_serv][idx_asiento]["libre"] = False y buses[...][...]["pasajero"] = nombre.
06
Parte 2 · Matrices de diccionarios
✈️ Sistema de Check-in — Aerolínea
Una aerolínea necesita gestionar el check-in de un vuelo, aplicar restricciones y generar el manifiesto de pasajeros.
Avanzado

Un avión tiene 4 filas de 6 asientos (A, B, C — pasillo — D, E, F). Cada asiento tiene clase (Business/Economy), precio, nombre del pasajero y estado de check-in. La aerolínea aplica reglas de negocio reales: asientos ya confirmados no pueden volver a registrarse, y pasajeros menores de 18 no pueden ocupar la fila de emergencia (fila 3).

El programa debe procesar el check-in de un pasajero, validar las reglas y generar el manifiesto de vuelo.

Lo que debe hacer el programa
  • 01 Mostrar el mapa del avión con clase, precio y estado de check-in
  • 02 Pedir al usuario: fila (1-4) y asiento (A-F) para hacer check-in
  • 03 Validar que el asiento tenga pasajero asignado y no haya hecho check-in
  • 04 Pedir edad: si fila 3 y edad < 18, rechazar y sugerir otro asiento
  • 05 Registrar el check-in actualizando el campo del diccionario
  • 06 Mostrar el manifiesto final y recaudación total por clase
Estructura del vuelo LA-830
checkin.py
vuelo = [
  [  # Fila 1 — Business $850.000
    {"asiento":"1A",
     "clase":"Business",
     "precio":850000,
     "pasajero":"Isabel Rojas",
     "checkin":True},
    {"asiento":"1B",
     "clase":"Business",
     "precio":850000,
     "pasajero":"Jorge Mendez",
     "checkin":False},
    # 1C sin pasajero, 1D-1F...
  ],
  [  # Fila 2 — Economy $320.000
    # misma estructura
  ],
  [  # Fila 3 — Economy (EMERGENCIA)
    # requiere edad >= 18
  ],
  [  # Fila 4 — Economy
    # misma estructura
  ],
]
columnas = ["A","B","C","D","E","F"]
Ejemplo de interacción y manifiesto
Terminal
=== VUELO LA-830  SCL → MIA ===
    A          B          C          D          E          F
1 [BIZ ✔] [BIZ  ] [BIZ ---] [BIZ ✔] [BIZ  ] [BIZ ---]
2 [ECO ✔] [ECO  ] [ECO ---] [ECO ✔] [ECO  ] [ECO ---]
3 [ECO  ] [ECO ---] [ECO ✔] [ECO ---] [ECO  ] [ECO ---]  ⚠ EMERGENCIA
4 [ECO  ] [ECO ✔] [ECO ---] [ECO  ] [ECO ---] [ECO  ]
✔=check-in | espacio=pendiente | ---=sin pasajero

Ingrese fila (1-4): 3
Ingrese asiento (A-F): A
Ingrese su edad: 16
✘ Fila de emergencia requiere mayores de 18 años.
  Asientos sugeridos: 2B, 2E, 4A...

(con edad válida >= 18:)
✔ Check-in registrado: Felipe Saez — Asiento 3A

=== MANIFIESTO DE VUELO LA-830 ===
N°  Asiento  Clase     Pasajero          Check-in
1   1A       Business  Isabel Rojas      ✔
2   1D       Business  Rosa Lillo        ✔
3   2A       Economy   Carlos Ruiz       ✔
4   2D       Economy   Tomás Vera        ✔
5   3C       Economy   Paula Mora        ✔
6   4B       Economy   Valentina R.      ✔

Pasajeros con check-in : 6 / 14 totales
Pendientes de check-in : 8
Recaudación Business   : $2.550.000
Recaudación Economy    : $1.920.000
💡
Pista El usuario ingresa fila 1-4; el índice en la lista es 0-3. Para el asiento usa columnas.index(letra). Valida fila de emergencia comparando idx_fila == 2. Para el manifiesto, recorre toda la matriz con doble for y muestra sólo si checkin == True.