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: enum class
    • plik nagłowkowy <fstream>
    • strumien wyjściowy (zapis do pliku) ofstream
    • strumień wejściowy (odczyt z pliku) ifstream
  • odczyt linii tekstu ze strumienia wejściowego funkcją getline
  • zamiana liczb na napisy: funkcja to_string(), funkcja stoi()
  • wyszukiwanie znaków w napisie metodą find(), wyodrębnianie podciągu znakow z napisu metodą substr
  • algorytm sortowania funkcją sort z pliku nagłowkowego <algorithm>

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

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:

  1. 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.
  2. Wyświetl - wyświetlenie aktualnej zawartości bazy danych (wszystkich rekordów).
  3. Sortuj - posortowanie rekordów alfabetycznie wg. nazwisk
  4. 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.