Projekt: baza danych osobowych

Podsumowanie zajęć:

klasy i obiekty, pola i metody

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)

Dodatkowe zagadnienia:

typ wyliczeniowy: enum class

odczyt linii tekstu ze strumienia wejściowego funkcją getline

pola i metody statyczne

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 funkcjonalnoś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

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 oddzielone spacją)

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ć wszystkie pola obiektu poprzez argumenty

operator << umieszczający rekord w strumieniu wyjsciowym ostream, np. w takiej postaci
Imiona Nazwisko, 21-11-1999, Mezczyzna

metodę statyczną WczytajOsobe

static Osoba WczytajOsobe()

która tworzy obiekt Osoba i wypełnia wszystkie pola obiektu danymi podanymi przez użytkownika ze standardowego wejścia cin. Użytkownik proszony jest o wypełnienie wszystkich pól rekordu (imię, nazwisko, data urodzenia, płeć). Metoda zwraca wypełniony obiekt Osoba.

operator porównania < służący do porównania kolejności dwóch rekordów pod względem nazwiska

bool Osoba::operator<(const Osoba&)

Operator zwraca wartość true lub false w zależności od porządku obiektów a < b i moze być wykorzystany do posortowania rekordów alfabetycznie

Klasa: Data

Obiekt klasy Data posiada pola (prywatne):

dzien: liczba całkowita

miesiąc: liczba całkowita (lub typ wyliczeniowy Stycznen=1, Luty=2, ..., Grudzien=12)

rok: liczba całkowita

Operacje publiczne:

konstruktor domyślny, ustawia datę 1 stycznia 1960 r.

konstruktor pozwalający zainicjować wszystkie pola obiektu

operator << wypisujący do strumienia wyjsciowego ostream datę w postaci DD-MM-YYYY

Klasa: Baza

Obiekt klasy Baza przechowuje zbiór rekordów (obiektów klasy Osoba) oraz pozwala na manipulację zawartością i wyświetlanie bazy danych. Rekordy przechowywane są w dynamicznie tworzonej tablicy, która jest powiększana w miarę dodawania nowych rekordów.

Atrybuty (prywatne pola):

osoby: adres do tablicy przechowującej rekordy (obiekty klasy Osoba)

rozmiar: rozmiar tablicy zawierającej rekordy

ile_elementow: ilość rekordów znajdujących się w bazie danych

ROZMIAR_DOMYSLNY: stała statyczna zawierająca domyślny rozmiar bazy danych (100)

Operacje (publiczne metody):

konstruktor domniemany tworzy pustą bazę o domyślnym rozmiarze (ROZMIAR_DOMYSLNY)

konstruktor tworzący pustą bazę o rozmiarze wskazanym w argumencie

destruktor

metoda Dodaj dodająca pojedynczy rekord do bazy danych

Baza& Dodaj(const Osoba&)

Nowy rekord dodawany jest jako ostatni element kolekcji rekordów. Jeżeli rozmiar bazy jest wyczerpany (ilość rekordów jest równa dostępnemu rozmiarowi) to przed dodaniem nowego rekordu rozmiar bazy danych jest zwiększany dwukrotnie. Należy zaimplementować odpowiednią metodę prywatną, która będzie odpowiedzialna za zwiększenie rozmiaru tablicy przechowującej rekordy.

operator << wypisujący do strumienia wyjściowego ostream całą zawartość bazy danych

metoda Sortuj powoduje posortowanie kolejności rekordów alfabetycznie względem nazwisk.
Do posortowana można wykorzystać funkcję std::sort z biblioteki <algorithm> lub mozna spróbować samodzielnie zaimplementować algorytm sortowania, wykorzystujący operator porównania < zdefiniowany w klasie Osoba.

konstruktor kopiujacy oraz dociążony operator przypisania operator=

Zadanie 5: Baza danych osobowych

Dokończ implementację klas Baza, Osoba, Data zgodnie z powyższą specyfikacją i zrealizuj program, który będzie wykorzystywał te klasy do zarządzania prostą bazą danych osobowych w następujący sposób. Podczas uruchomienia programu tworzona jest pusta baza danych o domyślnym rozmiarze. Następnie program wypisuje menu umożliwiające użytkownikowi podjęcie jednej z czterech 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ć).

Wyświetl - wyświetlenie aktualnej zawartości bazy danych (wszystkich rekordów).

Sortuj - posortowanie alfabetycznie (wg nazwisk) wszystkich rekordów w bazie danych.

Zamknij - zakończenie programu.

Po wykonaniu wybranej przez użytkownika akcji menu wyświetlane jest ponownie. Użytkownik może podjąć kolejną akcję, aż do momentu wybrania ostatniej pozycji menu, która zamyka program.

Rozwiązanie w postaci plików nagłówkowych *.h i źródłowych *.cpp umieść w Moodle Zadanie 5