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 | ) |