#include #include #include #include #include #include using namespace std; int next_customer_id; int next_reservation_id; /** * \brief ask a question and get a answer. * \tparam T return parameter * \param question the question. * \return the value. */ template T ask_question(const string& question) { 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!"; } } class address final { private: string street_; string street_no_; string postal_code_; string city_; public: 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) { } 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; } }; 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; public: 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) { } 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; } string get_name() const { return this->name_; } string get_first_name() const { return this->first_name_; } }; class reservation final { private: int id_; string start_ = {}; string end_ = {}; short motorcycle_ = -1; // => -1 means nothing reserved customer* customer_; public: reservation(string start, string end, const short motorcycle, customer* customer) : id_(++next_reservation_id), start_(move(start)), end_(move(end)), motorcycle_(motorcycle), customer_(customer) { } }; string motorcycles[] = { "Suzuki Bandit", "Honda TransAlp", "BMW F 650 GS", "Kawasaki ZZR1400" }; list customers; list reservations; void create_customer(); void create_reservation(); void rent_a_motorcycle(); 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"); 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; 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; } bool validate_date(string& date) { auto day = 0, month = 0, year = 0; const auto res = sscanf_s(date.c_str(), "%2d.%2d.%4d", &day, &month, &year); if (res != 3) return false; if (month < 1 || month > 12) return false; if (day < 1 || day > 31) return false; if (year < 1900 || month > 2200) return false; return true; } string get_validated_date(const string&& question) { while (true) { auto date = ask_question(question + " (tt.mm.jjjj)"); if (validate_date(date)) { return date; } 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; } 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; } } 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(); } 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); reservations.push_back(r); } void rent_a_motorcycle() { } void export_reservations() { }