Solución del exámen de Estructuras de datos y algoritmos de fecha 10 de Febrero de 2006 Pregunta 1. espec cadenas+ usa cadena, carecteres, booleanos operaciones prefijo : cadena cadena : boolean subcadena: cadena cadena : bolean ecuaciones c,d: carácter; A,B:cadena; prefijo (vacía, A) = verdad prefijo (añadir (c,A), vacía) = falso prefijo (añadir (c,A), añadir (d,B) ) = (c=d) AND prefijo (A,B) subcadena (vacía, A) = verdad) subcadena (añadir(c,A), vacía) = falso subcadena (añadir(c,A), añadir (d,B) ) = prefijo (añadir(c,A), añadir (d,B) ) OR prefijo (añadir(c,A), B) fespec Pregunta 2. ex02.ads -- Autores: Miguel Villarroel, Mayte Lozano -- Fichero: Ex062.ads -- Implementa las operaciones de inserción de un elemento entero en un -- montículo MAXMIN de intervalos. -- Es necesario implementar también la operación de creación de montículo vacío. generic X: positive; -- el maximo de elementos que el montículo puede almacenar se pasa como -- parámetro genérico package ex062 is type montint is limited private; procedure creavacio(m:out montint); --post: m=VACIO procedure inserta(m:in out montint; e:in integer; error:out boolean); --pre: m=m0 --post: si #(m0)<max (1000 en este caso) entonces m=INSERTA(m0,e) y error=falso -si no m queda igual y error=verdad private maxnum: positive := X; maxnodos: positive := (X+1)/2; type tpnodo is record inf, sup: integer; end record; type tvector is array (1..maxnodos) of tpnodo; type montint is record nodos: tvector; ctdadnum: natural; end record; end ex062; ex02.adb -- Autores: Miguel Villarroel, Mayte Lozano -- Fichero: Ex062.adb package body ex062 is procedure creavacio(m:out montint) is --post: m=VACIO begin m.ctdadnum:= 0; end creavacio; procedure inserta(m:in out montint; e:in integer; error:out boolean) is --pre: m=m0 --post: si #(m0)<max (1000 en este caso) entonces m=INSERTA(m0,e) y error=falso -si no m queda igual y error=verdad procedure subemin (m:in out montint; ind: in integer) is aux, padre, indice : integer; begin indice := ind; padre:= indice/2; while indice > 1 and then m.nodos(indice).inf < m.nodos(padre).inf loop aux:=m.nodos(indice).inf; m.nodos(indice).inf:=m.nodos(padre).inf; m.nodos(padre).inf:=aux; indice:= padre; padre := indice/2; end loop; end subemin; procedure subemax (m:in out montint; ind: in integer) is aux, padre, indice: integer; begin indice := ind; padre:= indice/2; while indice > 1 and then m.nodos(indice).sup > m.nodos(padre).sup loop aux:=m.nodos(indice).sup; m.nodos(indice).sup:=m.nodos(padre).sup; m.nodos(padre).sup:=aux; indice:=padre; padre:=indice/2; end loop; end subemax; nuevo, padre: integer; begin if m.ctdadnum >= maxnum then error:= true; else error:= false; m.ctdadnum:= m.ctdadnum+1; nuevo:=(m.ctdadnum+1)/2; if (m.ctdadnum mod 2) = 1 then -- impar: 1er elemento del nodo m.nodos(nuevo).inf := e; if nuevo>1 then padre := nuevo /2; if e > m.nodos(padre).sup then m.nodos(nuevo).inf:= m.nodos(padre).sup; m.nodos(padre).sup:= e; subemax(m, nuevo/2); else subemin(m, nuevo); end if; end if; else -- par: 2º elemento del nodo if e < m.nodos(nuevo).inf then m.nodos(nuevo).sup:=m.nodos(nuevo).inf; m.nodos(nuevo).inf:= e; subemin(m, nuevo); else m.nodos(nuevo).sup:= e; subemax(m, nuevo); end if; end if; end if; end inserta; end ex062; Pregunta 3. Puesto que una vez que atendamos los pedidos tendremos que distribuirlos a las Tiendas a través de las Compañías de transporte, debemos contar con una estructura que nos permita: 1. Buscar una Tienda (la que ha realizado el pedido) 2. Buscar una Población (en la que se encuentra la Tienda) 3. Buscar la Compañía de transporte (la que sirve a esa Población) Es aconsejable almacenar la información de esas entidades en una estructura que permita la búsqueda rápida de elementos, por ejemplo árboles AVL. Compañías de Transporte Poblaciones Tiendas Se puede añadir a la información de cada elemento información adicional, por ejemplo, en las compañías de transporte una lista que permita el acceso a la información de las poblaciones que atiende la compañía. O en el caso de las poblaciones una lista de las tiendas que se encuentran en esa población. Compañías de Transporte Lista de Poblaciones de una compañía Poblaciones Lista de Tiendas de una población Tiendas Los pedidos se almacenarán en una cola manteniendo así el orden de llegada de cada uno de ellos. Cola de pedidos A B C D E F Al momento de atender los pedidos se extraerán de la cola uno a uno y se verá si es posible atenderlo. (Por ejemplo, es posible que un pedido requiera 5000 unidades cuando solo nos quedan 4000 disponibles). Los pedidos que hayamos atendido en estricto orden de llegada se almacenarán en un montículo de prioridades ordenado por volumen máximo de pedido. Los pedidos extraídos de la cola y que no se hayan podido atender se almacenaran temporalmente en una cola de pedidos no satisfechos. Al final del proceso la cola de pedidos no satisfechos se unirá con la cola de los pedidos que no hayamos examinados (por que ya no quedan llaveros por asignar). En esta cola se añadiran los próximos pedidos que lleguen. Se mantiene así el orden de llegada de todos los pedidos, tanto de los que no se ha podido atender como de los que han de arrivar. Cola de pedidos al final de la semana A Montículo de pedidos (por mayor volumen) B C D ... E Cola de pedidos examinados Cola de pedidos que no se han podido atender no examinados E C H B Z D ... L N A M O ... Z F C D G ... Z Los pedidos que se ha podido atender se extraerán del montículo para luego se insertarlos en listas de distribución para cada compañía. Montículo de pedidos (por mayor volumen) E H B A M F Listas de pedidos por compañía (en el orden en que se han extraído del montículo) C1 E H C2 A M C3 B F Puesto que los elementos se extraen del montículo y se insertan inmediatamente al final de las listas, los elementos quedan ordenados por volumen. La codificación en Ada es inmediata.