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