Instituto de Computación - Facultad de Ingeniería - Universidad de la República Examen de Programación 2 Diciembre de 2012 Generalidades: •La prueba es individual y sin material. •Duración: 3 hs. •Sólo se contestan dudas acerca de la letra de los ejercicios. •Escriba las hojas de un sólo lado y con letra clara. •Resuelva ejercicios diferentes en hojas diferentes. •Numere cada hoja, indicando en la primera el total. •Coloque su nro. de cédula y nombre en cada hoja. •Se permite usar funciones y procedimientos auxiliares en todos los ejercicios, excepto en aquellos en los que se indique lo contrario. Ejercicio 1 ( puntos) La Administración Nacional de Puertos (ANP) quiere sistematizar la inspección de contenedores en tránsito en el puerto de Montevideo. El objetivo es optimizar el uso de los recursos de ANP para la inspección de contenedores en búsqueda de material ilícito, como contrabando y drogas. De cada contenedor se conocen los siguientes datos: • Origen (String) • Destino (String) • Contenido declarado (String) • Peso (Real) • Matrícula del barco (String) • Ubicación dentro del puerto (String) El registro de contenedores se hace en base semanal, y a medida que los barcos arriban al puerto se asigna a cada contenedor descargado un número, que lo identifica. Debido a este sistema de numeración a los contenedores de un mismo barco se les asignan identificadores consecutivos. Como la ANP no tiene recursos suficientes para inspeccionar todos los contenedores cada semana se sortea una cantidad I ≤ CR de contenedores para escanear o inspeccionar visualmente, siendo CR la cantidad de contenedores que fue registrada esa semana. Si al inspeccionar un contenedor se detecta material ilícito se inspeccionan los contenedores consecutivos (anterior y siguiente) porque es probable que también contengan material ilegal. Se pide: 1. Especifique en MODULA-2 los TADs Contenedor y ListaContenedores. Este último modela la lista semanal de contenedores y deberá contar con al menos las siguientes operaciones: • • • • Ingresar un nuevo contenedor. Devolver el contenedor con identificador i, donde 1≤ i ≤ CR Obtener CR Vaciar la lista de contenedores 2. Desarrolle una implementación completa del TAD ListaContenedores que considere las siguientes restricciones: • • • El ingreso de un nuevo contenedor debe realizarse en O(1) Obtener CR debe realizarse en O(1) Asumiendo que estamos accediendo al contenedor con identificador i, donde 1≤ i ≤ CR, se debe poder acceder a los contenedores anterior y posterior en O(1) en caso de que estos contenedores existan (no existe el contenedor anterior al que tiene identificador 1 ni el siguiente del que tiene identificador CR). Se sugiere una implementación basada en listas con posiciones implícitas.. Instituto de Computación - Facultad de Ingeniería - Universidad de la República Ejercicio 2 ( puntos) Sea ABB un tipo que representa árboles binarios de búsqueda cuyos elementos son del tipo TInfo que se describe a continuación. Los nodos de ABB están ordenados según el campo “clave”. TInfo = RECORD clave: CARDINAL; dato: T; END; Se dispone de las siguientes primitivas: • PROCEDURE Crear (): ABB; (* Devuelve un árbol vacío. *) • PROCEDURE Cons (info: TInfo; izq, der: ABB): ABB; (* Crea un árbol con raíz igual a "info" y con subárboles izquierdo y derecho "izq" y "der" respectivamente. Precondición: info.clave es mayor que las claves en "izq" y menor que las claves en "der". *) • PROCEDURE EsVacio (t: ABB): BOOLEAN; (* Devuelve TRUE si "t" es vacio o FALSE en otro caso. *) • PROCEDURE Raiz (t: ABB): TInfo; (* Devuelve la raíz de "t". Precondición: NOT EsVacio (t). *) • PROCEDURE Izquierdo (t: ABB): ABB; (* Devuelve el subárbol izquierdo de "t". Precondición: NOT EsVacio (t). *) • PROCEDURE Derecho (t: ABB): ABB; (* Devuelve el subárbol derecho de "t". Precondición: NOT EsVacio (t). *) • PROCEDURE Mayor (t: ABB): TInfo; (* Devuelve el elemento de "t" cuya clave es más grande. Precondición: NOT EsVacio (t). *) • PROCEDURE RemoverMayor (VAR t: ABB); (* Remueve de "t" el nodo cuya clave es más grande y libera los registros de memoria mantenidos por ese nodo. Precondición: NOT EsVacio (t). *) • PROCEDURE Destruir (VAR t: ABB); (* Libera todos los registros de memoria utilizados para almacenar el árbol "t". El árbol "t" queda indefinido.*) Se pide: 1. Implemente RemoverMayor accediendo a la representación de ABB. Para ello defina el tipo ABB. La implementación no debe ser recursiva. No se puede utilizar procedimientos auxiliares ni las primitivas. 2. Dado un árbol t de tipo ABB, se quiere obtener otro ABB t1 que sólo contenga copias de los nodos de t para los cuales el campo “dato” es mayor que una cierta cota. El árbol obtenido t1 no debe compartir registros de memoria con t y debe ser un árbol binario de búsqueda ordenado según “clave”. Para esto se cuenta con la siguiente función auxiliar: PROCEDURE EsMenor (a,b:T) : BOOLEAN (* Devuelve TRUE si y sólo si a<b, FALSE en cualquier otro caso .*) Instituto de Computación - Facultad de Ingeniería - Universidad de la República Se debe implementar la función Filtrado, sin definir procedimientos auxiliares ni acceder a la representación (usando solamente las primitivas y la función EsMenor): PROCEDURE Filtrado (t: ABB; cota: T): ABB; (* Devuelve un árbol con los elementos de "t" en los que "dato" es mayor que "cota". *) A modo de ejemplo, y suponiendo que el tipo T corresponda a strings, en la Figura 1 se presenta un árbol t (sobre a izquierda) y el resultado de filtrarlo con una cota igual al string “manzana” (sobre la derecha). 3. Suponga que también se dispone de la siguiente primitiva: PROCEDURE DestruirRaiz (VAR t: ABB); (* Libera los registros de memoria mantenidos por la raíz de "t". El árbol "t" queda indefinido. Precondición: NOT EsVacio (t). *) Figura 1: Ejemplo del resultado de aplicar la función Filtrado Usando solo las primitivas, incluida DestruirRaiz , implemente el procedimiento PROCEDURE Insertar (info: TInfo; VAR t: ABB); (* Inserta "info" en "t" manteniendo el orden dado por "clave". Precondición: info.clave no es una clave en "t". *) 4. Ahora suponga que en cada nodo se mantiene también la altura del árbol. El tipo TInfo pasa a ser el siguiente: TInfo = RECORD clave: CARDINAL; altura: CARDINAL; dato: T; END; Implemente, sin definir procedimientos auxiliares y accediendo directamente a la representación del tipo ABB definido en la parte 1, RemoverMayorRec (VAR t: ABB), una versión recursiva de RemoverMayor que además mantenga de manera correcta la altura de cada nodo. La Figura 2 presenta un ejemplo de árbol con el tipo TInfo modificado para almacenar la altura en cada nodo (izquierda) y el resultado de aplicar la función RemoverMayorRec sobre dicho árbol (derecha). Instituto de Computación - Facultad de Ingeniería - Universidad de la República Figura 2: Ejemplo de aplicación de la función RemoverMayorRec