Exercício 5

OC 1999/2000 (Exercícios Práticos)


Enunciado

Modelize um sistema distribuído que adicione todos os elementos duma matriz.Apresente o modelo operacional bem como o modelo de setup.

Desenvolva um módulo Erlang respeitante ao modelo anterior.


Solução

Modelo Operacional

Os elementos de cada linha são adicionados por um processo distinto, que posteriormente envia a soma para um processo que adicionará as somas de todas as linhas.

(falta modelo)

Modelo de Setup

A criação dos processos faz-se por ordem inversa da ordem de operação.

(falta modelo)

Implementação

-module(exercicio5).
-export([start/1,adicao/1,adicaofinal/2]).
start(Matriz) ->
	NLinhas=length(Matriz),
	Pid_adicaofinal=spawn(exercicio5,adicaofinal,[self(),NLinhas]),
	Pids_adicoes=lanca_adicoes(Pid_adicaofinal,NLinhas),
	envia_linhas(Pids_adicoes,Matriz),
	receive
		Result -> Result
	end.
lanca_adicoes(Pid_adicaofinal,NLinhas) ->
	lanca_adicoes(Pid_adicaofinal,NLinhas,[]).
lanca_adicoes(_Pid_adicaofinal,0,Pids_adicoes) ->
	Pids_adicoes;
lanca_adicoes(Pid_adicaofinal,NLinhas,Pids_adicoes) ->
	Pid_novo=spawn(exercicio5,adicao,[Pid_adicaofinal]),
	lanca_adicoes(Pid_adicaofinal,NLinhas-1,[Pid_novo|Pids_adicoes]).
envia_linhas([],[]) ->
	ok;
envia_linhas([Pid|Pids_adicoes],[Linha|Matriz]) ->
	Pid ! Linha,
	envia_linhas(Pids_adicoes,Matriz).
adicao(Pid_adicaofinal) ->
	receive
		Linha when list(Linha) -> ok
	end,
	Soma_linha=somatorio(Linha),
	Pid_adicaofinal ! Soma_linha.
somatorio(Linha) ->
	somatorio(Linha,0).
somatorio([],Soma_final) ->
	Soma_final;
somatorio([Elemento|Linha],Acumulado) ->
	somatorio(Linha,Acumulado+Elemento).
adicaofinal(Pid_start,NLinhas) ->
	Somatorio=recebe_e_adiciona(NLinhas),
	Pid_start ! Somatorio.
recebe_e_adiciona(NLinhas) ->
	recebe_e_adiciona(NLinhas,0).
recebe_e_adiciona(0,Somatorio) ->
	Somatorio;
recebe_e_adiciona(NLinhas,Acumulado) ->
	receive
		Soma_linha -> ok
	end,
	recebe_e_adiciona(NLinhas-1,Acumulado+Soma_linha).

Última actualização: 02-05-2005

OC 1999/2000 (Exercícios Práticos)