Parcial de Programación 2

Anuncio
Instituto de Computación. Facultad de Ingeniería. Universidad de la República
Parcial de Programación 2
23 de Mayo de 2006
Generalidades:
•
•
•
•
•
•
•
La prueba es individual y sin material.
La durac ió n es 3 h o ras.
S ó lo se c o ntestan dudas ac erc a de la letra de lo s ej erc ic io s.
E sc riba las h o j as de un só lo lado y c o n letra c lara.
C o mienc e la so luc ió n de c ada ej erc ic io en una nueva h o j a.
N umere c ada h o j a, indic ando en la primera el to tal.
C o lo q ue su nú mero de c é dula y no mbre en c ada h o j a.
E j ercicio 1 ( 1 6 puntos: 8 parte ( a) y 8 parte ( b) )
Considere la siguiente declaración, en Módula-2 , del tip o de las listas de nú m eros enteros LInt:
TYPE
LInt = POINTER TO RECORD
info : INTEGER;
sig : LInt
END;
D onde cada lista será rep resentada sin usar una celda dum m y ( cab ecera) .
Se pide, sin usar funciones o procedimientos auxiliares y accediendo directamente a la representación,
implementar los sig uientes dos procedimientos iterativ os:
a) InsLuego: D ados dos enteros e1 y e2, y dada una lista L de enteros de tip o Lint, inserta a e2 en la p osición
inm ediatam ente p osterior a la de la p rim era ocurrencia del elem ento e1 en L , si e1 p ertenece a L . S i e1 no p ertenece
a L , la op eración no tendrá ef ecto. E j em p los:
E ntradas
R esultado de InsLuego
e 1= 1 , e 2= 9 , L = [ 3 , 1 ]
L = [ 3 , 1 , 9]
e 1= 1 , e 2= 9 , L = [ 3 , 1 , 5 ]
L = [ 3 , 1 , 9, 5 ]
e 1= 3 , e 2= 9 , L = [ 3 , 5 , 3 , 9 ]
L = [ 3 , 9, 5 , 3 , 9 ]
e 1= 2 , e 2= 9 , L = [ ]
L = []
e 1= 2 , e 2= 9 , L = [ 3 , 1 , 5 ]
L = [3 ,1 ,5 ]
S O L U C IO N
PROCEDURE InsLuego(e1, e2 : INTEGER; VAR L : LInt);
VAR nuevo, iterador : LInt;
BEGIN
iterador := L;
WHILE (iterador <> NIL) AND (iterador^.info <> e1) DO
iterador := iterador^.sig;
END;
IF (iterador <> NIL) THEN
NEW(nuevo);
nuevo^.info := e2;
nuevo^.sig := iterador^.sig;
iterador^.sig := nuevo;
END;
END InsLuego;
(* Notar que la lista parámetro podría pasarse por copia, ya que nunca se inserta al
comienzo, evitando entonces usar el puntero auxiliar iterador para recorrerla *)
b ) B or r a r M a y or es: D ados un entero x y una lista L de enteros de tip o Lint ordenada de m enor a m ay or, elim ina
todos los elem entos de L m ay ores a x . E l p rocedim iento deb erá lib erar la m em oria de las celdas cuy os elem entos
son elim inados. E j em p los:
E ntrada
R esultado de B or r a r M a y or es
x = 6 , L = [ 2 ,3 ,6 ,9 ,1 3 ]
L = [2 ,3 ,6 ]
x = 1 3 , L = [2 ,3 ,6 ,9 ,1 3 ]
L = [2 ,3 ,6 ,9 ,1 3 ]
x = 1 , L = [ 2 ,3 ,6 ,9 ,1 3 ]
L = []
x = 1 , L = []
L = []
x = 8 , L = [ 2 ,3 ,6 ,9 ,1 3 ]
L = [2 ,3 ,6 ]
S O L U C IO N
PROCEDURE BorrarMayores (VAR l :LInt; x:INTEGER);
VAR iterador, aBorrar : LNat;
BEGIN
IF l <> NIL THEN
iterador := l;
IF iterador^.info > x THEN
aBorrar := iterador;
l := NIL;
ELSE
WHILE (iterador^.sig <>NIL and iterador^.sig^.info <= x) DO
iterador := iterador^.sig
END;
aBorrar := iterador^.sig;
iterador^.sig : = NIL;
END
WHILE (aBorrar <> NIL) DO
iterador := aBorrar;
aBorrar := aBorrar^.sig;
DISPOSE(iterador);
END;
END;
END BorrarMayores;
Al t e r n at i v a:
PROCEDURE BorrarMayores (VAR l :LInt; x:INTEGER);
VAR iterador, aBorrar : LNat;
BEGIN
IF (l <> NIL) THEN
iterador := l;
WHILE (iterador^.sig <> NIL) DO
IF (iterador^.sig^.info <= x) THEN
iterador := iterador^.sig
ELSE
borrar := iterador^.sig;
iterador^.sig := iterador^.sig^.sig;
DISPOSE(aBorrar);
END;
END;
IF (iterador^.info > x) THEN
l := l^.sig;
DISPOSE(iterador);
END;
END;
END BorrarMayores;
E j ercicio 2 ( 1 4 puntos)
Considere la siguiente declaración, en Módula-2 , del tip o de los á rb oles b inarios de b ú sq ueda de enteros:
ABB = POINTER TO ABNode;
ABNode = RECORD
raiz : INTEGER;
izq : ABB;
der : ABB;
END;
Se pide: implemen t e un procedimiento B or r a r S ub A r b q ue dados un á rb ol b inario de b ú sq ueda de enteros A de
tipo ABB ( sin elementos repetidos) y un entero x, elimine el sub á rb ol de A q ue tiene a x como su raí z . Si x no
pertenece a A , el procedimiento no tendrá efecto.
E j em p lo,
2
8
4
5
7
9
y
x = 7
B o r r a r Su b A r b
2
4
8
9
6
S i x f uera igual a 8 en el ej em p lo p rev io, el á rb ol q uedarí a v ací o.
N O T AS :
•
•
•
S e sugiere usar un p rocedim iento aux iliar, q ue deb erá ser im p lem entado.
I m p lem entar el/ los p rocedim iento/ s accediendo directam ente a la rep resentación.
D eb erá lib erarse la m em oria de las celdas cuy os elem entos sean elim inados.
S O L U C IO N
PROCEDURE BorrarSubArb(x : INTEGER; VAR A : ABB);
BEGIN
IF (A <> NIL) THEN
IF (A^.raiz = x) THEN
BorrarArb(A);
A := NIL;
ELSIF (t^.raiz > x) THEN
BorrarSubArb(x, A^.izq);
ELSE
BorrarSubArb(x, A^.der);
END;
END;
END BorrarSubArb;
PROCEDURE BorrarArb(VAR A : ABB);
BEGIN
IF (A <> NIL) THEN
BorrarArb(A^.izq);
BorrarArb(A^.der);
DISPOSE(A);
END;
END BorrarArb;
(* Notar que BorrarArb libera toda la memoria usada por el árbol parámetro, dejando a
éste como un puntero indefinido *)
E je r c ic io 3 ( 1 0 p u n to s )
Considere las siguientes op eraciones sob re L istas de N aturales ( C ardinales) :
•
•
•
•
•
PROCEDURE Nula() : LN;
( * Crea la lista de naturales v ací a. * )
PROCEDURE Agregar (x : CARDINAL; l : LN) : LN;
( * I nserta un elem ento al p rincip io de la lista de naturales. * )
PROCEDURE EsNula (l : LN) : BOOLEAN;
( * V erif ica si la lista de naturales está v ací a. * )
PROCEDURE Primero (l : LN) : CARDINAL;
( * R etorna el p rim er elem ento de la lista de naturales. P recondición: la lista no es v ací a. * )
PROCEDURE Cola (l : LN) : LN;
( * R etorna la lista de naturales sin su p rim er elem ento. P recondición: la lista no es v ací a. * )
Considere tam b ié n las siguientes op eraciones sob re A rb oles B inarios de N aturales:
•
•
•
•
•
•
PROCEDURE Vacio () : AB;
( * R etorna un á rb ol b inario v ací o. * )
PROCEDURE CreoAB (r : CARDINAL; i, d : AB) : AB;
( * R etorna un nuev o á rb ol con raí z r y sub á rb oles i y d. * )
PROCEDURE EsVacio (ab : AB) : BOOLEAN
( * R etorna T R U E si ab es v ací o. * )
PROCEDURE Raiz (ab : AB) : CARDINAL;
( * R etorna la raí z de ab . P recondición: ab es no v ací o. * )
PROCEDURE SubArbIzq (ab : AB) : AB;
( * R etorna el sub á rb ol iz q uierdo de ab . P recondición: ab es no v ací o. * )
PROCEDURE SubArbDer (ab : AB) : AB;
( * R etorna el sub á rb ol derech o de ab . P recondición: ab es no v ací o. * )
U n camino de un á rb ol b inario es una secuencia ( lista) de nodos desde la raí z a una h oj a del á rb ol. U na secuencia S 1
es prefij o de una secuencia S si, y sólo si, ex iste una secuencia S 2 tal q ue: concatenar( S 1,S 2) = S . O b serv ar q ue la
secuencia v ací a es p ref ij o de cualq uier secuencia y q ue toda secuencia es p ref ij o de si m ism a.
Se pide: implemen t a r u n a f u n c ió n r ec u r s iv a EsCamino q u e da do u n á r b o l b in a r io de n a t u r a les A y da da
u n a lis t a de n a t u r a les L , r et o r n e T R U E s i y s ó lo s i L es un prefij o de alg ú n camino de A .
L a f unción esC amino deb e im p lem entarse a p artir de las op eraciones p resentadas arrib a y no de def iniciones de
tip o p ara LN o AB. N o p ueden utiliz arse f unciones o p rocedim ientos aux iliares p ara resolv er este p rob lem a.
P or ej em p lo, las siguientes listas son algunos de los p ref ij os de los cam inos del á rb ol b inario ilustrado en el
ej ercicio 2 : [ ] , [ 8 ] , [ 8 ,4 ] , [ 8 ,4 ,2 ] , [ 8 ,4 ,7 ,5 ] .
S O L U C IO N
PROCEDURE EsCamino(A :AB; l: LN):BOOLEAN;
BEGIN
IF EsNula(l) THEN RETURN TRUE;
ELSIF EsVacio(A) THEN RETURN FALSE;
ELSE RETURN (Primero(l) = Raiz(A)) AND
(EsCamino(SubArbolIzq(A),Cola(l)) OR EsCamino(SubArbolDer(A),Cola(l)));
END EsCamino;
Descargar