-- AUTOR: Elvira Mayordomo Cámara
-- PROYECTO: módulo de implementación del
-- TAD criticos solución del examen de
-- EDA del 1-7-03
-- FICHERO: criticos.adb
-- FECHA: 5-1-04
with unchecked_deallocation;
package body criticos is
procedure dispose is new
unchecked_deallocation(pelicula, lista);
procedure
crearpelicula(titulo,director,actores,tema,resumen,comentarios:in
ustring; nota:in tpnota; p:out pelicula) is
begin
p.titulo:=titulo;--...
end crearpelicula;
procedure listardirector(l:in lista) is
aux:lista;
begin
aux:=l;
while aux/=null loop
put_line(aux.titulo);
aux:=aux.sigpa;
end loop;
end listardirector;
procedure listartema(l:in lista) is
aux:lista;
begin
aux:=l;
while aux/=null loop
put_line(aux.titulo);
put_line(aux.director);
aux:=aux.sigpt;
end loop;
end listartema;
procedure
anyadir(p:in pelicula; total:in out critico) is
t:topten;
aux,nueva:lista;
begin
nueva:=new pelicula;
nueva.all:=p;
-- añadir a la tabla de temas
if esta(total.portema, p.tema) then
t:=consultar(total.portema, p.tema);
if t.num<10 or t.ultima.nota<p.nota then
if t.primera.nota<p.nota then
nueva.sigpt:=t.primera;
t.primera:=nueva;
else
aux:=t.primera;
while aux.sigpt/=null and then
aux.sigpt.nota>p.nota loop
aux:=aux.sigpt;
end loop;
nueva.sigpt:=aux.sigpt;
aux.sigpt:=nueva;
end if;
if t.num<10 then
t.num:=t.num+1;
if nueva.sigpt=null then
t.ultima:=nueva;
end if;
else -- borrar la última
aux:=t.primera;
while aux.sigpt.sigpt/=null loop
aux:=aux.sigpt;
end loop;
aux.sigpt:=null;
dispose(t.ultima);
t.ultima:=aux;
end if;
end if;
else
t.num:=1;
t.primera:=nueva;
t.primera.sigpt:=null;
t.ultima:=t.primera;
end if;
modificar(total.portema, p.tema, t);
-- añadir a la tabla de autores
if esta(total.pordirector, p.director) then
aux:=consultar(total.pordirector,
p.director);
if aux.nota<p.nota then -- si es la mejor
nueva.sigpa:=aux;
aux:=nueva;
else
nueva.sigpa:=aux.sigpa;
aux.sigpa:=nueva;
end if;
else
aux:=nueva;
nueva.sigpa:=null;
end if;
modificar(total.pordirector, p.director, aux);
end anyadir;
procedure pelis_de(director:in ustring; total:in
critico; lalista:out lista) is
begin
if esta(total.pordirector, director) then
lalista:=consultar(total.pordirector, director);
else
lalista:=null;
end if;
end pelis_de;
procedure mejor_peli(director:in ustring; total:in
critico; lamejor:out ustring) is
-- Pre: NOT esvacía(pelis_de(director))
begin
if esta(total.pordirector, director) then
lamejor:=consultar(total.pordirector, director).titulo;
end if;
end mejor_peli;
procedure top_ten(tema:in ustring; total:in
critico; lasdiez:out lista) is
begin
if esta(total.portema, tema) then
lasdiez:=consultar(total.portema,
tema).primera;
else
lasdiez:=null;
end if;
end top_ten;
function h(c:ustring;tam:positive) return integer
is
-- hash por método de la división
-- tiempo considerado cte
res:integer;
begin
res:=0;
for i in 1..length(c) loop
res:=res+character'pos(Element(c,i));
end loop;
return res mod tam;
end h;
end criticos;
syntax highlighted by Code2HTML, v. 0.9.1