Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- with Ada.Text_IO;
- with Ada.Numerics.Discrete_Random;
- with Const;
- use Ada.Text_IO;
- procedure Main is
- type Sign is ('+', '-', '*');
- type Job is
- record
- first: Integer;
- operation: Sign;
- second: Integer;
- end record;
- task type CompanyPresident;
- task type Employee is
- task type Customer is
- task Scheduler is
- entry newJob (AJob: in Job);
- entry GetJob (AJob: out Job);
- entry GetState (mode: in Boolean);
- end Scheduler;
- task Store is
- entry newProduct (AnItem: in Integer);
- entry buyProduct (AnItem: out Integer);
- entry GetState (mode: in Boolean);
- end Store;
- task body CompanyPresident is
- Operations: array (0..2) of Sign := ('+', '-', '*');
- AJob: Job;
- subtype RangeNumbers is Integer range 1..1000;
- subtype RangeOperations is Integer range 0..2;
- package RNum is new Ada.Numerics.Discrete_Random(RangeNumbers);
- package ROp is new Ada.Numerics.Discrete_Random(RangeOperations);
- GNum: RNum.Generator;
- GOp: ROp.Generator;
- begin
- presidentLoop:
- loop
- AJob := (RNum.Random(GNum), Operations(ROp.Random(GOp)), RNum.Random(GNum));
- Scheduler.NewJob(AJob);
- if Const.Mode then
- Put_Line("Boss adds" & Integer'Image(AJob.first) & " " & Sign'Image(Ajob.operation) & Integer'Image(AJob.second) & " to tasks list.");
- end if;
- delay Const.CompanyPresidentSpeed;
- end loop presidentLoop;
- end CompanyPresident;
- task body Employee is
- Identifier : Integer;
- CurrentJob: Job;
- Result: Integer;
- begin
- accept Id (employeeId: in Integer) do
- Identifier := employeeId;
- end Id;
- endlessLoop:
- loop
- Scheduler.GetJob(CurrentJob);
- case CurrentJob.operation is
- when '+' =>
- Result := CurrentJob.first + CurrentJob.second;
- when '-' =>
- Result := CurrentJob.first - CurrentJob.second;
- when '*' =>
- Result := CurrentJob.first * CurrentJob.second;
- end case;
- if Const.Mode then
- Put_Line("worker" & Integer'Image(Identifier) & " produces " & Integer'Image(Result));
- end if;
- Store.newProduct(Result);
- delay Const.EmployeeSpeed;
- end loop endlessLoop;
- end Employee;
- task body Customer is
- identifier : Integer;
- Bought: Integer;
- begin
- accept Id (customerId: in Integer) do
- identifier := customerId;
- end Id;
- endlessLoop:
- loop
- Store.buyProduct(Bought);
- if Const.Mode then
- Put_Line("client" & Integer'image(identifier) & " bought " & Integer'image(bought));
- end if;
- delay Const.CustomerSpeed;
- end loop endlessLoop;
- end Customer;
- task body Scheduler is
- Jobs : array(0..Const.ToDoSize) of Job;
- JobsCount: Integer := 0;
- Head: Integer := 0;
- Tail: Integer := 0;
- begin
- endlessLoop:
- loop
- select
- when JobsCount < Const.ToDoSize =>
- accept NewJob(AJob: in Job) do
- Jobs(Tail) := AJob;
- end NewJob;
- Tail := (Tail+1) mod Const.StoreSize;
- JobsCount := JobsCount + 1;
- or when JobsCount > 0 =>
- accept GetJob(AJob: out Job) do
- AJob := Jobs(Head);
- end GetJob;
- Head := (Head + 1) mod Const.StoreSize;
- JobsCount := JobsCount - 1;
- or accept GetState(mode: in Boolean) do
- Put_Line("Bot> Lista zada:");
- Put("{ ");
- for I in Jobs'Range loop
- if Jobs(I).first = 0 then
- Put("()");
- else
- Put("(" & Integer'Image(Jobs(I).first) & Sign'Image(Jobs(I).operation) & Integer'Image(Jobs(I).second) & " )");
- end if;
- end loop;
- Put(" }");
- New_Line;
- end GetState;
- end select;
- end loop endlessLoop;
- end Scheduler;
- task body Store is
- Items: array (0..Const.StoreSize) of Integer;
- ItemsCount: Integer := 0;
- Head: Integer := 0;
- Tail: Integer := 0;
- begin
- endlessLoop:
- loop
- select
- when ItemsCount < Const.StoreSize =>
- accept newProduct(AnItem: in Integer) do
- Items(Tail) := AnItem;
- end newProduct;
- Tail := (Tail+1) mod Const.StoreSize;
- ItemsCount := ItemsCount+1;
- or when ItemsCount > 0 =>
- accept buyProduct (AnItem: out Integer) do
- AnItem := Items(Head);
- end buyProduct;
- Head := (Head + 1) mod Const.StoreSize;
- ItemsCount := ItemsCount-1;
- or accept GetState(mode: in Boolean) do
- Put_Line("Bot> Stan magazynu:");
- Put("{ ");
- for I in Items'Range loop
- Put("(" & Integer'Image(Items(I)) & " )");
- end loop;
- Put(" }");
- New_Line;
- end GetState;
- end select;
- end loop endlessLoop;
- end Store;
- p : CompanyPresident;
- w : array (0 .. Const.EmployeeNumber) of Employee;
- c : array (0 .. Const.CustomerNumber) of Customer;
- input: String(1..80);
- last: Natural;
- begin
- for I in w'Range loop
- w(I).Id(I);
- end loop;
- for I in c'Range loop
- c(I).Id(I);
- end loop;
- if not Const.Mode then
- Put_Line("Witaj w naszej firmie, co chcialbys wiedziec?");
- Put_Line("1 - Liczba pracownikow");
- Put_Line("2 - Ilosc rzeczy do zrobienia");
- Put_Line("3 - Lista zadan");
- Put_Line("4 - Liczba klientow");
- Put_Line("5 - Rozmiar magazynu");
- Put_Line("6 - Stan magazynu");
- loop
- Get_Line(input, last);
- case input(1) is
- when '1' =>
- Put_Line("Bot> Liczba pracownikow:" & Integer'Image(Const.EmployeeNumber));
- when '2' =>
- Put_Line("Bot> Ilosc rzeczy do zrobienia:" & Integer'Image(Const.ToDoSize));
- when '3' =>
- Scheduler.GetState(True);
- when '4' =>
- Put_Line("Bot> Liczba klientow:" & Integer'Image(Const.CustomerNumber));
- when '5' =>
- Put_Line("Bot> Rozmiar magazynu:" & Integer'Image(Const.StoreSize));
- when '6' =>
- Store.GetState(True);
- when others =>
- Put_Line("Witaj w naszej firmie, co chcialbys wiedziec?");
- Put_Line("1 - Liczba pracownikow");
- Put_Line("2 - Ilosc rzeczy do zrobienia");
- Put_Line("3 - Lista zadan");
- Put_Line("4 - Liczba klientow");
- Put_Line("5 - Rozmiar magazynu");
- Put_Line("6 - Stan magazynu");
- end case;
- end loop;
- end if;
- end Main;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement