Desenvolva um sistema que simule um processo de votação. Existe uma entidade (modelada por um processo) denominada Top, que é responsável pelo processo de recepção dos votos e posterior actualização da base de dados (BD). As entidades votantes, também modeladas por processos, conhecem o "endereço" de Top. Podem também ser requeridas consultas a Top, quer acerca dum elemento quer à BD completa.
A figura seguinte pretende representar as transações entre várias entidades intervenientes.

Funções e librarias a usar:
% nome do modulo. Tem de ser sempre a primeira linha util do programa -module(aula4).
-export([start/0, top/0, consultar/1, consultar/2, votar/2]).
start() -> spawn(aula4, top, []).
top() -> Dict = dict:new(), top_processo(Dict).
top_processo(Dict) ->
receive
{ consultar, Requerente} ->
Requerente ! { 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, Top, Resultado } -> Resultado
end.
consultar(Top, Banda) ->
Top ! { consultar, self(), Banda },
receive
{ consultar_resposta, Top, Resultado } -> Resultado
end.
votar(Top, Banda) ->
Top ! {votar, self(), Banda},
receive
{ votar_resposta, Top, Resultado } -> Resultado
end.
Última actualização: 14 Março 2000