View difference between Paste ID: dL6mc7an and YEZxpdsU
SHOW: | | - or go back to the newest paste.
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
              )