Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Szkielet programu do zadania z jÄzyków programowania
- -- Studenci powinni przemianowaÄ zadania producentów, konsumentów i bufora
- -- Powinni nastÄpnie zmieniÄ je tak, by odpowiadaÅy ich wÅasnym zadaniom
- -- Powinni także uzupeÅniÄ kod o brakujÄ ce konstrucje
- with Ada.Text_IO; use Ada.Text_IO;
- with Ada.Integer_Text_IO;
- with Ada.Numerics.Discrete_Random;
- procedure Budownictwo is
- Liczba_Wyrobow: constant Integer := 4;
- Liczba_Zestawow: constant Integer := 3;
- Liczba_Konsumentow: constant Integer := 2;
- subtype Zakres_Czasu_Produkcji is Integer range 3 .. 6;
- subtype Zakres_Czasu_Konsumpcji is Integer range 4 .. 8;
- subtype Typ_Wyrobow is Integer range 1 .. Liczba_Wyrobow;
- subtype Typ_Zestawow is Integer range 1 .. Liczba_Zestawow;
- subtype Typ_Konsumenta is Integer range 1 .. Liczba_Konsumentow;
- Nazwa_Wyrobu: constant array (Typ_Wyrobow) of String(1 .. 10)
- := ("chemik ", "fizyk ", "matematyk ", "informatyk");
- Nazwa_Zestawu: constant array (Typ_Zestawow) of String(1 .. 22)
- := ("Mala grupa badawcza ", "Srednia grupa badawcza", "Duza grupa badawcza ");
- package Losowa_Konsumpcja is new
- Ada.Numerics.Discrete_Random(Zakres_Czasu_Konsumpcji);
- package Losowy_Zestaw is new
- Ada.Numerics.Discrete_Random(Typ_Zestawow);
- type My_Str is new String(1 ..256);
- -- Producent produkuje okreÅlony wyrób
- task type Producent is
- -- Nadaj Producentowi tożsamoÅÄ, czyli rodzaj wyrobu
- entry Zacznij(Wyrob: in Typ_Wyrobow; Czas_Produkcji: in Integer);
- end Producent;
- -- Konsument pobiera z Bufora dowolny zestaw skÅadajÄ cy siÄ z wyrobów
- task type Konsument is
- -- Nadaj Konsumentowi tożsamoÅÄ
- entry Zacznij(Numer_Konsumenta: in Typ_Konsumenta;
- Czas_Konsumpcji: in Integer);
- end Konsument;
- -- W Buforze nastÄpuje skÅadanie wyrobów w zestawy
- task type Bufor is
- -- Przyjmij wyrób do magazynu, o ile jest miejsce
- entry Przyjmij(Wyrob: in Typ_Wyrobow; Numer: in Integer);
- -- Wydaj zestaw z magazynu, o ile sÄ czÄÅci (wyroby)
- entry Wydaj(Zestaw: in Typ_Zestawow; Numer: out Integer);
- end Bufor;
- P: array ( 1 .. Liczba_Wyrobow ) of Producent;
- K: array ( 1 .. Liczba_Konsumentow ) of Konsument;
- B: Bufor;
- task body Producent is
- package Losowa_Produkcja is new
- Ada.Numerics.Discrete_Random(Zakres_Czasu_Produkcji);
- G: Losowa_Produkcja.Generator; -- generator liczb losowych
- Nr_Typu_Wyrobu: Integer;
- Numer_Wyrobu: Integer;
- Produkcja: Integer;
- begin
- accept Zacznij(Wyrob: in Typ_Wyrobow; Czas_Produkcji: in Integer) do
- Losowa_Produkcja.Reset(G); -- zacznij generator liczb losowych
- Numer_Wyrobu := 1;
- Nr_Typu_Wyrobu := Wyrob;
- Produkcja := Czas_Produkcji;
- end Zacznij;
- Put_Line("ZaczÄto producenta wyrobu " & Nazwa_Wyrobu(Nr_Typu_Wyrobu));
- loop
- delay Duration(Losowa_Produkcja.Random(G)); -- symuluj produkcjÄ
- Put_Line("Otrzymano zgloszenie od naukowca o specjalzacji " & Nazwa_Wyrobu(Nr_Typu_Wyrobu)
- & " numer " & Integer'Image(Numer_Wyrobu));
- -- Wstaw do magazynu
- ------------ wazne miejsce: task producent odwiedza task bufor
- select
- delay 5.0;
- Put_Line("Nie przydzielono miejsca w instytucie badawczym!");
- then abort
- B.Przyjmij(Nr_Typu_Wyrobu, Numer_Wyrobu);
- Numer_Wyrobu := Numer_Wyrobu + 1;
- end select;
- end loop;
- end Producent;
- task body Konsument is
- G: Losowa_Konsumpcja.Generator; -- generator liczb losowych (czas)
- G2: Losowy_Zestaw.Generator; -- też (zestawy)
- Nr_Konsumenta: Typ_Konsumenta;
- Numer_Zestawu: Integer;
- Konsumpcja: Integer;
- Rodzaj_Zestawu: Integer;
- Nazwa_Konsumenta: constant array (1 .. Liczba_Konsumentow)
- of String(1 .. 10)
- := ("Inwestor 1", "Inwestor 2");
- begin
- accept Zacznij(Numer_Konsumenta: in Typ_Konsumenta;
- Czas_Konsumpcji: in Integer) do
- Losowa_Konsumpcja.Reset(G); -- ustaw generator
- Losowy_Zestaw.Reset(G2); -- też
- Nr_Konsumenta := Numer_Konsumenta;
- Konsumpcja := Czas_Konsumpcji;
- end Zacznij;
- Put_Line("ZaczÄto konsumenta " & Nazwa_Konsumenta(Nr_Konsumenta));
- loop
- delay Duration(Losowa_Konsumpcja.Random(G)); -- symuluj konsumpcjÄ
- Rodzaj_Zestawu := Losowy_Zestaw.Random(G2);
- -- pobierz zestaw do konsumpcji
- -----------wazne miejsce: task konsument spotyka task bufor
- select
- delay 5.0;
- Put_Line("Nie zebrano grupy badawczej na czas!");
- then abort
- B.Wydaj(Rodzaj_Zestawu, Numer_Zestawu);
- Put_Line(Nazwa_Konsumenta(Nr_Konsumenta) & ": przydzielono projekt dla: " &
- Nazwa_Zestawu(Rodzaj_Zestawu) & " numer " &
- Integer'Image(Numer_Zestawu));
- end select;
- end loop;
- end Konsument;
- task body Bufor is
- Pojemnosc_Magazynu: constant Integer := 10;
- type Typ_Magazynu is array (Typ_Wyrobow) of Integer;
- Magazyn: Typ_Magazynu
- := (0, 0, 0, 0);
- Sklad_Zestawu: array(Typ_Zestawow, Typ_Wyrobow) of Integer
- := ((0, 1, 1, 1), --mala grupa badawcza
- (1, 1, 2, 1), --srednia gr
- (1, 1, 2, 2)); --duza gr
- Numer_Zestawu: array(Typ_Zestawow) of Integer
- := (1, 1, 1);
- W_Magazynie: Integer := 0;
- function Mozna_Przyjac(Wyrob: Typ_Wyrobow) return Boolean is
- Wolne: Integer; -- wolne miejsce w magazynie
- Tmp_Mag: Typ_Magazynu; -- magazyn po przyjÄciu czÄÅci
- -- ile brakuje wyrobów w magazynie do produkcji okreÅlonych zestawów
- Brak: array(Typ_Zestawow, Typ_Wyrobow) of Integer;
- -- ile brakuje wyrobów w magazynie do produkcji dowolnego zestawu
- Max_Brak: array(Typ_Wyrobow) of Integer;
- -- ile potrzeba miejsca w magazynie, by wyprodukowaÄ dowolny wyrób
- Braki: Integer;
- begin
- if W_Magazynie >= Pojemnosc_Magazynu then
- return False;
- else
- Wolne := Pojemnosc_Magazynu - W_Magazynie;
- Tmp_Mag := Magazyn;
- Tmp_Mag(Wyrob) := Tmp_Mag(Wyrob) + 1;
- for W in Typ_Wyrobow loop
- Max_Brak(W) := 0;
- end loop;
- for Z in Typ_Zestawow loop
- for W in Typ_Wyrobow loop
- Brak(Z, W) := Integer'Max(0,
- Sklad_Zestawu(Z, W) - Tmp_Mag(W));
- if Brak(Z, W) > Max_Brak(W) then
- Max_Brak(W) := Brak(Z, W);
- end if;
- end loop;
- end loop;
- end if;
- Braki := 0;
- for W in Typ_Wyrobow loop
- Braki := Braki + Max_Brak(W);
- end loop;
- return Wolne >= Braki;
- end Mozna_Przyjac;
- function Mozna_Wydac(Zestaw: Typ_Zestawow) return Boolean is
- begin
- for W in Typ_Wyrobow loop
- if Magazyn(W) < Sklad_Zestawu(Zestaw, W) then
- return False;
- end if;
- end loop;
- return True;
- end Mozna_Wydac;
- procedure Sklad_Magazynu is
- begin
- for W in Typ_Wyrobow loop
- Put_Line("SkÅad magazynu: " & Integer'Image(Magazyn(W)) & " "
- & Nazwa_Wyrobu(W));
- end loop;
- end Sklad_Magazynu;
- begin
- Put_Line("ZaczÄto Bufor");
- loop
- accept Przyjmij(Wyrob: in Typ_Wyrobow; Numer: in Integer) do
- if Mozna_Przyjac(Wyrob) then
- Put_Line("Do instytutu badawczego zostal przyjety " & Nazwa_Wyrobu(Wyrob) & " nr " &
- Integer'Image(Numer));
- Magazyn(Wyrob) := Magazyn(Wyrob) + 1;
- W_Magazynie := W_Magazynie + 1;
- else
- delay 15.0; ---delay wiekszy niz beda czekaly selecty funkcji
- --Put_Line("Odrzucono wyrób " & Nazwa_Wyrobu(Wyrob) & " nr " &
- -- Integer'Image(Numer));
- end if;
- end Przyjmij;
- Sklad_Magazynu;
- accept Wydaj(Zestaw: in Typ_Zestawow; Numer: out Integer) do
- if Mozna_Wydac(Zestaw) then
- Put_Line( Nazwa_Zestawu(Zestaw) & " nr " &
- Integer'Image(Numer_Zestawu(Zestaw)) & " wyruszyla do pracy nad badaniami" );
- for W in Typ_Wyrobow loop
- Magazyn(W) := Magazyn(W) - Sklad_Zestawu(Zestaw, W);
- W_Magazynie := W_Magazynie - Sklad_Zestawu(Zestaw, W);
- end loop;
- Numer := Numer_Zestawu(Zestaw);
- Numer_Zestawu(Zestaw) := Numer_Zestawu(Zestaw) + 1;
- else
- delay 15.0; --delay wiekszy niz beda czekaly selecty funkcji
- --Put_Line("Brak czÄÅci dla zestawu " & Nazwa_Zestawu(Zestaw));
- --Numer := 0;
- end if;
- end Wydaj;
- Sklad_Magazynu;
- end loop;
- end Bufor;
- begin
- for I in 1 .. Liczba_Wyrobow loop
- for J in 1 .. Liczba_Konsumentow loop
- end Budownictwo;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement