EJERCICIO-Ejercicio Simplificado: Simulador de Cajero Automático Básico

Ejercicio Simplificado: Simulador de Cajero Automático Básico

Has sido contratado por un banco para crear un programa muy simple que simule un cajero automático. Tu tarea es desarrollar un algoritmo que permita retirar dinero, pero solo con dos tipos de billetes: de 50 y de 100.

Condiciones:

  • El cajero solo tiene billetes de 50 y 100.

  • El usuario solo puede retirar cantidades que sean múltiplos de 50 (por ejemplo: 50, 100, 150, 200, etc.). Si pide una cantidad que no es múltiplo de 50, debe mostrar un mensaje de error.

  • El objetivo es calcular cuántos billetes de cada denominación se deben entregar, usando la menor cantidad de billetes posible (siempre priorizando los billetes de mayor valor).

Siempre que inicie el algoritmo, deberá haber en inventario 10 billetes de cada denominación.
python
# Inventario inicial - 10 billetes de cada denominación
billetes_100 = 10
billetes_50 = 10

# Programa principal
print("=== CAJERO AUTOMÁTICO ===")

# Mostrar inventario actual
print("\n--- Inventario Actual ---")
print(f"Billetes de 100: {billetes_100}")
print(f"Billetes de 50: {billetes_50}")
print("--------------------------")

# Pedir la cantidad a retirar
cantidad = int(input("\n¿Cuánto dinero quieres retirar? "))

# Verificar monto mínimo
if cantidad < 50:
    print("Error: El monto mínimo es 50")

# Verificar si es múltiplo de 50
elif cantidad % 50 != 0:
    print("Error: Solo puedes retirar cantidades múltiplos de 50")

else:
    # Calcular cuántos billetes de cada uno necesitamos
    billetes_100_necesarios = cantidad // 100
    resto = cantidad % 100
    billetes_50_necesarios = resto // 50
    
    # Verificar si hay suficientes billetes
    if billetes_100_necesarios > billetes_100:
        print("Error: No hay suficientes billetes de 100 disponibles")
    
    elif billetes_50_necesarios > billetes_50:
        print("Error: No hay suficientes billetes de 50 disponibles")
    
    else:
        # Actualizar el inventario
        billetes_100 -= billetes_100_necesarios
        billetes_50 -= billetes_50_necesarios
        
        # Mostrar resultado
        print(f"\nRetirando {cantidad}:")
        if billetes_100_necesarios > 0:
            print(f"• {billetes_100_necesarios} billete(s) de 100")
        if billetes_50_necesarios > 0:
            print(f"• {billetes_50_necesarios} billete(s) de 50")
        
        # Mostrar inventario final
        print("\n--- Inventario Final ---")
        print(f"Billetes de 100: {billetes_100}")
        print(f"Billetes de 50: {billetes_50}")
        print("------------------------")

print("\n¡Gracias por usar nuestro cajero!")

📝 Explicación Simplificada:

  1. Inicializamos el inventario con 10 billetes de cada tipo

  2. Mostramos el inventario actual

  3. Pedimos la cantidad una sola vez (no hay ciclo)

  4. Verificamos errores:

    • Si es menor a 50

    • Si no es múltiplo de 50

    • Si no hay billetes suficientes

  5. Si todo está bien:

    • Calculamos los billetes necesarios

    • Actualizamos el inventario

    • Mostramos los billetes entregados

    • Mostramos el inventario final

  6. Terminamos con un mensaje de agradecimiento

📋 Ejemplo de ejecución:

text
=== CAJERO AUTOMÁTICO ===

--- Inventario Actual ---
Billetes de 100: 10
Billetes de 50: 10
--------------------------

¿Cuánto dinero quieres retirar? 250

Retirando 250:
• 2 billete(s) de 100
• 1 billete(s) de 50

--- Inventario Final ---
Billetes de 100: 8
Billetes de 50: 9
------------------------

¡Gracias por usar nuestro cajero!

🎯 Características:

  • ✅ Sin try (no maneja errores de entrada no numérica)

  • ✅ Sin ciclo infinito (solo una ejecución)

  • ✅ Termina después de entregar el dinero

  • ✅ Muestra inventario antes y después

  • ✅ Más simple y directo

Nota: Si el usuario escribe algo que no es un número (como "abc"), el programa fallará. Pero como pediste sin try, así se queda.


 EXPLICACIÓN DETALLADA DEL CÓDIGO

python
# Inventario inicial - 10 billetes de cada denominación
billetes_100 = 10
billetes_50 = 10

 Aquí creamos dos "cajitas" para guardar cuántos billetes tenemos:

  • billetes_100 = 10 → Tenemos 10 billetes de 100

  • billetes_50 = 10 → Tenemos 10 billetes de 50


python
# Programa principal
print("=== CAJERO AUTOMÁTICO ===")

 Mostramos el título del cajero automático.


python
# Mostrar inventario actual
print("\n--- Inventario Actual ---")
print(f"Billetes de 100: {billetes_100}")
print(f"Billetes de 50: {billetes_50}")
print("--------------------------")

 Mostramos cuántos billetes tenemos antes de que el usuario retire dinero.
 \n → Salto de línea para que se vea más ordenado.


python
# Pedir la cantidad a retirar
cantidad = int(input("\n¿Cuánto dinero quieres retirar? "))

 input() → Le preguntamos al usuario cuánto dinero quiere
 int() → Convertimos su respuesta en un número (ej: "250" → 250)
 cantidad → Guardamos ese número en una variable


python
# Verificar monto mínimo
if cantidad < 50:
    print("Error: El monto mínimo es 50")

 SI la cantidad es menor que 50 → Mostramos error
 Ejemplo: Si escribe "30" → "Error: El monto mínimo es 50"


python
# Verificar si es múltiplo de 50
elif cantidad % 50 != 0:
    print("Error: Solo puedes retirar cantidades múltiplos de 50")

 SINO, SI no es múltiplo de 50 → Mostramos error
 % → Operador que da el resto de una división
 Ejemplo: 75 % 50 = 25 (no es cero) → Error


python
else:
    # Calcular cuántos billetes de cada uno necesitamos
    billetes_100_necesarios = cantidad // 100
    resto = cantidad % 100
    billetes_50_necesarios = resto // 50

 SINO (si pasó todas las validaciones) → Calculamos los billetes
 // → División entera (sin decimales)
 Ejemplo con 250:

  • 250 // 100 = 2 → Necesitamos 2 billetes de 100

  • 250 % 100 = 50 → Sobra 50 pesos

  • 50 // 50 = 1 → Necesitamos 1 billete de 50


python
    # Verificar si hay suficientes billetes
    if billetes_100_necesarios > billetes_100:
        print("Error: No hay suficientes billetes de 100 disponibles")
    
    elif billetes_50_necesarios > billetes_50:
        print("Error: No hay suficientes billetes de 50 disponibles")

 Verificamos si tenemos suficientes billetes
 Ejemplo: Si pide 1500 billetes de 100 → Error (solo tenemos 10)


python
    else:
        # Actualizar el inventario
        billetes_100 -= billetes_100_necesarios
        billetes_50 -= billetes_50_necesarios

 SI tenemos billetes suficientes → Restamos del inventario
 -= → Significa "resta y guarda el resultado"
 Ejemplo:

  • billetes_100 = 10 - 2 = 8

  • billetes_50 = 10 - 1 = 9


python
        # Mostrar resultado
        print(f"\nRetirando {cantidad}:")
        if billetes_100_necesarios > 0:
            print(f"• {billetes_100_necesarios} billete(s) de 100")
        if billetes_50_necesarios > 0:
            print(f"• {billetes_50_necesarios} billete(s) de 50")

 Mostramos qué billetes entregamos
 Solo mostramos los billetes que realmente usamos


python
        # Mostrar inventario final
        print("\n--- Inventario Final ---")
        print(f"Billetes de 100: {billetes_100}")
        print(f"Billetes de 50: {billetes_50}")
        print("------------------------")

 Mostramos cuántos billetes nos quedaron después del retiro


python
print("\n¡Gracias por usar nuestro cajero!")

 Este mensaje se muestra SIEMPRE al final, haya habido error o no.

📋 FLUJO DEL PROGRAMA:

  1. Mostrar inventario inicial

  2. Pedir cantidad

  3. Verificar si es válida

  4. Si es válida → Calcular billetes

  5. Verificar si hay billetes suficientes

  6. Si hay → Entregar y actualizar inventario

  7. Mostrar inventario final

  8. Despedirse

🎯 RESUMEN:

El programa hace UNA SOLA operación y termina. No vuelve a preguntar. Es simple y directo.


Cajero Automático con Múltiples Denominaciones

python
# Inventario inicial - 10 billetes de cada denominación
billetes_1000 = 10
billetes_500 = 10
billetes_200 = 10
billetes_100 = 10
billetes_50 = 10

# Programa principal
print("=== CAJERO AUTOMÁTICO ===")

# Mostrar inventario actual
print("\n--- Inventario Actual ---")
print(f"Billetes de 1000: {billetes_1000}")
print(f"Billetes de 500: {billetes_500}")
print(f"Billetes de 200: {billetes_200}")
print(f"Billetes de 100: {billetes_100}")
print(f"Billetes de 50: {billetes_50}")
print("--------------------------")

# Pedir la cantidad a retirar
cantidad = int(input("\n¿Cuánto dinero quieres retirar? "))

# Verificar monto mínimo
if cantidad < 50:
    print("Error: El monto mínimo es 50")

# Verificar si es múltiplo de 50
elif cantidad % 50 != 0:
    print("Error: Solo puedes retirar cantidades múltiplos de 50")

else:
    # Calcular cuántos billetes de cada uno necesitamos
    temp_1000 = min(billetes_1000, cantidad // 1000)
    resto = cantidad - (temp_1000 * 1000)
    
    temp_500 = min(billetes_500, resto // 500)
    resto = resto - (temp_500 * 500)
    
    temp_200 = min(billetes_200, resto // 200)
    resto = resto - (temp_200 * 200)
    
    temp_100 = min(billetes_100, resto // 100)
    resto = resto - (temp_100 * 100)
    
    temp_50 = min(billetes_50, resto // 50)
    resto = resto - (temp_50 * 50)
    
    # Verificar si se puede dispensar exactamente la cantidad solicitada
    if resto != 0:
        print("Error: No hay una combinación de billetes disponible para el monto solicitado")
    else:
        # Actualizar el inventario
        billetes_1000 -= temp_1000
        billetes_500 -= temp_500
        billetes_200 -= temp_200
        billetes_100 -= temp_100
        billetes_50 -= temp_50
        
        # Mostrar resultado
        print(f"\nRetirando {cantidad}:")
        if temp_1000 > 0:
            print(f"• {temp_1000} billete(s) de 1000")
        if temp_500 > 0:
            print(f"• {temp_500} billete(s) de 500")
        if temp_200 > 0:
            print(f"• {temp_200} billete(s) de 200")
        if temp_100 > 0:
            print(f"• {temp_100} billete(s) de 100")
        if temp_50 > 0:
            print(f"• {temp_50} billete(s) de 50")
        
        # Mostrar inventario final
        print("\n--- Inventario Final ---")
        print(f"Billetes de 1000: {billetes_1000}")
        print(f"Billetes de 500: {billetes_500}")
        print(f"Billetes de 200: {billetes_200}")
        print(f"Billetes de 100: {billetes_100}")
        print(f"Billetes de 50: {billetes_50}")
        print("------------------------")

print("\n¡Gracias por usar nuestro cajero!")

Este código ahora incluye todas las denominaciones solicitadas (50, 100, 200, 500 y 1000) y verifica que exista una combinación exacta de billetes antes de realizar el retiro. Si no hay una combinación que satisfaga exactamente el monto solicitado, no se dispensará ningún billete.

El algoritmo intenta usar primero los billetes de mayor denominación y luego va bajando progresivamente a los de menor denominación, lo que es la forma estándar de operar en los cajeros automáticos.

Comentarios

Entradas populares de este blog

¿Qué es un Closure?

4 tipos de colecciones de datos más

Calculadora de edad