- 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
2
= 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.
- 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;
- 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;
- 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
- 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
- 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 X
- 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 3
- 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;
- 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
A
or not B
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;
- 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?
- 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;
- 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)
- 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;
- 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.
- 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;
- 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;
- 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)
- 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)
- 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));
- 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;
- 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;
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=
1
THEN
Put(T(T'Last));
ELSE
Put(T(T'Last));
New_Line;
DECLARE
T2 : Integer_Array (
1
.. T'Length -
1
);
BEGIN
FOR
I
IN
1
..T2'Length
LOOP
T2(I):=T(I);
END
LOOP
;
Wypisz_Tablice_od_Konca(T2);
END
;
END IF
;
END
Wypisz_Tablice_od_Konca;
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)
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/=
1
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
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)
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)
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:
- 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,0) , 1 e = (1,0) , 2 e = (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
);
- 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 =>
">"
);