Prenesite si datoteko students.csv v kateri se nahaja seznam študentov. V datoteki je v vsaki posamezni vrstici zapisan študent v obliki id,name,surname,dateOfBirth,street,post,country. Datum je zapisan v formatu day.month.year.

Primer ene vrstice:

100432031,Simon,Novak,3.4.2001,Partizanska cesta 1,1000 Ljubljana,Slovenija

Napišite razred Address, ki ima:
    instančne spremenljivke street, post, country in vse naj bodo tipa string
    konstruktor s 3 parametri (za vsako instančno spremenljivko)
    metodo toString

Uporabite razred Date iz predhodnih nalog. Razred naj ima:
    instančne spremenljivke day, month, year in vse naj bodo tipa int
    konstruktor s tremi paramteri (za vsako instančno spremenljivko)
    metode get za vsako instančno spremenljivko
    metodo toString ter dodatno:
    razredo metodo (static) GetDateFromString, ki kot edini parameter prejme datum v obliki niza in ga vrne kot Date. V metodi prožite/vržite (throw) izjemo (UnparseableDateException), če podan niz, ki vsebuje datum, ni v pravem formatu. Izjemo npr. prožite, če datum ne vsebuje točno dve piki in če je namesto številke zapisana črka.

Napišite razred Student, ki ima:
    instančne spremenljivke id (unsigned int), name (string), surname (string), dateOfBirth (Date), address (Address)
    konstruktor s 4 parametri (za vsako instančno spremenljivko)
    metodo toString
    razredno (static) metodo std::vector<std::shared_ptr<Student>> LoadFromFile(const std::string &filename), ki iz datoteke prebere seznam študentov, jih shrani v vektor in le-tega vrne. Pri branju posameznega študenta iz datoteke v primeru napačnega formata datuma ulovite izjemo UnparseableDateException (try - catch blok)
    razredno (static) metodo void SaveToFile(const std::vector<std::shared_ptr<Student>> &students, const std::string &fileName), ki v datoteko zapiše prejeti seznam študentov. Pri tem zapišite v formatu, da boste lahko z LoadFromFile prebrali.

Napišite izjemo (razred) UnparseableDateException, ki naj deduje iz sistemskega razreda std::exception. Potrebno je povoziti (angl. override) metodo const char* what() const noexcept iz nadrazreda exception. Razredu UnparseableDateException dodajte še lastnost std::string message in konstruktor, ki kot parameter prejme (napačen) datum v obliki niza in v spremenljivko message shranimo npr. niz Unparseable date: "21.5a.2020".

Pomagajte si z naslednjo povezavo: http://www.cplusplus.com/doc/tutorial/exceptions/.

V glavnem programu najprej iz datoteke preberite študente in vektor s študenti izpišite v konzolo.

V nalogi uporabljate pametne kazalce za ustvarjanje objektov shared_ptr iz standarda C++11. (https://en.cppreference.com/w/cpp/memory/shared_ptr)

Pomoč za delo z datotekami: Za delo z datotekami si pomagajte z naslednjo povezavo: http://www.cplusplus.com/doc/tutorial/files/. Glede na to, da so podatki shranjeni v csv (angl. comma-separated values) formatu, si lahko pomagate z metodo getline(istream &is, string &str, char delim), kjer parameter is predstavlja objekt istream, iz katerega preberemo podatke, parameter str je spremenljivka, v katero se shrani prebran niz in parameter delim predstavlja ločilo, do katerega bo (trenutni) niz prebran. V vašem primeru bo prvi parameter predstavljal vhodno datoteko, drugi parameter bo spremenljivka, v katero boste shranili prebrano vrednost, tretja vrednost pa bo znak vejica (,).

students.csv