Advertisement
Guest User

Untitled

a guest
Oct 19th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 8.65 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.      Wolne: Integer;        --  wolne miejsce w magazynie
  139.      Tmp_Mag: Typ_Magazynu;     --  magazyn po przyjęciu części
  140.      -- ile brakuje wyrobów w magazynie do produkcji określonych zestawów
  141.      Brak: array(Typ_Zestawow, Typ_Wyrobow) of Integer;
  142.      -- ile brakuje wyrobów w magazynie do produkcji dowolnego zestawu
  143.      Max_Brak: array(Typ_Wyrobow) of Integer;
  144.      -- ile potrzeba miejsca w magazynie, by wyprodukować dowolny wyrób
  145.      Braki: Integer;
  146.       begin
  147.      if W_Magazynie >= Pojemnosc_Magazynu then
  148.         return False;
  149.      else
  150.         Wolne := Pojemnosc_Magazynu - W_Magazynie;
  151.         Tmp_Mag := Magazyn;
  152.         Tmp_Mag(Wyrob) := Tmp_Mag(Wyrob) + 1;
  153.         for W in Typ_Wyrobow loop
  154.            Max_Brak(W) := 0;
  155.         end loop;
  156.         for Z in Typ_Zestawow loop
  157.            for W in Typ_Wyrobow loop
  158.           Brak(Z, W) := Integer'Max(0,
  159.                         Sklad_Zestawu(Z, W) - Tmp_Mag(W));
  160.           if Brak(Z, W) > Max_Brak(W) then
  161.              Max_Brak(W) := Brak(Z, W);
  162.            end if;
  163.            end loop;
  164.         end loop;
  165.      end if;
  166.      Braki := 0;
  167.      for W in Typ_Wyrobow loop
  168.         Braki := Braki + Max_Brak(W);
  169.      end loop;
  170.      return Wolne >= Braki;
  171.       end Mozna_Przyjac;
  172.  
  173.       function Mozna_Wydac(Zestaw: Typ_Zestawow) return Boolean is
  174.       begin
  175.      for W in Typ_Wyrobow loop
  176.         if Magazyn(W) < Sklad_Zestawu(Zestaw, W) then
  177.            return False;
  178.         end if;
  179.      end loop;
  180.      return True;
  181.       end Mozna_Wydac;
  182.  
  183.       procedure Sklad_Magazynu is
  184.       begin
  185.      for W in Typ_Wyrobow loop
  186.         Put_Line("Skład magazynu: " & Integer'Image(Magazyn(W)) & " "
  187.                & Nazwa_Wyrobu(W));
  188.      end loop;
  189.       end Sklad_Magazynu;
  190.  
  191.    begin
  192.       Put_Line("Zaczęto Bufor");
  193.       loop
  194.      accept Przyjmij(Wyrob: in Typ_Wyrobow; Numer: in Integer) do
  195.        if Mozna_Przyjac(Wyrob) then
  196.           Put_Line("Do instytutu badawczego zostal przyjety " & Nazwa_Wyrobu(Wyrob) & " nr " &
  197.         Integer'Image(Numer));
  198.           Magazyn(Wyrob) := Magazyn(Wyrob) + 1;
  199.           W_Magazynie := W_Magazynie + 1;
  200.             else
  201.                
  202.                delay 15.0; ---delay wiekszy niz beda czekaly selecty funkcji
  203.           --Put_Line("Odrzucono wyrób " & Nazwa_Wyrobu(Wyrob) & " nr " &
  204.               --    Integer'Image(Numer));
  205.        end if;
  206.      end Przyjmij;
  207.      Sklad_Magazynu;
  208.      accept Wydaj(Zestaw: in Typ_Zestawow; Numer: out Integer) do
  209.         if Mozna_Wydac(Zestaw) then
  210.            Put_Line( Nazwa_Zestawu(Zestaw) & " nr " &
  211.               Integer'Image(Numer_Zestawu(Zestaw)) & " wyruszyla do pracy nad badaniami" );
  212.            for W in Typ_Wyrobow loop
  213.           Magazyn(W) := Magazyn(W) - Sklad_Zestawu(Zestaw, W);
  214.           W_Magazynie := W_Magazynie - Sklad_Zestawu(Zestaw, W);
  215.            end loop;
  216.            Numer := Numer_Zestawu(Zestaw);
  217.            Numer_Zestawu(Zestaw) := Numer_Zestawu(Zestaw) + 1;
  218.             else
  219.                delay 15.0; --delay wiekszy niz beda czekaly selecty funkcji
  220.            --Put_Line("Brak części dla zestawu " & Nazwa_Zestawu(Zestaw));
  221.            --Numer := 0;
  222.         end if;
  223.      end Wydaj;
  224.      Sklad_Magazynu;
  225.       end loop;
  226.    end Bufor;
  227.    
  228. begin
  229.    for I in 1 .. Liczba_Wyrobow loop
  230.    for J in 1 .. Liczba_Konsumentow loop
  231. end Budownictwo;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement