Solución Examen de Programación 2

Anuncio
Solución Examen de Programación 2
22 de Febrero de 2014
Generalidades:
•
•
•
•
•
•
•
La prueba es individual y sin material.
Duración: 3hs.
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.
Ejercicio 1 (33 puntos)
Sea Lista el tipo de las listas de elementos de tipo CARDINAL que tiene definidas las siguientes
operaciones:
PROCEDURE CrearLista (): Lista;
(* Devuelve la lista vacía. *)
PROCEDURE Cons (i: CARDINAL; VAR l: Lista);
(* Inserta 'i' al principio de 'l'. *)
PROCEDURE Intercalar (VAR l1; Lista; VAR l2: Lista);
(* Precondición: l1 y l2 están ordenadas de manera creciente. Cada una puede
tener elementos repetidos y los elementos también pueden repetirse entre listas.
Mueve todos los elementos de l2 hacia l1. La lista l1 debe seguir estando
ordenada de manera creciente. La lista l2 debe quedar vacía.*)
Definir el tipo Lista en MODULA-2. Implementar la operación Intercalar de forma recursiva y
accediendo a la representación. No se puede crear ni liberar memoria de manera dinámica.
Solución
TYPE Lista = POINTER TO RECORD
info: CARDINAL;
sig: Lista;
END;
PROCEDURE Intercalar (VAR l1: Lista; VAR l2: Lista);
VAR
movido: Lista;
BEGIN
IF (l2 <> NIL) THEN
IF (l1 = NIL) THEN
l1 := l2;
l2 := NIL;
ELSE
IF (l1^.info > l2^.info) THEN
(* se remueve el primer elemento
de l2 y se pone al principio de l1 *)
movido := l2;
Examen de Programación 2 – 22 de Febrero de 2014 – Página 1/3
l2 := l2^.sig;
movido^.sig := l1;
l1 := movido;
END;
(* el primer elemento de l1 es menor o igual al
de l2 por lo que está en lugar correcto *)
(* se intercala l2 en el resto de l1 *)
Intercalar (l1^.sig, l2);
END;
END Intercalar;
END;
Ejercicio 2 (34 puntos)
Se implementa el tipo de los árboles finitarios de elementos de tipo CARDINAL con la
representación primer hijo, siguiente hermano:
TYPE
Arbol = POINTER TO RECORD
info: T;
primerHijo, sigHermano: Arbol;
END;
Implementar en MODULA-2 la operación Nivel que se define a continuación accediendo a la
representación de Arbol y usando las operaciones primitivas de Lista del Ejercicio 1.
PROCEDURE Nivel
(* Devuelve una
'A' en el nivel
repetirse en la
0. *)
(n: CARDINAL; A: Arbol): Lista;
lista ordenada de manera creciente de los elementos que están en
'n' Si un elemento se repite en el nivel 'n' de 'A' también debe
lista devuelta. Se considera que la raíz de 'A' está en el nivel
Solución
PROCEDURE Nivel (n: CARDINAL; A: Arbol): Lista;
VAR result, lHermanos: Lista;
BEGIN
IF (A = NIL) THEN
result := CrearLista ();
ELSE
(* o bien se alcanzo el nivel buscado y hay que enlistar el
valor del nodo o bien no se alcanzo y hay que buscar en los
hijos, disminuyendo el nivel *)
IF (n = 0) THEN
result := CrearLista ();
Cons (A^.info, result);
ELSE
result := Nivel (n - 1, A^.primerHijo);
END;
lHermanos := Nivel (n, A^.sigHermano);
Intercalar (result, lHermanos);
DestruirLista (lHermanos);
(* con esta implementacion de lista no hace falta *)
END;
RETURN result;
END Nivel;
Examen de Programación 2 – 22 de Febrero de 2014 – Página 2/3
Ejercicio 3 (33 puntos)
Parte a) Especificar en MODULA-2 el TAD Cola de Prioridad de elementos de tipo
CARDINAL, donde la prioridad está dada por el propio elemento. Definir operaciones
constructoras, selectoras/destructoras y predicados.
Solución
(*************** Constructoras ***************)
PROCEDURE CPVacia() : CP;
(* Retorna el la cola de prioridad vacía *)
PROCEDURE InsertarCP (n : CARDINAL; cp: CP): CP;
(* Retorna una nueva cola de prioridad que consiste de todos los elementos de cp
más el elemento n con prioridad n*)
(**************** Predicado ****************)
PROCEDURE EstaVaciaCP(cp: CP): BOOLEAN
(* Retorna TRUE si cp es vacía *)
(**************** Selectora ****************)
PROCEDURE EncontrarMinimo(cp: CP): CARDINAL;
(* Pre: Not EsVaciaCP(cp). Retorna el elemento de la cola de menor prioridad *)
(*************** Destructoras ***************)
PROCEDURE BorrarMinimo(cp: CP): CP;
(* Pre: Not EsVaciaCP(cp). Retorna cp sin el elemento de menor prioridad *)
Parte b) Implementar en MODULA-2 la operación OrdenarArreglo (no es del TAD Cola de
Prioridad) que se define a continuación. Sólo se deben usar las operaciones del TAD Cola de
Prioridad definidas en la Parte a).
PROCEDURE OrdenarArreglo (VAR A: ARRAY [1..MAX] OF CARDINAL);
(* Ordena los elementos de 'A' en forma creciente. *)
Solución
PROCEDURE OrdenarArreglo (VAR A: ARRAY [1..MAX] OF CARDINAL);
(* Ordena los del array 'A' en forma creciente. *)
VAR
C : CP;
i : CARDINAL;
BEGIN
C:= CPVacia();
FOR i:= 1 TO MAX DO
InsertarCP(A[i], C);
END;
FOR i:= 1 TO MAX DO
A[i]:= EncontrarMinimo(C);
C := BorrarMinimo(C);
END;
END OrdenarArreglo;
Examen de Programación 2 – 22 de Febrero de 2014 – Página 3/3
Descargar