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