Informacje wstępne

Zadania maturalne, które wymagają napisania programu i w przypadku których najlepszym wyjściem jest zastosowanie algorytmu sortującego, bardzo często wymagają wczytania danych z pliku. Operacja ta realizowana jest w sposób zależny od języka programowania. Trzeba ją opanować, aby podać rozwiązanie zadania.

W tym e‑materiale zastosujemy algorytm sortowania przez zliczanie. Jak wiemy, należy on do stabilnych algorytmów sortowaniastabilny algorytm sortowaniastabilnych algorytmów sortowania; oznacza to, że podczas sortowania zbioru zachowywana jest kolejność elementów mających takie same wartości klucza.

Zadanie 1. Szkoła tańca

W pewnej organizacji zrzeszającej profesjonalnych tancerzy wprowadzono informatyzacjęinformatyzacjainformatyzację. Wszyscy tancerze otrzymali numery identyfikacyjne. Każdy tancerz należy do jednego i tylko jednego zespołu tanecznego. Do organizacji zapisało się pięć zespołów tanecznych; do każdego z nich należy przynajmniej jeden tancerz.

Wszyscy tancerze zostali zapisani na liście. W każdej jej linii znajdują się trzy informacje w następującej kolejności: numer zespołu, punkty turniejowe, numer identyfikacyjny tancerza. Parametr punkty turniejowe należy do zakresu od 100 do 500 włącznie. Kilku tancerzy może mieć taką samą liczbę punktów turniejowych i nie wszystkie wartości liczbowe są wykorzystane.

Lista jest uporządkowana niemalejąco według numerów identyfikacyjnych tancerzy, jednak osoba odpowiedzialna za całą organizację chce dysponować bardziej szczegółowymi informacjami.

W pliku DANE_TANCERZE.txt zapisano 20 wierszy – w każdym z nich znajdują się trzy liczby całkowite oznaczające odpowiednio: numer zespołu, punkty turniejowe (większa liczba odpowiada większej liczbie zgromadzonych punktów) oraz numer identyfikacyjny tancerza. Informacje o tancerzach zapisane są w kolejności rosnącej, zgodnie z ich numerami identyfikacyjnymi. Znakiem oddzielającym informacje w danym wierszu jest pojedyncza spacja.

Przykładowe dane wejściowe:

Linia 1. 3 489 1. Linia 2. 2 142 9. Linia 3. 4 142 14. Linia 4. 1 156 15. Linia 5. 4 142 16.
RtPo5XKSrLJD5

Plik testowy TXT zawierający wartości liczbowe.

Plik TXT o rozmiarze 189.00 B w języku polskim

Zadanie 1.1

Napisz program w wybranym języku programowania, który utworzy nową listę, gdzie tancerze będą uporządkowani niemalejąco zgodnie ze swoją liczbą punktów turniejowych. Jeśli dwóch tancerzy ma taką samą liczbę punktów turniejowych, powinni być zapisani na liście w kolejności niemalejącej, zgodnie z numerami identyfikacyjnymi. Odpowiedź zapisz do pliku podpunkt1_odp.txt.

Poprawny wynik dla przykładowych danych wejściowych:

Linia 1. 2 142 9. Linia 2. 4 142 14. Linia 3. 4 142 16. Linia 4. 1 156 15. Linia 5. 3 489 1.

Do oceny oddajesz:

  • plik podpunkt1_odp.txt z odpowiedzią (lista tancerzy uporządkowana niemalejąco zgodnie z liczbą punktów turniejowych),

  • plik(i) z komputerową realizacją programu (kodem źródłowym).

Przedstawimy rozwiązanie zadania w postaci pseudokodu. Założymy, że informacje z pliku zapisaliśmy w tablicy dwuwymiarowej. Pamiętaj jednak, że pisząc własny program, musisz zadbać o prawidłowe wczytywanie danych z pliku.

Podaj rozwiązanie zadania, pisząc program w jednym z trzech języków: C++, Java lub Python. Zadbaj o prawidłowe wczytanie danych z pliku tekstowego. Odpowiedź do zadania dla przykładowych danych znajdziesz w osobnym pliku po omówieniu pseudokodu.

Rozwiązanie:

Zastosujemy algorytm sortowania przez zliczanie. Najpierw do programu wczytujemy informacje o tancerzach. Następnie tworzymy tablicę o nazwie listaTancerzy, w której zliczone są wystąpienia każdej liczby punktów turniejowych. Dalej, zgodnie z algorytmem sortowania przez zliczanie, w każdej komórce tablicy sumowane są liczby z tej oraz poprzedniej komórki, zaczynając od drugiej komórki tablicy. Następnie zostaje utworzona druga tablica, która zawiera listę tancerzy uporządkowaną niemalejąco według ich liczby punktów turniejowych - tablica ta zwrócona będzie jako wynik całego zadania.

Linia 1. wczytaj n. Linia 2. wczytaj listatancerzy otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy. Linia 3. licznik znak równości 0. Linia 4. min znak równości 100. Linia 5. max znak równości 500. Linia 6. tablicaZliczen otwórz nawias kwadratowy max minus min plus 1 zamknij nawias kwadratowy. Linia 8. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek max minus min wykonuj dwukropek prawy ukośnik prawy ukośnik zerowanie tablic. Linia 9. tablicaZliczen otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0. Linia 11. dopóki licznik otwórz nawias ostrokątny n wykonuj dwukropek. Linia 12. tablicaZliczen otwórz nawias kwadratowy listatancerzy otwórz nawias kwadratowy licznik zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy minus min zamknij nawias kwadratowy znak równości tablicaZliczen otwórz nawias kwadratowy listatancerzy otwórz nawias kwadratowy licznik zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy minus min zamknij nawias kwadratowy plus 1. Linia 13. licznik znak równości licznik plus 1. Linia 15. dla i znak równości 1 przecinek 2 kropka kropka kropka przecinek max minus min wykonuj dwukropek prawy ukośnik prawy ukośnik tu z pominięciem zera wykrzyknik. Linia 16. tablicaZliczen otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości tablicaZliczen otwórz nawias kwadratowy i minus 1 zamknij nawias kwadratowy plus tablicaZliczen otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 18. nowaListaTancerzy otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy. Linia 20. dla i znak równości n minus 1 przecinek n minus 2 przecinek n minus 3 przecinek kropka kropka kropka przecinek 0 wykonuj dwukropek. Linia 21. numerZespolu znak równości listatancerzy otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 22. punktyTurniejowe znak równości listatancerzy otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy. Linia 23. identyfikatorTancerza znak równości listatancerzy otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy. Linia 24. tablicaZliczen otwórz nawias kwadratowy punktyTurniejowe minus min zamknij nawias kwadratowy znak równości tablicaZliczen otwórz nawias kwadratowy punktyTurniejowe minus min zamknij nawias kwadratowy minus 1. Linia 25. indeksWTablicyWynikowej znak równości tablicaZliczen otwórz nawias kwadratowy punktyTurniejowe minus min zamknij nawias kwadratowy. Linia 26. nowaListaTancerzy otwórz nawias kwadratowy indeksWTablicyWynikowej zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy znak równości numerZespolu. Linia 27. nowaListaTancerzy otwórz nawias kwadratowy indeksWTablicyWynikowej zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy znak równości punktyTurniejowe. Linia 28. nowaListaTancerzy otwórz nawias kwadratowy indeksWTablicyWynikowej zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy znak równości identyfikatorTancerza. Linia 30. zwróć nowaListaTancerzy.

Odpowiedź do zadania dla danych zawartych w pliku tekstowym:

R129wAqE6TfGv

Przycisk do pobrania pliku TXT z wynikiem zadania.

Plik TXT o rozmiarze 189.00 B w języku polskim

Zadanie 1.2

Napisz program, który utworzy nową listę tancerzy, posortowaną według numerów zespołu (od 5 do 5). W przypadku tancerzy należących do tego samego zespołu należy posortować ich zgodnie z liczbą punktów turniejowych (od najmniejszej do największej). Tancerze mający taką samą liczbę punktów turniejowych powinni być posortowani niemalejąco zgodnie z ich identyfikatorami.

Lista tancerzy, posortowana według ich numerów zespołu, a w ramach zespołu – zgodnie z liczbą punktów turniejowych. Tancerze o identycznych liczbach punktów turniejowych powinni być posortowani niemalejąco zgodnie z numerem identyfikacyjnym.

Poprawny wynik dla przykładowych danych wejściowych:

Linia 1. 1 156 15. Linia 2. 2 142 9. Linia 3. 3 489 1. Linia 4. 4 142 14. Linia 5. 4 142 16.

Do oceny oddajesz:

  • plik podpunkt2_odp.txt z odpowiedzią (lista tancerzy uporządkowana niemalejąco według ich numerów zespołu, a w ramach zespołu - zgodnie z liczbą punktów turniejowych; tancerze o identycznych liczbach punktów turniejowych powinni być posortowani niemalejąco zgodnie z numerem identyfikacyjnym),

  • plik(i) z komputerową realizacją programu (kodem źródłowym).

Przedstawimy rozwiązanie zadania w postaci pseudokodu. Założymy, że informacje z pliku zapisaliśmy w tablicy dwuwymiarowej. Pamiętaj jednak, że pisząc własny program, musisz zadbać o prawidłowe wczytywanie danych z pliku.

Podaj rozwiązanie zadania, pisząc program w jednym z trzech języków: C++, Java lub Python. Zadbaj o prawidłowe wczytanie danych z pliku tekstowego. Odpowiedź do zadania dla przykładowych danych znajdziesz w osobnym pliku po omówieniu pseudokodu.

Rozwiązanie:

W poprzednim podpunkcie lista tancerzy została posortowana według ich liczby punktów turniejowych. Ponieważ na oryginalnej liście byli oni wpisani zgodnie z numerami identyfikacyjnymi, to pod względem liczby punktów turniejowych również są posortowani w takiej kolejności w tablicy z poprzedniego zadania. Jeżeli wykorzystamy teraz algorytm sortowania przez zliczanie, aby posortować listę z poprzedniego podpunktu zgodnie z numerami zespołów, uzyskamy listę, na której:

  • tancerze będą posortowani ze względu na przynależność do zespołu (od 1 do 5),

  • tancerze wchodzący w skład zespołu będą posortowani zgodnie ze swoją liczbą punktów turniejowych niemalejąco,

  • w ramach jednego zespołu i przy takiej samej liczby punktów turniejowych tancerze będą posortowani zgodnie ze swoim numerem identyfikacyjnym niemalejąco.

W obu przypadkach jest to zgodne ze wstępnymi założeniami, dlatego też w naszym rozwiązaniu skorzystamy z pseudokodu użytego w poprzednim zadaniu.

Linia 1. wczytaj n. Linia 2. wczytaj listatancerzy otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy. Linia 3. licznik znak równości 0. Linia 4. min znak równości 100. Linia 5. max znak równości 500. Linia 6. tablicaZliczen otwórz nawias kwadratowy max minus min plus 1 zamknij nawias kwadratowy. Linia 8. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek max minus min wykonuj dwukropek prawy ukośnik prawy ukośnik zerowanie tablic. Linia 9. tablicaZliczen otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0. Linia 11. dopóki licznik otwórz nawias ostrokątny n wykonuj dwukropek. Linia 12. tablicaZliczen otwórz nawias kwadratowy listatancerzy otwórz nawias kwadratowy licznik zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy minus min zamknij nawias kwadratowy znak równości tablicaZliczen otwórz nawias kwadratowy listatancerzy otwórz nawias kwadratowy licznik zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy minus min zamknij nawias kwadratowy plus 1. Linia 13. licznik znak równości licznik plus 1. Linia 15. dla i znak równości 1 przecinek 2 kropka kropka kropka przecinek max minus min wykonuj dwukropek prawy ukośnik prawy ukośnik tu z pominięciem zera wykrzyknik. Linia 16. tablicaZliczen otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości tablicaZliczen otwórz nawias kwadratowy i minus 1 zamknij nawias kwadratowy plus tablicaZliczen otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 18. nowaListaTancerzy otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy. Linia 20. dla i znak równości n minus 1 przecinek n minus 2 przecinek n minus 3 przecinek kropka kropka kropka przecinek 0 wykonuj dwukropek. Linia 21. numerZespolu znak równości listatancerzy otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 22. punktyTurniejowe znak równości listatancerzy otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy. Linia 23. identyfikatorTancerza znak równości listatancerzy otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy. Linia 24. tablicaZliczen otwórz nawias kwadratowy punktyTurniejowe minus min zamknij nawias kwadratowy znak równości tablicaZliczen otwórz nawias kwadratowy punktyTurniejowe minus min zamknij nawias kwadratowy minus 1. Linia 25. indeksWTablicyWynikowej znak równości tablicaZliczen otwórz nawias kwadratowy punktyTurniejowe minus min zamknij nawias kwadratowy. Linia 26. nowaListaTancerzy otwórz nawias kwadratowy indeksWTablicyWynikowej zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy znak równości numerZespolu. Linia 27. nowaListaTancerzy otwórz nawias kwadratowy indeksWTablicyWynikowej zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy znak równości punktyTurniejowe. Linia 28. nowaListaTancerzy otwórz nawias kwadratowy indeksWTablicyWynikowej zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy znak równości identyfikatorTancerza. Linia 30. listatancerzy znak równości nowaListaTancerzy. Linia 32. prawy ukośnik prawy ukośnik odwrócenie kolejnosci tablicy. Linia 33. start znak równości 0. Linia 34. koniec znak równości n minus 1. Linia 35. dopóki start otwórz nawias ostrokątny koniec wykonuj dwukropek. Linia 36. tempPluton znak równości nowalistaTancerzy otwórz nawias kwadratowy start zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 37. temppunktyTurniejowe znak równości nowalistaTancerzy otwórz nawias kwadratowy start zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy. Linia 38. tempIdent znak równości nowalistaTancerzy otwórz nawias kwadratowy start zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy. Linia 39. listatancerzy otwórz nawias kwadratowy start zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy znak równości listatancerzy otwórz nawias kwadratowy koniec zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 40. listatancerzy otwórz nawias kwadratowy start zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy znak równości listatancerzy otwórz nawias kwadratowy koniec zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy. Linia 41. listatancerzy otwórz nawias kwadratowy start zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy znak równości listatancerzy otwórz nawias kwadratowy koniec zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy. Linia 42. listatancerzy otwórz nawias kwadratowy koniec zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy znak równości tempPluton. Linia 43. listatancerzy otwórz nawias kwadratowy koniec zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy znak równości temppunktyTurniejowe. Linia 44. listatancerzy otwórz nawias kwadratowy koniec zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy znak równości tempIdent. Linia 45. start znak równości start plus 1. Linia 46. koniec znak równości koniec minus 1. Linia 48. licznik znak równości 0. Linia 49. min znak równości 1. Linia 50. max znak równości 5. Linia 51. tablicaZliczen otwórz nawias kwadratowy max minus min plus 1 zamknij nawias kwadratowy. Linia 53. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek max minus min wykonuj dwukropek prawy ukośnik prawy ukośnik zerowanie tablic. Linia 54. tablicaZliczen otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0. Linia 56. dopóki licznik otwórz nawias ostrokątny n wykonuj dwukropek. Linia 57. tablicaZliczen otwórz nawias kwadratowy listatancerzy otwórz nawias kwadratowy licznik zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy minus min zamknij nawias kwadratowy znak równości tablicaZliczen otwórz nawias kwadratowy listatancerzy otwórz nawias kwadratowy licznik zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy minus min zamknij nawias kwadratowy plus 1. Linia 58. licznik znak równości licznik plus 1. Linia 60. dla i znak równości 1 przecinek 2 kropka kropka kropka przecinek max minus min wykonuj dwukropek prawy ukośnik prawy ukośnik tu z pominięciem zera wykrzyknik. Linia 61. tablicaZliczen otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości tablicaZliczen otwórz nawias kwadratowy i minus 1 zamknij nawias kwadratowy plus tablicaZliczen otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 63. nowaListaTancerzy otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy. Linia 65. dla i znak równości n minus 1 przecinek n minus 2 przecinek n minus 3 przecinek kropka kropka kropka przecinek 0 wykonuj dwukropek. Linia 66. numerZespolu znak równości listatancerzy otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 67. punktyTurniejowe znak równości listatancerzy otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy. Linia 68. identyfikatorTancerza znak równości listatancerzy otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy. Linia 69. tablicaZliczen otwórz nawias kwadratowy numerZespolu minus min zamknij nawias kwadratowy znak równości tablicaZliczen otwórz nawias kwadratowy numerZespolu minus min zamknij nawias kwadratowy minus 1. Linia 70. indeksWTablicyWynikowej znak równości tablicaZliczen otwórz nawias kwadratowy numerZespolu minus min zamknij nawias kwadratowy. Linia 71. nowaListaTancerzy otwórz nawias kwadratowy indeksWTablicyWynikowej zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy znak równości numerZespolu. Linia 72. nowaListaTancerzy otwórz nawias kwadratowy indeksWTablicyWynikowej zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy znak równości punktyTurniejowe. Linia 73. nowaListaTancerzy otwórz nawias kwadratowy indeksWTablicyWynikowej zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy znak równości identyfikatorTancerza. Linia 76. zwróć nowaListaTancerzy.

Odpowiedź do zadania dla danych zapisanych w pliku tekstowym:

R8LPBzK5iBbYr

Przycisk do pobrania pliku TXT z wynikiem zadania.

Plik TXT o rozmiarze 191.00 B w języku polskim

Słownik

informatyzacja
informatyzacja

wykorzystywanie nowoczesnych metod przetwarzania informacji w gospodarce, technice itp.

stabilny algorytm sortowania
stabilny algorytm sortowania

algorytm, w przypadku którego zachowywana jest kolejność elementów o tej samej wartości klucza (należące do sortowanego zbioru elementy nie są zamieniane miejscami, jeżeli wartość ich klucza jest identyczna)