Ejercicios Pract. 3 y 4

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