JuanFelipeArango28

taller 2

Sep 11th, 2020 (edited)
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 19.10 KB | None | 0 0
  1. ;codigo: simbolo
  2. ;nombre: simbolo
  3. ;disponibilidad : estructura: precio: numero
  4.                                            ;disponibles: numero
  5.  
  6. (define-struct producto (codigo nombre disponibilidad))
  7. (define-struct disponibilidad (precio unidades))
  8. (define lista1 (read-words/line "data/listaproductos.txt"))
  9.  
  10. (define-struct nueva (nombre precio cantidad))
  11.  
  12. (define listaproductos (list (make-producto 'a 'leche (make-disponibilidad 2500 50) )
  13.                              (make-producto 'b 'gaseosa (make-disponibilidad 1500 30) )
  14.                              (make-producto 'c 'gomitas (make-disponibilidad 2700 20) )
  15.                              (make-producto 'd 'helado (make-disponibilidad 5000 40) )
  16.                              )
  17.   )
  18.  
  19. (define listaproductos2 (list (make-producto 'e 'huevos (make-disponibilidad 9000 40) )
  20.                               (make-producto 'f 'frutiño (make-disponibilidad 500 20) )
  21.                               (make-producto 'g 'chocolate (make-disponibilidad 3000 35) )
  22.                               (make-producto 'h 'chocorramo (make-disponibilidad 50000 10) )
  23.                               )
  24.   )
  25. (define lista3 (list
  26.                 (make-producto "i" "vino" (make-disponibilidad 70000 15))
  27.                 (make-producto "j" "naranja" (make-disponibilidad 6000 60))
  28.                 (make-producto "k" "Jugos" (make-disponibilidad 2000 20))
  29.                 (make-producto "l" "tomate" (make-disponibilidad 300 100))
  30.                 (make-producto "m" "escoba" (make-disponibilidad 12000 50))
  31.                 (make-producto "n" "pan" (make-disponibilidad 1000 500))
  32.                 (make-producto "o" "vodka" (make-disponibilidad 34000 20))
  33.                 (make-producto "p" "SalsaTomate" (make-disponibilidad 3000 20))
  34.                 (make-producto "q" "RedBull" (make-disponibilidad 6000 80))
  35.                 (make-producto "r" "Monster" (make-disponibilidad 8000 40))
  36.                 (make-producto "s" "limon" (make-disponibilidad 2000 90))
  37.                 (make-producto "t" "Vive100" (make-disponibilidad 1500 15))
  38.                 (make-producto "u" "yogurt" (make-disponibilidad 6000 30))
  39.                 (make-producto "v" "cerveza" (make-disponibilidad 2500 100))
  40.                 (make-producto "w" "avena" (make-disponibilidad 900 200))
  41.                 (make-producto "x" "queso" (make-disponibilidad 5000 22))
  42.                 (make-producto "y" "salchichon" (make-disponibilidad 9000 9))
  43.                 (make-producto "z" "sandia" (make-disponibilidad 5000 14))))
  44. (define lsst3 (list
  45.                (list "i" "vino" "70000" "15")
  46.                (list "j" "naranja" "6000" "60")
  47.                (list "k" "Jugos" "2000" "20")
  48.                (list "l" "tomate" "300" "100")
  49.                (list "m" "escoba" "12000" "50")
  50.                (list "n" "pan" "1000" "500")
  51.                (list "o" "vodka" "34000" "20")
  52.                (list "p" "SalsaTomate" "3000" "20")
  53.                (list "q" "RedBull" "6000" "80")
  54.                (list "r" "Monster" "8000" "40")
  55.                (list "s" "limon" "2000" "90")
  56.                (list "t" "Vive100" "1500" "15")
  57.                (list "u" "yogurt" "6000" "30")
  58.                (list "v" "cerveza" "2500" "100")
  59.                (list "w" "avena" "900" "200")
  60.                (list "x" "queso" "5000" "22")
  61.                (list "y" "salchichon" "9000" "9")
  62.                (list "z" "sandia" "5000" "14")))
  63.                
  64.  
  65. ;Autores: Diego Fernando Llanos Mondragón, 202060029. Juan Felipe Arango Guzmán, 202060066. Juan Sebastian Grajales Samudio, 202059897.
  66. ;Fecha: work in progress
  67. ;1
  68. ;contrato: consultar: lista de productos, simbolo -> estructura nueva
  69. ;propósito: retornar la información de un producto según el código ingresado a buscar, junto con su precio y cantidad
  70. ;Ejemplos:
  71. ;(consultar listaproductos 'a) (make-nueva 'leche 2500 50)
  72. ;(consultar listaproductos2 'h) (make-nueva 'chocorramo 50000 10)
  73. ;(consultar listaproductos 'd) (make-nueva 'helado 5000 40)
  74. ;(consultar listaproductos2 'f) (make-nueva 'frutiño 500 20)
  75. ;Definición:
  76. (define (consultar lista codigo)
  77.   (cond
  78.     [(not (cons? lista)) (error "El  primer dato debe ser una lista de productos")]
  79.     [(not (symbol? codigo)) (error "El  segundo dato debe ser un simbolo")]
  80.     [(empty? lista) (error "La lista esta vacia")]
  81.     [(equal? codigo (producto-codigo (first lista)) )  
  82.      (make-nueva (producto-nombre (first lista))
  83.                  (disponibilidad-precio (producto-disponibilidad (first lista)))
  84.                  (disponibilidad-unidades (producto-disponibilidad (first lista)))
  85.                  )]
  86.  
  87.     [else (consultar (rest lista) codigo)]
  88.     )
  89.   )
  90. ;Pruebas:
  91. (check-expect (consultar listaproductos 'a) (make-nueva 'leche 2500 50))
  92. (check-expect (consultar listaproductos2 'h) (make-nueva 'chocorramo 50000 10))
  93. (check-expect (consultar listaproductos 'd) (make-nueva 'helado 5000 40))
  94. (check-expect (consultar listaproductos2 'f) (make-nueva 'frutiño 500 20))
  95.  
  96. ;2
  97. ;Contrato: cargarProductos: lista de lista de productos -> lista de productos
  98. ;Proposito: Cargar la informacion de un archivo de texto convirtiendola en una lista de estructuras
  99. ;Ejemplos:
  100. ; (cargarProducto lista1)
  101. ; (list
  102. ; (make-producto "i" "vino" (make-disponibilidad 70000 15))
  103. ; (make-producto "j" "naranja" (make-disponibilidad 6000 60))
  104. ; (make-producto "k" "Jugos" (make-disponibilidad 2000 20))
  105. ; (make-producto "l" "tomate" (make-disponibilidad 300 100))
  106. ; (make-producto "m" "escoba" (make-disponibilidad 12000 50))
  107. ; (make-producto "n" "pan" (make-disponibilidad 1000 500))
  108. ; (make-producto "o" "vodka" (make-disponibilidad 34000 20))
  109. ; (make-producto "p" "SalsaTomate" (make-disponibilidad 3000 20))
  110. ; (make-producto "q" "RedBull" (make-disponibilidad 6000 80))
  111. ; (make-producto "r" "Monster" (make-disponibilidad 8000 40))
  112. ; (make-producto "s" "limon" (make-disponibilidad 2000 90))
  113. ; (make-producto "t" "Vive100" (make-disponibilidad 1500 15))
  114. ; (make-producto "u" "yogurt" (make-disponibilidad 6000 30))
  115. ; (make-producto "v" "cerveza" (make-disponibilidad 2500 100))
  116. ; (make-producto "w" "avena" (make-disponibilidad 900 200))
  117. ; (make-producto "x" "queso" (make-disponibilidad 5000 22))
  118. ; (make-producto "y" "salchichon" (make-disponibilidad 9000 9))
  119. ; (make-producto "z" "sandia" (make-disponibilidad 5000 14)))
  120.  
  121. ; (cargarProducto
  122. ;  (list
  123. ;   (list "a" "leche" "2500" "20")
  124. ;   (list "b" "cerveza" "2500" "30")
  125. ;   (list "c" "jabon" "2000" "15")))
  126. ; (list
  127. ;  (make-producto "a"
  128. ;                 "leche"
  129. ;                 (make-disponibilidad 2500
  130. ;                                      20))
  131. ;  (make-producto "b"
  132. ;                 "cerveza"
  133. ;                 (make-disponibilidad 2500
  134. ;                                      30))
  135. ;  (make-producto "c"
  136. ;                 "jabon"
  137. ;                 (make-disponibilidad 2000
  138. ;                                      15))
  139.  
  140.  
  141. ;Definicion:
  142. (define (cargarProducto lsst)
  143.   (cond
  144.     [(empty? lsst) empty]
  145.     [(cons? (first lsst))
  146.      (cons (make-producto (first (first lsst))
  147.                           (first (rest (first lsst)))
  148.                           (make-disponibilidad (string->number(first (rest (rest (first lsst)))))
  149.                                                (string->number(first (rest (rest (rest (first lsst))))))
  150.                                                )
  151.                           ) (cargarProducto (rest lsst)))]
  152.     [else (cargarProducto (rest lsst))]
  153.     )
  154.   )
  155. ;Pruebas:
  156. (check-expect (cargarProducto lsst3) (list
  157.                 (make-producto "i" "vino" (make-disponibilidad 70000 15))
  158.                 (make-producto "j" "naranja" (make-disponibilidad 6000 60))
  159.                 (make-producto "k" "Jugos" (make-disponibilidad 2000 20))
  160.                 (make-producto "l" "tomate" (make-disponibilidad 300 100))
  161.                 (make-producto "m" "escoba" (make-disponibilidad 12000 50))
  162.                 (make-producto "n" "pan" (make-disponibilidad 1000 500))
  163.                 (make-producto "o" "vodka" (make-disponibilidad 34000 20))
  164.                 (make-producto "p" "SalsaTomate" (make-disponibilidad 3000 20))
  165.                 (make-producto "q" "RedBull" (make-disponibilidad 6000 80))
  166.                 (make-producto "r" "Monster" (make-disponibilidad 8000 40))
  167.                 (make-producto "s" "limon" (make-disponibilidad 2000 90))
  168.                 (make-producto "t" "Vive100" (make-disponibilidad 1500 15))
  169.                 (make-producto "u" "yogurt" (make-disponibilidad 6000 30))
  170.                 (make-producto "v" "cerveza" (make-disponibilidad 2500 100))
  171.                 (make-producto "w" "avena" (make-disponibilidad 900 200))
  172.                 (make-producto "x" "queso" (make-disponibilidad 5000 22))
  173.                 (make-producto "y" "salchichon" (make-disponibilidad 9000 9))
  174.                 (make-producto "z" "sandia" (make-disponibilidad 5000 14))))
  175. (check-expect (cargarProducto (list
  176.                                (list "a" "leche" "2500" "20")
  177.                                (list "b" "cerveza" "2500" "30")
  178.                                (list "c" "jabon" "2000" "15")))
  179.               (list
  180.                (make-producto "a"
  181.                               "leche"
  182.                               (make-disponibilidad 2500
  183.                                                    20))
  184.                (make-producto "b"
  185.                               "cerveza"
  186.                               (make-disponibilidad 2500
  187.                                                    30))
  188.                (make-producto "c"
  189.                               "jabon"
  190.                               (make-disponibilidad 2000
  191.                                                    15))
  192.                )
  193.               )
  194. ;3
  195. ;Contrato: venderProducto: listaproductos, producto-> listaproductos actulizada
  196. ;Proposito: Actualiza la lista de productos restando de la estructura la cantidad a vender y si se venden todos los producto lo elimina de la lista
  197. ;Ejemplos:
  198. ; ej1 (venderProducto (list(make-producto "ab" "cola" (make-disponibilidad 5000 20))
  199. ;                                    (make-producto "ac" "pola" (make-disponibilidad 7000 30))
  200. ;                                    (make-producto "az" "hola" (make-disponibilidad 70000 60))) (make-producto "az" "hola" (make-disponibilidad 70000 30)))
  201. ;               (list(make-producto "ab" "cola" (make-disponibilidad 5000 20))
  202. ;                    (make-producto "ac" "pola" (make-disponibilidad 7000 30))
  203. ;                    (make-producto "az" "hola" (make-disponibilidad 70000 30)))
  204.  
  205. ; ej2 (venderProducto lista3 (make-producto "i" "vino" (make-disponibilidad 70000 12)))
  206. ;               (list (make-producto "i" "vino" (make-disponibilidad 70000 3))
  207. ;                     (make-producto "j" "naranja" (make-disponibilidad 6000 60))
  208. ;                     (make-producto "k" "Jugos" (make-disponibilidad 2000 20))
  209. ;                     (make-producto "l" "tomate" (make-disponibilidad 300 100))
  210. ;                     (make-producto "m" "escoba" (make-disponibilidad 12000 50))
  211. ;                     (make-producto "n" "pan" (make-disponibilidad 1000 500))
  212. ;                     (make-producto "o" "vodka" (make-disponibilidad 34000 20))
  213. ;                     (make-producto "p" "SalsaTomate" (make-disponibilidad 3000 20))
  214. ;                     (make-producto "q" "RedBull" (make-disponibilidad 6000 80))
  215. ;                     (make-producto "r" "Monster" (make-disponibilidad 8000 40))
  216. ;                     (make-producto "s" "limon" (make-disponibilidad 2000 90))
  217. ;                     (make-producto "t" "Vive100" (make-disponibilidad 1500 15))
  218. ;                     (make-producto "u" "yogurt" (make-disponibilidad 6000 30))
  219. ;                     (make-producto "v" "cerveza" (make-disponibilidad 2500 100))
  220. ;                     (make-producto "w" "avena" (make-disponibilidad 900 200))
  221. ;                     (make-producto "x" "queso" (make-disponibilidad 5000 22))
  222. ;                     (make-producto "y" "salchichon" (make-disponibilidad 9000 9))
  223. ;                     (make-producto "z" "sandia" (make-disponibilidad 5000 14)))
  224.  
  225. ; ej3 (venderProducto lista3 (make-producto "m" "escoba" (make-disponibilidad 12000 50)))
  226. ;               (list(make-producto "i" "vino" (make-disponibilidad 70000 15))
  227. ;                    (make-producto "j" "naranja" (make-disponibilidad 6000 60))
  228. ;                    (make-producto "k" "Jugos" (make-disponibilidad 2000 20))
  229. ;                    (make-producto "l" "tomate" (make-disponibilidad 300 100))
  230. ;                    (make-producto "n" "pan" (make-disponibilidad 1000 500))
  231. ;                    (make-producto "o" "vodka" (make-disponibilidad 34000 20))
  232. ;                    (make-producto "p" "SalsaTomate" (make-disponibilidad 3000 20))
  233. ;                    (make-producto "q" "RedBull" (make-disponibilidad 6000 80))
  234. ;                    (make-producto "r" "Monster" (make-disponibilidad 8000 40))
  235. ;                    (make-producto "s" "limon" (make-disponibilidad 2000 90))
  236. ;                    (make-producto "t" "Vive100" (make-disponibilidad 1500 15))
  237. ;                    (make-producto "u" "yogurt" (make-disponibilidad 6000 30))
  238. ;                    (make-producto "v" "cerveza" (make-disponibilidad 2500 100))
  239. ;                    (make-producto "w" "avena" (make-disponibilidad 900 200))
  240. ;                    (make-producto "x" "queso" (make-disponibilidad 5000 22))
  241. ;                    (make-producto "y" "salchichon" (make-disponibilidad 9000 9))
  242. ;                    (make-producto "z" "sandia" (make-disponibilidad 5000 14)))
  243.  
  244. ;Definicion:  
  245.  
  246. (define (venderProducto lst producto)
  247.   (cond
  248.     [(empty? lst) empty]
  249.     [(equal? (producto-codigo (first lst)) (producto-codigo producto))
  250.      (cond
  251.        [(<= (- (disponibilidad-unidades (producto-disponibilidad (first lst)))
  252.                (disponibilidad-unidades (producto-disponibilidad producto))) 0)
  253.         (rest lst)]
  254.        [else (cons (make-producto
  255.                     (producto-codigo (first lst))
  256.                     (producto-nombre (first lst))
  257.                     (make-disponibilidad
  258.                      (disponibilidad-precio (producto-disponibilidad (first lst)))
  259.                      (- (disponibilidad-unidades (producto-disponibilidad (first lst)))
  260.                         (disponibilidad-unidades (producto-disponibilidad producto))) ))
  261.                    (venderProducto (rest lst) producto))]
  262.        )
  263.      ]
  264.     [else (cons (first lst) (venderProducto (rest lst)producto) )]
  265.     )
  266.   )
  267. ;Pruebas:
  268. (check-expect (venderProducto (list(make-producto "ab" "cola" (make-disponibilidad 5000 20))
  269.                                    (make-producto "ac" "pola" (make-disponibilidad 7000 30))
  270.                                    (make-producto "az" "hola" (make-disponibilidad 70000 60))) (make-producto "az" "hola" (make-disponibilidad 70000 30)))
  271.               (list(make-producto "ab" "cola" (make-disponibilidad 5000 20))
  272.                    (make-producto "ac" "pola" (make-disponibilidad 7000 30))
  273.                    (make-producto "az" "hola" (make-disponibilidad 70000 30))))
  274.  
  275. (check-expect (venderProducto lista3 (make-producto "i" "vino" (make-disponibilidad 70000 12)))
  276.               (list (make-producto "i" "vino" (make-disponibilidad 70000 3))
  277.                     (make-producto "j" "naranja" (make-disponibilidad 6000 60))
  278.                     (make-producto "k" "Jugos" (make-disponibilidad 2000 20))
  279.                     (make-producto "l" "tomate" (make-disponibilidad 300 100))
  280.                     (make-producto "m" "escoba" (make-disponibilidad 12000 50))
  281.                     (make-producto "n" "pan" (make-disponibilidad 1000 500))
  282.                     (make-producto "o" "vodka" (make-disponibilidad 34000 20))
  283.                     (make-producto "p" "SalsaTomate" (make-disponibilidad 3000 20))
  284.                     (make-producto "q" "RedBull" (make-disponibilidad 6000 80))
  285.                     (make-producto "r" "Monster" (make-disponibilidad 8000 40))
  286.                     (make-producto "s" "limon" (make-disponibilidad 2000 90))
  287.                     (make-producto "t" "Vive100" (make-disponibilidad 1500 15))
  288.                     (make-producto "u" "yogurt" (make-disponibilidad 6000 30))
  289.                     (make-producto "v" "cerveza" (make-disponibilidad 2500 100))
  290.                     (make-producto "w" "avena" (make-disponibilidad 900 200))
  291.                     (make-producto "x" "queso" (make-disponibilidad 5000 22))
  292.                     (make-producto "y" "salchichon" (make-disponibilidad 9000 9))
  293.                     (make-producto "z" "sandia" (make-disponibilidad 5000 14))))
  294. (check-expect (venderProducto lista3 (make-producto "m" "escoba" (make-disponibilidad 12000 50)))
  295.               (list(make-producto "i" "vino" (make-disponibilidad 70000 15))
  296.                    (make-producto "j" "naranja" (make-disponibilidad 6000 60))
  297.                    (make-producto "k" "Jugos" (make-disponibilidad 2000 20))
  298.                    (make-producto "l" "tomate" (make-disponibilidad 300 100))
  299.                    (make-producto "n" "pan" (make-disponibilidad 1000 500))
  300.                    (make-producto "o" "vodka" (make-disponibilidad 34000 20))
  301.                    (make-producto "p" "SalsaTomate" (make-disponibilidad 3000 20))
  302.                    (make-producto "q" "RedBull" (make-disponibilidad 6000 80))
  303.                    (make-producto "r" "Monster" (make-disponibilidad 8000 40))
  304.                    (make-producto "s" "limon" (make-disponibilidad 2000 90))
  305.                    (make-producto "t" "Vive100" (make-disponibilidad 1500 15))
  306.                    (make-producto "u" "yogurt" (make-disponibilidad 6000 30))
  307.                    (make-producto "v" "cerveza" (make-disponibilidad 2500 100))
  308.                    (make-producto "w" "avena" (make-disponibilidad 900 200))
  309.                    (make-producto "x" "queso" (make-disponibilidad 5000 22))
  310.                    (make-producto "y" "salchichon" (make-disponibilidad 9000 9))
  311.                    (make-producto "z" "sandia" (make-disponibilidad 5000 14))))
  312.  
  313.  
  314. ;Contrato: lista-to-text: listaproductos actualizada -> string
  315. ;Definiciones:
  316. (define (lst-to-text lst)
  317.   (cond
  318.    
  319.     [(empty? lst) " "]
  320.     [else (string-append
  321.            (producto-codigo (first lst))
  322.            " "
  323.            (producto-nombre (first lst))
  324.            " "
  325.            (number->string (disponibilidad-precio (producto-disponibilidad (first lst))))
  326.            " "
  327.            (number->string (disponibilidad-unidades (producto-disponibilidad (first lst))))
  328.            "\n"
  329.            (lst-to-text (rest lst))
  330.            )]
  331.     ))
  332. ;Pruebas:
  333. (check-expect (lst-to-text lista3) "i vino 70000 15\nj naranja 6000 60\nk Jugos 2000 20\nl tomate 300 100\nm escoba 12000 50\nn pan 1000 500\no vodka 34000 20\np SalsaTomate 3000 20\nq RedBull 6000 80\nr Monster 8000 40\ns limon 2000 90\nt Vive100 1500 15\nu yogurt 6000 30\nv cerveza 2500 100\nw avena 900 200\nx queso 5000 22\ny salchichon 9000 9\nz sandia 5000 14\n ")
  334.  
  335. ;Contrato: almacenar: string -> archivo.txt
  336. ;Definiciones:
  337. (define (almacenar lst producto)
  338.   (write-file "listaproductosActualizada.txt" (lst-to-text (venderProducto lst producto))  )
  339.   )
  340. (almacenar lista3 (make-producto "n" "pan" (make-disponibilidad 1000 50)))
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.              
Add Comment
Please, Sign In to add comment