Kamikadze ADA

background image

Programowanie współbieżne i
rozproszone

From KamikadzeWiki

k ompilacja:

gnatmake -gnat05 powitanie.adb -o powitanie

Spis treści

1 Zadania z laboratoriów

1.1 Laboratorium 1

1.1.1 Zadanie 1

1.1.1.1 Rozwiązanie 1

1.1.2 Zadanie 2

1.2 Laboratorium 2

1.2.1 Zadanie 3

1.3 Laboratorium 3

1.3.1 Zadanie 4
1.3.2 Zadanie 5

1.4 Laboratorium 4

1.4.1 Zadanie 6
1.4.2 Zadanie 7

1.5 Laboratorium 5

1.5.1 Zadanie 8

1.5.1.1 zadanie8c.adb

1.5.2 Zadanie 9
1.5.3 Zadanie 10

1.6 Laboratorium 6

1.6.1 Zadanie 11
1.6.2 Zadanie 12

1.6.2.1 Rozwiązanie 12
1.6.2.2 park ing.ads
1.6.2.3 park ing.adb
1.6.2.4 zadanie12.adb

1.7 Kolok wium 2007 i 2008

1.7.1 Grupa A

1.7.1.1 Zadanie 1

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

1 z 38

06.01.2009 10:52

background image

1.7.1.2 Zadanie 2

1.7.2 Grupa B

1.7.2.1 Zadanie 1
1.7.2.2 Zadanie 2

1.8 Adds On

1.8.1 Suma macierzy o wartościach zespolonych
1.8.2 Sk rzyżowanie

Zadania z laboratoriów

Laboratorium 1

Zadanie 1

Sk ompiluj i uruchom podany poniżej program.
Uruchom program w debugerze i prześledź k rok owo jego działanie.
Zmodyfik uj program tak , aby wyk orzystywał pętlę while i sprawdzał tylk o liczby
mniejsze od sqrt(n).

with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure Zadanie1 is
n, j : Integer;
begin
Put("Podaj wartość liczby n: ");
Get(n);

for i in 2 .. n - 1 loop
j := n mod i;
exit when j = 0;
end loop;

if j /= 0 then
Put(n, 0);
Put(" jest liczbą pierwszą.");
else
Put(n, 0);
Put(" nie jest liczbą pierwszą.");
end if;
end;

Rozwiązanie 1

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

2 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Integer_Text_IO,Ada.Numerics.Elementary_Functions;
use Ada.Text_IO, Ada.Integer_Text_IO,Ada.Numerics.Elementary_Functions;

procedure zadanie1 is
n, j, i : Integer;
begin
Put("Podaj wartość liczby n: ");
Get(n);
i:=2;
while i<=Integer(sqrt(Float(n))) loop
j := n mod i;
exit when j = 0;
i:=i+1;
end loop;
if j /= 0 then
Put(n, 0);
Put(" jest liczbą pierwszą.");
else
Put(n, 0);
Put(" nie jest liczbą pierwszą.");
end if;
end;

Zadanie 2

Napisz program wyk onujący obliczenia na wek torach (suma, różnica i iloczyn
sk alarny). W ramach programu należy zdefiniować procedury Read, Write (do
wczytywania i wypisywania wek torów) oraz funk cje przeładowujące operatory +, - i *.
Wszystk ie argumenty tych podprogramów powinny być typu:

type Vector is array (Integer range <>) of Float;

W przypadk u operatorów obliczenia mają być wyk onywane w ramach k rótszego z nich.
Niezależnie od zak resu argumentów, zak res wynik u ma być liczony od 1, na przyk ład
wynik iem dodawania (odejmowania) wek torów:

a : Vector(4 .. 6);
b : Vector(11 .. 15);

powinien być wek tor typu:

Vector(1 .. 3);

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

3 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Integer_Text_IO,Ada.Text_IO, Ada.Float_Text_IO,Ada.Numerics.Elementary_Functions;
use Ada.Text_IO, Ada.Integer_Text_IO,Ada.Text_IO, Ada.Float_Text_IO,Ada.Numerics.Elementary_Functions;

procedure zadanie2 is
type Vector is array (Integer range <>) of Float;
len1,len2, first1, first2, len_out : Integer;

--**************************************************--
-------------------Function sum ----------------------
function sum (v1,v2 : Vector) return Vector is
len : Integer;
begin
if (v1'length > v2'length) then
len:=v2'length;
else
len := V1'length;
end if ;
declare
tmp : Vector(1 .. len);
begin
for i in 1 .. len loop
tmp(i):=v1(v1'first+i-1)+v2(v2'first+i-1);
end loop;
return tmp;
end;
end ;
-------------------Function sum ----------------------
--**************************************************--

--**************************************************--
-------------------Function div ----------------------
function div (v1,v2 : Vector) return Vector is
len : Integer;
begin
if (v1'length > v2'length) then
len:=v2'length;
else
len := V1'length;
end if ;
declare
tmp : Vector(1 .. len);
begin
for i in 1 .. len loop
tmp(i):=v1(v1'first+i-1)-v2(v2'first+i-1);
end loop;
return tmp;
end;
end ;

-------------------Function div ----------------------
--**************************************************--

--**************************************************--
-------------------Function scalar--------------------
function scalar (v1,v2 : Vector) return Float is
len : Integer;
begin
if (v1'length > v2'length) then
len:=v2'length;
else
len := V1'length;
end if ;
declare
ret : Float;
begin
ret:=0.0;

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

4 z 38

06.01.2009 10:52

background image

Laboratorium 2

Zadanie 3

Napisz program będący k alk ulatorem dla ułamk ów zwyk łych. Program powinien
działać w niesk ończonej pętli, w ramach k tórej wybierany jest typ operacji, podawane
są argumenty i wyznaczany jest wynik . Program powinien sk ładać się z trzech plik ów
(2 z nich stanowią implementację pak ietu udostępniającego odpowiedni typ i operacje
na ułamk ach). Zawartość plik u fractions.ads (specyfik acja dla pak ietu Fractions)
podano poniżej:

package Fractions is
type Fraction is private;

function "-"(x : Fraction) return Fraction;
function "+"(x, y : Fraction) return Fraction;
function "-"(x, y : Fraction) return Fraction;
function "*"(x, y : Fraction) return Fraction;
function "/"(x, y : Fraction) return Fraction;
function frac(n, d : Integer) return Fraction;
function numerator(x : Fraction) return Integer;
function denominator(x : Fraction) return Integer;

private
type Fraction is record
n, d : Integer;
end record;

procedure abridge(x : in out Fraction);
procedure sign(x : in out Fraction);
end;

fraction.ads:

package Fractions is
type Fraction is private;

function "-"(x : Fraction) return Fraction;
function "+"(x, y : Fraction) return Fraction;
function "-"(x, y : Fraction) return Fraction;
function "*"(x, y : Fraction) return Fraction;
function "/"(x, y : Fraction) return Fraction;
function frac(n, d : Integer) return Fraction;
function numerator(x : Fraction) return Integer;
function denominator(x : Fraction) return Integer;

private
type Fraction is record
n, d : Integer;
end record;

procedure abridge(x : in out Fraction);
procedure sign(x : in out Fraction);
end;

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

5 z 38

06.01.2009 10:52

background image

fraction.adb:

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

6 z 38

06.01.2009 10:52

background image

package body Fractions is
function "-"(x : Fraction) return Fraction is
f: Fraction;
begin
f.n:=-x.n;
f.d:=x.d;
sign(f);
return f;
end;
function "+"(x, y : Fraction) return Fraction is
f: Fraction;
begin
f.n:=x.n*y.d+y.n*x.d;
f.d:=x.d*y.d;
sign(f);
abridge(f);
return f;
end;
function "-"(x, y : Fraction) return Fraction is
f: Fraction;
begin
f.n:=x.n*y.d-y.n*x.d;
f.d:=x.d*y.d;
sign(f);
abridge(f);
return f;
end;
function "*"(x, y : Fraction) return Fraction is
f: Fraction;
begin
f.n:=x.n*y.n;
f.d:=x.d*y.d;
sign(f);
abridge(f);
return f;
end;
function "/"(x, y : Fraction) return Fraction is
f: Fraction;
begin
f.n:=x.n*y.d;
f.d:=x.d*y.n;
sign(f);
abridge(f);
return f;
end;
function frac(n, d : Integer) return Fraction is
f: Fraction;
begin
f.n:=n;
f.d:=d;
return f;
end;
function numerator(x : Fraction) return Integer is
begin
return x.n;
end;
function denominator(x : Fraction) return Integer is
begin
return x.d;
end;

procedure abridge(x : in out Fraction) is
n, d : Integer;
begin
n := numerator(x);
d := denominator(x);

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

7 z 38

06.01.2009 10:52

background image

zadanie3.adb:

with Ada.Text_IO, Ada.Integer_Text_IO,Fractions;
use Ada.Text_IO, Ada.Integer_Text_IO,Fractions;

procedure zadanie3 is
n,d : Integer;
f1,f2,wynik: Fraction;
operator : Character;
begin
loop
Put_Line("Podaj rodzaj działania (- * / + [z - zmień znak] [q - wyjdź]):");
Get(operator);
exit when operator = 'q';
case operator is
when 'z' =>
Put_Line("Podaj licznik ułamka");
Get(n);
Put_Line("Podaj mianownik ułamka");
Get(d);
f1 := frac(n,d);
when others =>
Put_Line("Podaj licznik 1. ułamka");
Get(n);
Put_Line("Podaj mianownik 1. ułamka");
Get(d);
f1 := frac(n,d);
Put_Line("Podaj licznik 2. ułamka");
Get(n);
Put_Line("Podaj mianownik 2. ułamka");
Get(d);
f2 := frac(n,d);
end case;
case operator is
when '+' => wynik:=f1+f2;
when '-' => wynik:=f1-f2;
when '*' => wynik:=f1*f2;
when '/' => wynik:=f1/f2;
when 'z' => wynik:=-f1;
when others => null;
end case;
Put("wynik ["); Put(numerator(wynik)); Put("/"); Put(denominator(wynik)); Put_Line("]");
end loop;
end;

Laboratorium 3

Zadanie 4

Napisz program realizujący współbieżne sortowanie bąbelk owe. W ramach programu
należy zdefiniować typ zadaniowy Sorting, k tórego specyfik ację podano poniżej:

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

8 z 38

06.01.2009 10:52

background image

type Data is array (Integer range <>) of integer;
type DataPtr is access Data;

task type Sorting is
entry Sort (x : in DataPtr);
entry Finished;
end;

Wejście Sort wyk orzystywane jest do przek azania do zadania wsk aźnik a do tablicy,
k tórą należy posortować. W ramach realizacji wejścia wyk onywane jest sortowanie
tablicy. Drugie z wejść wyk orzystywane jest do sprawdzenia, czy sortowanie zostało
zak ończone. W programie wyk orzystane zostaną dwa zadania typu Sorting.

Główna procedura programu odpowiada za wczytanie danych, podział ich na dwie
części, uruchomienie współbieżnego sortowania dwóch tablic, a na k ońcu za scalenie
wynik ów i wypisanie ich na ek ran. W programie należy wyk orzystać trzy wsk aźnik i
typu DataPtr. W oparciu o pierwszy z nich dynamicznie tworzona jest tablica o
wsk azanym przez użytk ownik a rozmiarze, do k tórej wczytywane są dane. Pozostałe
dwa wsk aźnik i używane są do utworzenia dwóch tablic o długości o połowę mniejszej
(zwrócić uwagę na fak t, że tablica pierwsza może mieć nieparzystą liczbę elementów),
k tóre przek azywane są do zadań sortujących. Po zak ończeniu sortowania procedura
główna scala wynik i umieszczając je ponownie w pierwszej tablicy, a następnie
wypisuje je na ek ran.

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

9 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure zadanie4 is
type Data is array (Integer range <>) of integer;
type DataPtr is access Data;

task type Sorting is
entry Sort (x : in DataPtr);
entry Finished;
end;

task body Sorting is
z,b : Integer;
a : DataPtr;
begin
accept Sort(x : in DataPtr) do
a := x;
end;

loop
z:=1;
for i in 1..a.All'Last-1 loop
if a(i)>a(i+1) then
b:=a(i+1);
a(i+1):=a(i);
a(i):=b;
z:=0;
end if;
end loop;
exit when z=1;
end loop;

accept Finished;
end;

s1, s2 : Sorting;
tab0, tab1, tab2 : DataPtr;
n,i_1,i_2 : Integer;

begin
Put_Line("Podaj dlugosc tablicy: ");
Get(n);

tab0 := new Data(1..n);

Put("Podaj kolejne elementy tablicy: ");
for i in 1..n loop
Get(tab0(i));
end loop;

tab1 := new Data(1..n/2);
tab2 := new Data(1..n/2+n mod 2);
tab1.All := tab0.All(1..n/2);
tab2.All := tab0.All(n/2+1..n);

s1.Sort(tab1);
s2.Sort(tab2);

s1.Finished;
s2.Finished;

i_1:=1;
i_2:=1;
while i_1<tab1'Last+1 and i_2<tab2'Last+1 loop
Put_Line("");

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

10 z 38

06.01.2009 10:52

background image

Zadanie 5

Napisz program będący implementacją modelu pięciu filozofów. W ramach programu
należy zdefiniować dwa typy zadaniowe: Fork i Philosopher. Specyfik acje tych typów
oraz dek laracje zmiennych podano poniżej. Wyróżnik zadania Philosopher jest
używany do ok reślenia numerów widelców, z k tórych k orzysta dany filozof.

task type Fork is
entry up;
entry down;
end;

cutlery : array(0 .. 4) of Fork;

task type Philosopher (i : integer);

f0 : Philosopher(0);
f1 : Philosopher(1);
f2 : Philosopher(2);
f3 : Philosopher(3);
f4 : Philosopher(4);

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

11 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Numerics.Float_Random, Ada.Calendar, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Numerics.Float_Random, Ada.Calendar, Ada.Integer_Text_IO;

procedure zadanie5 is

procedure print(i : integer; j : integer; up_down : String) is
begin
put("Philosopher ");
put(i, 0);
put(", fork ");
put(j, 0);
put(" " & up_down);
New_Line;
end;

task type Fork is
entry up;
entry down;
end;

task body Fork is
begin
loop
accept up;
accept down;
end loop;
end;

cutlery : array(0 .. 4) of Fork;

task type Philosopher (i : integer);

task body Philosopher is
g : Generator;
begin
reset(g);

loop
delay duration(random(g) * 4.0); --myslenie

cutlery(i).up;
print(i, i, "up");

select
cutlery((i+1) mod 5).up;
print(i, (i+1) mod 5, "up");
delay duration(random(g) * 4.0); --jedzenie
cutlery(i).down;
print(i, i, "down");
cutlery((i+1) mod 5).down;
print(i, (i+1) mod 5, "down");
else
cutlery(i).down;
print(i, i, "down ************");
end select;
end loop;
end;

f0 : Philosopher(0);
f1 : Philosopher(1);
f2 : Philosopher(2);
f3 : Philosopher(3);
f4 : Philosopher(4);

begin
null;

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

12 z 38

06.01.2009 10:52

background image

Laboratorium 4

Zadanie 6

Zadanie 6

Napisz program implementujący problem producentów i k onsumentów. Rozważany
system sk łada się z dwóch grup zadań ok reślanych jak o producenci i k onsumenci
(należy zaimplementować dwa typy zadaniowe). Zadania k orzystają ze wspólnego
magazynu. W k ażdym cyk lu swojej pracy producent dok łada jedną jednostk ę towaru do
magazynu, a k onsument usuwa trzy jednostk i. Czas wyk onania jednego cyk lu przez
producenta i k onsumenta jest losowy. Magazyn należy zaimplementować jak o zadanie z
dwoma wejściami (wejścia wywoływane w dowolnej k olejności), k tóre umożliwiają
dodanie i usunięcie towaru z magazynu lub jak o obiek t chroniony z dwoma wejściami.
Stan magazynu zaimplementować jak o liczbę całk owitą nieujemną. Wyk onać testy z
różną liczbą producentów i k onsumentów. Rozbudować program tak , by przy realizacji
spotk ania wyświetlana była dodatk owo liczba zadań oczek ujących w k olejce do danego
wejścia.

Zmodyfik uj powyższy program wprowadzając ograniczoną pojemność magazynu.

[1] (http://student.agh.edu.pl/~beholder/lab4/prod.adb) producenci
--grzyb Czy accept w producentach i k onsumentach jest napewno potrzebny? Są to
zadania, k tóre same sobie działają, wiec wystarczyła by im pętla z delay.

Konsument moglby wygladac tak :

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

13 z 38

06.01.2009 10:52

background image

--Konsument
task type consumer(time: Natural) is
end;

task body consumer is
g : Generator;
workTime: Natural :=time;
begin
reset(g);
for i in 1..workTime loop
warehouse.get(3);
put("konsument zjada 3 towary");
new_line;
delay duration(random(g)*4.0);
end loop;
end;
--Program
producers: array (1..3) of prodPtr;
consumers: array (1..2) of consPtr;
begin
for i in producers'First..producers'Last loop
producers(i) := new producer(5);
end loop;
for i in consumers'First..consumers'Last loop
consumers(i) := new consumer(2);
end loop;
--tutaj juz sobie same leca
--czy potrzebna jest jeszcze petla by program sie nie zakonczyl?

end;

Jesli nie, to prosze o sprostowanie

Zadanie 7

Napisz program obliczający wartość n mod k w oparciu o pierścień k procesów
ponumerowanych od 0 do k -1. Program wysyła k olejne wartości dzielnej n do procesu
zerowego. Każdy proces zmniejsza otrzymaną liczbę o jeden i przek azuje do następnego
procesu. Proces, k tóry otrzyma zero wypisuje swój numer będący wynik iem operacji n
mod k (wraz z informacją o początk owej wartości n). Program na początk u swojego
działania pyta o wartość k i tworzy odpowiednią tablicę zadań tworzących pierścień.
Każde z tych zadań powinno mieć dwa wejścia, jedno wyk orzystywane na początk u do
ustalenia jego numeru i drugie do otrzymywania danych do obliczeń. Przek azywane
dane powinny mieć formę rek ordu z dwoma liczbami całk owitymi (początk owa i
ak tualna wartość n). W implementacji zadań wyk orzystać instruk cję select z gałęzią
terminate k ończącą pracę zadania, jeżeli w ciągu 5 sek und nie zostanie wywołane
wejście do przek azywania danych.

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

14 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri

procedure zadanie7 is

type RingTask;

type PRingTask is access RingTask;

task type RingTask is
entry Init(NewIndex: Integer; NewModulo: Integer; NewNextTask: PRingTask);
entry Execute(Start: Integer; Current: Integer);
end;

task body RingTask is
Index : Integer;
Modulo : Integer;
NextTask : PRingTask;
CurrentNumber : Integer;
StartNumber : Integer;
begin
accept Init(NewIndex: Integer; NewModulo: Integer; NewNextTask: PRingTask) do
Index := NewIndex;
Modulo := NewModulo;
NextTask := NewNextTask;
end;

loop
accept Execute(Start: Integer; Current: Integer) do
CurrentNumber := Current;
StartNumber := Start;
end;
if (CurrentNumber = 0) then
Put(StartNumber);
Put(" mod ");
Put(Modulo);
Put(" = ");
Put(Index);
New_Line;
else
CurrentNumber := CurrentNumber - 1;
NextTask.Execute(StartNumber, CurrentNumber);
end if;
end loop;
end;

TaskCount: Positive;
N : Integer;
begin
Put("Podaj liczbe zadan: ");
Get(TaskCount);
declare
TaskArr: array(0..TaskCount-1) of PRingTask;
begin
for i in TaskArr'range loop
TaskArr(i) := new RingTask;
end loop;

for i in 0..TaskCount-2 loop
TaskArr(i).Init(i, TaskCount, TaskArr(i+1));
end loop;
TaskArr(TaskCount-1).Init(TaskCount - 1, TaskCount, TaskArr(0));
loop
Get(N);
TaskArr(0).Execute(N, N);

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

15 z 38

06.01.2009 10:52

background image

Laboratorium 5

Zadanie 8

zadanie8c.adb

Napisz program modelujący ruch wahadłowy na moście. Samochody jadące z północy i
południa muszą przejechać przez most, na k tórym dostępny jest tylk o jeden pas ruchu.
Przez most może odbywać się ruch tylk o w jednym k ierunk u. W ruchu wahadłowym
obowiązują zasady:

Samochód z południa może wjechać na most, gdy nie ma na nim samochodów
jadących z przeciwnego k ierunk u oraz gdy k olejk a samochodów stojących po
północnej stronie mostu jest pusta.
Jeżeli po północnej stronie mostu ustawiła się k olejk a samochodów, to po zjechaniu
ostatniego samochodu z mostu zmienia się k ierunek ruchu. Ostatni samochód
zjeżdżający z mostu umożliwia wjazd na most wszystk im oczek ującym samochodom
z północy.
Analogicznie zachowują się samochody jadące z północy.

Uzasadnić, że przy rozwiązaniu spełniającym powyższe wymagania możliwa jest
blok ada. Poprawić rozwiązanie eliminując blok adę. Następnie zmodyfik ować
rozwiązanie tak , aby spełnione było założenie, iż na moście mieści się co najwyżej N
samochodów. Na k oniec rozbudować rozwiązanie wprowadzając sygnalizację świetlną.
(Każda wersja rozwiązania powinna być w oddzielnym plik u.)

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

16 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri

procedure zadanie8c is

protected type Bridge is
entry Enter1;
entry Enter2;
entry ExitX( CarDirection : Integer);
entry SetDirection( NewDirection : Integer );
private
OnBridge : Integer := 0;
Direction : Integer := 1;
Limit : Integer := 3;
Stop : Boolean := false;
end;

protected body Bridge is
entry SetDirection ( NewDirection : Integer ) when true is
begin
Direction := NewDirection;
Put("Kierunek na moscie zmienia sie na ");
Put(Direction, 0);
New_Line;
Stop:= OnBridge > 0;
end SetDirection;

entry Enter1
when not Stop and OnBridge < Limit and Direction = 1 is
begin
Put("Samochod z kierunku 1 wjezdza na most");
New_Line;
OnBridge:= OnBridge + 1;
Put("Samochodow na moscie: ");
Put(OnBridge);
New_Line;
end Enter1;

entry Enter2
when not Stop and OnBridge < Limit and Direction = 2 is
begin
Put("Samochod z kierunku 2 wjezdza na most");
New_Line;
OnBridge:= OnBridge + 1;
Put("Samochodow na moscie: ");
Put(OnBridge);
New_Line;
end Enter2;

entry ExitX ( CarDirection : Integer ) when true is
begin
Put("Samochod z kierunku ");
Put(CarDirection, 0);
Put(" opuszcza most");
New_Line;
OnBridge:= OnBridge - 1;
Put("Samochodow na moscie: ");
Put(OnBridge);
New_Line;
if OnBridge = 0 then
Stop:=false;
end if;
end ExitX;
end;

b : Bridge;

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

17 z 38

06.01.2009 10:52

background image

Zadanie 9

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

18 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Numerics.Elementary_Functions, Ada.Numeri

procedure zadanie9 is

protected type Book is
entry BeginRead;
entry EndRead;
entry BeginWrite;
entry EndWrite;
private
Reading : Integer := 0;
Writing : Integer := 0;
end;

protected body Book is
entry BeginRead when Writing = 0 is
begin
Reading:= Reading + 1;
Put("Rozpoczecie czytania (");
Put(Reading, 0);
Put(")");
New_Line;
end BeginRead;

entry EndRead
when Reading > 0 is
begin
Reading:= Reading - 1;
Put("Zakonczenie czytania (");
Put(Reading, 0);
Put(")");
New_Line;
end EndRead;

entry BeginWrite when Writing = 0 and Reading = 0 is
begin
Writing:= Writing + 1;
Put("Rozpoczecie zapisu (");
Put(Writing, 0);
Put(")");
New_Line;
end BeginWrite;

entry EndWrite
when Writing > 0 is
begin
Writing:= Writing - 1;
Put("Zakonczenie zapisu (");
Put(Writing, 0);
Put(")");
New_Line;
end EndWrite;

end;

b : Book;

task type Reader is
entry Init(seed : Integer);
end;
task body Reader is
g : Generator;
begin
accept Init(seed : Integer) do
Reset(g, seed);

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

19 z 38

06.01.2009 10:52

background image

Zadanie 10

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

20 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Numerics.Float_Random, Ada.Calendar, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Numerics.Float_Random, Ada.Calendar, Ada.Integer_Text_IO;

procedure zadanie10 is

procedure print(i : integer; j : integer; up_down : String) is
begin
put("Philosopher ");
put(i, 0);
put(", fork ");
put(j, 0);
put(" " & up_down);
New_Line;
end;

protected type Fork is
entry up;
entry down;
private
state : Boolean := False; --False==down
end;

protected body Fork is
entry up when state = False is
begin
state := True;
end;

entry down when state = True is
begin
state := False;
end;
end Fork;

cutlery : array(0 .. 4) of Fork;

task type Philosopher (i : integer);

task body Philosopher is
g : Generator;
begin
reset(g);

loop
delay duration(random(g) * 4.0); --myslenie

cutlery(i).up;
print(i, i, "up");

select
cutlery((i+1) mod 5).up;
print(i, (i+1) mod 5, "up");
delay duration(random(g) * 4.0); --jedzenie
cutlery(i).down;
print(i, i, "down");
cutlery((i+1) mod 5).down;
print(i, (i+1) mod 5, "down");
else
cutlery(i).down;
print(i, i, "down ************");
end select;
end loop;
end;

f0 : Philosopher(0);
f1 : Philosopher(1);

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

21 z 38

06.01.2009 10:52

background image

Laboratorium 6

Zadanie 11

Napisz program sterujący sygnalizacją świetlną dla pojazdów mechanicznych na
sk rzyżowaniu w k ształcie litery T. Zak ładamy, że system wyświetla zielone światło dla
drogi podporządk owanej tylk o wtedy, gdy znajdują się na niej pojazdy. Zak ładamy, że
system jest informowany o pojawieniu się pojazdu na drodze podrzędnej, poprzez
zgłoszenie przerwania. Sterowanie sygnalizacją powinno być realizowane przez
zadanie sporadyczne (zwolnienie zadania następuje w wynik u obsługi przerwania
przez obiek t chroniony), k tóre po zwolnieniu wyświetla jeszcze zielone światło dla
drogi głównej przez 10 s, a następnie włącza zielone światło dla drogi
podporządk owanej (na 10 s - ten mały czas jest związany tylk o z symulacją
k omputerową). Zak ładamy, że jak o stan przejściowy wyświetlane jest przez 1 s światło
żółte (ewentualnie żółte i czerwone jednocześnie).

[2] (http://student.agh.edu.pl/~beholder/lab6/t.adb) main

with TBridge;

procedure t is

begin
null;
end;

[3] (http://student.agh.edu.pl/~beholder/lab6/tbridge.adb) .adb

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

22 z 38

06.01.2009 10:52

background image

with Ada.Text_IO;
use Ada.Text_IO;

package body TBridge is

----------------------------- LIGHT
protected body Light is

procedure ChangeState(i: integer) is
begin
state := i;
end;

end;
----------------------------- SENSOR
protected body Sensor is
procedure Signal is
begin
int := true;
end;

entry Start when int is
begin
int := false;
end;

end;
----------------------------- CONTROL
task body Control is
begin
loop
Put_Line("Czekanie na kogos z podrzednej....");
Sensor.Start;
--czekamy na zmiane
delay 9.0;
--żółte
Put_Line("Zmiana na zolte...");
l1.ChangeState(1);
l2.ChangeState(1);
delay 1.0;
--czerwone
Put_Line("Zmiana glownej na czerwone...");
l1.ChangeState(2);
l2.ChangeState(0);
delay 9.0;
--żółte
Put_Line("Zmiana na zolte...");
l1.ChangeState(1);
l2.ChangeState(1);
delay 1.0;
--zielone
Put_Line("Zmiana glownej na zielone...");
l1.ChangeState(0);
l2.ChangeState(2);
end loop;
end;

begin
l1.ChangeState(0);
l2.ChangeState(2);
end;

[4] (http://student.agh.edu.pl/~beholder/lab6/tbridge.ads) .ads

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

23 z 38

06.01.2009 10:52

background image

with Ada.Interrupts;
use Ada.Interrupts;

package TBridge is
protected type Light is
procedure ChangeState(i: integer);
private
state: integer; --0=zielone, 1=żółte, 2=czerwone
end;

l1, l2 : Light;

protected Sensor is
procedure Signal;
entry Start;
pragma Attach_Handler(Signal,10);

private
int: boolean := false;
end;

task Control;

end;

Zadanie 12

Napisz program sterujący bramk ą wjazdową na zamk nięty park ing. Żądanie
podniesienia rogatk i (przy wjeździe i wyjeździe) jest przek azywane jak o zgłoszenie
przerwania. Zak ładamy, że park ing ma ograniczoną pojemność i~system nie pozwala
na wjazd, gdy nie ma wolnych miejsc (ignorowane są wówczas zgłaszane przerwania -
system nie podnosi rogatk i). Przed wjazdem umieszczona jest tablica (obsługiwana
przez system), na k tórej wyświetlana jest informacja o liczbie dostępnych miejsc. Po
podniesieniu rogatk i system nie opuszcza jej do czasu, gdy nie przejedzie jeden pojazd
(informacja o zak ończeniu przejazdu również jest przek azywana przez zgłoszenie
przerwania).

Rozwiązanie 12

par k ing.ads

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

24 z 38

06.01.2009 10:52

background image

package parking is

protected type Gate is
procedure open;
procedure close;
function isOpened return Boolean;
private
opened : Boolean;
end;

G : Gate;

protected type Sensor is
procedure Signal_Leave;
procedure Signal_Enter;
procedure Signal_CloseGate;

entry Start(Event : out Integer);
pragma Attach_Handler(Signal_Leave, 1);
pragma Attach_Handler(Signal_Enter, 10);
pragma Attach_Handler(Signal_CloseGate, 12);
private
ToLeave : Boolean := false;
ToEnter : Boolean := false;
CloseGate : Boolean := false;
end;

sens : Sensor;

task Sterowanie;
end;

par k ing.adb

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

25 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

package body parking is

protected body Gate is
procedure open is
begin
Put_Line("Brama wjazdowa zostaje otwarta");
opened := true;
end;

procedure close is
begin
Put_Line("Brama wjazdowa zostaje zamknieta");
opened := false;
end;

function isOpened return Boolean is
begin
return opened;
end;
end;

protected body Sensor is
procedure Signal_Leave is
begin
Put_Line("Signal_Leave()");
ToLeave := true;
end;

procedure Signal_Enter is
begin
Put_Line("Signal_Enter()");
ToEnter := true;
end;

procedure Signal_CloseGate is
begin
Put_Line("Signal_CloseGate()");
CloseGate := true;
end;

entry Start(Event : out Integer)
when CloseGate or ToLeave or ToEnter is
begin
if (CloseGate) then
Event := 0;
CloseGate := false;
elsif (ToLeave) then
Event := 1;
ToLeave := false;
elsif (ToEnter) then
Event := 2;
ToEnter := false;
end if;
end;
end;

task body Sterowanie is
Event : Integer;
Cars : Integer := 0;
begin
loop
Put("Liczba zajetych miejsc: ");
Put(Cars, 0);

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

26 z 38

06.01.2009 10:52

background image

zadanie12.adb

with parking;
use parking;

procedure zadanie12 is
begin
null;
end;

Kolokwium 2007 i 2008

Grupa A

Zadanie 1

Napisz specyfik acj˛e i implementacje˛ pak ietu zawieraja˛cego definicje obiek tów
chronionych sensor i o´swietlenie oraz zadania sterowanie. Obiek t sensor reprezentuje
sensor ruchu. Obiek t ten obsługuje przerwanie, k tóre oznacza pojawienie si˛e
ruchomego przedmiotu w obserwowanym terenie. Obiek t os´wietlenie przechowuje
jedynie zmienna˛ logiczna˛ reprezentuja˛ca˛ jego stan oraz udoste˛pnia procedure ˛
ustawStan pozwalaja˛ca˛ na zmiane˛ jego stanu. Os´wietlenie jest wła˛czane i
wyła˛czane przez zadanie sterowanie. Jest to zadanie sporadyczne, zawieszone na
wej´sciu obiek tu sensor. Po jego wyzwoleniu wła˛cza os´wietlenie na 30 sek und.

sensor.ads

package sensor is
protected light is
procedure changeLight(b : boolean);
private
state : boolean := false;
end;

protected sensor is
procedure interrupt;
entry start;
pragma Attach_Handler(interrupt, 10);
private
triged : boolean := false;
end;

task controller;

end;

sensor.adb

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

27 z 38

06.01.2009 10:52

background image

with Ada.Text_IO;
use Ada.Text_IO;

package body Sensor is

protected body light is
procedure changeLight(b : boolean) is
begin
state:=b;
if state then
Put_Line("Oświetlenie włączone");
else
Put_Line("Oświetlenie wyłączone");
end if;
end;
end;

protected body sensor is
procedure interrupt is
begin
triged:=true;
end;
entry start when triged is
begin
triged:=false;
end;
end;

task body controller is
begin

loop
sensor.start;
light.changeLight(true);
delay(30.0);
light.changeLight(false);
end loop;

end;
end;

sensorTest.adb

with sensor;
use sensor;

procedure sensorTest is
begin
null;
end;

Zadanie 2

Napisz program znajduja˛cy minimum macierzy liczb całk owitych (wymiary W x K,
gdzie W i K sa˛ stałymi). W programie nalez˙y zdefiniowac´ typ zadaniowy i
zadek larowac´ W zadan´, z k tórych k az˙de wyznaczy minimum jednego z wierszy
macierzy. Wynik i obliczen´ poszczególnych zadan´ maja˛ zostac´ umieszczone w
jednowymiarowej tablicy minimaCza˛stk owe. Minimalna˛wartos´c´ w tej tablicy
znajduje procedura główna programu. W programie moz˙na pomina˛c´ fragment
dotycza˛cy pobierania danych do wej´sciowej macierzy.

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

28 z 38

06.01.2009 10:52

background image

with Ada.Text_IO, Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;
use Ada.Text_IO, Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;

procedure MinMatrix is
type Data is array(Integer Range<>) of Float;
type DataPtr is access Data;
task type VectorMin is
entry Min(vector : in DataPtr);
entry Finished(min : out Float);
end;
task body VectorMin is
vec : DataPtr;
m : Float;
begin
accept Min(vector : in DataPtr) do
vec:=vector;
end;
m:=vec(vec'First);
for i in vec'Range loop
if vec(i)<m then
m:=vec(i);
end if;
end loop;
accept Finished(min : out Float) do
min:=m;
end;
end;
w : constant Integer := 20;
k : constant Integer := 20;
matrix : array(1..w) of DataPtr;
gen : Generator;
minimaCzastkowe: array(1..w) of Float;
tasks : array(1..w) of VectorMin;
m: Float;
begin
reset(gen);
for i in matrix'Range loop
matrix(i):= new Data(1..k);
for j in matrix(i)'Range loop
matrix(i)(j):=Float(random(gen)) ;
end loop;
end loop;

for i in tasks'Range loop
tasks(i).Min(matrix(i));
end loop;

for i in tasks'Range loop
tasks(i).Finished(minimaCzastkowe(i));
end loop;

m:=minimaCzastkowe(1);
for i in 2 .. minimaCzastkowe'Last loop
if (m<minimaCzastkowe(i)) then
m:=minimaCzastkowe(i);
end if;
end loop;
Put(m);
end;

Grupa B

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

29 z 38

06.01.2009 10:52

background image

Zadanie 1

Napisz specyfik acje˛ i implementacje˛ pak ietu zawieraja˛cego definicje˛ typu
chronionego bramk a, dla programu steruj ˛ acego bramk ˛ a wjazdow ˛ a na
zamk ni˛ety park ing. ˙Za˛danie podniesienia rogatk i jest przek azywane jak o
zgłoszenie przerwania. Po podniesieniu rogatk i system nie opuszcza jej do czasu, gdy
nie przejedzie jeden pojazd (informacja o zak o´nczeniu przejazdu równie˙z jest
przek azywana przez zgłoszenie przerwania). Numery obsługiwanych przerwan´ sa˛
parametrami typu chronionego. Dodatk owo obiek t powinien zawierac´ funk cje˛
opuszczona zwracaja˛ca˛ wartos´c´ logiczna˛ zalez˙na˛ od ak tualnego stanu bramk i.
Napisz program testuja˛cy ten pak iet, w k tórym zadek larowano dwa obiek ty
bramk aWjazd i bramk aWyjazd oraz cyk liczne zadanie k ontrola, k tóre co 10 sek und
odczytuje stan obu bramek i wypisuje odpowiedni k omunik at na k onsoli.

Bramk aPa.ads

with Ada.Interrupts;
use Ada.Interrupts;

package BramkaPa is
protected type bramka(a,b : Interrupt_ID) is
procedure opusc;
procedure podnies;
procedure getState(s : out boolean);
pragma Attach_Handler(opusc,a);
pragma Attach_Handler(podnies,b);
private
state : boolean := false;
end;
end;

Bramk aPa.adb

with Ada.Interrupts;
use Ada.Interrupts;

package body BramkaPa is
protected body bramka is
procedure opusc is
begin
state:=false;
end;
procedure podnies is
begin
state:=true;
end;
procedure getState(s : out boolean) is
begin
s:=state;
end;
end;
end;

bramk aTest.adb

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

30 z 38

06.01.2009 10:52

background image

with Ada.Text_IO,BramkaPa;
use Ada.Text_IO,BramkaPa;

procedure bramkaTest is
type bramkaPtr is access bramka;
task show is
entry start(wja,wyj:bramkaPtr);
end;
task body show is
s : boolean;
wjazd, wyjazd : bramkaPtr;
begin
accept start(wja,wyj:bramkaPtr) do
wjazd:=wja;
wyjazd:=wyj;
end;
loop
Put("Wjazd: ");
wjazd.getState(s);
if s then
Put_Line("Podniesiona");
else
Put_Line("Opuszczona");
end if;
Put("Wyjazd: ");
wyjazd.getState(s);
if s then
Put_Line("Podniesiona");
else
Put_Line("Opuszczona");
end if;
New_Line;
delay(10.0);
end loop;
end;

bramkaWyjazd, bramkaWjazd: bramkaPtr;

begin
bramkaWyjazd := new bramka(10,12);
bramkaWjazd :=new bramka(14,16);
show.start(bramkaWjazd,bramkaWyjazd);
end;

Zadanie 2

Napisz program wyznaczaja˛cy sume˛ dwóch macierzy liczb rzeczywistych (wymiary W
x K, gdzie W i K sa˛ stałymi). W programie nalez˙y zdefiniowac´ typ zadaniowy i
zadek larowac´ K zadan´, z k tórych k az˙de sumuje jedna˛ z k olumn macierzy.
Wynik owa macierz (odpowiednio sformatowana) powinna zostac´ wys´wietlona na
ek ranie przez procedure˛ główna˛.

sumamacierzy.adb

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

31 z 38

06.01.2009 10:52

background image

with Ada.Text_IO,Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;
use Ada.Text_IO,Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;

procedure sumamacierzy is
type Data is array(Integer Range<>) of Float;
type DataPtr is access Data;
task type VectorSum is
entry Sum(vector1, vector2 : DataPtr);
entry Finished(sum : out DataPtr);
end;
task body VectorSum is
vec1,vec2,outvec : DataPtr;
begin
accept Sum(vector1, vector2 :DataPtr) do
outvec:=new Data(vector1'Range);
vec1:=vector1;
vec2:=vector2;
end;
for i in vec1'Range loop
outvec(i):=vec1(i)+vec2(i);
end loop;
accept Finished(sum : out DataPtr) do
sum:=outvec;
end;
end;
w : constant Integer := 20;
k : constant Integer := 10;
macierz1: array(1 .. w) of DataPtr;
macierz2: array(1 .. w) of DataPtr;
wynik : array(1 .. w ) of DataPtr;
gen : Generator;
sumTasks : array(1 .. w) of VectorSum;
begin
for i in macierz1'Range loop
macierz1(i):=new Data(1..k);
macierz2(i):=new Data(1..k);
for j in macierz1(i)'Range loop
macierz1(i)(j):=Float(random(gen))*10.0;
macierz2(i)(j):=Float(random(gen))*10.0;
end loop;
end loop;

for i in sumTasks'Range loop
sumTasks(i).Sum(macierz1(i), macierz2(i));
end loop;

for i in wynik'Range loop
sumTasks(i).Finished(wynik(i));
end loop;
for i in wynik'Range loop
for j in wynik(i)'Range loop
Put(wynik(i)(j),2,2);
end loop;
New_Line;
end loop;

end;

INNA WERSJA: urbanq:=> może założysz k onto na wik i?

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

32 z 38

06.01.2009 10:52

background image

with Ada.Text_IO,Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;
use Ada.Text_IO,Ada.Integer_Text_IO,Ada.Float_Text_IO,Ada.Numerics.Float_Random;

procedure zad2_b is

type Matrix is array(integer range<>,integer range<>) of float;
type MatrixPtr is access Matrix;

procedure initMatrix(A_ptrM : MatrixPtr;A_iRand : integer)is
gen : Generator;
begin
reset(gen,A_iRand);
for i in A_ptrM'range(1)
loop
for j in A_ptrM'range(2)
loop
if A_iRand = 0 then
A_ptrM(i,j) := 0.0;
else
A_ptrM(i,j) := random(gen);
end if;
end loop;
end loop;
end;

procedure printMatrix(ptrM : MatrixPtr)is
begin
for i in ptrM'range(1)
loop
for j in ptrM'range(2)
loop
Put(ptrM(i,j),1,3,0);
if j /= ptrM'last(2) then
Put(" | ");
end if;
end loop;
New_line;
end loop;
end;

task type SumColumn is
entry Start(A_pM1,A_pM2,A_pMR : MatrixPtr;A_iCol : integer);
entry Finished;
end;
task body SumColumn is
pM1,pM2,pMR : MatrixPtr;
iCol : integer;
begin
accept Start(A_pM1,A_pM2,A_pMR : MatrixPtr;A_iCol : integer) do
pM1 := A_pM1;
pM2 := A_pM2;
pMR := A_pMR;
iCol := A_iCol;
end;

for i in pMR'range(1)
loop
pMR(i,iCol) := pM1(i,iCol) + pM2(i,iCol);
end loop;

accept Finished;
end SumColumn;

K : constant integer := 3;
W : constant integer := 4;

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

33 z 38

06.01.2009 10:52

background image

Adds On

Suma macierzy o wartościach zespolonych

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

34 z 38

06.01.2009 10:52

background image

with Ada.Text_IO,Ada.Integer_Text_IO,Ada.Numerics.Float_Random;
use Ada.Text_IO,Ada.Integer_Text_IO,Ada.Numerics.Float_Random;

procedure sumamacierzyzespolonej is
type zespolona is record
re,im: Integer;
end record;
type Data is array(Integer Range<>) of zespolona;
type DataPtr is access Data;
task type SumVector is
entry start(vector1, vector2 : in DataPtr);
entry finished(vector : out DataPtr);
end;
task body SumVector is
vec1 : DataPtr;
vec2 : DataPtr;
begin
accept start(vector1, vector2 : in DataPtr) do
vec1:=vector1;
vec2:=vector2;
end;
for i in vec1'Range loop
vec1(i).re:=vec1(i).re+vec2(i).re;
vec1(i).im:=vec1(i).im+vec2(i).im;
end loop;
accept finished(vector : out DataPtr) do
vector:=vec1;
end;
end;
w : constant Integer := 5;
k : constant Integer := 4;
m1 : array(1 .. w) of DataPtr;
m2 : array(1 .. w) of DataPtr;
suma : array(1 .. w) of DataPtr;
gen : Generator;
tasks : array(1 .. w ) of SumVector;
begin
for i in m1'Range loop
m2(i) := new Data(1 .. k);
m1(i) := new Data(1 .. k);
for j in m1(i)'Range loop
m1(i)(j).re := Integer(Float(random(gen))*1000.0);
m1(i)(j).im := Integer(Float(random(gen))*1000.0);
m2(i)(j).re := Integer(Float(random(gen))*1000.0);
m2(i)(j).im := Integer(Float(random(gen))*1000.0);
end loop;
end loop;

for i in m1'Range loop
tasks(i).start(m1(i),m2(i));
end loop;

for i in suma'Range loop
tasks(i).finished(suma(i));
end loop;
for i in suma'Range loop
for j in suma(i)'Range loop
Put(suma(i)(j).re);Put("+");Put(suma(i)(j).im);Put("j");
end loop;
New_Line;
end loop;

end;

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

35 z 38

06.01.2009 10:52

background image

Skrzyżowanie

Na sk rzyżowaniu w k ształcie litery T znajduje się sensor, k tóry zmienia światło na
zielone dla k ierunk u pionowego tylk o, k iedy na sk rzyżowaniu pojawi się samochód
jadący z k ierunk u pionowego.

cross.ads

package cross is

protected Swiatlo is
procedure zmienSwiatlo(b : boolean);
function getSwiatlo return Boolean;
private
state : boolean;
end;

protected sensor is
procedure triged;
pragma Attach_Handler(triged,10);
entry start;
private
trig : boolean :=false;
end;
task controller;

end;

cross.adb

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

36 z 38

06.01.2009 10:52

background image

with Ada.Text_IO;
use Ada.Text_IO;

package body cross is
protected body sensor is
procedure triged is
begin
trig:=true;
end;
entry start when trig is
begin
trig:=false;
end;
end;
protected body Swiatlo is
procedure zmienSwiatlo(b: boolean) is
begin
state:=b;
end;
function getSwiatlo return boolean is
begin
return state;
end;
end;

task body controller is
begin
loop
sensor.start;
Swiatlo.zmienSwiatlo(true);
if Swiatlo.getSwiatlo then
Put_Line("zielone");
else
Put_Line("czerwone");
end if;
delay(10.0);
Swiatlo.zmienSwiatlo(false);
if Swiatlo.getSwiatlo then
Put_Line("zielone");
else
Put_Line("czerwone");
end if;
end loop;
end;
end;

sk rzyzowanie.adb (najbardziej spek tak ularne ;p)

with Ada.Text_IO,Ada.Interrupts,cross;
use Ada.Text_IO,Ada.Interrupts,cross;

procedure skrzyzowanie is

begin
null;
end;

Źródło: "http://student.agh.edu.pl/~k amik adz/k amik adzeIsBack /k amik adzeWik i
/index.php?title=Programowanie_wsp%C3%B3%C5%82bie%C5%BCne_i_rozproszone"

Kategoria: 5semestr

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

37 z 38

06.01.2009 10:52

background image

Tę stronę ostatnio zmodyfikowano 18:49, 22 sty 2008.

Programowanie współbieżne i rozproszone - Kamik...

http://student.agh.edu.pl/~kamikadz/kamikadzeIsBac...

38 z 38

06.01.2009 10:52


Wyszukiwarka

Podobne podstrony:
ADA wyjatki przerw3
Ada Styk Projekt4
ADA wspolbiezn 24
Ada Opala
FCZ-KT by Ada, Psychologia, testy
APIS-Z by Ada(2), diagnostyka
Ada czy to wypada, Przedszkole 3 latki
Kamikaze Kaito Slayers, KKS 5
Kamikaze Kaito Slayers, KKS 1
Ada Styk Projekt1
ADA wyjatki przerw6
ada polrola
testy z administ odp-Ada[1], UAM administracja, P. Administracyjne, Nowy folder
ada
Ada Styk Projekt3
ada bom 7 (1)
2015 Styk Ada 2rok AW sketching
ADA wspolbiezn 26

więcej podobnych podstron