daily pastebin goal
31%
SHARE
TWEET

main

a guest Oct 18th, 2017 56 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- autor: Tomasz Gajger
  2. -- nr. indeksu: 143218
  3. -- Jezyki Programowania, Informatyka - Sem III
  4. -- Program prezentujacy dzialanie mechanizmu randez-vous
  5. -- poprzez symulowanie warzenia piwa przez browar
  6.  
  7. with GNAT.IO; use GNAT.IO;
  8. with Ada.Numerics.Discrete_Random;
  9. with Magazyn;
  10. with Piwa;
  11. with Ada.Exceptions;
  12.  
  13. procedure main is
  14.    -- Stale okreslajace sposób dzialania symulacji
  15.    slodowniaOdstep : duration := 6.7;
  16.    hurtowniaOdstep : duration := 3.3;
  17.    sklepOdstep     : duration := 2.5;
  18.    pubOdstep       : duration := 5.5;
  19.    brakAkcjiOdstep : duration := 1.0;
  20.  
  21.    type koszykNaPiwa is array (Natural range <>) of Piwa.Piwo;
  22.  
  23.    -- Producenci
  24.    task Slodownia;
  25.    task Hurtownia;
  26.    -- Konsumenci
  27.    task Sklep;
  28.    task Pub;
  29.    -- Bufor
  30.    task Browar is
  31.       entry kupPiwka (koszyk : out koszykNaPiwa);
  32.       entry dostawaSlodu ( ile : in integer);
  33.       entry dostawaChmieluIDrozdzy;
  34.    end Browar;
  35.  
  36.    -- Slodownia dostarcza slod
  37.    task body Slodownia is
  38.    begin
  39.       loop
  40.          Browar.dostawaSlodu(10);
  41.          delay slodowniaOdstep;
  42.       end loop;
  43.    end Slodownia;
  44.  
  45.    -- Hurtownia dostarcza chmiel i drozdze
  46.    task body Hurtownia is
  47.    begin
  48.       loop
  49.          Browar.dostawaChmieluIDrozdzy;
  50.          delay hurtowniaOdstep;
  51.       end loop;
  52.    end Hurtownia;
  53.  
  54.    -- Sklep kupuje piwo czesto, ale po jednej sztuce
  55.    task body Sklep is
  56.       koszyk : koszykNaPiwa(0 .. 0);
  57.    begin
  58.       loop
  59.          delay sklepOdstep;
  60.          Browar.kupPiwka(koszyk);
  61.       end loop;
  62.    end Sklep;
  63.  
  64.    -- Pub kupuje piwo rzadziej, ale w wiekszej ilosci
  65.    task body Pub is
  66.       koszyk : koszykNaPiwa(0 .. 9);
  67.    begin
  68.       loop
  69.          delay pubOdstep;
  70.          Browar.kupPiwka(koszyk);
  71.       end loop;
  72.    end Pub;
  73.  
  74.    -- Browar, z surowcow piwowarskich, produkuje piwo, ktore jest przechowywane w jego magazynie
  75.    -- w oczekiwaniu na zakup przez sklep lub pub
  76.    task body Browar is
  77.  
  78.       pojemnoscMagazynuNaSkladniki : constant integer := 50;
  79.  
  80.       slod, drozdze, chmiel : integer := 0;
  81.  
  82.       -- Funkcja sprawdzajaca czy w magazynie na surowce piwowarskie jest jeszcze miejsce
  83.       function sprawdzCzyJestMiejsce( ile : in integer) return boolean is
  84.       begin
  85.          return slod + drozdze + chmiel + ile < pojemnoscMagazynuNaSkladniki;
  86.       end sprawdzCzyJestMiejsce;
  87.  
  88.       -- Warzymy piwo losowo wybierajac jego gatunek i moc!
  89.       function uwarzPiwo return Piwa.Piwo is
  90.          -- Generator Gatunku Piwa
  91.          package LosowyGatunekPiwa is new Ada.Numerics.Discrete_Random(Piwa.gatunki);
  92.          GGP : LosowyGatunekPiwa.Generator; use LosowyGatunekPiwa;
  93.  
  94.  
  95.          package LosowaZawartoscAlkoholu is new Ada.Numerics.Discrete_Random(Piwa.zawartoscAlkoholu);
  96.          GZA : LosowaZawartoscAlkoholu.Generator; use LosowaZawartoscAlkoholu;
  97.       begin
  98.          -- Seedujemy generatory
  99.          Reset(GGP);
  100.          Reset(GZA);
  101.          -- Zwracamy(...sic!) uwarzone piwo :)
  102.          return (gatunek => Random(GGP), moc => Random(GZA));
  103.       end uwarzPiwo;
  104.  
  105.    begin
  106.       loop
  107.          select
  108.             accept kupPiwka (koszyk : out koszykNaPiwa) do
  109.                -- Sklep lub pub zglosil chec zakupu piwa
  110.  
  111.                put_line(">> BROWAR: Ktos chce kupic piwka w ilosci: " & Integer'Image(koszyk'Length));
  112.  
  113.                begin
  114.                   for i in integer range koszyk'First .. koszyk'Last loop
  115.                      koszyk(i) := Magazyn.pobierz;
  116.                   end loop;
  117.                exception
  118.                   when ex : magazyn.wyjatekMagazynu =>
  119.                      put_line("!!BLAD: " & Ada.Exceptions.Exception_Message(ex));
  120.                end;
  121.  
  122.                   put_line(">> BROWAR: ZAKUP UDANY!");
  123.  
  124.             end kupPiwka;
  125.  
  126.          else
  127.             select
  128.                when sprawdzCzyJestMiejsce(10) =>
  129.                   accept dostawaSlodu ( ile : in integer) do
  130.                      -- Przyjechala dostawa slodu
  131.  
  132.                      put_line(">> BROWAR: Przyjelismy dostawe slodu!");
  133.                      slod := slod + 10;
  134.                   end dostawaSlodu;
  135.  
  136.             else
  137.                select
  138.                   when sprawdzCzyJestMiejsce(2) =>
  139.                      accept dostawaChmieluIDrozdzy do
  140.                         -- Przyjechala dostawa chmielu i drozdzy
  141.  
  142.                         put_line(">> BROWAR: Przyjelismy dostawe drozdzy i chmielu!");
  143.                         chmiel := chmiel + 1;
  144.                         drozdze := drozdze + 1;
  145.                      end dostawaChmieluIDrozdzy;
  146.  
  147.                else
  148.                   -- Browar jest bezczynny
  149.  
  150.                   put_line(">> BROWAR: Nie przyjechala dostawa. Piwa tez nikt nie chce kupic...");
  151.                   put     ("           W magazynie: || drozdze:" & Integer'Image(drozdze));
  152.                   put(" | chmiel:" & Integer'Image(chmiel) & " | slod:" & Integer'Image(slod) & " ||");
  153.                   new_line(1);
  154.                   put_line("           Oraz" & Integer'Image(Magazyn.sprawdzIloscSztuk) & " piw gotowych do sprzedania!");
  155.                   delay brakAkcjiOdstep;
  156.  
  157.                end select;
  158.             end select;
  159.          end select;
  160.  
  161.          if slod >= 5 and drozdze >= 1 and chmiel >= 1 then
  162.             put(">> BROWAR: Czas uwazyc troche piwa! Warka gotowa za:");
  163.  
  164.             for i in integer range 1 .. 3 loop
  165.                put(Integer'Image(4 - i) & "..");
  166.                delay 0.5;
  167.             end loop;
  168.  
  169.             new_line(1);
  170.  
  171.             slod := slod - 5;
  172.             drozdze := drozdze - 1;
  173.             chmiel := chmiel - 1;
  174.  
  175.             begin
  176.                for i in integer range 0 .. 4 loop
  177.                   Magazyn.dodaj(uwarzPiwo);
  178.                end loop;
  179.             exception
  180.                when ex : magazyn.wyjatekMagazynu =>
  181.                   put_line("!!BLAD: " & Ada.Exceptions.Exception_Message(ex));
  182.             end;
  183.          end if;
  184.       end loop;
  185.    end Browar;
  186.  
  187. begin
  188.    null;
  189. end main;
RAW Paste Data
Top