Algoritmo para Calcular Descuentos por Monto en PSeInt (Guía 2026)

Nivel: Básico / Intermedio Tiempo: ~20 min

Aplicar promociones y descuentos es una lógica fundamental en cualquier sistema de punto de venta (POS) o e-commerce. En este tutorial de Lógica de Programación, aprenderás a diseñar un algoritmo en PSeInt que recompensa a los clientes según cuánto gastan: a mayor compra, mayor descuento. Este ejercicio es perfecto para dominar las Estructuras Condicionales Anidadas (Si-SiNo-Si), ya que evaluaremos rangos de precios (por ejemplo, compras mayores a $1000 vs. compras menores) para decidir qué porcentaje aplicar. Es la introducción ideal a la «lógica de negocios».

Conceptos Clave: Rangos y Porcentajes

Para que la «caja registradora» funcione, necesitamos entender cómo la computadora toma decisiones basadas en números:

Condicionales Anidados (Escalera)

Cuando hay más de dos opciones (ej: sin descuento, 10% y 20%), un simple Si-Entonces no basta. Necesitamos colocar un Si dentro de otro para crear una «escalera» de decisiones que verifique los montos de mayor a menor.

Matemática de Porcentajes

Recuerda: En programación no restamos «20» a 100. Multiplicamos por el factor decimal.
• Descuento = Monto * 0.20
• Total = Monto - Descuento

Análisis del Algoritmo

Supongamos la siguiente política de la tienda:

  • Compra menor a $500: 0% de descuento.
  • Compra entre $500 y $1000: 10% de descuento.
  • Compra mayor a $1000: 20% de descuento.
  • ENTRADA El monto total de la compra (Subtotal). Variable: montoCompra (Real).
  • PROCESO Evaluar el monto en orden descendente para aplicar el porcentaje correcto.
    1. ¿Es > 1000? -> Desc = 20%
    2. ¿Es > 500? -> Desc = 10%
    3. Si no -> Desc = 0%
  • SALIDA Imprimir una «factura» detallando: Subtotal, Descuento aplicado (monto) y Total Neto a Pagar.

Código Fuente (Solución Estándar)

Archivo: DescuentoTienda.psc
Algoritmo CalcularDescuentoCompra
    // 1. Definición de Variables
    // Todo dinero debe ser Real por los centavos
    Definir montoCompra, montoDescuento, totalPagar Como Real;
    Definir porcentaje Como Real; // Variable auxiliar para mostrar info
    
    // 2. Entrada de Datos
    Escribir "=== CAJA REGISTRADORA 2026 ===";
    Escribir "Ingrese el monto total de la compra:";
    Leer montoCompra;
    
    // 3. Lógica de Descuentos (Condicionales Anidados)
    // Importante: Evaluar del mayor al menor para evitar errores de rango
    
    Si montoCompra > 1000 Entonces
        // Caso: Compra mayor a $1000
        montoDescuento <- montoCompra * 0.20;
        porcentaje <- 20;
    SiNo
        Si montoCompra > 500 Entonces
            // Caso: Entre $501 y $1000
            montoDescuento <- montoCompra * 0.10;
            porcentaje <- 10;
        SiNo
            // Caso: $500 o menos (Sin descuento)
            montoDescuento <- 0;
            porcentaje <- 0;
        FinSi
    FinSi
    
    // Cálculo final
    totalPagar <- montoCompra - montoDescuento;
    
    // 4. Salida (Formato Ticket)
    Escribir "-------------------------------";
    Escribir "Subtotal:        $", montoCompra;
    Escribir "Descuento (", porcentaje, "%): -$", montoDescuento;
    Escribir "-------------------------------";
    Escribir "TOTAL A PAGAR:   $", totalPagar;
    Escribir "-------------------------------";
    
    // Mensaje de cortesía
    Si montoDescuento > 0 Entonces
        Escribir "¡Felicidades! Ahorraste dinero hoy.";
    FinSi
    
FinAlgoritmo

Diagrama de Flujo

⚠️ Errores Frecuentes en Rangos Numéricos

La lógica de rangos es traicionera. Evita estos errores:

Orden Incorrecto de Evaluación

Si preguntas primero Si compra > 500, una compra de $2000 entrará en esa condición (porque 2000 es mayor que 500) y recibirá solo el 10% en lugar del 20%. Siempre evalúa del mayor al menor (o usa rangos con operador Y).

Compras Negativas

El código básico acepta «-100» como monto. En un sistema real, esto podría generar un «crédito» incorrecto. Siempre debemos validar que monto > 0.

Reto: Código Seguro (Validación)

Mejoremos el algoritmo para que no acepte números negativos y redondee los centavos para evitar problemas de visualización.

Algoritmo DescuentoValidado
    Definir compra, desc, total Como Real;
    
    // Ciclo para asegurar un monto válido
    Repetir
        Escribir "Ingrese monto de compra (Positivo):";
        Leer compra;
        Si compra <= 0 Entonces
            Escribir "Error: El monto debe ser mayor a 0.";
        FinSi
    Hasta Que compra > 0
    
    // Usamos rangos explícitos con operador 'Y' para mayor seguridad
    Si compra > 1000 Entonces
        desc <- compra * 0.20;
    SiNo
        // Aquí decimos explícitamente el rango
        Si compra > 500 Y compra <= 1000 Entonces
            desc <- compra * 0.10;
        SiNo
            desc <- 0;
        FinSi
    FinSi
    
    total <- compra - desc;
    
    // Redondeo matemático a 2 decimales
    total <- redon(total * 100) / 100;
    
    Escribir "Total Final: $", total;
    
FinAlgoritmo

Preguntas Frecuentes (FAQ)

¿Puedo usar la estructura 'Segun'?
No es recomendable para rangos continuos (como precios). Segun (Switch) funciona mejor para valores discretos y exactos (Opciones de menú 1, 2, 3). Para rangos de dinero, Si-Entonces es la herramienta correcta.
¿Cómo agrego un cupón de descuento extra?
Puedes preguntar al final ¿Tiene cupón? (S/N). Si la respuesta es S, restas un valor adicional al totalPagar calculado previamente.
¿Por qué me da el resultado con muchos decimales?
Las operaciones de punto flotante a veces generan residuos (ej: 10.0000001). Usa la función redon(variable) o formatea la salida si tu versión de PSeInt lo permite.
¿Cómo cambio la moneda?
El algoritmo es agnóstico a la moneda. Solo cambia el símbolo $ en los comandos Escribir por , S/, o el que necesites.

¿Listo para el siguiente nivel?

Domina la lógica de programación con nuestra colección completa.

Ver Más Ejercicios Resueltos

Publicaciones Similares