Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ************************************
- Corregido ayer martes 7/12 por prof.
- ************************************
- Ejercicio 7 de la Práctica 17 de Repaso 2do. Semestre. (Lista Doble Enlace)
- Una casa de deportes dispone de una lista que contiene información de los productos que se
- encuentran a la venta. De cada producto se conoce: código de producto, tipo, modelo, marca,
- stock, y precio. Dicha lista se encuentra ordenada por código de producto (criterio de orden
- primario) y por marca (criterio de orden secundario).
- Realizar módulos para:
- a) Agregar un producto. Recibe un producto y lo inserta en la lista.
- b) Borrado de un producto. Recibe el código del producto a eliminar y si existe lo elimina.
- Debe devolver un boolean que indique si se realizó o no el borrado.
- c) Calcular el tipo y modelo de los dos productos más caros de una marca (recibida por parámetro).
- d) Venta de un producto. Recibe el código del producto a vender y la cantidad pedida. La venta solo se
- realiza si el producto existe y hay stock suficiente. Para realizar la venta debe decrementar el
- stock del producto correspondiente. Debe devolver un boolean que indique si se realizó con éxito la
- operación o no.
- Nota: Realice el programa principal que invoque a los módulos e informe lo calculado en 3) y el éxito
- o fracaso de las operaciones realizadas en 2) y 4).
- program Deportes_Ejercicio_7_Práctica17Repaso;
- type
- lista=^nodo;
- nodo=record
- datos:producto;
- sig_cod:lista;
- sig_marca:lista;
- end;
- producto=record
- cod_prod:integer;
- tipo:string;
- modelo:string;
- marca:string;
- stock:integer;
- precio:real;
- end;
- lista_doble=record
- pri_cod:lista;
- pri_marca:lista;
- end;
- procedure leer_producto (var prod:producto);
- begin
- readln (prod.cod_prod);
- readln (prod.tipo);
- readln (prod.modelo);
- readln (prod.marca);
- readln (prod.stock);
- readln (prod.precio);
- end;
- procedure agregar_producto (var LD:lista_doble; p:producto);
- var
- nue:lista;
- begin
- new(nue);
- nue^.datos := producto;
- nue^.sig_cod := NIL;
- nue^.sig_marca := NIL;
- if (LD.pri_cod = NIL) then begin // Lista vacia
- LD.pri_cod := nue;
- LD.pri_marca := nue;
- end
- else begin
- insertar_por_codigo (LD^.pri_cod, nue); //Insertar por código
- insertar_por_marca (LD^.pri_marca, nue); //Insertar por marca
- end;
- end;
- procedure insertar_por_codigo (var pri_cod:lista; nue:lista); //Inserto por Código del Producto
- var
- ant, act:lista;
- begin
- ant := lista;
- act := lista;
- while (act <> NIL) and (act^.datos.cod_prod < nue^.datos.cod_prod) do
- ant := act;
- act := act^.sig_cod;
- end;
- if (ant := act) then begin
- nue^.sig_cod :=act;
- pri_cod := nue;
- end
- else begin
- ant.sig_cod nue;
- nue.sig_cod:=act;
- end;
- end;
- procedure insertar_por_marca (var pri_marca:lista; nue:lista); //Inserto por Marca
- var
- ant, act:lista;
- begin
- ant:=lista;
- act:=lista;
- while (act <> NIL) and (act^.datos.marca < nue^.datos.marca) do
- ant:=act;
- act:=act^sig_marca;
- end;
- if (ant:=act) then begin
- nue^.sig_marca:=act;
- pri_marca:=nue;
- end
- else begin
- ant.sig_marca:=nue;
- nue.sig_marca:=act;
- end;
- end;
- procedure borrar_producto (var LD:listadoble; codigo:integer; var OK:boolean);
- var
- eliminar:lista;
- begin
- eliminar:=Borrar_codigo (LD^.pri_cod, codigo);
- if (Buscar_codigo = TRUE) then begin
- desenganchar_por_codigo (LD^.pri_cod, eliminar); //Desengancho por código
- desenganchar_por_marca (LD^.pri_marca, eliminar); //Desengancho por marca
- OK := TRUE;
- else
- OK := FALSE;
- end;
- function buscar_codigo (pri_cod:lista; codigo) : lista; // Devuelve el producto (con los dos enganches)
- var
- act:lista;
- begin
- act:=pri_cod; // no es necesario hacer una copia, se puede utilizar directamente pri_cod porque esta pasado por valor.
- while (act<>NIL) and (act^.datos.cod_prod < codigo) do
- act:=act^.sig_cod;
- if (act = NIL) then
- buscar_codigo := NIL;
- else
- if (act^.datos.cod.prod = codigo) then
- buscar_codigo := pri;
- else
- buscar_codigo := NIL;
- end;
- procedure desenganchar_por_codigo (var pri_cod:lista; eliminar:lista);
- var
- ant, act:lista;
- begin
- ant:=pri_cod;
- act:=pri_cod;
- while (act < eliminar) do begin // Se sabe que existe
- ant:=act;
- act:=act^.sig_cod;
- end;
- if (act = pri_cod) then
- pri_cod:=act^.sig_cod;
- else
- ant^.sig_cod:=act^.sig_cod; //Aun no hago dispose porque tengo que desenganchar por marca al ser una lista doble
- end;
- procedure desenganchar_por_marca (var pri_marca:lista; eliminar:lista);
- var
- ant, act:lista;
- begin
- ant:=pri_marca;
- act:=pri_marca;
- while (act < eliminar) do begin // Se sabe que existe
- ant:=act;
- act:=act^.sig_marca;
- end;
- if (act = pri_marca) then
- pri_cod:=act^.sig_marca;
- else
- ant^.sig_marca:=act^.sig_marca; //Aun no hago dispose porque tengo que desenganchar por marca al ser una lista doble
- end;
- procedure calcular (pri_marca:lista; marca:string);
- var
- tipo1, tipo2 : string;
- modelo1, modelo2 : string;
- max1, max2 : integer;
- begin
- nue := pri_marca;
- max1 := -1;
- max2 := -1;
- while (nue <> NIL) and (nue^.datos.marca < marca) do
- nue := nue^.sig_marca;
- while (nue <> NIL) and (nue^.datos.marca = marca) then begin
- if (nue^.datos.precio > max1) then begin
- max2 := max1;
- modelo2 := modelo1;
- tipo2 := tipo1;
- max1 := nue^.datos.precio;
- modelo1 := nue^.datos.modelo;
- tipo1 := nue^.datos.tipo;
- end
- else
- if (nue^.datos.precio > max2) then begin
- max2 := nue^.datos.precio;
- modelo2 := nue^.datos.modelo;
- tipo2 := nue^.datos.tipo;
- end;
- end;
- nue := nue^.sig_marca
- end;
- if (max2 <> -1) then
- writeln ('El tipo:', tipo2 'y modelo:', modelo2 'es el más caro de la marca:', marca);
- if (max1 <> -1) then
- writeln ('El tipo:', tipo1 'y modelo:', modelo1 'es el más caro de la marca:', marca);
- end;
- function venta (pri_cod:lista; codigo:string; cantidad:integer) : boolean; // Devuelve verdadero o falso.
- var
- aux:boolean; nue:lista;
- begin
- nue := pri_cod; // no es necesario hacer una copia, se puede utilizar directamente pri_cod porque esta pasado por valor.
- while (nue <> NIL) and (nue^.datos.cod_prod < codigo) do
- nue := nue^.sig_cod;
- if (nue <> NIL) and (nue^.datos.cod_prod = codigo) then
- if (nue^.datos.stock < cantidad) then
- aux := FALSE;
- else begin
- nue^.datos.stock := nue^.datos.stock - cantidad;
- aux := TRUE;
- end;
- venta := aux;
- end;
- var
- LD:lista_doble;
- prod:producto;
- codigo:integer;
- OK:boolean;
- codigoventa:integer;
- cantidadventa:integer;
- mascarosmarca:string;
- begin
- OK := FALSE;
- LD := NIL;
- cargar_lista_doble (LD) // SE DISPONE
- leer_producto (prod); // Inciso a)
- agregar_producto (LD, prod);
- writeln ('Ingrese el código del producto a eliminar'); // Inciso b)
- readln (codigo);
- borrar_producto (LD, codigo, OK);
- if (OK = TRUE) then
- writeln ('Se ha eliminado el producto');
- else
- writeln ('No se ha podido eliminar el producto');
- writeln ('Por favor ingrese la marca del producto'); // Inciso c)
- readln (mascaromarca);
- calcular (LD^.pri_marca; mascarosmarca);
- writeln('Ingrese el código del producto a vender'); // Inciso d)
- readln(codigoventa);
- writeln('Ingese la cantidad solicitada');
- readln(cantidadventa);
- if (venta(LD^.pri_cod,codigoventa,cantidadventa) = TRUE) then
- writeln ('Se ha realizado la venta solicitada');
- else
- writeln ('No se ha podido realizar la venta');
- end.
- { ¡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