====== Podsumowanie: Projekt baza danych ====== * klasy i obiekty * zakresy dostępu, hermetyzacja: private, public * konstruktory (domniemany, kopiujący), destruktory * przeciążanie funkcji, przeciążanie operatorów (operator przypisania) * strumienie (''iostream''), łańcuchy znakowe (''string'') * typ wyliczeniowy: [[https://en.cppreference.com/w/cpp/language/enum|enum class]] * [[https://cplusplus.com/doc/tutorial/files/|operacje na plikach]]: * plik nagłowkowy '''' * strumien wyjściowy (zapis do pliku) [[https://cplusplus.com/reference/fstream/ofstream/|ofstream]] * strumień wejściowy (odczyt z pliku) [[https://cplusplus.com/reference/fstream/ifstream/|ifstream]] * odczyt linii tekstu ze strumienia wejściowego funkcją [[https://cplusplus.com/reference/string/string/getline/|getline]] * zamiana liczb na napisy: funkcja [[https://en.cppreference.com/w/cpp/string/basic_string/to_string|to_string()]], funkcja [[https://en.cppreference.com/w/cpp/string/basic_string/stol|stoi()]] * wyszukiwanie znaków w napisie metodą [[https://www.algorytm.edu.pl/biblioteki/string/find.html|find()]], wyodrębnianie podciągu znakow z napisu metodą [[https://en.cppreference.com/w/cpp/string/basic_string/substr|substr]] * algorytm sortowania funkcją [[https://en.cppreference.com/w/cpp/algorithm/sort|sort]] z pliku nagłowkowego [[https://en.cppreference.com/w/cpp/header/algorithm|]] ===== Projekt: Baza danych osobowych ===== Zaimplementuj program realizujący bazę danych przechowującą dane osobowe: imię (lub imiona), nazwisko, data urodzenia, płeć. Baza danych powinna umożliwiać następujące funcjonalności: * dodanie pojedynczego rekordu do bazy danych * wypełnienie rekordu (imię, nazwisko, płec osoby) danymi podanymi przez użytkownika * wyświetlenie rekordów oraz całej bazy danych * zapis bazy danych do pliku * odczyt zapisanego wcześniej stanu bazy danych * sortowanie kolejności rekordów względem nazwiska Zaproponuj i zaimplementuj odpowiednie klasy pozwalające na realizację programu w postaci obiektowej (klasa Baza, Osoba, Data). Zadbaj o hermetyzację (pola klas powinny byc prywatne). ==== Klasa: Osoba ==== Obiekt klasy ''Osoba'' reprezentuje pojedynczy rekord z danymi osobowymi. Atrybuty (prywatne pola): * ''nazwisko'': napis zawierający nazwisko * ''imie'': napis zawierający imię (lub imiona) * ''data_urodzenia'': obiekt klasy ''Data'' reprezentujący datę urodzenia * ''plec'': wartość wyliczeniowa ''Kobieta'', ''Mezczyzna'' lub ''Nieznana'' Operacje (publiczne metody): * konstruktor domyślny * konstruktor pozwalający zainicjować obiekt podanym imieniem, nazwiskiem, data urodzenia i informacją o płci * operator porównania ''<'' bool Osoba::operator<(const Osoba&) który porównuje kolejność dwóch rekordów pod względem nazwiska (bedzie wymagane do posortowania rekordów alfabetycznie) * operator ''<<'' umieszczający rekord w strumieniu wyjsciowym, np. w takiej postaci \\ Imie Nazwisko, 21-11-1999, Mezczyzna ==== Klasa: Data ==== Obiekt klasy ''Data'' posiada pola: * ''dzien'': liczba całkowita * ''miesiąc'': liczba całkowita (lub typ wyliczeniowy ''Stycznen''=1, ''Luty''=2, ..., ''Grudzien''=12) * ''rok'': liczba całkowita Operacje: * konstruktor domyślny (data 1 stycznia 1960 r.) * konstruktor pozwalający zainicjować wszystkie pola obiektu * operator ''<<'' wypisujący do strumienia wyjsciowego datę w postaci ''DD-MM'YYYY'' ==== Klasa: Baza ==== Obiekt klasy ''Baza'' przechowuje listę rekordów (obiektów klasy ''Osoba'') oraz pozwala na manipulację zawartością i wyświetlanie bazy. Atrybuty (prywatne pola): * ''osoby'': adres do tablicy przechowującej rekordy * ''rozmiar'': rozmiar tablicy zawierającej rekordy * ''ilosc'': ilość rekordów znajdujących się w bazie danych Operacje (publiczne metody): * konstruktor domniemany tworzy pustą bazę o rozmiarze 100 * konstruktor tworzący pustą bazę o rozmiarze wskazanym w argumencie * destruktor * metoda ''Dodaj'' dodająca pojedynczy rekord do bazy danych void Dodaj(const Osoba&) Nowy rekord dodawany jest na końcu rekordów. Jeżeli rozmiar bazy jest wyczerpany (ilość rekordów wyczerpała dostepny rozmiar) to przed dodaniem nowego rekordu rozmiar bazy danych jest zwiększany dwukrotnie * operator ''<<'' wypisujący do strumienia wyjściowego całą zawartość bazy danych * metoda ''Zapisz'', która zapisuje zawartość bazy danych do wskazanego pliku void Zapis(const char* nazwa_pliku) * metoda ''Wczytaj'', która wypełnia bazę danych zawartością podanego pliku void Wczytaj(const char* nazwa_pliku) Zakładamy, że wskazany plik został utworzony wcześniej metodą ''Zapisz''. Zaproponuj odpowiedni format zapisu/odczytu danych tak aby metoda ''Wczytaj'' była w stanie bezbłednie odtworzyć wczesniej zapisany stan bazy * metoda ''Sortuj'' powoduje posortowanie kolejności rekordów alfabetycznie względem nazwisk * konstruktor kopiujacy oraz dociążony operator przypisania ===== Program ==== Napisz program, który korzystając z klas ''Baza'', ''Osoba'', ''Data'' będzie realizował następujące działanie. Program wypisuje menu umożliwiając użytkownikowi podjęcie jednej akcji do wykonania: - **Dodaj** - dodanie nowego rekordu do bazy danych. Użytkownik proszony jest o wypełnienie wszystkich pól nowego rekordu (imię, nazwisko, data urodzenia, płeć). Nowy rekord dodawany jest automatycznie na końcu bazy danych. - **Wyświetl** - wyświetlenie aktualnej zawartości bazy danych (wszystkich rekordów). - **Sortuj** - posortowanie rekordów alfabetycznie wg. nazwisk - **Zamknij** - zapisanie aktualnego stanu bazy danych do pliku oraz zamknięcie programu. Po wykonaniu akcji menu wyświetlane jest ponownie i użytkownik może podjąć inną akcję aż do momentu zakonczenia programu. Przy pierwszym uruchomieniu program startuje z pustą bazą danych. W momencie zamknięcia programu (po wybraniu opcji 4 z menu) aktualny stan bazy danych jest zapisywany w pliku znajdującym się w bieżącym katalogu programu. Przy każdym kolejnym uruchomieniu programu, jeszcze przed wypisaniem menu, program sprawdza, czy w bieżącym katalogu znajduje się plik zawierający zapis bazy danych z poprzedniego uruchomienia. Jeżeli plik istnieje to stan bazy danych zostaje odtworzony z tego pliku i program kontynuuje swoje działanie.