Zadanie 1 Zadanie 1 Dana jest deklaracja Mąż księżniczki losowany

Transkrypt

Zadanie 1 Zadanie 1 Dana jest deklaracja Mąż księżniczki losowany
Algorytmy i podstawy programowania – Kolokwium I, Rozwiązania
31 maja 2015
ALGORYTMY I PODSTAWY PROGRAMOWANIA – KOLOKWIUM I, ROZWIĄZANIA
Grupa L
Zadanie 1
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.
Rozwiązanie:
Pan_Mlody'Val((N-1) mod 8)
albo bardziej ogólnie
Pan_Mlody'Val((N-1) mod
(Pan_Mlody'Pos(Pan_Mlody'Last) +1))
Dla N = 10 wartość wyrażenia wynosi
Krawiec.
Grupa P
Zadanie 1
Osiem kierunków kompasowych można
reprezentować typem wyliczeniowym
type Kierunek_Wiatru is (N, NE, E,
SE, S, SW, W, NW);
Napisać funkcje logiczne Przeciwne i
Prostopadle określające czy dwa dane
kierunki wiatru są odpowiednio przeciwne i
prostopadłe.
Rozwiązanie:
function Przeciwne (X : Wind; Y :
Wind) return Boolean is
Diff : constant Integer :=
Wind'Pos (X) - Wind'Pos (Y);
begin
return (Diff = 4) or (Diff = -4);
end Przeciwne;
function Prostopadle (X : Wind; Y :
Wind) return Boolean is
begin
if Wind'Pos(X) > Wind'Pos(Y) then
return Wind'Pos(X) - Wind'Pos(Y)
= 2;
else
return Wind'Pos(X) - Wind'Pos(Y)
= -2;
end if;
end Prostopadle;
Zadanie 2
Zadanie 2
Napisz instrukcję warunkową, równoważną z Zmienić instrukcję pętli for na równoważną
podaną instrukcję wyboru
instrukcję pętli while
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?
Rozwiazanie:
if X > Y then
Put (Item => "X jest wieksze");
else
Put (Item => "Y jest nie
mniejsze");
end if;
for Licznik in 1..10 loop
Put ("Licznik petli = ");
Put (Licznik);
end loop;
Rozwiązanie:
Licznik : Integer range 1..11 := 1;
..
while Licznik < 11 loop
Put ("Licznik petli = ");
Put (Licznik);
Licznik := Licznik + 1;
end loop;
Selektor jest typu Boolean.
1
Algorytmy i podstawy programowania – Kolokwium I, Rozwiązania
31 maja 2015
Zadanie 3
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:
procedure Wymien_Integer (
A : in out Integer;
B : in out Integer) is
T : Integer;
begin
T := A;
A := B;
B := T;
end Wymien_Integer;
procedure Wymien_Integer_Dwa (
A : in out Integer;
B : in out Integer) is
begin
A := A + B;
B := A - B;
A := A - B;
end Wymien_Integer_Dwa;
Pierwszy algorytm można zastosować do
dowolnych typów dla których określona jest
instrukcja podstawienia.
Drugi algorytm jest mniej uniwersalny, bo do
jego realizacji potrzebne są operacje
dodawania i mnożenia oraz instrukcja
podstawienia.
Zadanie 3
1. 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.
2. Zamienić funkcję Znak na równoważną
procedurę Wyznacz_Znak.
Rozwiązanie:
function Znak (Argument : in Float )
return Character is
-- Funkcja wyznacza znak liczby typu
-- Float,
-- + gdy Argument > 0,
-- 0 gdy Argument = 0 i
-- - gdy Argument < 0
Temp : Character;
begin
if Argument = 0.0 then
Temp := '0';
elsif Argument > 0.0 then
Temp := '+';
else
Temp := '-';
end if;
return Temp;
end Znak;
procedure Wyznacz_Znak
(Argument : in Float;
Znak : out Boolean) is
-- Procedura wyznacza znak liczby
-- typu Float,
-- + gdy Argument > 0,
-- 0 gdy Argument = 0 i
-- - gdy Argument < 0
begin
if Argument = 0.0 then
Znak := '0';
elsif Argument > 0.0 then
Znak := '+';
else
Znak := '-';
end if;
end Wyznacz_Znak;
2
Algorytmy i podstawy programowania – Kolokwium I, Rozwiązania
31 maja 2015
Zadanie 4
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.
Rozwiązanie:
case Poziom is
when 0..99 => Put (Item => "Poziom
niski");
when 100..199 => Put (Item =>
"Poziom sredni");
when 200..299 => Put (Item =>
"Poziom wysoki");
when others => Put (Item =>
"Alarm");
end case;
Zadanie 4
Niech
Poziom : Natural;
.. –- Obliczamy Poziom
Który z poniższych zapisów jest poprawny?
Uzasadnij odpowiedź.
a)
if Poziom < 100 then
Put (Item => "Poziom niski");
elsif Poziom < 200 then
Put (Item => "Poziom sredni");
elsif
Put (Item => "Poziom wysoki");
end if;
b)
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)
if Poziom < 100 then
Put (Item => "Poziom niski");
elsif Poziom < 200 then
Put (Item => "Poziom sredni");
else
Put (Item => "Poziom wysoki");
end if;
Rozwiązanie:
a) Brak warunku i słowa then
b) Po else nie powinno być warunku i
słowa then
c) OK
3
Algorytmy i podstawy programowania – Kolokwium I, Rozwiązania
31 maja 2015
Zadanie 5
Napisz funkcję Nie_Parzysta przyjmującą
wartość 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ę.
Rozwiązanie:
function Nie_Parzysta (Argument : in
Integer) return
Boolean is
begin
return (Argument mod 2) /= 0;
end Nie_Parzysta;
procedure Sprawdz_Czy_Nie_Parzysta
(Argument : in Integer;
Nie_Parzysta : out Boolean) is
begin
if (Argument mod 2) /= 0 then
Nie_Parzysta := True;
else
Nie_Parzysta := False;
end if;
end Sprawdz_Czy_Nie_Parzysta;
..
Wynik : Boolean;
..
Sprawdz_Czy_Nie_Parzysta (Liczba,
Wynik);
Put ("Liczba ");
Put (Liczba, 3);
if Wynik then
Put ("jest nieparzysta");
else
Put ("jest parzysta");
end if;
Zadanie 5
Niech będzie 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.
Rozwiązanie:
..
procedure Oblicz_Lucasa (N : in
Positive; W : out Positive);
..
Licznik
: Natural := 1;
Wyraz
: Positive;
..
while Licznik in 1..Ile_Wyrazow loop
Put (Licznik);
Set_Col(20);
Oblicz_Lucasa (Licznik, Wyraz);
Put (Wyraz); New_Line;
Licznik := Licznik + 1;
end loop;
4