Misja pierwsza: Spis pingwinów
Zadanie: Spis pingwinów
Ogród zoologiczny w Bajtowie przeprowadza spis 270 pingwinów znajdujących się na wszystkich wybiegach.
Dane w spisie dotyczące pingwinów zawierają:
Id– identyfikator ID (unikatowy dla każdego osobnika) lub „0”, gdy brak danych,Płeć– „samiec” lub „samica”,Gatunek– nazwa gatunku w postaci ciągu znaków,Wiek– zapisany w miesiącach (liczba naturalna zapisana z zerami wiodącymi, o długości dokładnie trzech znaków).
Aby uporządkować dane w spisie, pracownicy zoo zapisali zebrane informacje w pliku pingwiny.txt – każdy osobnik w nowej linii, każda z czterech informacji oddzielona pojedynczym znakiem odstępu.
pingwiny.txt.W spisie brakuje jednak informacji dotyczących niektórych numerów ID – luki zostały oznaczone jako „0”. Wiadomo natomiast, że ID każdego pingwina tworzone jest w następujący sposób:
pierwsza cyfra to cyfra oznaczająca płeć – „1” to samiec, „2” to samica,
druga, trzecia i czwarta cyfra to kod ASCII pierwszego znaku nazwy gatunku pingwina (np. dla wartości 97 powinno to być 097),
piąta, szósta i siódma cyfra to wiek pingwina w miesiącach (np. dla osobnika w wieku sześciu miesięcy cyfry wieku podane są w następujący sposób: 006).
W wybranym przez siebie języku programowania napisz program, który:
uzupełni brakujące dane dotyczące pingwinów,
posortuje informacje niemalejąco według numerów ID, a następnie zapisze do pliku
gatunki.txtgatunki pingwinów, których dane w spisie znajdują się na pozycjach 1, 20 oraz 200, każdy w osobnej linii.
Do oceny oddajesz:
plik
gatunki.txtzawierający odpowiedź (gatunki pingwinów z plikupingwiny.txt, które po posortowaniu według ID znalazły się na 1., 20. oraz 200. miejscu),plik(i) z komputerową realizacją zadania (kodem programu).
Przedstaw rozwiązanie w postaci programu w języku C++, Java lub Python. Odpowiedź do zadania znajdziesz po omówieniu rozwiązania.
Rozwiązanie
Rozwiązanie zadania przedstawimy w postaci pseudokodu.
Stworzenie struktury oraz import danych
Tworzymy strukturę opisującą dane dotyczące pingwinów oraz określamy typy danych zawartych w niej elementów. [linie od 1 do 5]
Importujemy dane z każdej linii pliku oraz zapisujemy je do struktur reprezentujących pingwiny. [linie od 9 do 15]
Przykładowa implementacja struktury Pingwin (z użyciem struktury słownika wypełnionej przykładowymi danymi):
Rozwiązanie zadań
Ze względu na sortowanie struktur względem jednego z ich pól trudniej skorzystać z wbudowanych funkcji sortowania, dlatego też musimy sami zaimplementować wybrany algorytm sortowania. W podanym rozwiązaniu do posortowania danych użyty został algorytm sortowania bąbelkowego.
Rozpoczynamy od definicji funkcji zamień(x, y), która zamieni ze sobą wartości dwóch argumentów do niej przekazanych. [linia od 1 do 4]
Zapiszemy algorytm sortowania bąbelkowego tablicy.
Definiujmy funkcję sortowania bąbelkowego. [linia 1]
Zapisujemy zewnętrzną pętlę przechodzącą po wszystkich pozycjach tablicy. Wewnątrz definiujemy zmienną logiczną
zamiana, której wartość będzie decydować, czy zakończyć sortowanie (unikniemy pustych przebiegów pętli, jeśli tablica będzie posortowana wcześniej). [linie 2, 3, 4]W pętli wewnętrznej przechodzącej po nieuporządkowanych elementach (
ipingwinów od końca znajduje się już na właściwych pozycjach) porównujemy ID pingwinów. Jeżeli osobnik na wcześniejszej pozycji ma większe ID, zamieniamy go z sąsiadem po prawej i aktualizujemy wartość zmiennejzamiana. [linie 5–8]W przypadku niewystąpienia jakiejkolwiek zamiany wartość zmiennej
zamianapozostanie równafałsz, co oznacza, że tablica jest już posortowana i można przerwać zewnętrzną pętlę. [linie 9, 10]
Sortowanie możemy wykonać wyłącznie wtedy, kiedy wszystkie pingwiny będą miały nadane właściwe identyfikatory. Powinniśmy zatem sprawdzić, które ich nie mają, a następnie im je nadać. Zapiszemy zatem pętlę, która sprawdzi, które pingwiny nie mają nadanych poprawnie identyfikatorów, a następnie przypisze im je na podstawie płci, gatunku oraz wieku. Ostatnim krokiem będzie posortowanie całej struktury oraz zapisanie odpowiednich danych do pliku wynikowego.
W celu rozwiązania zadania przechodzimy po wszystkich indeksach tablicy
Pingwiny, a następnie sprawdzamy, które numery ID są błędnie zapisane (wpisane do struktury jako 0) [linie 1, 2]. Co istotne, ID można było tworzyć i uzupełniać na bieżąco, podczas wczytywania danych. W kodzie ilustrującym tworzenie struktury w linii 12 można dodać tworzenie ID, umieszczając tam linie 2–12 z powyższego kodu.Gdy natrafimy na błędny numer ID, należy go stworzyć zgodnie ze wzorem opisanym w zadaniu:
Jeżeli osobnik jest samcem, pierwszą cyfrą będzie
1. Jeśli zaś jest samicą, pierwszą cyfrą będzie2. [linie od 3 do 6]Następnie mnożymy wartość zmiennej strukturalnej ID przez 1000 (dopisując na końcu trzy zera – w ten sposób nie musimy rozważać, czy kod ASCII jest trzy-, czy dwucyfrowy). Dodajemy teraz wartość kodu ASCII pierwszej litery gatunku osobnika do jego ID. [linie 8, 9]
Tym samym sposobem ponownie dopisujemy trzy zera do wartości zmiennej ID, a następnie dodajemy wiek osobnika. [linie 11, 12]
Sortujemy teraz całą strukturę – w przedstawionym przykładzie użyty został algorytm sortowania bąbelkowego. [linia 14]
Następnie zapisujemy odpowiednio dane do pliku wynikowego (pamiętamy, że w językach programowania dostępnych na egzaminie maturalnym indeksowanie elementów tablicy zaczyna się od zera). [linia 16]
Odpowiedź do zadania
Odpowiedź dla danych z pliku pingwiny.txt:
Słownik
uporządkowany (zwykle alfabetycznie) spis pojęć, nazwisk, nazw, tematów wraz z numerami stron, na których występują
(ang. nested loop) sposób zapisu pętli, gdzie jedna pętla znajduje się w drugiej; przechodzenie pomiędzy pętlami odbywa się w następujący sposób: pętla zewnętrzna rozpoczyna pierwsze wykonanie, następuje przejście po wszystkich iteracjach pętli wewnętrznej, wówczas pętla wewnętrzna kończy swoje działanie i pętla zewnętrzna rozpoczyna drugie wykonanie
(ang. bubble sort) prosty algorytm sortowania polegający na porównywaniu dwóch kolejnych elementów i zamianie ich kolejności, jeśli zaburza ona porządek, w jakim sortuje się tablicę; algorytm kończy się, gdy nie wykonano żadnych zamian