Zadanie 1. 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.

R68HrgD2PC5Ko

Plik pingwiny.txt.
Plik TXT o rozmiarze 7.26 KB w języku polskim

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:

  1. pierwsza cyfra to cyfra oznaczająca płeć – „1” to samiec, „2” to samica,

  2. druga, trzecia i czwarta cyfra to kod ASCII pierwszego znaku nazwy gatunku pingwina (np. dla wartości 97 powinno to być 097),

  3. 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:

  1. uzupełni brakujące dane dotyczące pingwinów,

  2. posortuje informacje niemalejąco według numerów ID, a następnie zapisze do pliku gatunki.txt gatunki 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.txt zawierający odpowiedź (gatunki pingwinów z pliku pingwiny.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

Linia 1. struktura Pingwin. Linia 2. Id dwukropek liczba całkowita. Linia 3. Płeć dwukropek tekst. Linia 4. Gatunek dwukropek tekst. Linia 5. Wiek dwukropek liczba całkowita. Linia 7. utwórz tablicę Pingwiny otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 9. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 269 wykonuj dwukropek. Linia 10. Informacje otwórz nawias kwadratowy 0 kropka kropka 3 zamknij nawias kwadratowy ← wczytaj i minus tą linię z pliku cudzysłów pingwiny kropka txt cudzysłów. Linia 11. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy ← nowy element typu Pingwin. Linia 12. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id ← Informacje otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 13. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Płeć ← Informacje otwórz nawias kwadratowy 1 zamknij nawias kwadratowy. Linia 14. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Gatunek ← Informacje otwórz nawias kwadratowy 2 zamknij nawias kwadratowy. Linia 15. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Wiek ← Informacje otwórz nawias kwadratowy 3 zamknij nawias kwadratowy.
  1. Tworzymy strukturę opisującą dane dotyczące pingwinów oraz określamy typy danych zawartych w niej elementów. [linie od 1 do 5]

  2. Importujemy dane z każdej linii pliku oraz zapisujemy je do struktur reprezentujących pingwiny. [linie od 9 do 15]

Ze względu na istotne różnice między językami programowania dostępnymi na egzaminie maturalnym przedstawiamy przykładowe implementacje struktury Pingwin:

  • C++

Linia 1. struct Pingwin otwórz nawias klamrowy. Linia 2. int Id średnik. Linia 3. string Płeć średnik. Linia 4. string Gatunek średnik. Linia 5. int Wiek średnik. Linia 6. zamknij nawias klamrowy średnik.
  • Java

Linia 1. class Pingwin otwórz nawias klamrowy. Linia 2. public int Id średnik. Linia 3. public String Płeć średnik. Linia 4. public String Gatunek średnik. Linia 5. public int Wiek średnik. Linia 6. zamknij nawias klamrowy.
  • Python (z użyciem struktury słownika wypełnionej przykładowymi danymi)

Linia 1. Pingwin znak równości otwórz nawias klamrowy. Linia 2. cudzysłów Id cudzysłów dwukropek 1 przecinek. Linia 3. cudzysłów Płeć cudzysłów dwukropek cudzysłów samiec cudzysłów przecinek. Linia 4. cudzysłów Gatunek cudzysłów dwukropek cudzysłów grubodzioby cudzysłów przecinek. Linia 5. cudzysłów Wiek cudzysłów dwukropek 102. Linia 6. zamknij nawias klamrowy.

Rozwiązanie zadań

Ważne!

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ąbelkowegosortowanie bąbelkowesortowania bąbelkowego.

Linia 1. funkcja zamień otwórz nawias okrągły x przecinek y zamknij nawias okrągły. Linia 2. pom ← x. Linia 3. x ← y. Linia 4. y ← pom.

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.

Linia 1. funkcja sortuj otwórz nawias okrągły Pingwiny otwórz nawias kwadratowy zamknij nawias kwadratowy zamknij nawias okrągły. Linia 2. n ← długość otwórz nawias okrągły Pingwiny otwórz nawias kwadratowy zamknij nawias kwadratowy zamknij nawias okrągły. Linia 3. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka n minus 1 wykonuj dwukropek. Linia 4. zamiana ← fałsz. Linia 5. dla j znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek n minus i minus 1 wykonuj dwukropek. Linia 6. jeżeli Pingwiny otwórz nawias kwadratowy j minus 1 zamknij nawias kwadratowy kropka Id zamknij nawias ostrokątny Pingwiny otwórz nawias kwadratowy j zamknij nawias kwadratowy kropka Id dwukropek. Linia 7. zamień otwórz nawias okrągły Pingwiny otwórz nawias kwadratowy j minus 1 zamknij nawias kwadratowy przecinek Pingwiny otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły. Linia 8. zamiana ← prawda. Linia 9. jeżeli zamiana znak równości fałsz dwukropek. Linia 10. przerwij pętlę.
  1. Definiujmy funkcję sortowania bąbelkowego. [linia 1]

  2. 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]

  3. W pętli wewnętrznej przechodzącej po nieuporządkowanych elementach (i pingwinó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ść zmiennej zamiana. [linie 5–8]

  4. W przypadku niewystąpienia jakiejkolwiek zamiany wartość zmiennej zamiana pozostanie równa fał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.

Linia 1. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły Pingwiny otwórz nawias kwadratowy zamknij nawias kwadratowy zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 2. jeżeli Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id znak równości 0 dwukropek. Linia 3. jeżeli Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Płeć znak równości cudzysłów samiec cudzysłów dwukropek. Linia 4. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id ← 1. Linia 5. w przeciwnym razie dwukropek. Linia 6. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id ← 2. Linia 8. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id ← Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id asterysk 1000. Linia 9. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id ← Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id plus ASCII otwórz nawias okrągły Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Gatunek otwórz nawias kwadratowy 0 zamknij nawias kwadratowy zamknij nawias okrągły. Linia 11. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id ← Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id asterysk 1000. Linia 12. Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id ← Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Id plus Pingwiny otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka Wiek. Linia 14. sortuj otwórz nawias okrągły Pingwiny zamknij nawias okrągły. Linia 16. zapisz Pingwiny otwórz nawias kwadratowy 0 zamknij nawias kwadratowy kropka Gatunek przecinek Pingwiny otwórz nawias kwadratowy 19 zamknij nawias kwadratowy kropka Gatunek przecinek Pingwiny otwórz nawias kwadratowy 199 zamknij nawias kwadratowy kropka Gatunek do pliku cudzysłów gatunki kropka txt cudzysłów.
  1. 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.

  2. 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ędzie 2. [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]

  1. Sortujemy teraz całą strukturę – w przedstawionym przykładzie użyty został algorytm sortowania bąbelkowego. [linia 14]

  2. 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:

Linia 1. adeli. Linia 2. bialobrewy. Linia 3. krolewski.

Słownik

indeks
indeks

uporządkowany (zwykle alfabetycznie) spis pojęć, nazwisk, nazw, tematów wraz z numerami stron, na których występują

pętla zagnieżdżona
pętla zagnieżdżona

(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

sortowanie bąbelkowe
sortowanie bąbelkowe

(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