Algorytmy zadania id 51150 Nieznany (2)

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

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.

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

- 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;

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

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;

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=

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;

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/=

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










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,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

);




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 =>

">"

);









Wyszukiwarka

Podobne podstrony:
chemia zadania 2 id 113035 Nieznany
algorytmy sortujace id 57762 Nieznany
Algorytmy obliczen id 57749 Nieznany
me zadanie 2 id 290295 Nieznany
plyta zadanie id 363191 Nieznany
Dodatkowe zadania id 138777 Nieznany
formularze zadania id 179681 Nieznany
(budzet zadaniowy)id 1238 Nieznany (2)
CO zadania id 118396 Nieznany
blok 7 zadania id 90420 Nieznany (2)
111 ZADANIA2 1 id 601077 Nieznany (2)
elektrotechnika zadanie id 1593 Nieznany
IT zadania1 id 220832 Nieznany
algorytmy tekstowe id 57778 Nieznany (2)
granica ciagu zadania id 195350 Nieznany
jQuery zadania id 228844 Nieznany
3 3 BK Algorytmy parsingu id 34 Nieznany (2)
arkusz 1 zadania id 68486 Nieznany (2)

więcej podobnych podstron