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

operacje na plikach:

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>

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.