From f7e90c0eab17a27f0ff596998f312c38d061f8a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20B=C3=B6rchers?= Date: Wed, 26 Dec 2018 22:33:22 +0100 Subject: [PATCH] working on validation --- src/Motorradvermietung.cpp | 597 +++++++++++++++++++------------------ 1 file changed, 303 insertions(+), 294 deletions(-) diff --git a/src/Motorradvermietung.cpp b/src/Motorradvermietung.cpp index 434229a..541452b 100644 --- a/src/Motorradvermietung.cpp +++ b/src/Motorradvermietung.cpp @@ -17,191 +17,191 @@ int next_reservation_id; template T ask_question(const string& question) { - cout << question << ": "; - T value; - cin >> value; - return value; + cout << question << ": "; + T value; + cin >> value; + return value; } bool ask_question(const string& question) { - while (true) - { - const auto answer = ask_question(question + " (J/N)"); - if (answer == 'j' || answer == 'J') - { - return true; - } - if (answer == 'n' || answer == 'N') - { - return false; - } - cout << "Ungueltige Eigabe. Bitte noch einmal versuchen!"; - } + while (true) + { + const auto answer = ask_question(question + " (J/N)"); + if (answer == 'j' || answer == 'J') + { + return true; + } + if (answer == 'n' || answer == 'N') + { + return false; + } + cout << "Ungueltige Eigabe. Bitte noch einmal versuchen!"; + } } class date final { private: - unsigned short day_; - unsigned short month_; - unsigned short year_; + unsigned short day_; + unsigned short month_; + unsigned short year_; public: - date(const unsigned short day, const unsigned short month, const unsigned short year) : day_(day), month_(month), - year_(year) - { - } + date(const unsigned short day, const unsigned short month, const unsigned short year) : day_(day), month_(month), + year_(year) + { + } - int get_sum() const - { - return year_ + month_ + day_; - } + int get_sum() const + { + return year_ + month_ + day_; + } }; class address final { private: - string street_; - string street_no_; - string postal_code_; - string city_; + string street_; + string street_no_; + string postal_code_; + string city_; public: - address() = default; + address() = default; - address(const string&& street, const string&& street_no, const string&& postal_code, const string&& city) : - street_(street), - street_no_(street_no), - postal_code_(postal_code), - city_(city) - { - } + address(const string&& street, const string&& street_no, const string&& postal_code, const string&& city) : + street_(street), + street_no_(street_no), + postal_code_(postal_code), + city_(city) + { + } - friend istream& operator>>(istream& istr, address& address) - { - cout << "Strasse: "; - istr >> address.street_; - cout << "Hausnummer: "; - istr >> address.street_no_; - cout << "Postleitzahl: "; - istr >> address.postal_code_; - cout << "Ort: "; - istr >> address.city_; - return istr; - } + friend istream& operator>>(istream& istr, address& address) + { + cout << "Strasse: "; + istr >> address.street_; + cout << "Hausnummer: "; + istr >> address.street_no_; + cout << "Postleitzahl: "; + istr >> address.postal_code_; + cout << "Ort: "; + istr >> address.city_; + return istr; + } - friend ostream& operator<<(ostream& ostr, const address& customer) - { - ostr << "Strasse: " << customer.street_ << endl; - ostr << "Hausnummer: " << customer.street_no_ << endl; - ostr << "Postleitzahl: " << customer.postal_code_ << endl; - ostr << "Ort: " << customer.city_ << endl; - return ostr; - } + friend ostream& operator<<(ostream& ostr, const address& customer) + { + ostr << "Strasse: " << customer.street_ << endl; + ostr << "Hausnummer: " << customer.street_no_ << endl; + ostr << "Postleitzahl: " << customer.postal_code_ << endl; + ostr << "Ort: " << customer.city_ << endl; + return ostr; + } }; class customer final { private: - int id_; - string name_; - string first_name_; - address address_; - unsigned short year_of_birth_ = 1900; - string phone_no_; - bool has_driving_license_ = false; + int id_; + string name_; + string first_name_; + address address_; + unsigned short year_of_birth_ = 1900; + string phone_no_; + bool has_driving_license_ = false; public: - customer() : id_(++next_customer_id) - { - } + customer() : id_(++next_customer_id) + { + } - customer(string&& name, string&& first_name, address&& address, unsigned short&& year_of_birth, string&& phone_no, - bool&& has_driving_license) : id_(++next_customer_id), - name_(name), - first_name_(first_name), - address_(address), - year_of_birth_(year_of_birth), - phone_no_(phone_no), - has_driving_license_(has_driving_license) - { - } + customer(string&& name, string&& first_name, address&& address, unsigned short&& year_of_birth, string&& phone_no, + bool&& has_driving_license) : id_(++next_customer_id), + name_(name), + first_name_(first_name), + address_(address), + year_of_birth_(year_of_birth), + phone_no_(phone_no), + has_driving_license_(has_driving_license) + { + } - friend istream& operator>>(istream& istr, customer*& customer) - { - cout << "Name: "; - istr >> customer->name_; - cout << "Vorname: "; - istr >> customer->first_name_; - cout << "Geburtsjahr: "; - istr >> customer->year_of_birth_; - istr >> customer->address_; - cout << "Telefonnumer: "; - istr >> customer->phone_no_; - customer->has_driving_license_ = ask_question("Fuehrerschein der Klasse A?"); - return istr; - } + friend istream& operator>>(istream& istr, customer*& customer) + { + cout << "Name: "; + istr >> customer->name_; + cout << "Vorname: "; + istr >> customer->first_name_; + cout << "Geburtsjahr: "; + istr >> customer->year_of_birth_; + istr >> customer->address_; + cout << "Telefonnumer: "; + istr >> customer->phone_no_; + customer->has_driving_license_ = ask_question("Fuehrerschein der Klasse A?"); + return istr; + } - friend ostream& operator<<(ostream& ostr, const customer& customer) - { - ostr << "Name: " << customer.name_ << endl; - ostr << "Vorname: " << customer.first_name_ << endl; - ostr << "Geburtsjahr: " << customer.year_of_birth_ << endl; - ostr << customer.address_; - ostr << "Telefonnummer: " << customer.phone_no_ << endl; - ostr << "Fuehrerschein " << (customer.has_driving_license_ ? "" : "nicht ") << "vorhanden." << endl; - return ostr; - } + friend ostream& operator<<(ostream& ostr, const customer& customer) + { + ostr << "Name: " << customer.name_ << endl; + ostr << "Vorname: " << customer.first_name_ << endl; + ostr << "Geburtsjahr: " << customer.year_of_birth_ << endl; + ostr << customer.address_; + ostr << "Telefonnummer: " << customer.phone_no_ << endl; + ostr << "Fuehrerschein " << (customer.has_driving_license_ ? "" : "nicht ") << "vorhanden." << endl; + return ostr; + } - string get_name() const - { - return this->name_; - } + string get_name() const + { + return this->name_; + } - string get_first_name() const - { - return this->first_name_; - } + string get_first_name() const + { + return this->first_name_; + } }; class reservation final { private: - int id_; - date start_; - date end_; - short motorcycle_ = -1; // => -1 means nothing reserved - customer* customer_; + int id_; + date start_; + date end_; + short motorcycle_ = -1; // => -1 means nothing reserved + customer* customer_; public: - reservation(const date start, const date end, const short motorcycle, customer* customer) : - id_(++next_reservation_id), - start_(start), - end_(end), - motorcycle_(motorcycle), - customer_(customer) - { - } + reservation(const date start, const date end, const short motorcycle, customer* customer) : + id_(++next_reservation_id), + start_(start), + end_(end), + motorcycle_(motorcycle), + customer_(customer) + { + } - date get_start_date() const - { - return start_; - } + date get_start_date() const + { + return start_; + } - date get_end_date() const - { - return end_; - } + date get_end_date() const + { + return end_; + } - short get_motorcycle() const - { - return motorcycle_; - } + short get_motorcycle() const + { + return motorcycle_; + } }; string motorcycles[] = { - "Suzuki Bandit", - "Honda TransAlp", - "BMW F 650 GS", - "Kawasaki ZZR1400" + "Suzuki Bandit", + "Honda TransAlp", + "BMW F 650 GS", + "Kawasaki ZZR1400" }; list customers; @@ -213,194 +213,203 @@ void export_reservations(); int main() { - try - { - while (true) - { - system("cls"); - cout << "Motorradvermietung (" << reservations.size() << " Reservierungen; " << customers.size() << - " Kunden)" - << endl << endl; - cout << "Bitte w\x84hlen Sie eine Option:" << endl; - cout << "1: Neuen Kunden anlegen" << endl; - cout << "2: Erstellen einer Reservierung" << endl; - cout << "3: Motorrad herausgeben" << endl; - cout << "4: Reservierungen exportieren" << endl; - cout << endl; - cout << "0: Programm beenden" << endl; - const auto input = ask_question("Ihre Eingabe"); + try + { + while (true) + { + system("cls"); + cout << "Motorradvermietung (" << reservations.size() << " Reservierungen; " << customers.size() << + " Kunden)" + << endl << endl; + cout << "Bitte w\x84hlen Sie eine Option:" << endl; + cout << "1: Neuen Kunden anlegen" << endl; + cout << "2: Erstellen einer Reservierung" << endl; + cout << "3: Motorrad herausgeben" << endl; + cout << "4: Reservierungen exportieren" << endl; + cout << endl; + cout << "0: Programm beenden" << endl; + const auto input = ask_question("Ihre Eingabe"); - switch (input) - { - case 1: - create_customer(); - break; - case 2: - create_reservation(); - break; - case 3: - rent_a_motorcycle(); - break; - case 4: - export_reservations(); - break; - case 0: - return 0; - default: - cout << "Unerlaubte Eingabe" << endl; - system("pause"); - } - } - } - catch (...) - { - cout << "Etwas unvorhergesehendes ist passiert. Tut mir leid." << endl; - system("pause"); - } + switch (input) + { + case 1: + create_customer(); + break; + case 2: + create_reservation(); + break; + case 3: + rent_a_motorcycle(); + break; + case 4: + export_reservations(); + break; + case 0: + return 0; + default: + cout << "Unerlaubte Eingabe" << endl; + system("pause"); + } + } + } + catch (...) + { + cout << "Etwas unvorhergesehendes ist passiert. Tut mir leid." << endl; + system("pause"); + } } void create_customer() { - while (true) - { - system("cls"); - cout << "Neuen Kunden anlegen" << endl; - cout << "------------------------------------" << endl; + while (true) + { + system("cls"); + cout << "Neuen Kunden anlegen" << endl; + cout << "------------------------------------" << endl; - auto c = new customer; - cin >> c; - cout << endl << endl; - cout << *c; - if (ask_question("Angaben korrekt?")) - { - customers.push_back(c); - return; - } - } + auto c = new customer; + cin >> c; + cout << endl << endl; + cout << *c; + if (ask_question("Angaben korrekt?")) + { + customers.push_back(c); + return; + } + } } vector find_customers_by_name(const string& name) { - vector result; - for (auto customer : customers) - { - if (customer->get_name() == name) - { - result.push_back(customer); - } - } - return result; + vector result; + for (auto customer : customers) + { + if (customer->get_name() == name) + { + result.push_back(customer); + } + } + return result; } date get_validated_date(const string&& question) { - while (true) - { - auto date_as_string = ask_question(question + " (tt.mm.jjjj)"); + while (true) + { + auto date_as_string = ask_question(question + " (tt.mm.jjjj)"); - auto day = 0, month = 0, year = 0; - const auto res = sscanf_s(date_as_string.c_str(), "%2d.%2d.%4d", - &day, - &month, - &year); + auto day = 0, month = 0, year = 0; + const auto res = sscanf_s(date_as_string.c_str(), "%2d.%2d.%4d", + &day, + &month, + &year); - if (res == 3 && (month >= 1 && month <= 12) && (day >= 1 && day <= 31) && (year >= 1900 && month <= 2200)) - { - return date{ - static_cast(day), - static_cast(month), - static_cast(year) - }; - } - cout << "Fehlerhafte Eingabe." << endl; - } + if (res == 3 && (month >= 1 && month <= 12) && (day >= 1 && day <= 31) && (year >= 1900 && month <= 2200)) + { + return date{ + static_cast(day), + static_cast(month), + static_cast(year) + }; + } + cout << "Fehlerhafte Eingabe." << endl; + } } customer* find_customer_by_first_name(const vector& filtered_customers, const string& first_name) { - for (auto c : filtered_customers) - { - if (c->get_first_name() == first_name) - { - return c; - } - } - return nullptr; + for (auto c : filtered_customers) + { + if (c->get_first_name() == first_name) + { + return c; + } + } + return nullptr; } int select_motorcycle() { - while (true) - { - cout << "Bitte w\x84hlen sie ein Motorrad aus:" << endl; - auto index = 0; - for (const auto& cycle : motorcycles) - { - cout << ++index << ": " << cycle << endl; - } - const auto answer = ask_question("Auswahl"); - const auto size = static_cast(sizeof(motorcycles) / sizeof(*motorcycles)); - if (answer > 0 && answer <= size) - { - return answer - 1; - } - cout << "Ung\x81ltige Eingabe" << endl << endl; - } + while (true) + { + cout << "Bitte w\x84hlen sie ein Motorrad aus:" << endl; + auto index = 0; + for (const auto& cycle : motorcycles) + { + cout << ++index << ": " << cycle << endl; + } + const auto answer = ask_question("Auswahl"); + const auto size = static_cast(sizeof(motorcycles) / sizeof(*motorcycles)); + if (answer > 0 && answer <= size) + { + return answer - 1; + } + cout << "Ung\x81ltige Eingabe" << endl << endl; + } } bool validate_reservation(reservation* const reservation) { - for (auto r : reservations) - { - if (r->get_motorcycle() == reservation->get_motorcycle()) - { - if (reservation->get_start_date().get_sum() > r->get_end_date().get_sum()) - { - //TODO - } - } - } - return true; + const auto start_sum = reservation->get_start_date().get_sum(); + const auto end_sum = reservation->get_end_date().get_sum(); + for (auto r : reservations) + { + if (r->get_motorcycle() == reservation->get_motorcycle()) + { + if (start_sum < r->get_end_date().get_sum() && end_sum > r->get_start_date().get_sum() + || end_sum > r->get_start_date().get_sum() && end_sum < r->get_end_date().get_sum()) + { + return false; + } + } + } + return true; } void create_reservation() { - system("cls"); - const auto name = ask_question("Name des Kunden"); - auto customers = find_customers_by_name(name); - customer* current; - if (customers.size() > 1) - { - const auto first_name = ask_question("Vorname des Kunden"); - current = find_customer_by_first_name(customers, first_name); - if (current == nullptr) - { - cout << "Kunde nicht gefunden" << endl; - system("pause"); - return; - } - } - else if (customers.empty()) - { - cout << "Kunde nicht gefunden" << endl; - system("pause"); - return; - } - else - { - current = customers.front(); - } + system("cls"); + const auto name = ask_question("Name des Kunden"); + auto customers = find_customers_by_name(name); + customer* current; + if (customers.size() > 1) + { + const auto first_name = ask_question("Vorname des Kunden"); + current = find_customer_by_first_name(customers, first_name); + if (current == nullptr) + { + cout << "Kunde nicht gefunden" << endl; + system("pause"); + return; + } + } + else if (customers.empty()) + { + cout << "Kunde nicht gefunden" << endl; + system("pause"); + return; + } + else + { + current = customers.front(); + } - const auto start_date = get_validated_date("Startdatum"); - const auto end_date = get_validated_date("Enddatum"); - const auto motorcycle = select_motorcycle(); - const auto r = new reservation(start_date, end_date, motorcycle, current); - if (validate_reservation(r)) - { - reservations.push_back(r); - } + const auto start_date = get_validated_date("Startdatum"); + const auto end_date = get_validated_date("Enddatum"); + const auto motorcycle = select_motorcycle(); + const auto r = new reservation(start_date, end_date, motorcycle, current); + if (validate_reservation(r)) + { + reservations.push_back(r); + } + else + { + cout << "Reservierung konnte nicht angelegt werden." << endl; + cout << "Die Zeitperiode ueberschneidet sich mit einer vorhandenen Reservierung" << endl; + system("pause"); + } } void rent_a_motorcycle()