Exercício 7

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


Enunciado


Solução

-module(exercicio7).
-export([start/2,coluna/1,elemento/1]).

start(A,B) ->
	Pids=criar_nodes(coluna,length(B)),
	Pids_Cols=envia_dados(Pids,A,B),
	recebe_resultados(Pids_Cols).

criar_nodes(Funcao,N) ->
	criar_nodes(Funcao,N,[]).

criar_nodes(Funcao,0,Pids) -> Pids;
criar_nodes(Funcao,N,Pids) ->
	P=spawn(exercicio7,Funcao,[self()]),
	criar_nodes(Funcao,N-1,[P|Pids]).

envia_dados(Pids,A,B) ->
	envia_dados(Pids,A,B,[],1).

envia_dados([],_,_,Pids_Cols,_) -> Pids_Cols;
envia_dados([P|Pids],A,[Coluna|B],Pids_Cols,N) ->
	P ! {A,Coluna},
	envia_dados(Pids,A,B,[{N,P}|Pids_Cols],N+1).

recebe_resultados(Pids_Cols) ->
	recebe_resultados(Pids_Cols,[]).

recebe_resultados([],Resultados) -> Resultados;
recebe_resultados([{N,P}|Pids_Cols],Resultados) ->
	receive
		{P,Resultado} -> ok
	end,
	recebe_resultados(Pids_Cols,[Resultado|Resultados]).

coluna(Pid_start) ->
	receive
		{A,Coluna} -> ok
	end,
	Pids=criar_nodes(elemento,length(Coluna)),
	Pids_elem=envia_dados(Pids,Coluna,A),
	Resultados=recebe_resultados(Pids_elem),
	Pid_start ! {self(),Resultados}.

elemento(Pid_coluna) ->
	receive
		{Linha,Coluna} -> ok
	end,
	Elem=multiplica_linha_coluna(Linha,Coluna),
	Pid_coluna ! {self(),Elem}.

multiplica_linha_coluna(L,C) ->
	multiplica_linha_coluna(L,C,0).

multiplica_linha_coluna([],[],Elem) -> Elem;
multiplica_linha_coluna([L1|L],[C1|C],Elem) ->
	multiplica_linha_coluna(L,C,Elem+C1*L1).

Última actualização: 07-12-2004

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