Programación Orientada a Objetos — Python

Ing. Bernardo Prado · DSM3 · UTH 2026-2

🎓 2026-2 🐍 Python 3 📊 100 pts

⚠️ INSTRUCCIONES OBLIGATORIAS PARA LA ENTREGA DEL EXAMEN

🏢 Ejercicios 1–6 — if / elif / else · Negocios

Seis ejercicios de aplicación directa en contextos de negocios reales: banco, hotel, restaurante, gasolinera, farmacia y cine. Cada uno usa if / elif / else y atributos bool, con escenario, diagramas y salida esperada.

6Ejercicios
100Puntos
if/elif/elseFoco
boolTipo clave
1

Cuenta Bancaria

🎯 17 pts📦 if/elif/else + bool🏦 Banco

📋 Escenario

Un banco necesita clasificar las cuentas de sus clientes según el saldo disponible y controlar si están activas. La clase CuentaBancaria usará un atributo booleano para indicar si la cuenta está operativa, clasificará el tipo de cuenta con if/elif/else según el saldo, y permitirá realizar retiros solo cuando haya fondos suficientes.

🧠 Lógica de cada método — cómo construirlo

CuentaBancaria.__init__()
Guarda el titular y el saldo iniciales. Crea el booleano activa = True para indicar que la cuenta comienza operativa. Define el atributo de clase SALDO_MINIMO = 500 como política del banco.
tipo_cuenta()
Usa if/elif/else para clasificar: si saldo >= 50000 retorna "Platino", si >= 10000 retorna "Oro", si >= 1000 retorna "Básica", de lo contrario retorna "Sin fondos".
tiene_fondos()
Retorna True solo cuando el saldo es mayor o igual al SALDO_MINIMO y la cuenta está activa. Combina ambas condiciones con and.
retirar(monto)
Si la cuenta está activa y el saldo cubre el monto, descuenta el dinero y retorna True. En cualquier otro caso retorna False sin modificar el saldo.
__str__()
Construye un texto usando un operador ternario para mostrar ✓ Con fondos o ✗ Sin fondos según el resultado de tiene_fondos(), junto con el nombre del titular, tipo y saldo formateado.

📐 Diagrama de Clases

CuentaBancaria
Atributos
+ SALDO_MINIMO : float = 500
+ titular : str
+ saldo : float
+ activa : bool = True
Métodos
+ tipo_cuenta() : str
+ tiene_fondos() : bool
+ retirar(monto) : bool
+ __str__() : str

👤 Diagrama de Casos de Uso

«Cuenta Bancaria» Cliente Consultar saldo Retirar dinero Verificar tipo de cuenta Ver estado de fondos
▶ Comprobación — Salida esperada
Ana Torres | Cuenta: Platino | Saldo: $75000.00 | ✓ Con fondos
Pedro Luna | Cuenta: Básica | Saldo: $2000.00 | ✓ Con fondos
María Sol | Cuenta: Sin fondos | Saldo: $300.00 | ✗ Sin fondos
Roberto Díaz | Cuenta: Oro | Saldo: $15000.00 | ✓ Con fondos
2

Habitación de Hotel

🎯 17 pts📦 if/elif/else + bool🏨 Hotel

📋 Escenario

Un hotel necesita gestionar sus habitaciones, conocer su categoría según el tipo y controlar su disponibilidad. La clase Habitacion usará un booleano para indicar si está libre, clasificará su categoría con if/elif/else según el tipo y calculará el costo total aplicando descuentos por estadía larga.

🧠 Lógica de cada método — cómo construirlo

Habitacion.__init__()
Guarda el numero, tipo y precio_noche. Crea el booleano disponible = True para indicar que la habitación empieza libre.
categoria()
Usa if/elif/else para clasificar el tipo: "Suite" es "Lujo", "Doble" es "Estándar", cualquier otro tipo es "Económica".
reservar()
Si la habitación está disponible, cambia disponible a False y retorna True. Si ya estaba ocupada, retorna False sin cambiar nada.
costo_total(noches)
Si noches >= 7 aplica 15% de descuento, si >= 3 aplica 10%, de lo contrario aplica precio completo. Retorna el resultado con round(..., 2).
__str__()
Usa un operador ternario para mostrar ✓ Disponible o ✗ Ocupada y arma la línea con número, tipo, categoría y precio por noche.

📐 Diagrama de Clases

Habitacion
Atributos
+ numero : int
+ tipo : str
+ precio_noche : float
+ disponible : bool = True
Métodos
+ categoria() : str
+ reservar() : bool
+ costo_total(noches) : float
+ __str__() : str

👤 Diagrama de Casos de Uso

«Habitación de Hotel» Recepcionista Verificar disponibilidad Reservar habitación Consultar categoría Calcular costo total
▶ Comprobación — Salida esperada
Hab. 301 | Suite → Lujo | $2500.00/noche | ✓ Disponible
Hab. 101 | Doble → Estándar | $800.00/noche | ✗ Ocupada
Hab. 205 | Sencilla → Económica | $400.00/noche | ✓ Disponible
Costo 10 noches Hab. 301: $21250.00 (desc. 15%)
3

Pedido de Restaurante

🎯 17 pts📦 if/elif/else + bool🍽️ Restaurante

📋 Escenario

Un restaurante necesita gestionar los pedidos de sus mesas, calcular la propina según el monto consumido y registrar si la cuenta ya fue pagada. La clase Pedido usará un booleano para el estado de pago, calculará la propina con if/elif/else y mostrará el total con desglose.

🧠 Lógica de cada método — cómo construirlo

Pedido.__init__()
Guarda el número de mesa, el nombre del platillo y el precio. Crea el booleano pagado = False para indicar que la cuenta empieza pendiente.
calcular_propina()
Usa if/elif/else para fijar el porcentaje: precio >= 500 aplica 15%, >= 200 aplica 12%, de lo contrario aplica 10%. Retorna el valor de la propina como float.
total_con_propina()
Suma el precio original más la propina calculada y retorna el total redondeado a dos decimales.
pagar()
Solo cambia pagado a True si la cuenta estaba pendiente. Si ya estaba pagada, no hace ningún cambio para evitar doble cobro.
__str__()
Usa un operador ternario para mostrar ✓ Pagado o ✗ Pendiente. Arma la línea con mesa, platillo, precio, propina y total.

📐 Diagrama de Clases

Pedido
Atributos
+ mesa : int
+ platillo : str
+ precio : float
+ pagado : bool = False
Métodos
+ calcular_propina() : float
+ total_con_propina() : float
+ pagar() : None
+ __str__() : str

👤 Diagrama de Casos de Uso

«Pedido de Restaurante» Mesero Registrar pedido Calcular propina Ver total con propina Registrar pago
▶ Comprobación — Salida esperada
Mesa 5 | Filete a la plancha | $650.00 + propina $97.50 = $747.50 | ✗ Pendiente
Mesa 2 | Sopa del día | $150.00 + propina $15.00 = $165.00 | ✓ Pagado
Mesa 8 | Pasta italiana | $280.00 + propina $33.60 = $313.60 | ✗ Pendiente
4

Vehículo en Gasolinera

🎯 17 pts📦 if/elif/else + bool⛽ Gasolinera

📋 Escenario

Una gasolinera necesita controlar el nivel de combustible de los vehículos que atiende. La clase Vehiculo usará un booleano para saber si el tanque está lleno, determinará el estado del nivel con if/elif/else y alertará cuando el vehículo necesite atención urgente.

🧠 Lógica de cada método — cómo construirlo

Vehiculo.__init__()
Guarda la placa, el tipo de combustible y el nivel_tanque (0–100). Crea el booleano tanque_lleno comparando si el nivel inicial es igual a 100.
estado_tanque()
Usa if/elif/else para clasificar: >= 75 es "Lleno", >= 50 es "Medio", >= 25 es "Bajo", de lo contrario es "Crítico".
necesita_servicio()
Retorna True cuando el nivel del tanque es menor a 25, indicando que el vehículo necesita cargarse urgentemente.
cargar(litros)
Suma los litros al nivel actual sin superar 100. Luego actualiza el booleano tanque_lleno comparando si el nuevo nivel es igual a 100.
__str__()
Usa un operador ternario para mostrar ✓ Necesita servicio o ✗ Sin urgencia según necesita_servicio(), junto con placa, combustible, nivel y estado.

📐 Diagrama de Clases

Vehiculo
Atributos
+ placa : str
+ combustible : str
+ nivel_tanque : float
+ tanque_lleno : bool
Métodos
+ estado_tanque() : str
+ necesita_servicio() : bool
+ cargar(litros) : None
+ __str__() : str

👤 Diagrama de Casos de Uso

«Vehículo en Gasolinera» Despachador Consultar nivel Verificar urgencia Cargar combustible Ver estado del tanque
▶ Comprobación — Salida esperada
ABC-123 | Gasolina | Nivel: 80% → Lleno | ✗ Sin urgencia
XYZ-789 | Diesel | Nivel: 18% → Crítico | ✓ Necesita servicio
DEF-456 | Gasolina | Nivel: 45% → Medio | ✗ Sin urgencia
ABC-123 después de cargar 20 L | Nivel: 100% → Lleno
5

Medicamento en Farmacia

🎯 16 pts📦 if/elif/else + bool💊 Farmacia

📋 Escenario

Una farmacia necesita controlar sus medicamentos, verificar si requieren receta médica y aplicar descuentos a clientes con membresía. La clase Medicamento usará booleanos para el requisito de receta y disponibilidad, y aplicará descuentos con if/elif/else según precio y membresía.

🧠 Lógica de cada método — cómo construirlo

Medicamento.__init__()
Guarda el nombre, precio y el booleano requiere_receta. Crea el booleano disponible = True para indicar que hay existencia desde el inicio.
descuento_membresia(es_miembro)
Usa if/elif/else: si es_miembro y precio >= 200 aplica 20%, si es_miembro sin importar precio aplica 10%, de lo contrario retorna 0. Devuelve el monto de descuento.
precio_final(es_miembro)
Resta el descuento al precio original y retorna el resultado con round(..., 2).
puede_vender(tiene_receta)
Si el medicamento requiere receta, retorna True solo cuando hay receta y está disponible. Si no requiere receta, solo verifica que esté disponible.
__str__()
Muestra el nombre, precio original, precio con membresía, si requiere receta y si se puede vender usando operadores ternarios para los booleanos.

📐 Diagrama de Clases

Medicamento
Atributos
+ nombre : str
+ precio : float
+ requiere_receta : bool
+ disponible : bool = True
Métodos
+ descuento_membresia(es_miembro) : float
+ precio_final(es_miembro) : float
+ puede_vender(tiene_receta) : bool
+ __str__() : str

👤 Diagrama de Casos de Uso

«Medicamento en Farmacia» Farmacéutico Verificar receta Aplicar descuento Calcular precio final Autorizar venta
▶ Comprobación — Salida esperada
Amoxicilina | $185.00 → $166.50 (miembro) | Receta: ✓ | ✓ Se puede vender
Ibuprofeno | $95.00 → $85.50 (miembro) | Receta: ✗ | ✓ Se puede vender
Morfina | $320.00 → $256.00 (miembro) | Receta: ✓ | ✗ No se puede vender
6

Boleto de Cine

🎯 16 pts📦 if/elif/else + bool🎬 Cine

📋 Escenario

Una sala de cine necesita gestionar sus boletos según la función programada. La clase Boleto usará un booleano para saber si ya fue vendido, calculará el precio final con if/elif/else aplicando un factor según la función (Matiné, Normal o Premier) y mostrará la información completa al cajero.

🧠 Lógica de cada método — cómo construirlo

Boleto.__init__()
Guarda el nombre de la pelicula, el número de sala, el tipo de funcion y el precio_base. Crea el booleano vendido = False para indicar que el boleto aún está disponible.
factor_precio()
Usa if/elif/else para retornar el factor: "Matiné" retorna 0.7, "Normal" retorna 1.0, "Premier" o cualquier otro caso retorna 1.3.
precio_final()
Multiplica el precio_base por el factor obtenido de factor_precio() y retorna el resultado con round(..., 2).
vender()
Si el boleto aún no ha sido vendido, cambia vendido a True. Si ya estaba vendido, no realiza ningún cambio para evitar doble emisión.
__str__()
Usa un operador ternario para mostrar ✓ Disponible o ✗ Vendido según el estado, y arma la línea con película, sala, función y precio final.

📐 Diagrama de Clases

Boleto
Atributos
+ pelicula : str
+ sala : int
+ funcion : str
+ precio_base : float
+ vendido : bool = False
Métodos
+ factor_precio() : float
+ precio_final() : float
+ vender() : None
+ __str__() : str

👤 Diagrama de Casos de Uso

«Boleto de Cine» Cajero Registrar función Calcular precio final Vender boleto Ver disponibilidad
▶ Comprobación — Salida esperada
Interestelar | Sala 3 | Matiné | $63.00 | ✓ Disponible
Avatar 2 | Sala 1 | Premier | $130.00 | ✓ Disponible
Titanic | Sala 2 | Normal | $100.00 | ✗ Vendido
UTH — Universidad Tecnológica de Hermosillo
Programación Orientada a Objetos · Ing. Bernardo Prado · DSM3 · 2026-2
Ejercicios 1–6 · if/elif/else · Negocios · 100 pts