Ejercicios Exámenes de Prácticas de AD2 Ejercicio 3 – Junio’00. Dada la siguiente estructura enlazada: Type prt = ^nodo; nodo = record Dato: integer; sig: ptr end; Lista = ptr; var l:lista Se pide: Implementar un procedimiento o función tal que dada una lista l retorne otra l2 que contenga los elementos de forma invertida (ver ejemplo) (3 puntos) Página 1 de 1 Ejercicio 3 – Septiembre’00. Se define el tipo abstracto concordancia como el conjunto de palabras que se ha leído de un texto, teniendo para cada palabra su frecuencia de aparición en el texto. Las operaciones del tipo permiten inicializar este conjunto, añadirle palabras, listarlo, etc… Pero además, se desea añadirle al tipo una operación con perfil procedimiento borra_palabra(ent/sal c:concordancia; p: palabra); y cuya especificación dice que, después de la ejecución del procedimiento, la palabra p no aparecerá en la concordancia c. Todas las otras palabras que aparecieran previamente en c, continuarán en la concordancia. Se debe escribir una operación en PASCAL que implemente esta operación, teniendo en cuenta que la representación escogida para el tipo concordancia es en forma de lista enlazada, en donde todo nodo de la lista guarda una palabra, y un entero que corresponde a la frecuencia de aparición de dicha palabra. Cabe resaltar que cada palabra sólo puede aparecer en uno de los nodos de la lista. Las declaraciones de tipo que se han hecho para esta representación son: Type elemento=record pal:palabra; frec:entero end; nodo=record dato:elemento; sig:ptr; end; concordancia=ptr; ptr= ^nodo; Se supone que está disponible y se puede usar una operación con el siguiente perfil: función compal(p1,p2: palabra): booleano, que se hace cierta cuando p1 y p2 son la misma palabra, y falso en caso contrario. Página 2 de 2 (4 puntos) Ejercicio 3 – Junio’01. Se define el tipo abstracto concordancia como el conjunto de palabras que se ha leído de un texto, teniendo para cada palabra su frecuencia de aparición en el texto. La representación de dicho tipo y del tipo palabra son las vistas en practicas: Const Maxlon = 50; type simbolo = char; palabra = record sec: paked array [1..Maxlon] of simbolo; lon: integer; end; elemento = record nodo = record pal: palabra; dato: elemento; frec: integer; sig: ptr; end; end; ptr = ^nodo; concordancia = ptr; Las operaciones del tipo permiten: inicializar este conjunto, añadirle palabras, listarlo, etc... Pero además se desea añadirle al tipo una operación que dadas dos concordancias c1 y c2 devuelva la unión de las dos concordancias en c2. Esta unión se define como la unión de las palabras de las dos concordancias de forma que si una palabra aparece en las dos concordancias su frecuencia en la concordancia resultante es la suma de las frecuencias. El perfil y la especificación de esta operación son los siguientes: Procedure unionc (c1: concordancia; var c2: concordancia); P={ c1 = C11, C12, ..., C1n ∧ 0 ≤ n ∧ ∀i:1≤i≤n : C1i = (P1i, F1i) ∧ c2 = C21, C22, ..., C2m ∧ 0 ≤ m ∧ ∀i:1≤i≤m: C2i = (P2i, F2i) } Q={ c2 = C1, C2, ..., Ck∧0≤k≤n+m ∧∀i:1≤i≤k:( Ci=(Pi, Fi) ∧ ( (∀j:1≤j≤m:P i ≠ P2j ∧ ∃j:1≤j≤n: (Pi=P1j∧ Fi=F1j) ) ∨ (∀j:1≤j≤n: P i ≠ P1j ∧ ∃j:1≤j≤m:(Pi=P2j∧ Fi=F2j) ) ∨ (∃j1:1≤j1≤n:∃j2:1≤j2≤m:(Pi=P1j1=P2j2 ∧ Fi= F1j1 + F2j2)) ))} Se supone que está disponible y se puede usar una operación con perfil: function comPal (p1, p2: palabra): boolean; que se hace cierta cuando p1 y p2 son la misma palabra y falsa en caso contrario. Se pide: (5 puntos) a) Diseñar un procedimiento que inserte una palabra p con frecuencia f al principio de la concordancia c. Dicho procedimiento tiene el perfil: (1 punto) Procedure insertaprim (var c:concordancia; p: palabra; f : integer); Página 3 de 3 b) Diseñar un procedimiento que inserte en una concordancia c una palabra p con una frecuencia f de forma que si p ya está en c se incrementa su frecuencia con un valor f y se devuelve el valor verdadero, en caso contrario se devuelve el valor falso. Este procedimiento tiene el siguiente perfil: (2 puntos) Procedure inspal (var c: concordancia; p: palabra; f: integer; var insertado: boolean); c) Utilizando el procedimiento anterior, escribir el procedimiento unionc del enunciado del problema. (2 puntos) Página 4 de 4 Ejercicio 3 – Septiembre’01. Se define el tipo abstracto concordancia como el conjunto de palabras que se ha leído de un texto, teniendo para cada palabra su frecuencia de aparición en el texto. La representación de dicho tipo y del tipo palabra son las vistas en prácticas: Const Maxlon = 50; type simbolo = char; palabra = record sec: packed array [1..Maxlon] of simbolo; lon: integer; end; elemento = record nodo = record pal:palabra; dato: elemento; frec:integer; sig: ptr; end; end; ptr = ^nodo; concordancia = ptr; Las operaciones del tipo permiten: inicializar este conjunto, añadirle palabras, listarlo, etc... Pero además se desea añadirle al tipo una operación que dada una concordancia c no vacía devuelva las palabras con mayor y menor frecuencia. En el caso de que existan varias palabras con más de una frecuencia máxima o mínima se debe devolver la que aparece en último lugar. El perfil y la especificación de esta operación son los siguientes: Procedure maxmin (c: concordancia; var pmax ,pmin: palabra); P={ c = C1, C2, ..., Cn ∧ 0 < n ∧ ∀i:1≤i≤n : Ci = (Pi, Fi) } Q={ c = C1, C2, ..., Cn ∧0 < n ∧ ∀i:1≤i≤n : Ci = (Pi, Fi) ∧ (∃i: 1≤i≤n : Ci = (pmax, Fi) ∧∃j: 1≤j≤n : Cj = (pmin, Fj) ∧ ∀r:1≤r≤n:( Cr = (Pr, Fr) ∧ Fi ≥ Fr ∧ Fj ≤ Fr ))} Se pide: (5 puntos) d) Diseñar un procedimiento que implemente de forma eficiente la operación anterior. (3 puntos) Página 5 de 5 e) Utilizando el procedimiento anterior y suponiendo que están disponibles las operaciones con perfil: procedure borrarpal ( var c: concordancia; p: palabra ); que dada una concordancia c y una palabra p borra la palabra de la concordancia y procedure escrPal ( p: palabra ); vista en prácticas que dada una palabra la escribe en pantalla. Diseñar un procedimiento cuyo perfil aparece en el recuadro de abajo, de forma que dada una concordancia escriba los sucesivos pares de palabras y cada par será el de frecuencia mínima y máxima sin tener en cuenta los pares ya escritos. Además, la concordancia se quedará vacía tras la ejecución del procedimiento. También se puede utilizar la función vista en prácticas: function esvaciac ( c: concordancia): boolean; que dada una concordancia c, devuelve el valor cierto si c está vacía o falso en caso contrario. Ejemplo: si la concordancia contiene las cinco palabras: c= (“venus”,1),(“tierra”,4),(“marte”,2),(“neptuno”,1),(“pluton”,3) en pantalla debe aparecer: menor mayor ------------neptuno tierra venus plutón marte marte (2 puntos) Procedure listapalabras (var c: concordancia); Página 6 de 6