To zadanie egzaminacyjne celowo łączy kilka technik z całego roku, dokładnie tak jak zadania na maturze rozszerzonej — rzadko testują one jeden temat w izolacji.
Plik wyniki.txt zawiera wyniki testu rekrutacyjnego — w każdej linii jedna liczba całkowita (0–100), po jednej osobie. Napisz program, który:
a) wczyta dane z pliku,
b) posortuje wyniki algorytmem MergeSort (Blok 08),
c) obliczy medianę wyników,
d) zapisze do nowego pliku raport.txt trzy najlepsze i trzy najgorsze wyniki oraz obliczoną medianę.
Napisz funkcję sprawdzającą, czy wyrażenie arytmetyczne zapisane w ONP (Blok 12) jest poprawne (tzn. czy po jego obliczeniu na stosie zostaje dokładnie jeden element, bez błędów niedomiaru stosu), a jeśli tak — oblicz jego wartość.
Mając listę sąsiedztwa grafu reprezentującego sieć znajomości, napisz funkcję znajdującą najkrótszą (pod względem liczby kroków) ścieżkę między dwiema wskazanymi osobami, wykorzystując BFS (Blok 07). Jeśli ścieżka nie istnieje, funkcja powinna zwrócić informację o tym fakcie.
Zmodyfikuj klasyczny BFS z Bloku 07 tak, aby oprócz zbioru odwiedzonych wierzchołków przechowywał również "poprzednika" każdego wierzchołka (skąd do niego dotarliśmy). Po zakończeniu BFS, jeśli wierzchołek docelowy został odwiedzony, odtwórz ścieżkę, cofając się przez poprzedników od celu do startu.
Sprawdź, czy potrafisz bez pomocy notatek: wczytać dane z pliku, posortować je odpowiednim algorytmem, oraz uzasadnić dobór algorytmu pod kątem złożoności — to trzy filary, na których opiera się większość zadań programistycznych na maturze rozszerzonej.
1. W zadaniu 1, dlaczego zastosowano akurat MergeSort, a nie np. Counting Sort?
2. Co powinna zrobić poprawna implementacja obliczania ONP, jeśli po przetworzeniu całego wyrażenia na stosie zostanie więcej niż jeden element?
3. Dlaczego do znajdowania najkrótszej ścieżki w nieważonym grafie znajomości używamy BFS, a nie DFS?