Advertisement
Guest User

Untitled

a guest
Oct 19th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 7.15 KB | None | 0 0
  1. -- Szkielet programu do zadania z języków programowania
  2. -- Studenci powinni przemianować zadania producentów, konsumentów i bufora
  3. -- Powinni następnie zmienić je tak, by odpowiadały ich własnym zadaniom
  4. -- Powinni także uzupełnić kod o brakujące konstrucje
  5. with Ada.Text_IO; use Ada.Text_IO;
  6. with Ada.Integer_Text_IO;
  7. with Ada.Numerics.Discrete_Random;
  8.  
  9.  
  10. procedure Budownictwo is
  11.    Liczba_Wyrobow: constant Integer := 4;
  12.    Liczba_Zestawow: constant Integer := 3;
  13.    Liczba_Konsumentow: constant Integer := 2;
  14.    subtype Zakres_Czasu_Produkcji is Integer range 3 .. 6;
  15.    subtype Zakres_Czasu_Konsumpcji is Integer range 4 .. 8;
  16.    subtype Typ_Wyrobow is Integer range 1 .. Liczba_Wyrobow;
  17.    subtype Typ_Zestawow is Integer range 1 .. Liczba_Zestawow;
  18.    subtype Typ_Konsumenta is Integer range 1 .. Liczba_Konsumentow;
  19.    Nazwa_Wyrobu: constant array (Typ_Wyrobow) of String(1 .. 10)
  20.      := ("chemik    ", "fizyk     ", "matematyk ", "informatyk");
  21.    Nazwa_Zestawu: constant array (Typ_Zestawow) of String(1 .. 22)
  22.      := ("Mala grupa badawcza   ", "Srednia grupa badawcza", "Duza grupa badawcza   ");
  23.    package Losowa_Konsumpcja is new
  24.      Ada.Numerics.Discrete_Random(Zakres_Czasu_Konsumpcji);
  25.    package Losowy_Zestaw is new
  26.      Ada.Numerics.Discrete_Random(Typ_Zestawow);
  27.    type My_Str is new String(1 ..256);
  28.  
  29.    -- Producent produkuje określony wyrób
  30.    task type Producent is
  31.       -- Nadaj Producentowi tożsamość, czyli rodzaj wyrobu
  32.       entry Zacznij(Wyrob: in Typ_Wyrobow; Czas_Produkcji: in Integer);
  33.    end Producent;
  34.  
  35.    -- Konsument pobiera z Bufora dowolny zestaw składający się z wyrobów
  36.    task type Konsument is
  37.       -- Nadaj Konsumentowi tożsamość
  38.       entry Zacznij(Numer_Konsumenta: in Typ_Konsumenta;
  39.             Czas_Konsumpcji: in Integer);
  40.    end Konsument;
  41.  
  42.    -- W Buforze następuje składanie wyrobów w zestawy
  43.    task type Bufor is
  44.       -- Przyjmij wyrób do magazynu, o ile jest miejsce
  45.       entry Przyjmij(Wyrob: in Typ_Wyrobow; Numer: in Integer);
  46.       -- Wydaj zestaw z magazynu, o ile są części (wyroby)
  47.       entry Wydaj(Zestaw: in Typ_Zestawow; Numer: out Integer);
  48.    end Bufor;
  49.  
  50.    P: array ( 1 .. Liczba_Wyrobow ) of Producent;
  51.    K: array ( 1 .. Liczba_Konsumentow ) of Konsument;
  52.    B: Bufor;
  53.  
  54.    task body Producent is
  55.       package Losowa_Produkcja is new
  56.     Ada.Numerics.Discrete_Random(Zakres_Czasu_Produkcji);
  57.       G: Losowa_Produkcja.Generator;    --  generator liczb losowych
  58.       Nr_Typu_Wyrobu: Integer;
  59.       Numer_Wyrobu: Integer;
  60.       Produkcja: Integer;
  61.    begin
  62.       accept Zacznij(Wyrob: in Typ_Wyrobow; Czas_Produkcji: in Integer) do
  63.      Losowa_Produkcja.Reset(G); --  zacznij generator liczb losowych
  64.      Numer_Wyrobu := 1;
  65.      Nr_Typu_Wyrobu := Wyrob;
  66.      Produkcja := Czas_Produkcji;
  67.       end Zacznij;
  68.       Put_Line("Zaczęto producenta wyrobu " & Nazwa_Wyrobu(Nr_Typu_Wyrobu));
  69.       loop
  70.      delay Duration(Losowa_Produkcja.Random(G)); --  symuluj produkcję
  71.      Put_Line("Otrzymano zgloszenie od naukowca o specjalzacji " & Nazwa_Wyrobu(Nr_Typu_Wyrobu)
  72.             & " numer "  & Integer'Image(Numer_Wyrobu));
  73.          -- Wstaw do magazynu
  74.          
  75.          ------------ wazne miejsce: task producent odwiedza task bufor
  76.          select
  77.             delay 5.0;
  78.             Put_Line("Nie przydzielono miejsca w instytucie badawczym!");
  79.             then abort
  80.             B.Przyjmij(Nr_Typu_Wyrobu, Numer_Wyrobu);
  81.             Numer_Wyrobu := Numer_Wyrobu + 1;
  82.          end select;
  83.       end loop;
  84.    end Producent;
  85.  
  86.    task body Konsument is
  87.       G: Losowa_Konsumpcja.Generator;   --  generator liczb losowych (czas)
  88.       G2: Losowy_Zestaw.Generator--  też (zestawy)
  89.       Nr_Konsumenta: Typ_Konsumenta;
  90.       Numer_Zestawu: Integer;
  91.       Konsumpcja: Integer;
  92.       Rodzaj_Zestawu: Integer;
  93.       Nazwa_Konsumenta: constant array (1 .. Liczba_Konsumentow)
  94.     of String(1 .. 10)
  95.     := ("Inwestor 1", "Inwestor 2");
  96.    begin
  97.       accept Zacznij(Numer_Konsumenta: in Typ_Konsumenta;
  98.              Czas_Konsumpcji: in Integer) do
  99.      Losowa_Konsumpcja.Reset(G);    --  ustaw generator
  100.      Losowy_Zestaw.Reset(G2);   --  też
  101.      Nr_Konsumenta := Numer_Konsumenta;
  102.      Konsumpcja := Czas_Konsumpcji;
  103.       end Zacznij;
  104.       Put_Line("Zaczęto konsumenta " & Nazwa_Konsumenta(Nr_Konsumenta));
  105.       loop
  106.      delay Duration(Losowa_Konsumpcja.Random(G)); --  symuluj konsumpcję
  107.      Rodzaj_Zestawu := Losowy_Zestaw.Random(G2);
  108.  
  109.          -- pobierz zestaw do konsumpcji
  110.          
  111.          -----------wazne miejsce: task konsument spotyka task bufor
  112.          select
  113.             delay 5.0;
  114.             Put_Line("Nie zebrano grupy badawczej na czas!");
  115.             then abort
  116.             B.Wydaj(Rodzaj_Zestawu, Numer_Zestawu);
  117.             Put_Line(Nazwa_Konsumenta(Nr_Konsumenta) & ": przydzielono projekt dla: " &
  118.             Nazwa_Zestawu(Rodzaj_Zestawu) & " numer " &
  119.              Integer'Image(Numer_Zestawu));
  120.          end select;
  121.       end loop;
  122.    end Konsument;
  123.  
  124.    task body Bufor is
  125.       Pojemnosc_Magazynu: constant Integer := 10;
  126.       type Typ_Magazynu is array (Typ_Wyrobow) of Integer;
  127.       Magazyn: Typ_Magazynu
  128.     := (0, 0, 0, 0);
  129.       Sklad_Zestawu: array(Typ_Zestawow, Typ_Wyrobow) of Integer
  130.         := ((0, 1, 1, 1),   --mala grupa badawcza
  131.             (1, 1, 2, 1),   --srednia  gr
  132.             (1, 1, 2, 2));  --duza gr
  133.       Numer_Zestawu: array(Typ_Zestawow) of Integer
  134.     := (1, 1, 1);
  135.       W_Magazynie: Integer := 0;
  136.  
  137.       function Mozna_Przyjac(Wyrob: Typ_Wyrobow) return Boolean is
  138.  
  139.       function Mozna_Wydac(Zestaw: Typ_Zestawow) return Boolean is
  140.  
  141.       procedure Sklad_Magazynu is
  142.  
  143.    begin
  144.       Put_Line("Zaczęto Bufor");
  145.       loop
  146.      accept Przyjmij(Wyrob: in Typ_Wyrobow; Numer: in Integer) do
  147.        if Mozna_Przyjac(Wyrob) then
  148.           Put_Line("Do instytutu badawczego zostal przyjety " & Nazwa_Wyrobu(Wyrob) & " nr " &
  149.         Integer'Image(Numer));
  150.           Magazyn(Wyrob) := Magazyn(Wyrob) + 1;
  151.           W_Magazynie := W_Magazynie + 1;
  152.             else
  153.                
  154.                delay 15.0; ---delay wiekszy niz beda czekaly selecty funkcji
  155.           --Put_Line("Odrzucono wyrób " & Nazwa_Wyrobu(Wyrob) & " nr " &
  156.               --    Integer'Image(Numer));
  157.        end if;
  158.      end Przyjmij;
  159.      Sklad_Magazynu;
  160.      accept Wydaj(Zestaw: in Typ_Zestawow; Numer: out Integer) do
  161.         if Mozna_Wydac(Zestaw) then
  162.            Put_Line( Nazwa_Zestawu(Zestaw) & " nr " &
  163.               Integer'Image(Numer_Zestawu(Zestaw)) & " wyruszyla do pracy nad badaniami" );
  164.            for W in Typ_Wyrobow loop
  165.           Magazyn(W) := Magazyn(W) - Sklad_Zestawu(Zestaw, W);
  166.           W_Magazynie := W_Magazynie - Sklad_Zestawu(Zestaw, W);
  167.            end loop;
  168.            Numer := Numer_Zestawu(Zestaw);
  169.            Numer_Zestawu(Zestaw) := Numer_Zestawu(Zestaw) + 1;
  170.             else
  171.                delay 15.0; --delay wiekszy niz beda czekaly selecty funkcji
  172.            --Put_Line("Brak części dla zestawu " & Nazwa_Zestawu(Zestaw));
  173.            --Numer := 0;
  174.         end if;
  175.      end Wydaj;
  176.      Sklad_Magazynu;
  177.       end loop;
  178.    end Bufor;
  179.    
  180. begin
  181.    for I in 1 .. Liczba_Wyrobow loop
  182.    for J in 1 .. Liczba_Konsumentow loop
  183. end Budownictwo;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement