with ada.text_io, ada.numerics.discrete_random;  
use ada.text_io; 
 
procedure golf is 
 
subtype RandIntervall is integer range 1..10
package Rand is new ada.numerics.discrete_random(RandIntervall); 
use Rand; 
 
protected W is 
  procedure Write(s : in string); 
end W; 
 
protected body W is 
  procedure Write(s : in string) is 
  begin 
     put_line(s); 
  end Write; 
end W; 
 
protected type Palya is 
   entry belep; 
   procedure kilep; 
private 
   b : boolean := true; 
end Palya; 
 
protected body Palya is 
   entry belep when b is 
   begin 
      b := false; 
   end belep; 
    
   procedure kilep is 
   begin 
      b := true; 
   end kilep; 
end Palya; 
 
Palyak : array(1..18of Palya; 
 
task type Csoport(id : integer); 
 
task Penztar is 
   entry fizet; 
   entry elkoszon(x : in integer); 
end Penztar; 
 
 
task body Csoport is 
   faildb : integer := 0
   G : Generator; 
begin 
   reset(G); 
   W.Write(integer'image(id) & ". csoport: fizetek"); 
   Penztar.fizet; 
   for i in 1..18 loop 
      select  
         Palyak(i).belep; 
         --w.WRITE(integer'image(id) & "*********"); 
         delay duration((random(G)+10)/100); 
         --w.WRITE(integer'image(id) & "/////////"); 
         W.Write(integer'image(id) & ". csoport: jatszottam a " & integer'image(i) & ". palyan"); 
         Palyak(i).kilep; 
      or 
         delay 0.15
         W.Write(integer'image(id) & ". csoport: rauntam varni a " & integer'image(i) & ". palyara"); 
         faildb := faildb + 1
      end select
   end loop
   W.Write(integer'image(id) & ". csoport: befejeztem a jatekot es " & integer'image(faildb*100) & ". fabatkat kaptam vissza"); 
   Penztar.elkoszon(faildb); 
end Csoport; 
 
task body Penztar is 
   db : integer := 0
   back : integer := 0
   cash : integer := 0
begin 
   while db < 30 loop 
      select 
         accept fizet do 
            cash := cash + 1800
         end fizet; 
      or 
         accept elkoszon(x : in integer) do 
            db := db + 1
            back := back + x; 
         end elkoszon; 
      end select
   end loop
   W.Write("Penztar: A napi bevetel: " & integer'image(cash - 100*back));  
end Penztar; 
 
type pCsoport is access Csoport; 
Cs : array(1..30of pCsoport; 
G : Generator; 
 
begin 
   Reset(G); 
   for i in 1..30 loop 
      delay duration((random(G)+20)/100); 
      Cs(i) := new Csoport(i); 
   end loop
end golf;
 
 
VISSZA