Programowanie i struktury danych – egzamin
Organizacja plików: Wszystkie pliki oddawane do sprawdzenia należy zapisać we wspólnym folderze o nazwie będącej numerem indeksu, umieszczonym na pulpicie. Oddajemy tylko źródła programów (pliki o rozszerzeniach .cpp i .h)!!!
Napisać pomocnicze biblioteki oraz program główny dla następującego zadania:
Biuro Logistyki Emerytalno-Finansowej analizuje regularnie dane osobowe obywateli pod kątem osiągnięcia przez nich wieku emerytalnego. W tym celu przetwarza dwa pliki zawierające dane osobowe obywateli. Pierwszy z nich nazywa się "osoby.txt" i zawiera ich dane w przypadkowej kolejności w formacie (kolejne linie):
Nazwisko Imię (oddzielone odstępem)
Drugi plik nazywa się "pesele.txt" i zawiera liczbę linii zgodną z liczbą linii w pierwszym pliku.
Każda linia zawiera numer PESEL danej osoby – pierwsza linia to PESEL pierwszej osoby, druga - drugiej, itd.
Należy wydrukować do pliku "wyniki.txt" listę zawierającą dane obywateli wraz z datami urodzin.
Pierwsze 6 cyfr numeru PESEL koduje datę urodzenia w postaci rrmmdd, gdzie rr oznacza 2 ostatnie cyfry roku urodzenia, a do mm dodawane jest 20 jeśli osoba urodziła się w roku 2000 lub późniejszym (np. 022504 oznacza datę 04.05.2002). Lista ma być uporządkowana od osoby najstarszej do najmłodszej i ma zawierać dane osobowe w następującym formacie (kolejne linie):
Data urodzenia (w formacie dd.mm.rrrr, np. 04.05.2002) Imię
Nazwisko
<pusta linia>
Wymagania formalne:
Program powinien być zapisany w trzech plikach: kontener.h, dane.h i main.cpp (wolno rozbić kontener na kontener.h i kontener.cpp, podobnie z dane.h i dane.cpp).
W plikach dane.* należy umieścić strukturę implementującą dane przetwarzane w programie, przechowywane w kontenerze, wraz z odpowiednimi metodami. Tu powinny znaleźć się też wszystkie pomocnicze funkcje, sprawdzające poprawność danych (na przykład poprawność numeru PESEL). Nie należy umieszczać w tym pliku funkcji formatujących dane do wydruku, ani żadnych innych funkcji używających operacji wejścia-wyjścia.
W plikach kontener.* należy umieścić strukturę odpowiadającą użytemu abstrakcyjnemu typowi danych. Można użyć struktury z typem elementu odpowiadającym strukturze zbudowanej w plikach dane.*. Kontener powinien zapewniać możliwość przechowywania nieograniczonej liczby elementów. Należy umieścić w kontenerze i implementować tylko te metody, które będą używane w programie głównym. Implementacja nie może zależeć od typu elementu, powinna działać tak samo po zmianie tego typu na jakikolwiek inny. Nie może też być tu żadnych operacji wejścia-wyjścia ani formatowania wydruku kontenera.
W pliku main.cpp umieszczamy program główny korzystający z plików kontener.h i dane.h oraz funkcje formatujące wydruk i inne funkcje korzystające z operacji wejścia-wyjścia.
Niedozwolone jest korzystanie z kontenerów i algorytmów z biblioteki standardowej C++.
Zapisu do pliku wynikowego nie wolno rozpocząć przed odczytaniem całości plików wejściowych.
Dodatkowe punkty:
Za obsługę wejścia odporną na błędy użytkownika i za poprawne komentarze, w tym w bibliotekach pomocniczych: cel funkcji, warunki wstępne, warunki końcowe, sytuacje wyjątkowe i ewentualnie zwracany wynik, przyznawane będą dodatkowe punkty. Obsługa wejścia odporna na błędy użytkownika powinna wyglądać następująco:
• w przypadku gdy niepoprawne są dane osoby (czyli nieprawidłowość wystąpiła w pliku osoby.txt), osoba jest wpisywana do pliku wynikowego, przy czym zamiast jej imienia i nazwiska pojawia się adnotacja „DO WERYFIKACJI”,
• w przypadku gdy dane osoby są poprawne, a niepoprawny jest jej numer PESEL (czyli nieprawidłowość wystąpiła w pliku pesele.txt), osoba ta nie jest wpisywana do pliku wynikowego, a odpowiadająca jej linia w pliku osoby.txt jest pomijana.
Kolejne dodatkowe punkty można uzyskać zapewniając w programie obsługę wielu imion osób podanych w pliku osoby.txt z odstępami po nazwisku.
Dodatkowe punkty będą również przyznane za weryfikację poprawności numeru PESEL, który musi być ciągiem 11 cyfr, z których ostatnia to cyfra kontrolna. Weryfikację poprawności tej cyfry realizuje się poprzez wyznaczenie sumy kontrolnej wszystkich cyfr numeru PESEL i sprawdzenie jej podzielności przez 10 (wartość a+3b+7c+9d+e+3f+7g+9h+i+3j+k musi być podzielna przez 10, gdzie literom a-k odpowiadają kolejne cyfry numeru PESEL począwszy od pierwszej, np.
02250412345 nie jest poprawny, a stanie się poprawny gdy ostatnią cyfrę zmienimy na 3 uzyskując numer 02250412343).