Examen de Programación 2

Anuncio
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.
Descargar