JF_Jaramillo

Recursividad

Aug 22nd, 2020
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;;Estructuras
  2.  
  3. (define-struct fruta (nombre pesoG valorG))
  4. (define-struct carne (nombre tipo pesoG))
  5.  
  6. (define-struct carne-cerdo (parte precioG))
  7. (define-struct carne-pollo (parte tipo precioG))
  8. (define-struct carne-res (parte proceso precioG))
  9. (define-struct carne-pescado (tipo origen precioG))
  10.  
  11. (define-struct electrodomestico (nombre marca precioU))
  12. (define-struct higiene (nombre marca precioD))
  13. (define-struct bebidas (nombre marca precioU))
  14.  
  15. (define-struct venta (producto unidades))
  16. (define-struct detallado (subtotal IVA bolsas total))
  17.  
  18. ;;;Solución
  19.  
  20. ;;Autor: Carlos A Delgado
  21. ;;Fecha 22 de Agosto de 2020
  22. ;;Contrato: calcular-venta: lista de venta, numero -> detallado
  23. ;;Propósito: Calcular el total detallado de una venta que de realiza en un supermercado
  24. ;;Ejemplo
  25. ; Voy a comprar 150 manzanas gramo cuesta 8, tres mil gramos
  26. ; de lomo de cerdo 15 el gramo y una lavadora 200000. 3 bolsas
  27. ; Detallado: Subtotal:  150*8 + 15*3000 + 200000 = 246200
  28. ; IVA: 0.05(150*8 + 15*3000 ) + 0.19*200000 = 40310
  29. ; Bolsas= 3*40 = 120
  30. ; Total: 286630
  31.  
  32. (define (calcular-venta lventa num_bolsas)
  33.   (make-detallado
  34.    (calcular-subtotal lventa)
  35.    (calcular-iva lventa)
  36.    (* 40 num_bolsas)
  37.    (+ (calcular-subtotal lventa)
  38.       (calcular-iva lventa)
  39.       (* 40 num_bolsas)
  40.       )))
  41.  
  42. ;;Contrato: calcular-subtotal: lista de venta -> numero
  43. (define (calcular-subtotal lventa)
  44.   (cond
  45.     [(null? lventa) 0]
  46.     [(fruta? (venta-producto (first lventa)))
  47.      (+
  48.       (*
  49.       ;;Número de gramos que voy a comprar
  50.       (venta-unidades (first lventa))
  51.       ;;Valor por gramo
  52.       (fruta-valorG (venta-producto (first lventa)))
  53.       )
  54.       ;;Resto
  55.       (calcular-subtotal (rest lventa))
  56.       )
  57.      ]
  58.     [(carne? (venta-producto (first lventa)))
  59.      (+
  60.       ;;Primero
  61.       (*
  62.        ;;Número de gramos que voy a comprar
  63.        (venta-unidades (first lventa))
  64.        ;;Precio por gramo
  65.        (cond
  66.          [(carne-cerdo? (carne-tipo (venta-producto (first lventa))))
  67.           (carne-cerdo-precioG (carne-tipo (venta-producto (first lventa))))
  68.           ]
  69.          [(carne-pollo? (carne-tipo (venta-producto (first lventa))))
  70.           (carne-pollo-precioG (carne-tipo (venta-producto (first lventa))))
  71.           ]
  72.          [(carne-res? (carne-tipo (venta-producto (first lventa))))
  73.           (carne-res-precioG (carne-tipo (venta-producto (first lventa))))
  74.           ]
  75.          [(carne-pescado? (carne-tipo (venta-producto (first lventa))))
  76.           (carne-pescado-precioG (carne-tipo (venta-producto (first lventa))))
  77.           ]
  78.          [else (error "Tipo de carne no válido")]
  79.          )
  80.       )
  81.       ;;Resto
  82.       (calcular-subtotal (rest lventa))
  83.       )
  84.      ]
  85.     [(higiene? (venta-producto (first lventa)))
  86.      (+
  87.       ;;Primero
  88.       (*
  89.        ;;Número de docenas que voy a comprar
  90.        (venta-unidades (first lventa))
  91.        ;;Valor por docena
  92.        (higiene-precioD (venta-producto (first lventa)))
  93.        )
  94.       ;;Resto
  95.       (calcular-subtotal (rest lventa))
  96.       )
  97.      ]
  98.     [(electrodomestico? (venta-producto (first lventa)))
  99.      (+
  100.       ;;Primero
  101.       (*
  102.        ;;Número de unidades que voy a comprar
  103.        (venta-unidades (first lventa))
  104.        ;;Valor por unidad
  105.        (electrodomestico-precioU (venta-producto (first lventa)))
  106.        )
  107.       ;;Resto
  108.       (calcular-subtotal (rest lventa))
  109.       )]
  110.     [(bebidas? (venta-producto (first lventa)))
  111.      (+
  112.       ;;Primero
  113.       (*
  114.        ;;Número de unidades que voy a comprar
  115.        (venta-unidades (first lventa))
  116.        ;;Valor por unidad
  117.        (bebidas-precioU (venta-unidades (first lventa)))
  118.        )
  119.       ;;Resto
  120.       (calcular-subtotal (rest lventa))
  121.       )]
  122.     [else (error "La lista contiene un producto no válido")]
  123.     ))
  124.  
  125. ;;calcular-iva: lista de venta -> numero
  126. (define (calcular-iva listaV)
  127.   (cond
  128.     [(empty? listaV) 0]
  129.     [else
  130.      (+
  131.       (cond
  132.         [(or (fruta? (venta-producto (first listaV)))
  133.              (carne? (venta-producto (first listaV))))
  134.          (* 0.05 (calcular-subtotal (cons (first listaV) empty)))]
  135.         [else (* 0.19 (calcular-subtotal (cons (first listaV) empty)))]
  136.         )
  137.       (calcular-iva (rest listaV))
  138.       )]))
  139.  
  140. ;;Pruebas
  141. ; Voy a comprar 150 manzanas gramo cuesta 8, tres mil gramos
  142. ; de lomo de cerdo 15 el gramo y una lavadora 200000. 3 bolsas
  143. ; Detallado: Subtotal:  150*8 + 15*3000 + 200000 = 246200
  144. ; IVA: 0.05(150*8 + 15*3000 ) + 0.19*200000 = 40310
  145. ; Bolsas= 3*40 = 120
  146. ; Total: 286630
  147.  
  148.  
  149. (check-expect (calcular-venta (cons (make-venta (make-fruta "manzana" 150 8) 150)
  150.                                     (cons (make-venta (make-carne "Cerdo" (make-carne-cerdo "lomo" 15) 200) 3000)
  151.                                           (cons (make-venta (make-electrodomestico "Lavadora" "LG" 200000) 1)
  152.                                                 empty))) 3)
  153.               (make-detallado
  154.                246200
  155.                40310
  156.                120
  157.                286630)
  158.               )
Add Comment
Please, Sign In to add comment