Instituto de Computación - Facultad de Ingeniería - Universidad de la República Examen de Programación 2 Febrero de 2006 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 (10 puntos) Dadas las siguientes operaciones funcionales sobre lista de naturales (LNat): PROCEDURE Null() : LNat; (* Crea la lista vacía *) PROCEDURE Cons(x : CARDINAL; l : LNat) : LNat; (* Inserta un elemento al principio de la lista *) PROCEDURE Empty(l : LNat) : BOOLEAN; (* Retorna TRUE si la lista está vacía *) PROCEDURE Head(l : LNat) : CARDINAL; (* Retorna, si la lista no es vacía, el primer elemento de la lista *) PROCEDURE Tail(l : LNat) : LNat; (* Retorna, si la lista no es vacía, la lista sin su primer elemento *) Implementar la siguiente función recursivamente: BorrarUltimo: Recibe una lista y retorna una lista con el mismo contenido que la lista de entrada pero sin el último elemento. Precondición: la lista parámetro no es vacía. Ejercicio 2 (20 puntos) Se considera la siguiente representación de LNat (del ejercicio 1): TYPE LNat = POINTER TO RECORD info : CARDINAL; sig : LNat; END; Implementar la siguiente operación procedural, iterativamente, accediendo directamente a la representación y sin usar procedimientos auxiliares: dup: Recibe una lista y elimina los elementos repetidos contiguos, dejando una única aparición de cada elemento. El procedimiento debe modificar la lista de entrada sin crear ninguna celda extra. No es necesario liberar la memoria de las celdas eliminadas. Ejemplos: Instituto de Computación - Facultad de Ingeniería - Universidad de la República Entrada Salida [1,2,2,2,1,1] [1,2,1] [] [] [1,2,3,4] [1,2,3,4] [5,5,5,5,5,5] [5] Ejercicio 3 (35 puntos) Parte a) De una especificación mínima funcional del TAD Queue (Cola) de caracteres. Comente brevemente y de forma clara las funciones especificadas. Parte b) Considere la siguiente especificación del TAD Stack de caracteres: DEFINITION MODULE Stack; TYPE Stack; PROCEDURE NullS(VAR s : Stack); (* Crea la pila vacia *) PROCEDURE Push(c : CHAR; VAR s : Stack); (* Dado un caracter y una pila devuelve la pila resultado de haber insertado el caracter en el tope de la pila s *) PROCEDURE EmptyS(s : Stack) : BOOLEAN; (* Retorna TRUE si y solo si la pila es vacia *) PROCEDURE Top(s : Stack) : CHAR; (* Pre: La pila s no es vacia. Devuelve el elemento que esta en el tope de la pila *) PROCEDURE Pop(VAR s : Stack); (* Pre: La pila s no es vacia. Devuelve la pila s sin el elemento que esta en el tope de la pila *) END Stack; Utilizando los TADs Stack y Queue definidos anteriormente, escriba un procedimiento iterativo que reciba una secuencia de caracteres en una Queue (Cola) y la procese de la siguiente manera: La secuencia puede contener 2 tipos de paréntesis, las parejas: "(*", "*)" y "[", "]". Las mismas encierran comentarios que deben ser eliminados de la cadena (Queue) de entrada. Éstos pueden estar anidados uno dentro de otro, pero respetando las siguientes condiciones: • toda marca de apertura, "[" o "(*", debe tener su correspondiente marca de cierre y • cada marca de cierre, "]" o "*)", se aparea con la última de apertura El procedimiento debe eliminar de la tira de caracteres todos los comentarios, así como verificar si la secuencia es correcta. La tira de caracteres se recibe en una Queue con un carácter especial que indica el fin de la secuencia, el mismo es "$". No se puede utilizar ninguna cola auxiliar, es decir, se debe devolver la tira sin los comentarios en la misma Queue que se recibe. En caso de que la tira contenga errores, se debe retornar TRUE en el parámetro booleano de salida error (en este caso no importa lo que se devuelva en la tira), en otro caso error debe valer FALSE. Instituto de Computación - Facultad de Ingeniería - Universidad de la República El cabezal del procedimiento es el siguiente: PROCEDURE PreProcesador (VAR tira : Queue; VAR error : BOOLEAN); Ejemplos: Entrada Salida tira Salida error Procedure p; (* calcula perímetro*) q := 0$ Procedure p; q := 0$ FALSE Este es [me(*no*)s] original$ Este es original$ FALSE Aca [se (*muestran 2] niveles incompletos$ TRUE Otro co[n err(*or p]or es*)tar intercalado$ TRUE (Sin** (errores$ (Sin** (errores$ FALSE Ejercicio 4 (35 puntos) Considere la siguiente especificación del TAD ArbolesGenerales no vacíos y sin elementos repetidos, de un tipo genérico T: • PROCEDURE ArbolHoja(elem:T): ArbGen; (* Dado un elemento genera un árbol que sólo contiene dicho elemento (como una hoja). *) • PROCEDURE Insertar(a:ArbGen;v,w:T): ArbGen; (* Dados un árbol y dos elementos v y w, inserta a v como el último hijo de w en el árbol (hijo más a la derecha), siempre que w pertenezca al árbol y v no pertenezca al árbol. En caso contrario, la operación no tiene efecto. *) • PROCEDURE EsArbolHoja(a:ArbGen): Boolean; (* Dado un árbol, retorna true si, y sólo si, el árbol es un árbol hoja (con un solo elemento). *) • PROCEDURE Pertenece(a: ArbGen; elem:T): Boolean; (* Dados un árbol y un elemento, retorna true si y sólo si el elemento pertenece al árbol. *) • PROCEDURE Borrar (a:ArbGen; elem:T): ArbGen; (* Dados un árbol y un elemento, elimina al elemento del árbol siempre que éste pertenezca al árbol, no sea la raíz del mismo y no tenga ningún hijo. En caso contrario, la operación no tiene efecto. *) Se pide: Implemente el TAD ArbolesGenerales usando la representación primer hijo – siguiente hermano. Notas: • Asuma implementadas las funciones: ArbolHoja, EsArbolHoja y Pertenece. • Las funciones Insertar y Borrar deben retornar árboles que compartan registros de memoria con los árboles parámetros. • Puede utilizar el operador de igualdad (=) para comparar elementos de tipo T. • Si necesita usar funciones o procedimientos auxiliares en la implementación del TAD, desarrolle los códigos correspondientes.