Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- autor: Tomasz Gajger
- -- nr. indeksu: 143218
- -- Jezyki Programowania, Informatyka - Sem III
- -- Program prezentujacy dzialanie mechanizmu randez-vous
- -- poprzez symulowanie warzenia piwa przez browar
- with GNAT.IO; use GNAT.IO;
- with Ada.Numerics.Discrete_Random;
- with Magazyn;
- with Piwa;
- with Ada.Exceptions;
- procedure main is
- -- Stale okreslajace sposób dzialania symulacji
- slodowniaOdstep : duration := 6.7;
- hurtowniaOdstep : duration := 3.3;
- sklepOdstep : duration := 2.5;
- pubOdstep : duration := 5.5;
- brakAkcjiOdstep : duration := 1.0;
- type koszykNaPiwa is array (Natural range <>) of Piwa.Piwo;
- -- Producenci
- task Slodownia;
- task Hurtownia;
- -- Konsumenci
- task Sklep;
- task Pub;
- -- Bufor
- task Browar is
- entry kupPiwka (koszyk : out koszykNaPiwa);
- entry dostawaSlodu ( ile : in integer);
- entry dostawaChmieluIDrozdzy;
- end Browar;
- -- Slodownia dostarcza slod
- task body Slodownia is
- begin
- loop
- Browar.dostawaSlodu(10);
- delay slodowniaOdstep;
- end loop;
- end Slodownia;
- -- Hurtownia dostarcza chmiel i drozdze
- task body Hurtownia is
- begin
- loop
- Browar.dostawaChmieluIDrozdzy;
- delay hurtowniaOdstep;
- end loop;
- end Hurtownia;
- -- Sklep kupuje piwo czesto, ale po jednej sztuce
- task body Sklep is
- koszyk : koszykNaPiwa(0 .. 0);
- begin
- loop
- delay sklepOdstep;
- Browar.kupPiwka(koszyk);
- end loop;
- end Sklep;
- -- Pub kupuje piwo rzadziej, ale w wiekszej ilosci
- task body Pub is
- koszyk : koszykNaPiwa(0 .. 9);
- begin
- loop
- delay pubOdstep;
- Browar.kupPiwka(koszyk);
- end loop;
- end Pub;
- -- Browar, z surowcow piwowarskich, produkuje piwo, ktore jest przechowywane w jego magazynie
- -- w oczekiwaniu na zakup przez sklep lub pub
- task body Browar is
- pojemnoscMagazynuNaSkladniki : constant integer := 50;
- slod, drozdze, chmiel : integer := 0;
- -- Funkcja sprawdzajaca czy w magazynie na surowce piwowarskie jest jeszcze miejsce
- function sprawdzCzyJestMiejsce( ile : in integer) return boolean is
- begin
- return slod + drozdze + chmiel + ile < pojemnoscMagazynuNaSkladniki;
- end sprawdzCzyJestMiejsce;
- -- Warzymy piwo losowo wybierajac jego gatunek i moc!
- function uwarzPiwo return Piwa.Piwo is
- -- Generator Gatunku Piwa
- package LosowyGatunekPiwa is new Ada.Numerics.Discrete_Random(Piwa.gatunki);
- GGP : LosowyGatunekPiwa.Generator; use LosowyGatunekPiwa;
- package LosowaZawartoscAlkoholu is new Ada.Numerics.Discrete_Random(Piwa.zawartoscAlkoholu);
- GZA : LosowaZawartoscAlkoholu.Generator; use LosowaZawartoscAlkoholu;
- begin
- -- Seedujemy generatory
- Reset(GGP);
- Reset(GZA);
- -- Zwracamy(...sic!) uwarzone piwo :)
- return (gatunek => Random(GGP), moc => Random(GZA));
- end uwarzPiwo;
- begin
- loop
- select
- accept kupPiwka (koszyk : out koszykNaPiwa) do
- -- Sklep lub pub zglosil chec zakupu piwa
- put_line(">> BROWAR: Ktos chce kupic piwka w ilosci: " & Integer'Image(koszyk'Length));
- begin
- for i in integer range koszyk'First .. koszyk'Last loop
- koszyk(i) := Magazyn.pobierz;
- end loop;
- exception
- when ex : magazyn.wyjatekMagazynu =>
- put_line("!!BLAD: " & Ada.Exceptions.Exception_Message(ex));
- end;
- put_line(">> BROWAR: ZAKUP UDANY!");
- end kupPiwka;
- else
- select
- when sprawdzCzyJestMiejsce(10) =>
- accept dostawaSlodu ( ile : in integer) do
- -- Przyjechala dostawa slodu
- put_line(">> BROWAR: Przyjelismy dostawe slodu!");
- slod := slod + 10;
- end dostawaSlodu;
- else
- select
- when sprawdzCzyJestMiejsce(2) =>
- accept dostawaChmieluIDrozdzy do
- -- Przyjechala dostawa chmielu i drozdzy
- put_line(">> BROWAR: Przyjelismy dostawe drozdzy i chmielu!");
- chmiel := chmiel + 1;
- drozdze := drozdze + 1;
- end dostawaChmieluIDrozdzy;
- else
- -- Browar jest bezczynny
- put_line(">> BROWAR: Nie przyjechala dostawa. Piwa tez nikt nie chce kupic...");
- put (" W magazynie: || drozdze:" & Integer'Image(drozdze));
- put(" | chmiel:" & Integer'Image(chmiel) & " | slod:" & Integer'Image(slod) & " ||");
- new_line(1);
- put_line(" Oraz" & Integer'Image(Magazyn.sprawdzIloscSztuk) & " piw gotowych do sprzedania!");
- delay brakAkcjiOdstep;
- end select;
- end select;
- end select;
- if slod >= 5 and drozdze >= 1 and chmiel >= 1 then
- put(">> BROWAR: Czas uwazyc troche piwa! Warka gotowa za:");
- for i in integer range 1 .. 3 loop
- put(Integer'Image(4 - i) & "..");
- delay 0.5;
- end loop;
- new_line(1);
- slod := slod - 5;
- drozdze := drozdze - 1;
- chmiel := chmiel - 1;
- begin
- for i in integer range 0 .. 4 loop
- Magazyn.dodaj(uwarzPiwo);
- end loop;
- exception
- when ex : magazyn.wyjatekMagazynu =>
- put_line("!!BLAD: " & Ada.Exceptions.Exception_Message(ex));
- end;
- end if;
- end loop;
- end Browar;
- begin
- null;
- end main;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement