Advertisement
juanesperanza

Ejercicio 7 de la Práctica 17 de Repaso 2do. Semestre.

Dec 8th, 2012
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 7.55 KB | None | 0 0
  1.                          
  2.                          ************************************
  3.              Corregido ayer martes 7/12 por prof.
  4.              ************************************
  5.  
  6. Ejercicio 7 de la Práctica 17 de Repaso 2do. Semestre. (Lista Doble Enlace)
  7.              
  8. Una casa de deportes dispone de una lista que contiene información de los productos que se
  9. encuentran a la venta. De cada producto se conoce: código de producto, tipo, modelo, marca,
  10. stock, y precio. Dicha lista se encuentra ordenada por código de producto (criterio de orden
  11. primario) y por marca (criterio de orden secundario).
  12.  
  13. Realizar módulos para:
  14.  
  15. a) Agregar un producto. Recibe un producto y lo inserta en la lista.
  16. b) Borrado de un producto. Recibe el código del producto a eliminar y si existe lo elimina.
  17. Debe devolver un boolean que indique si se realizó o no el borrado.
  18. c) Calcular el tipo y modelo de los dos productos más caros de una marca (recibida por parámetro).
  19. d) Venta de un producto. Recibe el código del producto a vender y la cantidad pedida. La venta solo se
  20. realiza si el producto existe y hay stock suficiente. Para realizar la venta debe decrementar el
  21. stock del producto correspondiente. Debe devolver un boolean que indique si se realizó con éxito la
  22. operación o no.
  23.  
  24. Nota: Realice el programa principal que invoque a los módulos e informe lo calculado en 3) y el éxito
  25. o fracaso de las operaciones realizadas en 2) y 4).
  26.  
  27.  
  28. program Deportes_Ejercicio_7_Práctica17Repaso;
  29.  
  30. type
  31.     lista=^nodo;
  32.     nodo=record
  33.     datos:producto;
  34.     sig_cod:lista;
  35.     sig_marca:lista;
  36.     end;
  37.    
  38.     producto=record
  39.     cod_prod:integer;
  40.     tipo:string;
  41.     modelo:string;
  42.     marca:string;
  43.     stock:integer;
  44.     precio:real;
  45.     end;
  46.    
  47.     lista_doble=record
  48.     pri_cod:lista;
  49.     pri_marca:lista;
  50.     end;
  51.  
  52. procedure leer_producto (var prod:producto);
  53.  
  54. begin
  55.     readln (prod.cod_prod);
  56.     readln (prod.tipo);
  57.     readln (prod.modelo);
  58.     readln (prod.marca);
  59.     readln (prod.stock);
  60.     readln (prod.precio);
  61. end;
  62.    
  63. procedure agregar_producto (var LD:lista_doble; p:producto);
  64. var
  65.     nue:lista;
  66.  
  67. begin
  68.     new(nue);
  69.     nue^.datos := producto;
  70.     nue^.sig_cod := NIL;
  71.     nue^.sig_marca := NIL;
  72.     if (LD.pri_cod = NIL) then begin // Lista vacia
  73.         LD.pri_cod := nue;
  74.         LD.pri_marca := nue;
  75.     end
  76.     else begin
  77.         insertar_por_codigo (LD^.pri_cod, nue); //Insertar por código
  78.         insertar_por_marca (LD^.pri_marca, nue); //Insertar por marca
  79.     end;
  80. end;
  81.  
  82. procedure insertar_por_codigo (var pri_cod:lista; nue:lista); //Inserto por Código del Producto
  83. var
  84.     ant, act:lista;
  85.  
  86. begin
  87.     ant := lista;
  88.     act := lista;
  89.     while (act <> NIL) and (act^.datos.cod_prod < nue^.datos.cod_prod) do
  90.         ant := act;
  91.         act := act^.sig_cod;
  92.     end;
  93.     if (ant := act) then begin
  94.         nue^.sig_cod :=act;
  95.         pri_cod := nue;
  96.     end
  97.     else begin
  98.         ant.sig_cod nue;
  99.         nue.sig_cod:=act;
  100.     end;
  101. end;
  102.  
  103. procedure insertar_por_marca (var pri_marca:lista; nue:lista); //Inserto por Marca
  104. var
  105.     ant, act:lista;
  106.  
  107. begin
  108.     ant:=lista;
  109.     act:=lista;
  110.     while (act <> NIL) and (act^.datos.marca < nue^.datos.marca) do
  111.         ant:=act;
  112.         act:=act^sig_marca;
  113.     end;
  114.     if (ant:=act) then begin
  115.         nue^.sig_marca:=act;
  116.         pri_marca:=nue;
  117.     end
  118.     else begin
  119.         ant.sig_marca:=nue;
  120.         nue.sig_marca:=act;
  121.     end;
  122. end;
  123.  
  124. procedure borrar_producto (var LD:listadoble; codigo:integer; var OK:boolean);
  125. var
  126.     eliminar:lista;
  127.  
  128. begin
  129.     eliminar:=Borrar_codigo (LD^.pri_cod, codigo);
  130.     if (Buscar_codigo = TRUE) then begin
  131.         desenganchar_por_codigo (LD^.pri_cod, eliminar); //Desengancho por código
  132.         desenganchar_por_marca (LD^.pri_marca, eliminar); //Desengancho por marca
  133.         OK := TRUE;
  134.     else
  135.     OK := FALSE;
  136. end;
  137.  
  138. function buscar_codigo (pri_cod:lista; codigo) : lista; // Devuelve el producto (con los dos enganches)
  139. var
  140.     act:lista;
  141.  
  142. begin
  143.     act:=pri_cod; // no es necesario hacer una copia, se puede utilizar directamente pri_cod porque esta pasado por valor.
  144.     while (act<>NIL) and (act^.datos.cod_prod < codigo) do
  145.         act:=act^.sig_cod;
  146.     if (act = NIL) then
  147.         buscar_codigo := NIL;
  148.     else
  149.     if (act^.datos.cod.prod = codigo) then
  150.         buscar_codigo := pri;
  151.     else
  152.         buscar_codigo := NIL;
  153. end;
  154.  
  155.  
  156. procedure desenganchar_por_codigo (var pri_cod:lista; eliminar:lista);
  157. var
  158.     ant, act:lista;
  159.    
  160. begin
  161.     ant:=pri_cod;
  162.     act:=pri_cod;
  163.     while (act < eliminar) do begin         // Se sabe que existe
  164.         ant:=act;
  165.         act:=act^.sig_cod;
  166.     end;
  167.     if (act = pri_cod) then
  168.         pri_cod:=act^.sig_cod;
  169.     else
  170.         ant^.sig_cod:=act^.sig_cod; //Aun no hago dispose porque tengo que desenganchar por marca al ser una lista doble
  171. end;
  172.  
  173. procedure desenganchar_por_marca (var pri_marca:lista; eliminar:lista);
  174. var
  175.     ant, act:lista;
  176.    
  177. begin
  178.     ant:=pri_marca;
  179.     act:=pri_marca;
  180.     while (act < eliminar) do begin         // Se sabe que existe
  181.         ant:=act;
  182.         act:=act^.sig_marca;
  183.     end;
  184.     if (act = pri_marca) then
  185.         pri_cod:=act^.sig_marca;
  186.     else
  187.         ant^.sig_marca:=act^.sig_marca; //Aun no hago dispose porque tengo que desenganchar por marca al ser una lista doble
  188. end;
  189.  
  190. procedure calcular (pri_marca:lista; marca:string);
  191. var
  192.     tipo1, tipo2 : string;
  193.     modelo1, modelo2 : string;
  194.     max1, max2 : integer;
  195.    
  196. begin
  197.     nue := pri_marca;
  198.     max1 := -1;
  199.     max2 := -1;
  200.     while (nue <> NIL) and (nue^.datos.marca < marca) do
  201.         nue := nue^.sig_marca;
  202.     while (nue <> NIL) and (nue^.datos.marca = marca) then begin
  203.         if (nue^.datos.precio > max1) then begin
  204.             max2 := max1;
  205.             modelo2 := modelo1;
  206.             tipo2 := tipo1;
  207.             max1 := nue^.datos.precio;
  208.             modelo1 := nue^.datos.modelo;
  209.             tipo1 := nue^.datos.tipo;
  210.         end
  211.         else
  212.             if (nue^.datos.precio > max2) then begin
  213.                 max2 := nue^.datos.precio;
  214.                 modelo2 := nue^.datos.modelo;
  215.                 tipo2 := nue^.datos.tipo;
  216.             end;
  217.         end;
  218.         nue := nue^.sig_marca
  219.     end;
  220.     if (max2 <> -1) then
  221.     writeln ('El tipo:', tipo2 'y modelo:', modelo2 'es el más caro de la marca:', marca);
  222.     if (max1 <> -1) then
  223.     writeln ('El tipo:', tipo1 'y modelo:', modelo1 'es el más caro de la marca:', marca);
  224. end;
  225.  
  226. function venta (pri_cod:lista; codigo:string; cantidad:integer) : boolean; // Devuelve verdadero o falso.
  227. var
  228.     aux:boolean; nue:lista;
  229.  
  230. begin
  231.     nue := pri_cod;  // no es necesario hacer una copia, se puede utilizar directamente pri_cod porque esta pasado por valor.
  232.     while (nue <> NIL) and (nue^.datos.cod_prod < codigo) do
  233.         nue := nue^.sig_cod;
  234.     if (nue <> NIL) and (nue^.datos.cod_prod = codigo) then
  235.         if (nue^.datos.stock < cantidad) then
  236.             aux := FALSE;
  237.         else begin
  238.             nue^.datos.stock := nue^.datos.stock - cantidad;
  239.             aux := TRUE;
  240.         end;
  241.     venta := aux;
  242. end;
  243.  
  244. var
  245.     LD:lista_doble;
  246.     prod:producto;
  247.     codigo:integer;
  248.     OK:boolean;
  249.     codigoventa:integer;
  250.     cantidadventa:integer;
  251.     mascarosmarca:string;
  252.  
  253. begin
  254.     OK := FALSE;
  255.     LD := NIL;
  256.     cargar_lista_doble (LD) // SE DISPONE
  257.     leer_producto (prod); // Inciso a)
  258.     agregar_producto (LD, prod);
  259.     writeln ('Ingrese el código del producto a eliminar'); // Inciso b)
  260.     readln (codigo);
  261.     borrar_producto (LD, codigo, OK);
  262.     if (OK = TRUE) then
  263.         writeln ('Se ha eliminado el producto');
  264.     else
  265.         writeln ('No se ha podido eliminar el producto');
  266.     writeln ('Por favor ingrese la marca del producto');   // Inciso c)
  267.     readln (mascaromarca);
  268.     calcular (LD^.pri_marca; mascarosmarca);   
  269.     writeln('Ingrese el código del producto a vender'); // Inciso d)
  270.     readln(codigoventa);
  271.     writeln('Ingese la cantidad solicitada');
  272.     readln(cantidadventa);
  273.     if (venta(LD^.pri_cod,codigoventa,cantidadventa) = TRUE) then
  274.         writeln ('Se ha realizado la venta solicitada');
  275.     else
  276.         writeln ('No se ha podido realizar la venta');
  277. end.
  278.        
  279. { ¡Gracias Sebastian Beriay por subir las prácticas resueltas! He estudiado y sigo estudiando de allí. Sos grande :) }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement