background image

- 1 - 

 

CZEŚĆ PIERWSZA – POJĘCIA WSTĘPNE 

 

Zadanie 1. 

Które z następujących ciągów znaków są poprawnymi identyfikatorami w Adzie? 

Wyjaśnić ewentualne błędy. 

1Wysokosc 

 

 

- nazwa nie może rozpoczynać się od cyfry

 

Poziom1 

 

 

- ok 

Suma_Sprzedazy 

 

- ok

 

Towar&Data 

 

 

- & znak specjalny

 

Mój@Adres 

 

 

- @ znak specjalny 

Mój_Adres_ 

 

 

- nazwa nie może kończyć się podkreślnikiem 

New 

 

 

 

- słowo zastrzeżone

 

 

Zadanie 2. 

Oblicz wartości reprezentowane przez liczby 

15#E#E+1 

 

 

- 14*15 = 210, całkowita (integer) 

2#0.1#E-5 

 

 

- 2

-1

*2

-5

 = 2

-6

 = 1.56250E-02, rzeczywista (float) 

16#9.99#E2 

 

 

- (9 + 9*1/16 + 9*1/256)*16

= 2457.0, rzeczywista (float) 

i podaj jakiego rodzaju są te liczby (całkowite, czy rzeczywiste). 

 

Zadanie 3. 

Oblicz wartości reprezentowane przez liczby 

15#E#E-1 

 

 

- błąd, wykładnik nie może być liczbą ujemną

 

2#01#E5 

 

 

- 1*2

5

 = 32, całkowita (integer) 

10#9.99#E2 

 

 

- 9.99*10

2

 = 999.0, rzeczywista (float)

 

i podaj jakiego rodzaju s

ą te liczby (całkowite, czy rzeczywiste). 

 

Zadanie 4. 

Oblicz wartości reprezentowane przez liczby 

16#E#E+1 

 

 

- 14*16 = 224 

2#11#E11 

 

 

- (2+1)*2

11

 = 6144 

16#F.FF#E+2   

 

- (15 + 15/16 + 15/16

2

)*16

2

 = 4095.0

 

2#1.1111_1111_111#E11 

- 4095.0

 

 

Zadanie  5. 

Na ile różnych sposobów można zapisać liczbę całkowitą 41? Nie bierzemy pod uwagę podkreślników, 

rozróżnienia między E i e, nieznaczących zer na początku i opcjonalnego + przed wykładnikiem.

 

Odpowiedź: na 32. 

• 

10#41#, 2#101001# - 15 sposobów (15 systemów liczbowych) 

• 

10#41#E+00, 2#101001#E+00 - 15 sposobów (15 systemów liczbowych) 

• 

zapis tradycyjny tj. 41 i 41E+00 – 2 sposoby. 

 

background image

- 2 - 

 

CZĘŚĆ DRUGA – TYPY WYLICZENIOWE 

 

Zadanie 1. 

Dane są deklaracje typów wyliczeniowych i ich podtypów 

type Dzien is (Poniedzialek, Wtorek, Sroda, Czwartek, Piatek, Sobota, Niedziela); 
type Kamien is (Diament, Beryl, Kwarc); 
subtype Dzien_Roboczy is Dzien range Poniedzialek..Piatek; 

Oblicz wartości wyrażeń: 

a) Dzien'Succ(Dzien_Roboczy'Last) 

 

- sobota 

b) Dzien_Roboczy'Succ(Dzien_Roboczy'Last) 

- sobota

  

c) Kamien'Pos(Kwarc) 

 

 

 

- 2 (diament jest na pozycji 0)

 

 

Zadanie 2. Dana jest deklaracja 

type Pan_Mlody is (Druciarz, Krawiec, Zolnierz, Marynarz, Bogacz, Biedak, Zebrak, Zlodziej); 

Mąż  księżniczki  losowany  jest  w  ten  sposób,  że  mamy  ośmiu  kandydatów  reprezentowanych  przez  dane  typu 
Pan_Mlody 

i każdy z nich zjada kawałek dużego tortu. Napisać wyrażenie, które określi pana młodego, który zjadł 

N

-

ty kawałek tortu. Obliczyć wynik dla N = 10. 

Odpowiedź: 

Put(Pan_Mlody'Image(Pan_Mlody'Val((N - 1) mod 8))); 

Dla N = 10 mamy KRAWIEC. 

 

Zadanie 3. Niech zmienna D b

ędzie typu 

type Dzien is (Poniedzialek, Wtorek, Sroda, Czwartek, Piatek, Sobota, Niedziela); 

i niech jej warto

ść będzie równa pierwszemu dniu miesiąca. Napisz instrukcję przypisania (podstawienia), która zmieni 

warto

ść tej zmiennej na wartość odpowiadającą N-temu dniu miesiąca. Obliczyć wartość D, jeżeli przed wykonaniem 

tej instrukcji D = Wtorek i N = 25

Odpowiedź: 

D := Dzien'Val((N – 1 + Dzien'Pos(D)) mod 7); 

Dla WTOREK i N=25 mamy PIATEK. 

 

Zadanie 4. Osiem kierunków kompasowych mo

żna reprezentować typem wyliczeniowym 

type Wind is (North, North_East, East, South_East, South, South_West, West, North_West); 

Napisa

ć funkcje logiczne Przeciwne i Prostopadle określające czy dwa dane kierunki wiatru są odpowiednio 

przeciwne i prostopadłe. 

Odpowiedź: 

FUNCTION PRZECIWNE (Wiatr_1, Wiatr_2: IN Wind) RETURN Boolean IS 

BEGIN 

   IF  (Wind'Pos(Wiatr_1) – Wind'Pos(Wiatr_2)) mod 8 = 4 THEN 

      RETURN TRUE; 

   ELSE 

      RETURN False; 

   END IF; 

END PRZECIWNE; 

 

FUNCTION PROSTOPADLE (Wiatr_1, Wiatr_2: IN Wind) RETURN Boolean IS 

BEGIN 

   IF (Wind'Pos(Wiatr_1) – Wind'Pos(Wiatr_2)) mod 4 = 2 THEN 

      RETURN TRUE; 

   ELSE 

      RETURN False; 

   END IF; 

END PROSTOPADLE; 

 

background image

- 3 - 

 

Zadanie  5.  Przypu

śćmy,  że ogrodnik kopie w zimie, sadzi na wiosnę, pielęgnuje w lecie i  zbiera jesienią. Napisz 

instrukcj

ę wyboru (case) w celu wywołania odpowiednich podprogramów: Kop, Sadz, Pielegnuj, Zbieraj w 

zale

żności od tego jaki jest aktualny miesiąc. Użyj następujących deklaracji: 

type Nazwa_Miesiaca is (Styczen, Luty, Marzec, Kwiecien, Maj, Czerwiec, Lipiec, Sierpien, Wrzesien, 
Pazdziernik, Listopad, Grudzien); 
Miesiac : Nazwa_Miesiaca; 

Przyjmuj

ąc,  że zimę  tworzą  miesiące  Styczen,  Luty  i  Marzec  zadeklaruj podtypy Zima,  Wiosna,  Lato  i 

Jesien 

typu Nazwa_Miesiaca i wykorzystaj te deklaracje do realizacji 

instrukcji wyboru działa_ ogrodnika. W 

przypadku, gdy zima zaczyna si

ę w grudniu i kończy w lutym nie można zadeklarować podtypu Zima. Jak postąpić w 

takim przypadku? 

Pozostałe podtypy należy zadeklarować i wykorzystać. 

Odpowiedź: 

SUBTYPE Zima IS Nazwa_Miesiaca RANGE Styczen..Marzec; 

SUBTYPE Wiosna IS Nazwa_Miesiaca RANGE Kwiecien..Czerwiec; 

SUBTYPE Lato IS Nazwa_Miesiaca RANGE Lipiec..Wrzesien; 

SUBTYPE Jesien IS Nazwa_Miesiaca RANGE Pazdziernik..Grudzien; 

 

CASE Miesiac IS 

   WHEN Zima'RANGE => KOP; 

   WHEN Wiosna'RANGE  => SADZ; 

   WHEN Lato'RANGE  => PIELEGNUJ; 

   WHEN Jesien'RANGE => ZBIERAJ; 

END CASE; 

 

W drugim przypadku mamy: 

 

SUBTYPE Wiosna IS Nazwa_Miesiaca RANGE Marzec..Maj; 

SUBTYPE Lato IS Nazwa_Miesiaca RANGE  Czerwiec..Sierpien; 

SUBTYPE Jesien IS Nazwa_Miesiaca RANGE Wrzesien..Listopad; 

 

CASE Miesiac IS 

   WHEN Wiosna'RANGE  => SADZ; 

   WHEN Lato'RANGE  => PIELEGNUJ; 

   WHEN Jesien'RANGE => ZBIERAJ; 

   WHEN OTHERS => KOP; 

END CASE; 

 

background image

- 4 - 

 

CZĘŚĆ TRZECIA – STAŁE I ZMIENNE 

 

Zadanie 1. 
Zadeklarowa

ć stałą Pi o wartości 3.14159. 

Odpowiedź:  

Pi: CONSTANT Float := 3.14159; 

 

Zadanie 2. Które z poni

ższych konstrukcji są poprawne? Przyjąć, że wszystkie zmienne są typu całkowitego. Wyjaśnić błędy 

w niepoprawnych konstrukcjach. 

a) X*Y := C   

 

- działanie niedozwolone w części przypisowej, brak średnika

 

b) Y := Con;  

 

- ok 

c) X : 

constant Integer; 

- brak konkretnej wartości stałej

 

d) X : integer; 

 

- ok 

e) A := B 

rem C; 

 

- ok 

 

Zadanie 3. 

Napisz deklaracje stałych Dziesiec i Sto typu Float. 

Odpowiedź: 

Dziesiec: CONSTANT Float := 10.0; 

Sto: CONSTANT Float := 100.0; 

 

Zadanie 4. Czy poprawne s

ą deklaracje 

Zero : 

constant := 0.0; 

Jeden : 

constant := 1.0; 

Odpowiedź: Tak, kompilator automatycznie skojarzy typ Float. 

 

Zadanie 5. Poda

ć jakie błędy są w następujących deklaracjach 

a) var i ; Integer; 

 

 

- błędna nazwa, średnik zamiast dwukropka

 

b) G : 

constant := 9.81 

 

 

- brak średnika

 

c) P, Q : 

constant Integer; 

 

 

- brak konkretnej wartości stałej

 

d) P := Q := 7; 

 

 

 

- niedozwolony sposób przypisania

 

e) MN : 

constant Integer := M + N; 

- MN nie będzie stałą, jeśli M i N są zmiennymi

 

f) 2Pi : 

constant := 2.0*Pi; 

 

- błędna nazwa, cyfra na początku 

background image

- 5 - 

 

CZĘŚĆ CZWARTA – TYPY STANDARDOWE 

 

Zadanie 1. Chcemy 

napisać wyrażenie obliczające iloraz 9 i 5. Jakie będzie to wyrażenie, jeżeli iloraz ma być liczbą 

całkowitą i jakie ma być wyrażenie, gdy iloraz ma być liczbą rzeczywistą? 

Odpowiedz:  W pierwszym i drugim wypadku  będzie  to  9/5.  Dla  iloraz  zmiennych typu Integer 

będzie także typu Integer (bliższy zeru). 

 

Zadanie 2. 

Oblicz wartości wyrażeń: 

a) 10.0/3.0 + 5.0*2.0 

- 1.33333E+01 (40/3) 

b) 10 

rem 3 + 5 rem 

- 2 

c) 10/3 + 5/2 

 

- 5 

d) 12.5 + (2.5/(6.2/3)) 

- błąd, nie można mieszać typów

 

e) –4*(-5 + 6) 

 

- -4 

f) 13 

rem 5/3 

 

- 0

 

g) (10/3 

rem 2)/3   

- 0 (wynik ilorazu liczb typu Integer zawsze bliższy zeru)

 

h) 5.0 

rem 3.0 

 

- błąd, operator rem działa na liczbach typu Integer 

 

Zadanie 3. Dane s

ą deklaracje 

X : Integer := 4; 
Y : Integer := 17; 
Z : Float := 2.6; 

Oblicz warto

ści następujących wyrażeń: 

a) X/Y 

 

 

 

- 0

 

b) 1.0/Float(X) + 2.0 

- 2.25 

c) Z*Float(Y) 

 

- 44.2 

d) X + Y 

rem 

 

- 5 (rem ma pierwszeństwo przed dodawaniem i odejmowaniem)

 

e) 14/15*2 

 

 

- 0 

f) 2*X + Y – X 

 

- 21 

g) X/2 

 

 

 

- 2 

h) 2*3 –1 

rem 

 

- 5 (mnożenie i dzielenie ma pierwszeństwo przed rem) 

i) X 

rem Y/X. 

 

- 1 

 

Zadanie 4. Dane s

ą deklaracje 

K, L : Integer 

range 1..10; 

M : Integer 

range 1..20; 

Która z podanych instrukcji podstawienia mo

że spowodować zgłoszenie wyjątku Constraint_Error? 

a) M := K; 
b) K := L; 

c)

 L := M; 

- tutaj

 

 

Zadanie 5.  

Zadanie_04_5 _04_5.. .. Zapisz następujące wyrażenie matematyczne w Adzie:  

a)  okres drgań wahadła,  

b) masa relatywistyczna cząstki o masie spoczynkowej m0 

c)wzór Stirlinga aproksymujący wartość n ! dla n ∈ P .  

Wszystkie zmienne są typu Float z wyjątkiem n w punkcie c), gdzie n ∈ P . Przyjmij też,  

że funkcja Sqrt obliczająca wartość pierwiastka kwadratowego jest dostępna, liczby π  i 

e są reprezentowane przez stałe 

Pi : constant Float := 3.14159;  

E : constant Float := 2.71828; 

Rozwiązanie: 

a)  Pi: constant Float :=3.14159; 

Okres_drgan_wachadla: Float; 

l,g: Float; 

Okres_drgan_wachadla:=2*Pi*sqrt(l/g); 

b)  Masa_relatywistyczna: Float; 

m0: Float; 

v,c: Float; 

background image

- 6 - 

 

Masa_relatywistyczna:=m0/(sqrt(1-(v/c)**2.0)); 

c)  Pi: constant Float:= 3.14159 

E: constant Float:=2.71828; 

N: Integer; 

Wzór_Stirlinga: Float; 

Wzór_Stirlinga:=sqrt(2.0*Pi*Float(N))*(Float(N)**Float(N))*(E**Float(-N)); 

 

Zadanie  6.  Niech  A, B : Boolean. Oblicz warto

ści wyrażenia 

or not 

dla wszystkich mo

żliwych wartości 

zmiennych A,B. 

Wskazówka: ‘not’ ma pierwszeństwo. 

Rozwiązanie: 

A,B: Boolean; 

• 

Dla : 

A: constant Boolean:=TRUE; 

B: constant Boolean:=FALSE; 

A or not B; 

Return TRUE; 

• 

Dla: 

A: constant Boolean:=TRUE; 

B: constant Boolean:=TRUE; 

A or not B; 

Return TRUE; 

• 

Dla: 

A: constant Boolean:=FALSE; 

B: constant Boolean:=TRUE; 

A or not B; 

Return FALSE; 

• 

Dla: 

A: constant Boolean:=FALSE; 

B: constant Boolean:=FALSE; 

A or not B; 

Return TRUE; 

 

Zadanie 7. 

Napisz deklaracje stałych Prawda i Falsz, które mają odpowiednio wartości True i False. Wyznacz 

nast

ępnie wartości wyrażeń: 

a) Prawda 

and Falsz and Prawda,   

 

- False

 

b) 

not Prawda or Prawda, 

 

 

 

- True

 

c) (Falsz = Falsz) = (Falsz = Falsz), 

 

- True

 

d) Prawda < Prawda < Prawda < Prawda. 

 

- False

 

Odpowiedź: 

Prawda: Boolean := True; 

Falsz: Boolean := False; 

background image

- 7 - 

 

CZĘŚĆ PIĄTA – INSTRUKCJE 

 

Zadanie 1. Zmień podaną instrukcję tak, aby była bardziej efektywna 

X, Y : Integer; 

-- To jest deklaracja 

.. 
if (X > (Y + 10)) and (X /= Y) then 
.. 

Przyjąć, że przed wykonaniem tej instrukcji zmiennym X,Y nadano jakieś wartości. 
Odpowiedź: Wystarczy skreślić „and (X /= Y)”. 

… 

IF X > Y + 10 THEN 

… 

 

Zadanie 2. Niech 

Poziom : Natural; 

.. –- 

Obliczamy Poziom 

if Poziom < 100 then 
Put (Item => "Poziom niski"); 
elsif Poziom < 200 then 
Put (Item => "Poziom sredni"); 
elsif Poziom < 300 then 
Put (Item => "Poziom wysoki"); 
else 
Put (Item => "Alarm"); 
end if

Zamień podaną instrukcję warunkową na równoważną instrukcję wyboru. 
Odpowiedź: 

CASE Poziom IS  

   WHEN 0..99 => Put("Poziom niski"); 

   WHEN 100..199=> Put("Poziom sredni"); 

   WHEN 200..299 => Put("Poziom wysoki"); 

   WHEN OTHERS => Put("Alarm"); 

END CASE; 

 

Zadanie 3. Następującą instrukcję warunkową zastąp przez równoważną instrukcję wyboru 

Ilosc_Punktow : Natural 

range 1..100; 

.. –- 

Obliczamy Ilosc_Punktow 

if Ilosc_Punktow < 50 then 
Put (Item => " dwa "); 
elsif Ilosc_Punktow < 66 then 
Put (Item => " trzy "); 
elsif Ilosc_Punktow < 91 then 
Put (Item => " cztery "); 
else 
Put (Item => " piec "); 
end if; 

Odpowiedź: 

CASE Ilosc_Punktow IS 

   WHEN 1..49 => Put("dwa"); 

   WHEN 50..65=>Put("trzy"); 

   WHEN 66..90 =>Put("cztery"); 

   WHEN 91..100 =>Put("piec"); 

END CASE; 

 

Zadanie 4. Niech 

Poziom : Natural; 

.. –- 

Obliczamy Poziom 

Który z poniższych zapisów jest poprawny? 

background image

- 8 - 

 

a)-„brak warunku” 

if Poziom < 100 then 
Put (Item => "Poziom niski"); 
elsif Poziom < 200 then 
Put (Item => "Poziom sredni"); 
elsif 
Put (Item => "Poziom wysoki"); 
end if

b)-

„zbędny warunek” 

if Poziom < 100 then 
Put (Item => "Poziom niski"); 
else Poziom < 200 then 
Put (Item => "Poziom sredni"); 
elsif Poziom < 300 then 
Put (Item => "Poziom wysoki"); 
end if

c) - poprawny 

if Poziom < 100 then 
Put (Item => "Poziom niski"); 
elsif Poziom < 200 then 
Put (Item => "Poziom sredni"); 
else 
Put (Item => "Poziom wysoki"); 
end if

 

Zadanie 5. Napisz instrukcję warunkową, równoważną z podaną instrukcją wyboru 

case X > Y is 
when 
True => Ada.Text_IO.Put (Item => "X jest wieksze"); 
when False => Ada.Text_IO.Put (Item => "Y jest nie mniejsze"); 
end case

Jakiego typu jest selektor w tej instrukcji? 
Odpowiedź: 

IF X > Y THEN 

   Put(Item => "X jest wieksze"); 

ELSE 

   Put(Item => "Y jest niemniejsze"); 

END IF; 

Selektor jest typu Boolean. 

 

Zadanie 6. Zmienić instrukcję pętli for na równoważną instrukcję pętli while 

for Licznik in 1..10 loop 
Put ("Licznik petli = "); 
Put (Licznik); 
end loop

Odpowiedź: 

Licznik := 1; 

WHILE Licznik <= 10 LOOP 

   Put("Licznik petli = "); 

   Put(Licznik); 

   Licznik := Licznik + 1; 

END LOOP;

 

 

Zadanie 7. Ile razy zostanie wykonany ci

ąg instrukcji Ciag_Instrukcji w pętli? 

for Licznik in 3..3 loop 
Ciag_Instrukcji; 
end loop

Odpowiedź: Tylko raz. 

 

Zadanie 8. Poniżej podano instrukcję pętli while, która oblicza i wypisuje kolejne potęgi liczby 2 z przedziału 1..10000. 

Potega := 1; 
while Potega < 10000 loop 
Ada.Integer_Text_IO.Put (Item => Potega, Width => 5); 
Potega := Potega * 2; 
end loop

Zamień tę instrukcję na równoważną pętlę ogólną z warunkiem wyjścia w postaci testu początkowego. 
Odpowiedź: 

Potega := 1; 

LOOP 

   EXIT WHEN Potega >= 10000; 

   Ada.Integer_Text_IO.Put(Item => Potega, Width => 5); 

   Potega := Potega * 2; 

END LOOP; 

 

background image

- 9 - 

 

Zadanie 9.  Poniżej podano instrukcję  pętli  loop  z  testem  początkowym,  która  oblicza  i  wypisuje  kolejne  potęgi  liczby  2  z 
przedziału 1..10000. 

Potega := 1; 
exit when Potega >= 10000; 
Ada.Integer_Text_IO.Put (Item => Potega, Width => 5); 
Potega := Potega * 2; 
end loop

Zamieć tę instrukcję na równoważną pętlę while
Odpowiedź: 

Potega := 1; 

WHILE Potega < 10000 LOOP 

Ada.Integer_Text_IO.Put (Item => Potega, Width => 5); 

Potega := Potega * 2; 

END LOOP; 

 

Zadanie 10. Jakie wartości wypiszą instrukcje? 

for Licznik in 1..5 loop 
Ada.Integer_Text_IO.Put (Item => Licznik, Width => 5); 
end loop
Ada.Integer_Text_IO.Put (Item => Licznik, Width => 5); 

Odpowiedź: Nic nie wypisze – nie zajdzie kompilacja. Brak odpowiedniej deklaracji. 
 
Zadanie 11. 
Jakie wartości wypiszą instrukcje? 

Licznik: Integer; 
.. 
Licznik := 1; 
for Licznik in 1..5 loop 
Ada.Integer_Text_IO.Put(Item => Licznik, Width => 5); 
end loop
Ada.Integer_Text_IO.Put(Item => Licznik, Width => 5); 

Odpowiedź: 1, 2, 3, 4, 5, 1. 

 

Zadanie12 Niech będą dane dwie zmienne A, B typu Integer.   

1. Napisać ciąg instrukcji zamieniający wartości tych zmiennych. Można zadeklarować  

zmienne pomocnicze.  

2.  Napisać  ciąg  instrukcji  zamieniający  wartości  tych    zmiennych.  Nie  można  deklarować 

zmiennych pomocniczych.  

Oceń  jakość  obydwu  algorytmów  wymiany  biorąc  pod  uwagę  liczbę  i  złożoność  wykonywanych 

operacji oraz możliwość przeniesienia tych algorytmów na inne typy danych. 

 

Rozwiązanie: (brak) 

 

 

background image

- 10 - 

 

CZĘŚĆ SZÓSTA – PODPROGRAMY 

 

Zadanie  1.  Napisz  funkcję  Nie_Parzysta  przyjmującą  wartości  True  albo  False  w  zależności  od  tego,  czy  jej 
argument (parametr) typu całkowitego jest odpowiednio liczbą nieparzystą albo parzystą. Oto przykład wykorzystania tej 
funkcji. 

Liczba : Integer 

range -99..99; 

.. 
Put ("Liczba "); 
Put (Liczba, 3); 
if Nie_Parzysta (Liczba) then 
Put (" jest nieparzysta"); 
else 
Put (" jest parzysta"); 
end if

Zamień  tę  funkcję  na  równoważną  procedurę  Sprawdz_Czy_Nie_Parzysta  oraz  ewentualnie  zmień  deklaracje i 
podany ciąg instrukcji tak, że użytkownik nie zauważy zastąpienia funkcji przez procedurę. 
Odpowiedź: 

FUNCTION Nie_Parzysta (Liczba: IN Integer) RETURN Boolean IS 

BEGIN 

   IF Liczba mod 2 = 0  THEN 

      RETURN False; 

   ELSE 

      RETURN True; 

   END IF; 

END Nie_Parzysta; 

 

PROCEDURE Sprawdz_Czy_Nie_Parzysta (Liczba: IN Integer; Logiczna: OUT Boolean) IS 

BEGIN 

   IF Liczba mod 2 = 0 THEN 

      Logiczna := False; 

   ELSE 

      Logiczna := True; 

   END IF; 

END Sprawdz_Czy_Nie_Parzysta; 

 

Liczba: Integer RANGE -99..99; 

Logiczna: Boolean; 

... 

Put("Liczba "); 

Put(Liczba, 3); 

Sprawdz_Czy_Nie_Parzysta(Liczba, Logiczna);

 

 

Zadanie 2. Napisać funkcję Suma_Kwadratow obliczającą iteracyjnie sumę kwadratów pierwszych N liczb całkowitych 
dodatnich. 
Odpowiedź: 

FUNCTION Suma_Kwadratów (N: IN Positive) RETURN Natural IS 

   Suma: Natural := 0; 

   Licznik: Positive := 1; 

BEGIN 

   WHILE Licznik <= N LOOP 

      Suma := Suma + Licznik**2; 

      Licznik := Licznik + 1; 

   END LOOP; 

   RETURN Suma; 

END Suma_Kwadratów; 

background image

- 11 - 

 

 
Zadanie 3A. Napisz funkcję Lucas obliczającą N-ty wyraz ciągu Lucasa określonego wzorem 
L

1

 =

 1, L

2

 =

 3, L

n

 = 

L

n-1 

L

n-2

, N

 

>

 

2. 

Odpowiedź: 

FUNCTION Lucas (N : IN Positive) RETURN Natural IS 

   N_2: Positive := 1; 

   N_1: Positive := 3; 

   N_ty: Natural := 0; 

   Licznik: Positive := 3; 

BEGIN 

   CASE N IS 

      WHEN 1 => N_ty := 1; 

      WHEN 2 => N_ty := 3; 

      WHEN OTHERS => 

         WHILE Licznik <= N LOOP 

            N_ty := N_2 + N_1; 

            N_2 := N_1; 

            N_1 := N_ty; 

            Licznik := Licznik + 1; 

         END LOOP; 

   END CASE; 

   RETURN N_ty; 

END Lucas;

 

 

Zadanie 3B. Mając dany nagłówek funkcji Lucas 
function Lucas (N : in Positive) return Positive; 
i fragment programu wypisujący pierwszych Ile_Wyrazow : Positive; tego ciągu 

for Licznik in 1..Ile_Wyrazow loop 
Put (Licznik); 
Set_Col(20); 
Put (Lucas(Licznik)); 
New_Line; 
end loop

napisz nagłówek równoważnej procedury Oblicz_Lucasa i zmień podany fragment programu tak, że użytkownik nie 
zauważy zmiany funkcji na procedurę oraz zmiany pętli for na pętlę while. Zadeklaruj odpowiednie zmienne, jeżeli jest to 
potrzebne. 

Odpowiedź: 

N_ty_Wyraz: Positive; 

Licznik: Positive := 1; 

PROCEDURE Oblicz_Lucasa (N: IN Positive; N_ty_Wyraz: IN OUT Positive) IS 

… 

WHILE Licznik <= Ile_Wyrazow LOOP 

Put (Licznik); 

Set_Col(20); 

Oblicz_Lucasa(Licznik, N_ty_Wyraz); 

New_Line; 

Licznik := Licznik + 1; 

END LOOP; 

 

Zadanie 4. 

Niech  A oznacza liczbę całkowitą i niech  N oznacza liczbę naturalną  

(całkowitą nieujemną).   

1. Napisać funkcję Potega_Iteracyjnie realizującą iteracyjny algorytm wyznaczający  N - tą potęgę liczby  A. 

Należy podać dwie wersje algorytmu stosujące pętlę  

while. Wskazówka. Potęgę obliczamy przez powtarzając operację mnożenia.  

2. Rozwiązanie punktu 1 podać przy wykorzystaniu pętli forfor for.  

background image

- 12 - 

 

3. Napisać funkcję  Potega_Iteracyjnie_Opt realizującą iteracyjny algorytm  

wyznaczający N - tą potęgę liczby A, przy czym algorytm ten musi być bardziej efektywny od algorytmów z 

poprzednich punktów. Wskazówka. Potęgę obliczamy przez  

powtarzając operację mnożenia. W każdej iteracji liczba czynników jest parzysta,  

albo nieparzysta. 

Rozwiązanie:  

N-ty_wyraz: 

positive; 

licznik:positive:=1; 
procedure 

on;icz_lucasa(N:positive,N_ty_wyraz: 

in 

out 

positive) 

is 

..... 
while 

licznik<=Ile_wyrazow 

loop 

put(licznik); 
Set_Col(20); 
oblicz_lucasa(licznik,N_ty_wyraz); 
licznik:=licznik+1; 
end loop;

 

 

Zadanie 5. 
a) Napisać funkcję Znak wyznaczającą znak argumentu typu Float tzn. znak +, jeżeli argument jest większy od zera, 
znak – jeżeli argument jest mniejszy od zera i znak zero jeżeli argument jest zerem. 
b) Zamienić  funkcję  Znak  na  równoważną  procedurę  Wyznacz_Znak  i  zmienić  ewentualnie  podane deklaracje i 
instrukcje tak, że użytkownik nie zauważy zamiany podprogramów. 
Zwróć uwagę na kolejność deklaracji. 

function Znak (Argument : in Float ) return Character is 

.. 

end Znak; 

.. 

Plus : 

constant Character := '+'; 

Minus : 

constant Character := '-'; 

Zero : 

constant Character := '0'; 

Liczba : Float; 

.. 

begin 
Read (Liczba); 
Ada.Text_Io.New_Line; 
if Znak (Liczba) = Zero then 
Ada.Text_Io.Put (Zero); 
elsif Znak (Liczba) = Plus then 
Ada.Text_Io.Put (Plus); 
else 
Ada.Text_Io.Put (Minus); 
end if
end Test_Znak;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

background image

- 13 - 

 

Odpowiedź: 

A) 

FUNCTION Znak (Argument: IN Float) RETURN 

Character IS 

   Signum: Character; 

BEGIN 

   IF Argument = 0.0 THEN 

      Signum := '0'; 

   ELSIF 

      Argument > 0.0 THEN 

      Signum := '+'; 

   ELSE 

      Signum := '–'; 

   END IF; 

   RETURN Signum; 

END Znak; 

 

 

 

 

 

 

 

 

B) 

PROCEDURE Wyznacz_Znak (Argument: IN Float) 

IS 

   Plus: CONSTANT Character := '+'; 

   Minus: CONSTANT Character := '-'; 

   Zero: CONSTANT Character := '0'; 

BEGIN 

   IF Argument = 0.0 THEN 

      Put(Zero); 

   ELSIF 

      Argument > 0.0 THEN 

      Put(Plus); 

   ELSE 

      Put(Minus); 

   END IF; 

END Wyznacz_Znak; 

… 

Liczba: Float; 

… 

BEGIN 

Get(Liczba); 

Wyznacz_Znak(Liczba); 

END;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

background image

- 14 - 

 

CZĘŚĆ SIÓDMA – TABLICE JEDNOWYMIAROWE 

 

Zadanie  1.  Zdefiniować  typ  tablicowy  Quiz_Array,  którego  wartościami  są  tablice  12  elementów  typu  logicznego 
indeksowanych przez liczby całkowite od 21 do 32. Zadeklarować odpowiedni typ Index. Zdefiniować zbiór J wartości typu 
indeksów i zbiór A wartości elementów tablicy A: Quiz_Array. 
Odpowiedź: 

Index: Integer range 21..32; 

TYPE Quiz_Array IS ARRAY (Index) OF Boolean; 

J = {21, 22,…, 31, 32} 

A = {True, False} 

 

Zadanie 2. Jeżeli w pewnej tablicy mamy umieścić liczbę prawidłowych odpowiedzi udzielonych przez studentów na każde 
z  20  pytań  testu,  to  jakie  typy  danych  powinny  być  zadeklarowane  jako  typ  indeksu  (Index)  i  składowych  tablicy 
(Component)? Przyjąć, że grupa studentów ma 50 osób i zadeklarować odpowiedni typ tablicowy (Test_Results) i zmienną 
Res tego typu. Co oznacza, Res(10) = 5? 
Odpowiedź: 

SUBTYPE Index IS Integer RANGE 1..20; 

SUBTYPE Component IS Integer RANGE 0..50; 

TYPE Test_Results IS ARRAY (Index) OF Component; 

Res: Test_Results; 

Res(10) = 5 oznacza, że na dziesiąte pytanie odpowiedziało dobrze pięciu studentów.

 

 

Zadanie 3. Dane są deklaracje 

Max_Size : 

constant := 30; 

subtype Index_Range is Integer range 1..Max_Size; 
type Name_String is array (Index_Range) of Character; 
.. 
First_Name : Name_String; 

Napisa

ć  instrukcję  podstawienia,  która  pierwszej  składowej  tablicy  First_Name  przypisuje  wartość  'A'.  Wywołać 

procedurę Put z odpowiedniego pakietu bibliotecznego (zastosować mechanizm kwalifikacji) tak, że wypisze ona wartość 
14

-tej składowej tablicy First_Name. 

Odpowiedź: 

First_Name(First_Name'First) := 'A'; 

Ada.Text_Io.Put(First_Name(14));

 

 

Zadanie 4. Niech będzie dana deklaracja 

type Tablica_Napisow_4D is array (Positive range <>) of String (1..4); 

Przypuśćmy, że w gospodarstwie są Kura, Pies, Koza i Owca. Zadeklaruj zmienną Zwierzeta podanego typu i 
nadaj jej wartość w postaci napisów z nazwami wymienionych zwierząt. Napisz instrukcję zmieniającą Psa w Biesa. 
Odpowiedź: 

Zwierzeta: Tablica_Napisow_4D := ("Kura", "Pies", "Koza", "Owca"); 

Zwierzeta(2) := "Bies"; 

Dla innej kolejności zwierząt w tablicy można przypisanie uogólnić np. w następujący sposób: 

FOR I IN Zwierzet'RANGE LOOP 

IF Zwierzeta(I) = "Pies" THEN Zwierzeta(I) := "Bies"; 

END IF; 

END LOOP; 

 

Zadanie5:

 

Dany jest typ tablicowy  

type Integer_Array is array (Integer range <>) of Integer;  

Napisać podprogram, który nadaje wartość  0 wszystkim elementom tablicy  T typu  

Integer_Array. Należy użyć pętli while i atrybutów tablic jednowymiarowych.  

Rozwiązanie (brak) 

 

background image

- 15 - 

 

 

Zadanie6: 

Dany jest typ tablicowy  

type Integer_Array is array (Integer range <>) of Integer;  

Napisać funkcję, który oblicza liczbę zerowych elementów w danej tablicy  T typu  

Integer_Array. Należy stosować atrybuty tablic jednowymiarowych. 

Rozwiązanie (brak) 

 

 

Zadanie7: 

Dany jest typ tablicowy  
type Integer_Array is array (Integer range <>) of Integer;  
Napisać podprogram znajdujący w danej tablicy T typu Integer_Array indeks i wartość największego elementu tej tablicy. 
Należy zastosować atrybuty tablic jednowymiarowych i pętlę while. 

Rozwiązanie (brak) 

 
 

Zadanie8: 

Dany jest typ tablicowy  
type Integer_Array is array (Integer range <>) of Integer;  
Niech T będzie tablicą typu Integer_Array uporządkowaną wg porządku rosnącego.  
Napisać funkcję wyznaczającą liczbę różnych elementów tej tablicy. Przyjąć, że jeżeli  
wszystkie elementy są równe, to liczba różnych elementów jest równa 1. Należy zastosować atrybuty tablic 
jednowymiarowych. 

Rozwiązanie (brak) 

background image

- 16 - 

 

CZĘŚĆ ÓSMA – TABLICE WIELOWYMIAROWE 

 

Zadanie  1.  Napisz  funkcję  Iloczyn_Diadyczny  obliczającą  iloczyn  zewnętrzny  dwóch  wektorów.  Iloczyn  ten 
określamy następująco: iloczyn zewnętrzny C dwóch wektorów A,B jest macierzą prostokątną, której elementy dane są 
wzorem: C

ij

 

= A

i

 

* B

j

, i,j 

= 1,..,n

Przyjmij, 

że 

type Wektor is array (Integer range <>) of Float; 
type Macierz is array (Integer range <>, Integer range <>) of Float; 

Odpowiedź: 

FUNCTION Iloczyn_Diadyczny (X, Y : Wektor) RETURN Macierz IS 

   XY: Macierz (1..X'Length, 1..Y'Length); 

BEGIN 

   FOR I IN X'RANGE LOOP 

      FOR J IN Y'RANGE LOOP 

         XY(I,J) := X(I) * Y(J); 

      END LOOP; 

END LOOP; 

   RETURN XY; 

END Iloczyn_Diadyczny; 

 

Zadanie 2. Mając daną deklaracj

ę 

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

napisz  funkcję  Create_Unit_Matrix,  której  parametrem  formalnym  jest  wymiar  macierzy  jednostkowej  N x  N  o 
elementach  rzeczywistych.  Użyj  tej  funkcji  do  deklaracji  stałej  tablicowej  Unit_Matrix_N  zawierającej  macierz 
jednostkową N x N. 
Odpowiedź: ??? 

FUNCTION Create_Unit_Matrix (N: IN Positive) RETURN Matrix IS 

   Macierz_Jednostkowa: Matrix(1..N, 1..N) := (1..N => (1..N => 0.0)); 

BEGIN 

   FOR I IN 1..N LOOP 

Macierz_jednostkowa(I,I):=1.0; 

   END LOOP; 

   RETURN Macierz_Jednostkowa; 

END Create_Unit_Matrix; 

N: Positive; 

BEGIN – rozpoczęcie procedury głównej 

   Get(N); 

      DECLARE – deklaracja wewnątrz bloku  

         Unit_Matrix_N: CONSTANT Matrix(1..N, 1..N) := Create_Unit_Matrix(N); 

      BEGIN – rozpoczęcie bloku 

… 

 

Zadanie 3. Niech będą dane deklaracje 

type Wektor_6 is array (1..6) of Float; 
type Macierz_3_Na_6 is array (1..3) of Wektor_6; 
M : Macierz_3_Na_6; 

Napisz jedną instrukcję przypisania wymieniającą miejscami pierwszy i drugi wiersz tablicy M.

 

Odpowiedź: 

M(1..2) := (M(2), M(1)); 

background image

- 17 - 

 

CZĘŚĆ DZIEWIĄTA – REKORDY 

 

Zadanie 1.

 

Typ Complex 

reprezentujący liczby zespolone może być zadeklarowany następująco: 

type Complex is record 
Re : Float; 
Im : Float; 
end record

Zadeklaruj stałą I tego typu, która reprezentuje pierwiastek kwadratowy z liczby –1. Zadeklaruj stałe Zero i Jeden 

tego  typu,  które  reprezentują  odpowiednio  elementy  neutralne  dodawania  i  mnożenia  liczb  rzeczywistych.  Użyj 

agregatów  nazywanych  do  nadania  wartości  wszystkich  stałych.  Napisz  funkcje  "+"  i  "*"  obliczające  sumę  i 
iloczyn dwóch liczb typu Complex. 

Odpowiedź: 

I: CONSTANT Complex := (Re => 0.0, Im => 1.0); (lub Im => -1.0 ) 

Zero: CONSTANT Complex := (Re => 0.0, Im => 0.0); 

Jeden: CONSTANT Complex := (Re => 1.0, Im => 0.0); 

FUNCTION "+" (Z: Complex; W: Complex) RETURN Complex IS 

   Wynik: Complex; 

BEGIN 

   Wynik.Re := Z.Re + W.Re; Wynik.Im := Z.Im + W.Im; 

   RETURN Wynik; 

END "+"; 

 

FUNCTION "*" (Z: Complex; W: Complex) RETURN Complex IS 

   Wynik : Complex; 

BEGIN 

   Wynik.Re := Z.Re * W.Re - Z.Im * W.Im; 

   Wynik.Im := Z.Im * W.Re + Z.Re * W.Im; 

   RETURN Wynik; 

END "*"; 

 

Zadanie 2.

 

Typ Complex 

reprezentujący liczby zespolone może być zadeklarowany następująco: 

type Complex is record 
Re : Float; 
Im : Float; 
end record

Napisz funkcje Re_Part,  Im_Part  i  Conjugate 

obliczające  odpowiednio  część  rzeczywistą,  część  urojoną  i 

liczbę sprzężoną dla danej liczby typu Complex. 

Odpowiedź: 

FUNCTION Re_Part (Z: Complex) RETURN Float IS 

   Wynik: Float; 

BEGIN 

   Wynik := Z.Re; RETURN Wynik; 

END Re_Part; 

 

FUNCTION Im_Part (Z: Complex) RETURN Float IS 

   Wynik: Float; 

BEGIN 

   Wynik := Z.Im; RETURN Wynik; 

END Im_Part; 

 

FUNCTION Conjugate (Z: Complex) RETURN Complex IS 

   Wynik: Complex; 

BEGIN 

   Wynik.Re := Z.Re; Wynik.Im := -Z.Im; 

   RETURN Wynik; 

END Conjugate; 

background image

- 18 - 

 

CZĘŚĆ 10-REKURENCJA 

 

Zadanie1: 

Zadanie.

 

Napisać funkcje Lucas_Iter i Lucas_Rek obliczające iteracyjnie i rekurencyjnie N-ty wyraz ciągu Lucasa określonego 

wzorami: 
L(1) = 1, L(2) = 3, 
L(k) = L(k-1) + L(k-2), k > 2

 

 

Odpowiedź: 
Iteracyjnie: 
FUNCTION Lucas_Iter (N: Positive) 
RETURN Positive IS 
   A: Positive := 1; 
   B: Positive := 3; 
   N_ty: Positive; 
   Licznik: Positive := 3; 
BEGIN 
   IF N = 1 THEN 
      N_ty := A; 
   ELSIF N = 2 THEN 
      N_ty := B; 
   ELSE 
      WHILE Licznik <= N LOOP 
         N_ty := A + B; 
         A := B; 
         B := N_ty; 
         Licznik := Licznik + 1; 
      END LOOP; 
   END IF; 
RETURN N_ty; 
END Lucas_Iter; 
Rekurencyjnie: 
FUNCTION Lucas_Rek (N: Positive) 
RETURN Positive IS 
   A: Positive := 1; 
   B: Positive := 3; 
   N_ty: Positive; 
BEGIN 
   IF N = 1 THEN 
      N_ty := A; 
   ELSIF N = 2 THEN 
      N_ty := B; 
   ELSE 
N_ty:= Lucas_Rek(N-1)+ Lucas_Rek(N-2); 
   END IF; 
RETURN N_ty; 
END Lucas_Rek; 
 
 
 
 
 
 
 

background image

19 

 

(porównaj program lucas)

 

 
Zadanie2: 

Przypuśćmy, że dana jest tablica jednowymiarowa zawierająca 

N

n

 

elementów. Algorytm rekurencyjny wypisujący 

elementy tej tablicy zaczynając od pierwszego można zapisać następująco: 

Jeżeli tablica jest niepusta, to 

− Wypisz pierwszy element, 

− Wypisz ta

blicę zawierającą pozostałe n-1 elementów. 

Napisz procedurę Wypisz_Tablice realizującą ten algorytm w przypadku, gdy elementy tablicy są typu Integer, przy 

czym parametr formalny rodzaju wejściowego ma być typu: 
type Integer_Array is array (Integer range <>) of Integer; 

i przy realizacji algorytmu wolno korzystać jedynie z atrybutów typów tablicowych.

 

 

PROCEDURE Wypisz_Tablice (Tablica: IN Integer_Array) IS 
BEGIN 
   IF Tablica'Length /= 0 THEN 
      Put(Tablica(Tablica'First)); 
      Wypisz_Tablice(Tablica => Tablica (Tablica'First + 1 .. Tablica'Last)); 
   END IF; 
END Wypisz_Tablice;  
(porównaj program Wypisz_Liste_Rekurencyjnie

 

 
 
 
 
Zadanie3  
Przypuśćmy, że dana jest tablica jednowymiarowa zawierająca N 

∈ ℕ elementów. 

Algorytm rekurencyjny wypisujący elementy tej tablicy zaczynając od ostatniego 

można zapisać następująco: 

Jeżeli tablica jest niepusta, to 

− Wypisz ostatni element, 
− 

Wypisz tablicę zawierającą pozostałe N 

− 1 elementy. 

Napisz procedurę Wypisz_Tablice_Od_Konca realizującą ten algorytm w przypadku, 

gdy elementy tablicy są typu Integer, przy czym parametr formalny rodzaju wejściowego 

ma być typu: 

type 

Integer_Array 

is array 

(Integer 

range 

<>) 

of 

Integer; 

i przy realizacji algorytmu wolno korzystać jedynie z atrybutów typów tablicowych. 

Rozwiązanie 

PROCEDURE 

Wypisz_Tablice_od_Konca ( 

         T : 

IN OUT 

Integer_Array) 

IS 

   BEGIN 
      IF 

T'Length=

THEN 

         

Put(T(T'Last)); 

      

ELSE 

         

Put(T(T'Last)); 

         New_Line; 
         

DECLARE 

            

T2 : Integer_Array (

.. T'Length - 

1

); 

         

BEGIN 

            FOR 

IN 

1

..T2'Length 

LOOP 

               

T2(I):=T(I); 

            

END

 

LOOP

            Wypisz_Tablice_od_Konca(T2); 
         

END

      

END IF

   

END 

Wypisz_Tablice_od_Konca;

 

background image

20 

 

 

 
Zadanie 4: 

Przypuśćmy, że mamy wyznaczyć iloczyn liczb 

Z

M

(typ Integer) i 

P

N

(typ Positive) i nie możemy skorzystać z tabliczki 

mnożenia,  natomiast  możemy  wyłącznie  stosować  dodawanie.  Algorytm  rekurencyjny  wyznaczający  M  *  N  jest  następujący: 

Jeżeli N = 1, to M * N = M, w przeciwnym przypadku M * N = M + (N – 1) * M. 

Napisać funkcję Mnozenie, która realizuje ten algorytm.

 

 

FUNCTION Mnozenie (M: Integer; N: Positive) RETURN Integer IS 
   Iloczyn_M_i_N: Integer; 
BEGIN 
   IF N = 1 THEN 
      Iloczyn_M_i_N := M; 
   ELSE 
      Iloczyn_M_i_N := M + Mnozenie(M, N – 1); 
   END IF; 
RETURN Iloczyn_M_i_N; 
END Mnozenie; 
(porównaj program Mnozenie_Rekurencyjne) 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

21 

 

CZĘŚĆ 11- DYNAMICZNE STRUKTURY DANYCH 

Zadanie1 

Przypuśćmy, że mamy wyznaczyć iloczyn liczb M 

∈ ℤ i N ∈ P i nie możemy 

skorzystać z tabliczki mnożenia, natomiast możemy wyłącznie stosować dodawanie. Algorytm 
rekurencyjny wyznaczający M 

∗ N jest następujący: 

− 

Jeżeli N 

= 1, to M ∗ N = M , 

− w przeciwnym przypadku M 

∗ N = M + M ∗ (N − 1). 

Napisa

ć funkcję Mnozenie, która realizuje ten algorytm. 

Rozwiązanie 

FUNCTION 

Mnozenie ( 

         M : Integer; 
         N : Positive) 
     

RETURN 

Integer 

IS 

      

M1: Integer :=M ; 

      N1: Positive :=N; 
   

BEGIN 

      WHILE 

N1/=

LOOP 

         

M1:=M1+M; 

         N1:=N1-

1

      

END LOOP

      

RETURN 

M1; 

   

END 

Mnozenie; 

Zadanie. 

Mamy dane deklaracje: 

type 

Wsk_Integer 

is access 

Integer; 

Wsk1, Wsk2 : Wsk_Integer; 

oraz instrukcje 

Wsk1 := new Integer'(0); 
Wsk2 := new Integer'(100); 
Put (Wsk1.All, 3); New_Line; 
Put (Wsk2.All, 3); New_Line; 
Wsk2.All := Wsk1.All; 
Put (Wsk1.All, 3); New_Line; 
Put (Wsk2.All, 3); New_Line; 
Wsk1.All := 5; 
Wsk2.All := 25; 
Put (Wsk1.All, 3); New_Line; 
Put (Wsk2.All, 3); New_Line; 
Wsk1 := Wsk2; 
Put (Wsk1.All, 3); New_Line; 
Put (Wsk2.All, 3); New_Line; 

Podaj wszystkie wartości wypisywane przez wywołania procedury Put. 
Rozwiązanie 

0  100  0  0  5  25  25  25 

 
 

 
 
 
 
 
 
 
 
 

background image

22 

 

Zadanie2: 

Przypuśćmy, że chcemy wyznaczać wartości dowolnych dobrze określonych odwzorowań 

2

2

:

R

R

f

y

x

f

x

=

)

(

. W 

tym celu piszemy deklaracje 
type Wektor_2 is array (1 .. 2) of Float; 
type Odwzorowanie is access function (X : in Wektor_2) return Wektor_2; 
Napisać  funkcję  Obraz,  której  parametrami  są  argument  X  typu  Wektor_2  i funkcja typu Odwzorowanie.  Funkcja ma 

wyznaczać  wektor  Odwzorowanie(X).  Następnie  napisać  funkcje  Przeciwny  i  Obrocony_O_90,  obliczające 

odpowiednio wektor przeciwny i wektor obrócony o kąt 90 stopni do argumentu tych funkcji, takie, że mogą być parametrami 
aktualnym funkcji Obraz. 

Mając deklaracje 

V : Wektor_2 := (1.0, 1.0); 
W : Wektor_2; 
Napisać  instrukcje  przypisującą  zmiennej  W  wartość  obliczoną  przez  funkcję  Obraz  w przypadku, gdy jej parametrami 

aktualnymi są V i funkcje Przeciwny i Obrocony_O_90.

 

 

Ro

związanie: 

FUNCTION Obraz (X: Wektor_2; Funkcja: Odwzorowanie) RETURN Wektor_2 IS 
BEGIN 
RETURN Funkcja(X); 
END Obraz; 

 

FUNCTION Przeciwny (X: Wektor_2) RETURN Wektor_2 IS 
   Wektor_Przeciwny: Wektor_2; 
BEGIN 
   Wektor_Przeciwny := (-X(1), -X(2)); 
RETURN Wektor_Przeciwny; 
END Przeciwny; 

 

FUNCTION Obrocony_O_90 (X: Wektor_2) RETURN Wektor_2 IS 
   Wektor_Obrocony_O_90: Wektor_2; 
BEGIN 
   Wektor_Obrocony_O_90 := (-X(2), X(1)); 
RETURN Wektor_Obrocony_O_90; 
END Obrocony_O_90; 

... 

W := Obraz(V, Przeciwny'ACCESS); 
W := Obraz(V, Obrocony_O_90'ACCESS); 
(porównaj program Przeksztalcenia_Na_Plaszczyznie

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

23 

 

CZĘŚĆ 12-PAKIETY 
 
Zadanie1. 

Ciąg zdefiniowany wzorem 

 

x

n+1

=(x

n

*5

5

) mod 2

13

symuluje generator liczb

 

pseudolosowych. Wartość początkowa x

0

 

powinna być liczbą nieparzystą z przedziału 

0..2

13

Napisać pakiet o nazwie Liczby_Losowe zawierający procedurę Inicjuj do 

nadania wartości początkowej ciągu i funkcję Nastepny wyznaczającą kolejne wyrazy 

ciągu. Nie korzystać z pakietów bibliotecznych. 

Rozwiązanie (brak) 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

24 

 

CZĘŚĆ 13-TYPY PRYWATNE 
 
Zadanie1 

Napisać funkcje First_Component i Second_Component obliczające odpowiednio 

pierwszą i drugą składową wektora typu Wektor_2D. Założyć przy tym, że 

deklaracja tego typu ma postać 

type 

Wektor_2D 

is private

private 
type 

Wektor_2D 

is record 

First : Float; 
Second : Float; 

end record

Rozwiązanie 

FUNCTION 

First_Component ( 

         X : Wektor_2d) 
     

RETURN 

Float 

IS 

   BEGIN 
      RETURN 

X.First; 

   

END

 First_Component; 

    
   

FUNCTION 

SECOND_Component ( 

         X : Wektor_2d) 
     

RETURN 

Float 

IS 

   BEGIN 
      RETURN 

X.Second; 

   

END

 SECOND_Component; 

 
Zadanie2 

Przyjmując definicję typu Wektor_2D jak wyżej napisać funkcje 
Konstruktor_2D

, "+", "*", "*" 

służące odpowiednio do: konstrukcji wektora z jego 

składowych, obliczania sumy dwóch wektorów i obliczania iloczynu skalara przez wektor i 
wektora przez skalar rzeczywisty. 

Roz

wiązanie:

background image

- 25 - 

 

FUNCTION 

"+" 

      X, 
      Y : Wektor_2d) 
  

RETURN 

Wektor_2d 

IS 

   

V : Wektor_2d; 

BEGIN 

   V.First:=X.First+Y.First; 
   V.Second:=X.Second+Y.Second; 
      

RETURN

 V; 

END 

"+"

 

FUNCTION 

"*" 

      A : Float; 
      X : Wektor_2d) 
  

RETURN 

Wektor_2d 

IS 

   

V : Wektor_2d; 

BEGIN 

   V.First:=A*X.First; 
   V.Second:=A*X.Second; 
   

RETURN 

V; 

END 

"*"

 

 
 
FUNCTION 

"*" 

      X : Wektor_2d; 
      A : Float) 
  

RETURN 

Wektor_2d 

IS 

BEGIN 
   RETURN 

A*X; 

END 

"*"

 

PROCEDURE 

Czytaj_Wektor_2d ( 

      X :    

OUT 

Wektor_2d) 

IS 

BEGIN

 

   

Ada.Float_Text_Io.Get

 

(X.First);

 

   New_Line; 
   Ada.Float_Text_Io.Get

 

(X.Second); 

END 

Czytaj_Wektor_2d; 

 
Zadanie3: 

Przyjmując definicję typu Wektor_2D jak wyżej napisać pełne deklaracje 

stałych Zero, Wersor_1 i Wersor_2, które reprezentują odpowiednio wektory: 

= (0,0) , 1 = (1,0) , 2 = (0,1)  

Rozwiązanie 

PRIVATE 
TYPE 

Wektor_2D 

IS 

   RECORD 
      

First  : Float; 

      Second : Float; 
   

END RECORD

Zero: 

CONSTANT 

Wektor_2D := (

0.0

,

0.0

); 

E1: 

CONSTANT 

Wektor_2D := (

1.0

,

0.0

); 

E2: 

CONSTANT 

Wektor_2D := (

0.0

,

1.0

); 

 
 
 
 

background image

- 26 - 

 

 

CZĘŚĆ 16-JEDNOSTKI OGÓLNE 

 

Zadanie1: 
Mamy deklaracje 

generic 
type 

Typ_Danych 

is private

procedure 

Wymien_Ogolnie (W1, W2 : 

in out 

Typ_Danych); 

... 

procedure 

Wymien_Ogolnie (W1, W2 : 

in out 

Typ_Danych) 

is 

Temp: Typ_Danych; 

begin 

Temp := W1; 
W1 := W2; 
W2 := Temp; 

end 

Wymien_Ogolnie;

Czy typ Typ_Danych zadeklarowany w sekcji ogólnej jako 

private

może być typem prywatnym ograniczonym – 

limited private

? Uzasadnij 

odpowiedź. 

Rozwiązanie 

Nie może być gdyż typ limited private nie ma zdefiniowanego działania „:=”   

 

Zadanie2: 

Mamy deklaracje 

generic 
type 

Typ_Danych 

is private

procedure 

Wymien_Ogolnie (W1, W2 : 

in out 

Typ_Danych); 

Napisać konkretyzację procedury Wymien_Ogolnie w przypadku typu standardowego 
Character

Rozwiązanie 

Zad 16.2 

PROCEDURE 

Wymien_Integer 

IS 

NEW 

Wymien_Ogolnie (Typ_Danych => Character); 

 
Zadanie3 
Mamy deklaracje 

generic 
type 

Typ_Danych 

is private

with function 

Wiekszy(L, R : Typ_Danych) 

return 

Boolean; 

function 

Maksimum (W1, W2 : Typ_Danych) 

return 

Typ_Danych;

Napisać 

konkretyzację funkcji Maksimum w przypadku typu standardowego Character. 

Rozwiązanie 

FUNCTION 

Maksimum_Character 

IS 

   NEW 

Maksimum ( 

      Typ_Danych => Character, 
      Wiekszy    => 

">"

);