-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