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