Advertisement
Guest User

Untitled

a guest
Oct 19th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 7.82 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 Symulacja is
  11.    Liczba_Wyrobow: constant Integer := 5;
  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 .. 6)
  20.      := ("Wyrob1", "Wyrob2", "Wyrob3", "Wyrob4", "Wyrob5");
  21.    Nazwa_Zestawu: constant array (Typ_Zestawow) of String(1 .. 7)
  22.      := ("Zestaw1", "Zestaw2", "Zestaw3");
  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("Wyprodukowano wyrób " & Nazwa_Wyrobu(Nr_Typu_Wyrobu)
  72.             & " numer "  & Integer'Image(Numer_Wyrobu));
  73.      -- Wstaw do magazynu
  74.      B.Przyjmij(Nr_Typu_Wyrobu, Numer_Wyrobu);
  75.      Numer_Wyrobu := Numer_Wyrobu + 1;
  76.       end loop;
  77.    end Producent;
  78.  
  79.    task body Konsument is
  80.       G: Losowa_Konsumpcja.Generator;   --  generator liczb losowych (czas)
  81.       G2: Losowy_Zestaw.Generator--  też (zestawy)
  82.       Nr_Konsumenta: Typ_Konsumenta;
  83.       Numer_Zestawu: Integer;
  84.       Konsumpcja: Integer;
  85.       Rodzaj_Zestawu: Integer;
  86.       Nazwa_Konsumenta: constant array (1 .. Liczba_Konsumentow)
  87.     of String(1 .. 10)
  88.     := ("Konsument1", "Konsument2");
  89.    begin
  90.       accept Zacznij(Numer_Konsumenta: in Typ_Konsumenta;
  91.              Czas_Konsumpcji: in Integer) do
  92.      Losowa_Konsumpcja.Reset(G);    --  ustaw generator
  93.      Losowy_Zestaw.Reset(G2);   --  też
  94.      Nr_Konsumenta := Numer_Konsumenta;
  95.      Konsumpcja := Czas_Konsumpcji;
  96.       end Zacznij;
  97.       Put_Line("Zaczęto konsumenta " & Nazwa_Konsumenta(Nr_Konsumenta));
  98.       loop
  99.      delay Duration(Losowa_Konsumpcja.Random(G)); --  symuluj konsumpcję
  100.      Rodzaj_Zestawu := Losowy_Zestaw.Random(G2);
  101.      -- pobierz zestaw do konsumpcji
  102.      B.Wydaj(Rodzaj_Zestawu, Numer_Zestawu);
  103.      Put_Line(Nazwa_Konsumenta(Nr_Konsumenta) & ": pobrano zestaw " &
  104.             Nazwa_Zestawu(Rodzaj_Zestawu) & " numer " &
  105.             Integer'Image(Numer_Zestawu));
  106.       end loop;
  107.    end Konsument;
  108.  
  109.    task body Bufor is
  110.       Pojemnosc_Magazynu: constant Integer := 30;
  111.       type Typ_Magazynu is array (Typ_Wyrobow) of Integer;
  112.       Magazyn: Typ_Magazynu
  113.     := (0, 0, 0, 0, 0);
  114.       Sklad_Zestawu: array(Typ_Zestawow, Typ_Wyrobow) of Integer
  115.     := ((2, 1, 2, 1, 2),
  116.         (2, 2, 0, 1, 0),
  117.         (1, 1, 2, 0, 1));
  118.       Numer_Zestawu: array(Typ_Zestawow) of Integer
  119.     := (1, 1, 1);
  120.       W_Magazynie: Integer := 0;
  121.  
  122.       function Mozna_Przyjac(Wyrob: Typ_Wyrobow) return Boolean is
  123.      Wolne: Integer;        --  wolne miejsce w magazynie
  124.      Tmp_Mag: Typ_Magazynu;     --  magazyn po przyjęciu części
  125.      -- ile brakuje wyrobów w magazynie do produkcji określonych zestawów
  126.      Brak: array(Typ_Zestawow, Typ_Wyrobow) of Integer;
  127.      -- ile brakuje wyrobów w magazynie do produkcji dowolnego zestawu
  128.      Max_Brak: array(Typ_Wyrobow) of Integer;
  129.      -- ile potrzeba miejsca w magazynie, by wyprodukować dowolny wyrób
  130.      Braki: Integer;
  131.       begin
  132.      if W_Magazynie >= Pojemnosc_Magazynu then
  133.         return False;
  134.      else
  135.         Wolne := Pojemnosc_Magazynu - W_Magazynie;
  136.         Tmp_Mag := Magazyn;
  137.         Tmp_Mag(Wyrob) := Tmp_Mag(Wyrob) + 1;
  138.         for W in Typ_Wyrobow loop
  139.            Max_Brak(W) := 0;
  140.         end loop;
  141.         for Z in Typ_Zestawow loop
  142.            for W in Typ_Wyrobow loop
  143.           Brak(Z, W) := Integer'Max(0,
  144.                         Sklad_Zestawu(Z, W) - Tmp_Mag(W));
  145.           if Brak(Z, W) > Max_Brak(W) then
  146.              Max_Brak(W) := Brak(Z, W);
  147.            end if;
  148.            end loop;
  149.         end loop;
  150.      end if;
  151.      Braki := 0;
  152.      for W in Typ_Wyrobow loop
  153.         Braki := Braki + Max_Brak(W);
  154.      end loop;
  155.      return Wolne >= Braki;
  156.       end Mozna_Przyjac;
  157.  
  158.       function Mozna_Wydac(Zestaw: Typ_Zestawow) return Boolean is
  159.       begin
  160.      for W in Typ_Wyrobow loop
  161.         if Magazyn(W) < Sklad_Zestawu(Zestaw, W) then
  162.            return False;
  163.         end if;
  164.      end loop;
  165.      return True;
  166.       end Mozna_Wydac;
  167.  
  168.       procedure Sklad_Magazynu is
  169.       begin
  170.      for W in Typ_Wyrobow loop
  171.         Put_Line("Skład magazynu: " & Integer'Image(Magazyn(W)) & " "
  172.                & Nazwa_Wyrobu(W));
  173.      end loop;
  174.       end Sklad_Magazynu;
  175.  
  176.    begin
  177.       Put_Line("Zaczęto Bufor");
  178.       loop
  179.      accept Przyjmij(Wyrob: in Typ_Wyrobow; Numer: in Integer) do
  180.        if Mozna_Przyjac(Wyrob) then
  181.           Put_Line("Przyjęto wyrób " & Nazwa_Wyrobu(Wyrob) & " nr " &
  182.         Integer'Image(Numer));
  183.           Magazyn(Wyrob) := Magazyn(Wyrob) + 1;
  184.           W_Magazynie := W_Magazynie + 1;
  185.        else
  186.           Put_Line("Odrzucono wyrób " & Nazwa_Wyrobu(Wyrob) & " nr " &
  187.             Integer'Image(Numer));
  188.        end if;
  189.      end Przyjmij;
  190.      Sklad_Magazynu;
  191.      accept Wydaj(Zestaw: in Typ_Zestawow; Numer: out Integer) do
  192.         if Mozna_Wydac(Zestaw) then
  193.            Put_Line("Wydano zestaw " & Nazwa_Zestawu(Zestaw) & " nr " &
  194.               Integer'Image(Numer_Zestawu(Zestaw)));
  195.            for W in Typ_Wyrobow loop
  196.           Magazyn(W) := Magazyn(W) - Sklad_Zestawu(Zestaw, W);
  197.           W_Magazynie := W_Magazynie - Sklad_Zestawu(Zestaw, W);
  198.            end loop;
  199.            Numer := Numer_Zestawu(Zestaw);
  200.            Numer_Zestawu(Zestaw) := Numer_Zestawu(Zestaw) + 1;
  201.         else
  202.            Put_Line("Brak części dla zestawu " & Nazwa_Zestawu(Zestaw));
  203.            Numer := 0;
  204.         end if;
  205.      end Wydaj;
  206.      Sklad_Magazynu;
  207.       end loop;
  208.    end Bufor;
  209.    
  210. begin
  211.    for I in 1 .. Liczba_Wyrobow loop
  212.       P(I).Zacznij(I, 10);
  213.    end loop;
  214.    for J in 1 .. Liczba_Konsumentow loop
  215.       K(J).Zacznij(J,12);
  216.    end loop;
  217. end Symulacja;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement