Aula nº 5

Baseado no exercício da aula anterior, altere-o de forma que:

  1. Cada processo vote várias vezes seguidas e só depois receba todas as mensagens de resposta;
  2. O processo Top seja lançado por um nó (node) qualquer, num outro qualquer;
  3. O processo Top seja registado com o nome top, no nó onde é lançado.

Funções e librarias a usar:

Utilize o módulo anterior, realizando as seguintes operações:

  1. Lance três nós, por ex. top, andy, pablo (o nó top será utilizado para gestor da BD do top, os outros serão votantes e consultores);
  2. Num dos nós, lance o processo top, executando a função start/1;
  3. Utilizando o pid retornado pela função start/1, execute as funções consultar/1, consultar/2 e votar/2;
  4. Utilizando o nome registado (top), execute as funções consultar/1, consultar/2 e votar/2.

OC 98-99 (Exercícios Práticos)


-module(aula5).
-export([start/1, top/0, consultar/1, consultar/2, votar/2]).
%% questao 2
start(No) -> spawn(No, aula5, top, [])).
top() ->
	% questao 3
	register(top, self()),
	Dict = dict:new(),
	top_processo(Dict).
top_processo(Dict) ->
	receive
		{ consultar, Requisitante } ->
			Requisitante ! { consultar_resposta, self(), Dict },
			DictNovo = Dict;
		{ consultar, Requerente, Banda } ->
			case dict:find(Banda, Dict) of
				error -> Val = 0;
				{ok, V} -> Val = V
			end,
			Requerente ! { consultar_resposta, self(), {Banda, Val} },
			DictNovo = Dict;
		{ votar, Votante, Banda } ->
			case dict:find(Banda, Dict) of
				error -> Val = 1;
				{ok, V} -> Val = V + 1
			end,
			DictNovo = dict:store(Banda, Val, Dict),
			Votante ! {votar_resposta, self(), {Banda, Val} }
	end,
	top_processo(DictNovo).
consultar(Top) ->
	Top ! {consultar, self() },
	receive
		{ consultar_resposta, PidTop, Resultado } -> Resultado
	end.
consultar(Top, Banda) ->
	Top ! { consultar, self(), Banda},
	receive
		{ consultar_resposta, PidTop, Resultado } -> Resultado
	end.
votar(Top, ListaBandas) ->
	%% questao 1
	emite_votos(Top, ListaBandas),
	recebe_respostas(ListaBandas).
%% adicionado ao exercicio anterior
emite_votos(_, [] ) -> io:fwrite("todos os votos foram emitidos~n");
emite_votos(Top, [H|ListaBandas] ) ->
	Top ! { votar, self(), H },
	emite_votos( Top, ListaBandas ).
recebe_respostas([]) -> io:fwrite("todas as respostas foram recebidas~n");
recebe_respostas( [H|ListaBandas] ) ->
	receive
		{ votar_resposta, Top, Resultado } -> io:fwrite("~s~n", [io_lib:write(Resultado)])
	end,
	recebe_respostas( ListaBandas ).
%% fim de alteracoes
Índice

Última actualização: 14 Março 2000

OC 98-99 (Exercícios Práticos)