tomasfdel

SO Práctica 3

May 8th, 2018
799
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. TO DO:
  2.     - Pedirle el Ej 2 a Giannini.
  3.  
  4.  
  5. //Ejercicio 1
  6. -module(pepe).
  7. -export([init/0]).
  8.  
  9. match_test () ->
  10.   {A,B} = {5,4},
  11.   %% Esta linea se rompe porque no puede hacer matchear C a dos valores distintos.
  12.   %%{C,C} = {5,4},
  13.   {B,A} = {4,5},
  14.   {D,D} = {5,5}.
  15.  
  16. apellido ({persona, {nombre, _}, {apellido, A}}) -> A.
  17. nombre ({persona, {nombre, N}, {apellido, _}}) -> N.
  18.  
  19.  
  20. tuple_test (P1,P2) ->
  21.   io:format("El nombre de P1 es ~p y el apellido de P2 es ~p~n",[nombre(P1),apellido(P2)]).
  22.  
  23.  
  24. string_test () -> [
  25.   helloworld == 'helloworld', %% Este es True porque son dos maneras de escribir el mismo atomo.
  26.   "helloworld" < 'helloworld', %% Este es False y no entendemos por que.
  27.   helloworld == "helloworld", %% Este es False porque uno es un atomo y el otro, un string.
  28.   [$h,$e,$l,$l,$o,$w,$o,$r,$l,$d] == "helloworld", %% Este es True porque son dos maneras de escribir el mismo string.
  29.   [104,101,108,108,111,119,111,114,108,100] < {104,101,108,108,111,119,111,114,108,100}, %% Este es False y no entendemos por que.
  30.   [104,101,108,108,111,119,111,114,108,100] > 1, %% Este es True y no entendemos por que.
  31.   [104,101,108,108,111,119,111,114,108,100] == "helloworld"]. %% Este es True porque cada caracter corresponde con su codigo.
  32.  
  33. filtrar_por_apellido(Personas,Apellido) -> [nombre(X) || X <- Personas, apellido(X) == Apellido].
  34.  
  35. init () ->
  36.     P1 = {persona,{nombre,"Juan"},{apellido, "Gomez"}},
  37.     P2 = {persona,{nombre,"Carlos"},{apellido, "Garcia"}},
  38.     P3 = {persona,{nombre,"Javier"},{apellido, "Garcia"}},
  39.     P4 = {persona,{nombre,"Rolando"},{apellido, "Garcia"}},
  40.     match_test(),
  41.     tuple_test(P1, P2),
  42.     string_test(),
  43.     Garcias = filtrar_por_apellido([P4,P3,P2,P1],"Garcia"),
  44.     io:format("~p ~n~p ~n~p ~n", Garcias),
  45.     io:format("Todo esta bien ~n").
  46.  
  47.  
  48.  
  49. // Ejercicio 3
  50. -module(eco).
  51. -compile(export_all).
  52.                          
  53. server() ->
  54.     {ok, ListenSocket} = gen_tcp:listen(8000, [{active, false}]),
  55.     wait_connect(ListenSocket, 1).
  56.  
  57. wait_connect(ListenSocket, N) ->
  58.     {ok, Socket} = gen_tcp:accept(ListenSocket),
  59.     spawn(?MODULE, wait_connect, [ListenSocket, N+1]),
  60.     get_request(Socket, N).
  61.  
  62. get_request(Socket, N) ->   {ok, Msg} = gen_tcp:recv(Socket, 0),
  63.                             gen_tcp:send(Socket, Msg),
  64.                             gen_tcp:close(Socket).
  65.  
  66.  
  67.  
  68.  
  69.  
  70. // Ejercicio 4
  71. %%Version original
  72. -module(ej4).
  73. -compile(export_all).
  74. -define(N_Procesos, 7).
  75. -define(N_Inicial, 10).
  76. proceso(IdHermano) -> receive   {id, Pid} -> proceso(Pid);
  77.                                 {msg, 0} -> IdHermano ! {msg_exit}, io:format("RIP in Process ~p~n", [self()]), ok;
  78.                                 {msg, N} -> io:format("Soy el proceso ~p y le mando N = ~p al proceso ~p~n",[self(), N - 1, IdHermano]), IdHermano ! {msg, N - 1}, proceso(IdHermano);
  79.                                 {msg_exit} -> IdHermano ! {msg_exit}, io:format("RIP in Process ~p~n", [self()]), ok end.
  80.  
  81. iniciarProcesos(ListaDePids, Actual, Total) when (Actual > Total) -> lists:nth(1, ListaDePids) ! {msg, ?N_Inicial}, ok;
  82. iniciarProcesos(ListaDePids, Actual, Total) -> lists:nth(Actual, ListaDePids) ! {id, lists:nth( (Actual rem ?N_Procesos) + 1, ListaDePids)}, iniciarProcesos(ListaDePids, Actual + 1, Total).
  83.  
  84. init() ->   IDs = [spawn(?MODULE, proceso, [0]) || _ <- lists:seq(1, ?N_Procesos, 1)],
  85.             iniciarProcesos(IDs, 1, ?N_Procesos).
  86.  
  87.  
  88. %%Modificación
  89. -module(ej4).
  90. -compile(export_all).
  91. -define(N_Procesos, 50).
  92.  
  93. proceso(IdHermano, Repetir) ->
  94.     receive {id, Pid} -> proceso(Pid, Repetir);
  95.             {msg} -> case Repetir of
  96.                         true  ->    io:format("RIP in Process ~p~n", [self()]),
  97.                                     IdHermano ! {msg_exit},
  98.                                     ok;
  99.                         false ->    io:format("Soy el proceso ~p y le mando un mensaje al proceso ~p~n",[self(), IdHermano]),
  100.                                     IdHermano ! {msg},
  101.                                     proceso(IdHermano, true)
  102.                         end;
  103.             {msg_exit} -> IdHermano ! {msg_exit}, io:format("RIP in Process ~p~n", [self()]), ok end.
  104.  
  105. iniciarProcesos(ListaDePids, Actual, Total) when (Actual > Total) -> lists:nth(1, ListaDePids) ! {msg}, ok;
  106. iniciarProcesos(ListaDePids, Actual, Total) -> lists:nth(Actual, ListaDePids) ! {id, lists:nth( (Actual rem ?N_Procesos) + 1, ListaDePids)}, iniciarProcesos(ListaDePids, Actual + 1, Total).
  107.  
  108. init() ->   IDs = [spawn(?MODULE, proceso, [0, false]) || _ <- lists:seq(1, ?N_Procesos, 1)],
  109.             iniciarProcesos(IDs, 1, ?N_Procesos).
  110.  
  111. //EJERCICIO 6 SUGOIIIII
  112. -module(ej6).
  113. %~ -export([testLock/0,testsenpai/0]).
  114. -compile(export_all).
  115.  
  116. %internal
  117. %~ -export([f/2,waiter/2]).
  118. %~ -export([waiter_senpai/2,senpai/2]).
  119.  
  120.  
  121. mutex () -> receive {lock, Pid} -> Pid!ok,
  122.                 receive {unlock, Pid} -> ok end, mutex();
  123.                     {destroyLock, Pid} -> ok end.
  124.  
  125.  
  126. lock (L) -> L!{lock, self()}, receive ok -> ok end.
  127. unlock (L) -> L!{unlock, self()}, ok.
  128. createLock () -> spawn(?MODULE, mutex, []).
  129. destroyLock (L) -> L!{destroyLock, self()}.
  130.  
  131.  
  132. f (L,W) -> lock(L),
  133.   %   regioncritica(),
  134.   io:format("uno ~p~n",[self()]),
  135.   io:format("dos ~p~n",[self()]),
  136.   io:format("tre ~p~n",[self()]),
  137.   io:format("cua ~p~n",[self()]),
  138.   unlock(L),
  139.   W!finished.
  140.  
  141.  
  142. waiter (L,0)  -> io:format("Destruyendo Lock~n"), destroyLock(L);
  143. waiter (L,N)  -> receive finished -> waiter(L,N-1) end.
  144.  
  145.  
  146. testLock () -> L = createLock(),
  147.   W=spawn(?MODULE,waiter,[L,3]),
  148.   spawn(?MODULE,f,[L,W]),
  149.   spawn(?MODULE,f,[L,W]),
  150.   spawn(?MODULE,f,[L,W]),
  151.   ok.
  152.  
  153. %~ #noweeb
  154. semaphore (N, L) when N>0 ->
  155.         receive {senpaiP, Pid} ->   Pid!ok,
  156.                                     semaphore(N-1, [Pid | L]);
  157.                 {senpaiV, Pid2} ->
  158.                     case lists:member(Pid2, L) of
  159.                         true  -> semaphore(N+1, lists:delete(Pid2, L));
  160.                         false -> semaphore(N,L)
  161.                     end;
  162.                 {destroysenpai, Pid3} -> ok end;
  163. semaphore (N, L) ->
  164.         receive {senpaiV, Pid2} ->
  165.                     case lists:member(Pid2, L) of
  166.                         true  -> semaphore(N+1, lists:delete(Pid2, L));
  167.                         false -> semaphore(N,L)
  168.                     end;
  169.                 {destroysenpai, Pid3} -> ok end.
  170.  
  171. createsenpai (N) -> spawn(?MODULE, semaphore, [N, []]).
  172. destroysenpai (S) -> io:format("S-senpai, I don't feel so good... UwU~n"), S!{destroysenpai, self()}, ok.
  173. senpaiP (S) -> S!{senpaiP, self()}, receive ok -> ok end.
  174. senpaiV (S) -> S!{senpaiV, self()}, ok.
  175.  
  176.  
  177. senpai (S,W) ->
  178.   senpaiP(S),
  179.   %regioncritica(), bueno, casi....
  180.   io:format("uno ~p~n",[self()]),
  181.   io:format("dos ~p~n",[self()]),
  182.   io:format("tre ~p~n",[self()]),
  183.   io:format("cua ~p~n",[self()]),
  184.   senpaiV(S),
  185.   W!finished.
  186.  
  187. waiter_senpai (S,0)  -> destroysenpai(S);
  188. waiter_senpai (S,N)  -> receive finished -> waiter_senpai(S,N-1) end.
  189.  
  190.  
  191. testsenpai () -> S = createsenpai(1), % a lo sumo dos usando io al mismo tiempo
  192.   W=spawn(?MODULE,waiter_senpai,[S,5]),
  193.   spawn(?MODULE,senpai,[S,W]),
  194.   spawn(?MODULE,senpai,[S,W]),
  195.   spawn(?MODULE,senpai,[S,W]),
  196.   spawn(?MODULE,senpai,[S,W]),
  197.   spawn(?MODULE,senpai,[S,W]),
  198.   '=w= s-senpai...'.
  199.  
  200.  
  201.  
  202.  
  203. // Ejercicio 7
  204. -module(ej7).
  205. -compile(export_all).
  206.  
  207. launch() -> process_flag(trap_exit, true),
  208.             H = spawn_link(?MODULE, hello, []),
  209.             receive {'EXIT', _, _} -> launch() end.
  210.  
  211. hello() ->
  212.    
  213.     {A1,A2,A3} = now(),
  214.     random:seed(A1,A2,A3),
  215.     helloloop().
  216.  
  217. helloloop() ->
  218.     receive
  219.         after 1000 -> ok
  220.     end,
  221.     io:format("Hello ~p~n",
  222.         [case random:uniform(10) of 10 -> 1/uno; _ -> self() end]),
  223.     helloloop().
  224.  
  225. init() -> spawn(?MODULE, launch, []).
  226.  
  227.  
  228.  
  229.  
  230. // Ejercicio 8
  231. -module(ej8).
  232. -compile(export_all).
  233.  
  234. launch() -> process_flag(trap_exit, true),
  235.             H = spawn_link(?MODULE, hello, []),
  236.             receive {'EXIT', _, _} -> launch() end.
  237.  
  238. hello() ->
  239.    
  240.     {A1,A2,A3} = now(),
  241.     random:seed(A1,A2,A3),
  242.     helloloop().
  243.  
  244. helloloop() ->
  245.     receive
  246.         after 1000 -> ok
  247.     end,
  248.     io:format("Hellori ~p~n",
  249.         [case random:uniform(10) of 10 -> 1/uno; _ -> self() end]),
  250.     ?MODULE:helloloop().
  251.  
  252. init() -> spawn(?MODULE, launch, []).
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×