Solución al Problema de la Máquina Expendedora

 Eres un emprendedor entusiasta y tienes la oportunidad de instalar una
máquina expendedora de botanas en un auto lavado cercano a tu casa. Te
corresponde desarrollar el algoritmo para que cuente las monedas que el
usuario va insertando, sumando el importe en una variable hasta que el
usuario introduzca un código de algunos de los productos que están
disponibles. debes validar que el importe pagado sea suficiente. Hay que
tener en cuenta las siguientes restricciones:

1.:El algoritmo debera aceptar los siguientes comandos:

1.2:[NUMERO].Sera un valor numerico que representa la 
moneda que esta entrando al sistema.
1.3:[IDENTIFICADOR] Sera una clave para identificar los
productos que estan disponibles con el formato
[LETRA][NUMERO], por ejemplo ,D4,A3, etc.

1.4:RETIRAR. Si se recibe este comando, se devolvera
el importe al usuario cancelando la operacion

1.5:PARA. Este comando será para detener la ejecucion

2.-La maquina solo acepta monedas de 1,2,5,10 y 20
pesos.Cualquier otra moneda que entre al sistema sera
rechazada.

3.-No te preocupes por llevar el detalle de als monedas 
que el cliente ha introducido, solo el importe

4-En este problema, no ocupas tomar en cuenta el inventario
disponible de cada producto

5.-En algoritmo debe de reiniciarse cada vez que se haya
dispensado un producto y debera mantenerse corriendo hata que
sea introducido el comando para salir

6.-Intenta dividir tu programa en funciones para que tu codigo
sea mas comprensible

 

 Solución al Problema de la Máquina Expendedora

Lógica en Dos Pasos

Paso 1: Procesamiento Continuo de Comandos

  • La máquina debe funcionar en un ciclo infinito que solo se detiene con el comando "PARA"

  • En cada iteración, espera recibir un comando del usuario

  • Dependiendo del tipo de comando, ejecuta una acción específica

Paso 2: Gestión de Estados y Validaciones

  • Mantener un acumulador del dinero insertado

  • Validar que las monedas sean de denominaciones permitidas

  • Verificar si el dinero acumulado es suficiente al seleccionar un producto

  • Reiniciar el estado después de cada transacción completada

Pseudocódigo Detallado

text
INICIAR_PROGRAMA:
    MIENTRAS verdadero HACER
        mostrar "Esperando comando..."
        leer comando_del_usuario
        
        SI comando_del_usuario es "PARA" ENTONCES
            romper ciclo  // Terminar programa
        SINO SI comando_del_usuario es "RETIRAR" ENTONCES
            ejecutar RETIRAR_DINERO
        SINO SI comando_del_usuario es numérico ENTONCES
            ejecutar PROCESAR_MONEDA
        SINO SI comando_del_usuario tiene formato [LETRA][NUMERO] ENTONCES
            ejecutar PROCESAR_PRODUCTO
        SINO
            mostrar "Comando no válido"
        FIN SI
    FIN MIENTRAS

PROCESAR_MONEDA(valor_moneda):
    SI valor_moneda está en [1, 2, 5, 10, 20] ENTONCES
        agregar valor_moneda a total_acumulado
        mostrar "Total acumulado: [total_acumulado]"
    SINO
        mostrar "Moneda no aceptada"
    FIN SI

PROCESAR_PRODUCTo(codigo_producto):
    precio = OBTENER_PRECIO(codigo_producto)
    SI precio = -1 ENTONCES
        mostrar "Producto no válido"
    SINO SI total_acumulado >= precio ENTONCES
        mostrar "Dispensando producto [codigo_producto]"
        cambio = total_acumulado - precio
        SI cambio > 0 ENTONCES
            mostrar "Entregando cambio: [cambio] pesos"
        FIN SI
        ejecutar REINICIAR_TRANSACCION
    SINO
        mostrar "Fondos insuficientes. Faltan [precio - total_acumulado] pesos"
    FIN SI

RETIRAR_DINERO():
    SI total_acumulado > 0 ENTONCES
        mostrar "Devolviendo [total_acumulado] pesos"
        ejecutar REINICIAR_TRANSACCION
    SINO
        mostrar "No hay dinero para devolver"
    FIN SI

REINICIAR_TRANSACCION():
    total_acumulado = 0

OBTENER_PRECIO(codigo):
    // Base de datos de precios (ejemplo)
    SI codigo = "A1" ENTONCES devolver 15
    SI codigo = "B2" ENTONCES devolver 20
    SI codigo = "C3" ENTONCES devolver 25
    SI codigo = "D4" ENTONCES devolver 30
    devolver -1  // Producto no encontrado

Analogía: La Cafetería Inteligente

Imagina que eres un cajero en una cafetería:

  • Ciclo principal = Tu turno de trabajo: atiendes clientes uno tras otro hasta que termina tu jornada ("PARA")

  • Acumulador de dinero = La bandeja donde colocas el dinero que te da el cliente

  • Validación de monedas = Revisar que las monedas sean mexicanas y de denominaciones reales

  • Comando RETIRAR = El cliente cambia de idea y pide que le devuelvas su dinero

  • Selección de producto = El cliente te dice qué bebida quiere y verificas si alcanza con lo que pagó

  • Reinicio de transacción = Prepararte para atender al siguiente cliente, limpiando la bandeja

Descomposición en Partes Más Pequeñas

Parte 1: Estructura Principal del Programa

Algoritmo: Ciclo while infinito con switch-case
Estructura de datos: Variable para el comando actual

python
while True:
    comando = input("Ingrese comando: ")
    if comando == "PARA":
        break
    elif comando == "RETIRAR":
        # Lógica para retirar
    elif es_numero(comando):
        # Lógica para moneda
    elif es_codigo_producto(comando):
        # Lógica para producto

Parte 2: Validación y Procesamiento de Monedas

Algoritmo: Validación con lista de valores permitidos
Estructura de datos: Lista de monedas válidas [1, 2, 5, 10, 20]

python
monedas_validas = [1, 2, 5, 10, 20]

def procesar_moneda(valor):
    if valor in monedas_validas:
        total_acumulado += valor
        print(f"Moneda aceptada. Total: {total_acumulado}")
    else:
        print("Moneda rechazada")

Parte 3: Gestión de Productos y Precios

Algoritmo: Búsqueda en diccionario de precios
Estructura de datos: Diccionario {código: precio}

python
productos = {
    "A1": 15, "A2": 18, "A3": 22,
    "B1": 12, "B2": 25, "B3": 30,
    "C1": 8, "C2": 10, "C3": 12
}

def obtener_precio(codigo):
    return productos.get(codigo, -1)

Parte 4: Procesamiento de Transacciones

Algoritmo: Comparación y cálculo aritmético simple
Estructura de datos: Variable acumuladora para el total

python
def procesar_producto(codigo):
    precio = obtener_precio(codigo)
    if precio == -1:
        print("Producto no existe")
    elif total_acumulado >= precio:
        cambio = total_acumulado - precio
        print(f"Producto dispensado. Cambio: {cambio}")
        reiniciar_transaccion()
    else:
        faltante = precio - total_acumulado
        print(f"Faltan {faltante} pesos")

Parte 5: Reinicio del Sistema

Algoritmo: Reset de variable de estado
Estructura de datos: Variable simple para total acumulado

python
def reiniciar_transaccion():
    global total_acumulado
    total_acumulado = 0

Estructuras de Datos y Algoritmos por Cada Parte

  1. Ciclo Principal  Algoritmo: Control de flujo con ciclo while + condicionales

    • El ciclo while True mantiene el programa ejecutándose continuamente

    • Los if/elif determinan qué acción tomar según el comando

  2. Validación de Monedas  Estructura: Lista + operador in

    • La lista [1, 2, 5, 10, 20] define las monedas aceptadas

    • El operador in verifica membresía de manera eficiente

  3. Gestión de Productos  Estructura: Diccionario + método get()

    • El diccionario permite búsqueda rápida de precios por código

    • get() con valor default -1 maneja productos inexistentes elegantemente

  4. Control de Transacciones  Algoritmo: Aritmética simple + comparaciones

    • Resta para calcular cambio: total - precio

    • Comparación >= para verificar fondos suficientes

  5. Reinicio del Sistema  Algoritmo: Reasignación de variable

    • Simplemente establecer total_acumulado = 0 para nueva transacción

Esta descomposición hace que cada parte sea manejable y fácil de entender para principiantes, permitiendo enfocarse en una funcionalidad específica a la vez.

Comentarios

Entradas más populares de este blog

1-valores duplicados en un arreglo

Pseudocódigo de la Máquina Expendedora

Trabajas en una compañía que ofrece seguros de vida y de gastos