Pages: [1]   Go Down
Print
Author Topic: Esercitazione Erlang: il conto corrente  (Read 1163 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
rondey
Matricola
*
Offline Offline

Posts: 74


« on: 25-03-2016, 17:20:17 »

Definire una attore per la rappresentazione di un conto corrente bancario.
L'attore deve  fornire i seguenti metodi:
  • deposito: che prende in ingresso un numero e incrementa il saldo del conto di un valore pari a tale numero
  • prelievo: che prende in ingresso un numero e decrementa il saldo del conto di un valore pari a tale importo; se il saldo e' maggiore dell'importo prelevato, prelevare l'intero saldo
  • saldo: che restituisce il saldo del conto corrente

La mia soluzione (funzionante):
Code:
-module(conto_corrente).
-export([start/0, push/1, pop/1, value/1, loop/1]).

start() -> spawn(conto_corrente, loop, [0]).

push({Conto_pid, Money}) ->
Conto_pid ! {self(), push, Money},
receive
{Conto_pid, Money} -> Money
end.

pop({Conto_pid, Money}) ->
Conto_pid ! {self(), pop, Money},
receive
Y -> Y
end.

value(Conto_pid) ->
Conto_pid ! {self(), value},
receive
{Conto_pid, Money} -> Money
end.


loop(N) ->
receive
{Pid, push, Money} when  (Money > 0) ->
Pid ! {self(), Money},
loop(N + Money);
{Pid, pop, Money} when  (Money > 0) ->
if  (N >= Money) ->
Pid ! {self(), Money},
loop(N - Money);
(N < Money) ->
Pid ! {self(), N},
loop(0)
end;
{Pid, value} ->
Pid ! {self(), N},
loop(N);
_ ->
loop(N)
end.

Quello che non capisco è: se metto nella receive della funzione pop({Conto_pid, Money}) il codice
Code:
{Conto_pid, Money} -> Money
se effettuo un prelievo maggiore del saldo totale, il programma si blocca.
Logged
Ocelot92
Apprendista Forumista
**
Offline Offline

Posts: 301



« Reply #1 on: 31-03-2016, 15:33:46 »

I feel you. Sto cercando di capirlo anche io ma niente per ora.
Logged

I'm happy to tell you all that...
((λf.λx.f(f(x))) (λy.y^2)) (5)  = 5^4

"Si ma dillo che bisogna cliccare APPLY per crearle le partizioni…" - cit. Utente dopo aver seguito un How-To... .-.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 2.799



WWW
« Reply #2 on: 31-03-2016, 16:26:17 »

-module(conto_corrente).
-export([start/0, push/1, pop/1, value/1, loop/1]).

start() -> spawn(conto_corrente, loop,
  • ).

deposit(Conto_pid, Money) ->
   Conto_pid ! {self(), push, Money},
   receive
      {Conto_pid, Money} -> Money
   end.
   
withdraw(Conto_pid, Money) ->
   Conto_pid ! {self(), pop, Money},
   receive
      {Conto_pid, Remainder} -> Remainder
   end.
   
value(Conto_pid) ->
   Conto_pid ! {self(), value},
   receive
      {Conto_pid, Money} -> Money
   end.
   

loop(N) ->
   receive
      {Pid, push, Money} when  (Money > 0) ->
         Pid ! {self(), Money},
         loop(N + Money);
      {Pid, pop, Money} when  (Money > 0) ->
         if  (N >= Money) ->
               Pid ! {self(), Money},
               loop(N - Money);
            (N < Money) ->
               Pid ! {self(), N},
               loop(0)
         end;
      {Pid, value} ->
         Pid ! {self(), N},
         loop(N);
      _ ->
         loop(N)
   end.
Logged
rondey
Matricola
*
Offline Offline

Posts: 74


« Reply #3 on: 01-04-2016, 09:39:50 »

Code:
-module(conto_corrente).
-export([start/0, deposit/2, withdraw/2, value/1, loop/1]).

start() -> spawn(conto_corrente, loop, [0]).

deposit(Conto_pid, Money) ->
   Conto_pid ! {self(), push, Money},
   receive
      {Conto_pid, Money} -> Money
   end.
  
withdraw(Conto_pid, Money) ->
   Conto_pid ! {self(), pop, Money},
   receive
      {Conto_pid, Remainder} -> Remainder
   end.
  
value(Conto_pid) ->
   Conto_pid ! {self(), value},
   receive
      {Conto_pid, Money} -> Money
   end.
  

loop(N) ->
   receive
      {Pid, push, Money} when  (Money > 0) ->
         Pid ! {self(), Money},
         loop(N + Money);
      {Pid, pop, Money} when  (Money > 0) ->
         if  (N >= Money) ->
               Pid ! {self(), Money},
               loop(N - Money);
            (N < Money) ->
               Pid ! {self(), N},
               loop(0)
         end;
      {Pid, value} ->
         Pid ! {self(), N},
         loop(N);
      _ ->
         loop(N)
   end.

Changelog:
  • Modificato l'export inserendo i nuovi nomi delle funzioni e i relativi numeri di argomenti che richiedono
« Last Edit: 01-04-2016, 11:25:27 by rondey » Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 2.799



WWW
« Reply #4 on: 01-04-2016, 11:04:22 »

Giusto....

Logged
Ocelot92
Apprendista Forumista
**
Offline Offline

Posts: 301



« Reply #5 on: 01-04-2016, 16:05:22 »

Ecco il mio:
Code:
-module(exconto).
-export([loop/1, start/0, prelievo/2, versamento/2,saldo/1]).

%Comportamento del conto
loop(Saldo) ->
receive
{PID, saldo} -> PID!Saldo, loop(Saldo);
{PID, versamento, Quantita} -> loop(Saldo+Quantita);
{PID, prelievo, Quantita} ->
if
(Saldo-Quantita) >= 0 ->
loop(Saldo - Quantita);
true ->
loop(0)
end;
_ -> loop(Saldo)
end.
% Funzioni per interagire da shell
start() ->
spawn(exconto,loop,[1000]).

prelievo(Conto_pid, Amount) ->
Conto_pid!{self(), prelievo, Amount}.

versamento(Conto_pid, Amount) ->
Conto_pid!{self(), versamento, Amount}.

saldo(Conto_pid) ->
Conto_pid!{self(), saldo},
receive
Y -> Y
end.
« Last Edit: 01-04-2016, 17:45:02 by Ocelot92 » Logged

I'm happy to tell you all that...
((λf.λx.f(f(x))) (λy.y^2)) (5)  = 5^4

"Si ma dillo che bisogna cliccare APPLY per crearle le partizioni…" - cit. Utente dopo aver seguito un How-To... .-.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 2.799



WWW
« Reply #6 on: 01-04-2016, 17:38:07 »

Non chiamiamoli
Quote
% Metodi per interagire da shell
I metodi sono degli oggetti.
Meglio chiamarle per quelle che sono: funzioni.

Salutoni
FB
Logged
Ocelot92
Apprendista Forumista
**
Offline Offline

Posts: 301



« Reply #7 on: 01-04-2016, 17:40:58 »

Ops...  
Corretto.
« Last Edit: 01-04-2016, 17:46:00 by Ocelot92 » Logged

I'm happy to tell you all that...
((λf.λx.f(f(x))) (λy.y^2)) (5)  = 5^4

"Si ma dillo che bisogna cliccare APPLY per crearle le partizioni…" - cit. Utente dopo aver seguito un How-To... .-.
Pages: [1]   Go Up
Print
Jump to: