/ Published in: C++
HDU Deggendorf - Exercise 1st semester
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
/* * Datum: 23.12.2011 * Hochschule: HDU - Deggendorf * Studiengang: 1. Semsester WI * Name: Dominik Fischer * Kurs: Grundlagen der Softwareentwicklung I * Thema: Erste Pr����¯�¿�½������¸fungsstudienarbeit zur Vorlesung * Abgabe: Bis 09.01.2011 18:00 Uhr */ // Standardbibliotheken einbinden #include <cstdlib> #include <iostream> #include <vector> using namespace std; // Klasse definieren class HotelRoom { private: int type, nr, days; bool taken; string guest; public: // Setter void setType(int); void setNr(int); void setDays(int); void setTaken(bool); void setGuest(string); // Getter int getType(); int getNr(); int getDays(); bool isTaken(); string getGuest(); // Konstruktoren HotelRoom(); HotelRoom(int, int, bool, int, string); // Methoden void printBill(); void book(int, string); void clear(); void print(); }; // Prototypen definieren void header(char*); // Funktion zum Zeichnen einer Ueberschrift int getInt(char*, char*, int, int); // Funktion fuer die Eingabe eines Int-Wertes string getString(char*, char*); // Funktion fuer die Eingabe eines Stings bool execMenu(); // Ausgabe des Menues void showRooms(bool, bool); // Zimmer am Bildschirm ausgeben void bookRoom(); // Zimmer buchen void clearRoom(); // Zimmer freigeben void createBill(); // Rechnung erstellen void searchRoomByNr(); // Zimmer nach Nummer suchen inkl. Eingabe void searchRoomByGuest(); // Zimmer nach Gast suchen inkl. Eingabe HotelRoom *findRoomByNr(int); // Zimmer nach Nummer Suchen HotelRoom *findRoomByGuest(string); // Zimmer nach Gast Suchen HotelRoom *findFreeRoom(int); // Freies Zimmer nach Typ suchen // Konstanten definieren #define PRICE_DOUBLE 70 // Preis Doppelzimmer #define PRICE_SINGLE 50 // Preis Einzelzimmer #define TYPE_DOUBLE 302 // Doppelzimmer-Typ #define TYPE_SINGLE 301 // Einzelzimmer-Typ #define COUNT_DOUBLE 10 // Anzahl Doppelzimmer #define COUNT_SINGLE 10 // Anzahl Einzelzimmer // Globaler Vektor fuer alle Zimmer vector<HotelRoom> rooms(COUNT_DOUBLE + COUNT_SINGLE); /* * @return kein Rueckgabewert * @desc Startroutine des Programms */ int main() { // Variablen deklaration bool replay; // Raume vorbelegen for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) { // Einzel und Doppelzimmer haben andere Nummern; if(i >= COUNT_SINGLE) { rooms[i].setType(TYPE_DOUBLE); rooms[i].setNr(200 + i); } else { rooms[i].setType(TYPE_SINGLE); rooms[i].setNr(100 + i); } rooms[i].setTaken(false); } do { system("CLS"); header("Willkommen bei der Hotelzimmerverwaltung"); replay = execMenu(); system("PAUSE"); } while(replay); return 0; } /* * @return false wenn Programm beendet werden soll * @desc Gibt Menue am Bildschirm aus und steuert dessen Eingabe */ bool execMenu() { cout << endl; cout << " * Informationsabfrage " << endl; cout << " - Belegte Zimmer anzeigen (1)" << endl; cout << " - Freie Zimmer anzeigen (2)" << endl; cout << " - Alle Zimmer anzeigen (3)" << endl; cout << " * Zimmer belegen (4)" << endl; cout << " * Zimmer freigeben (5)" << endl; cout << " * Rechnung erstellen (6)" << endl; cout << " * Suchen" << endl; cout << " - Nach Nr (7)" << endl; cout << " - Nach Gast (8)" << endl; cout << " * Programmende (9)" << endl; cout << " " << endl; int choice = getInt("Geben Sie Ihre Auswahl ein:","Es sind nur Werte zwischen 1 und 9 erlaubt",1,9); switch (choice) { case 1: showRooms(true, false); break; case 2: showRooms(false, true); break; case 3: showRooms(true, true); break; case 4: bookRoom(); break; case 5: clearRoom(); break; case 6: createBill(); break; case 7: searchRoomByNr(); break; case 8: searchRoomByGuest(); break; case 9: return false; break; } return true; } /* * @desc Bucht freies Zimmer nach Typ mit Tage und Namen */ void bookRoom() { int type = getInt("Doppel-[302] oder Einzelzimmer[301]?","Geben Sie 301 fuer Einzel- und 302 fuer Doppelzimmer ein ",301,302); HotelRoom *r = findFreeRoom(type); if(!r) { cout << "Es wurde kein freies Zimmer gefunden!" << endl; } else { int days = getInt("Geben Sie die Buchungstage ein:","Ungueltige Nummer eingegeben!",0,365); string guest = getString("Geben Sie den Gaeste-Namen ein:","Sie muessen einen Gast angeben!"); r->book(days, guest); } } /* * @desc Liest Zimmernummer ein und gibt das Zimmer aus, falls gefunden */ void searchRoomByNr() { int nr = getInt("Geben Sie die Zimmernummer ein:","Ungueltige Nummer eingegeben!",100,299); HotelRoom *r = findRoomByNr(nr); if(!r) { cout << "Das gesuchte Zimmer wurde nicht gefunden!" << endl; } else { r->print(); } } /* * @desc Liest Gastnamen ein und gibt das Zimmer aus, falls gefunden */ void searchRoomByGuest() { string guest = getString("Geben Sie den Gast ein:","Eingaben erforderlich"); HotelRoom *r = findRoomByGuest(guest); if(!r) { cout << "Der gesuchte Gast wurde nicht gefunden!" << endl; } else { r->print(); } } /* * @desc Liest Zimmernummer ein und gibt dieses Zimmer frei, falls gebucht */ void clearRoom() { int nr = getInt("Geben Sie die Zimmernummer ein:","Ungueltige Nummer eingegeben!",100,299); HotelRoom *r = findRoomByNr(nr); if(!r) { cout << "Das gesuchte Zimmer wurde nicht gefunden!" << endl; } else { r->clear(); } } /* * @desc Liest Zimmernummer ein und erstellt eine Rechnung, falls gebucht */ void createBill() { int nr = getInt("Geben Sie die Zimmernummer ein:","Ungueltige Nummer eingegeben!",100,299); HotelRoom *r = findRoomByNr(nr); if(!r) { cout << "Das gesuchte Zimmer wurde nicht gefunden!" << endl; } else { r->printBill(); } } /* * @type Doppel oder Einzelzimmer (siehe Konstanten) * * @return Das erste freie Zimmer in der Liste mit passendem Typ o. eine Nullreferenz bei keinen Freien * @desc Sucht nach einem freien Zimmer */ HotelRoom *findFreeRoom(int type) { HotelRoom *ret, *r; for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) { r = &rooms[i]; if(!r->isTaken() && r->getType() == type) { return r; } } return ret; } /* * @nr Nummer nach der gesucht werden soll * * @return Das gefundene Zimmer oder eine Nullreferenz bei keinem Gefundenen * @desc Sucht nach der Zimmernummer */ HotelRoom *findRoomByNr(int nr) { HotelRoom *ret, *r; for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) { r = &rooms[i]; if(r->getNr() == nr) { return r; } } return ret; } /* * @guest Gast nach dem gesucht werden soll * * @return Das gefundene Zimmer oder eine Nullreferenz bei keinem Gefundenen * @desc Sucht nach dem Gast */ HotelRoom *findRoomByGuest(string guest) { HotelRoom *ret, *r; for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) { r = &rooms[i]; if(r->isTaken() && guest.compare(r->getGuest()) == 0) { return r; } } return ret; } /* * @taken Belegte Zimmer anzeigen * @free Freie Zimmer anzeigen * * @desc Gibt die Zimmer in Listenform aus */ void showRooms(bool taken, bool free) { HotelRoom r; for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) { r = rooms[i]; if(r.isTaken() && taken || !r.isTaken() && free) { r.print(); } } } /* * @label Ueberschrift * * @return Kein Rueckgabewert * @desc Gibt eine Ueberschrift aus umrandet mit Sternchen */ void header(char* label) { int length = 0; for(int i = 0; label[i] != '\0'; i++) { length++; } for (int i = 0; i < length + 2; i++) { cout << "*"; } cout << endl << "*" << label << "*" << endl; for (int i = 0; i < length + 2; i++) { cout << "*"; } cout << endl << endl; } /* * @label Ueberschrift * @error Fehlermeldung * @min Minimalwert * @max Maximalwert * * @return Den Eingegebenene Int-Wert * @desc Gibt das Label aus, erfraegt den Int-Wert, ueberprueft auf Min und Max, sowie gueltige Eingabe (!char, etc.) */ int getInt(char* label, char* error, int min, int max) { bool input_failed = true; int value = 0; do { cout << label << endl; cin >> value; input_failed = (value < min || value > max) || !cin; // Gueltigkeit des Wertes pruefen (!cin prueft auf "nicht" int Eingaben if(input_failed) { cout << error << endl << endl; cin.clear(); // Fehlerstatus loeschen (bei char-Eingaben) cin.ignore(); // Fehlerhafte Eingabe loeschen (bei char-Eingaben) } } while(input_failed); cout << endl; return value; } /* * @label Ueberschrift * @error Fehlermeldung * * @return Den Eingegebenene String-Wert * @desc Gibt das Label aus, erfraegt den String-Wert, ueberprueft auf gueltige Eingabe */ string getString(char* label, char* error) { bool input_failed = true; string value = ""; do { cout << label << endl; cin >> value; input_failed = (value.size() == 0) || !cin; // Gueltigkeit des Wertes pruefen (!cin prueft auf "nicht" int Eingaben if(input_failed) { cout << error << endl << endl; cin.clear(); // Fehlerstatus loeschen (bei char-Eingaben) cin.ignore(); // Fehlerhafte Eingabe loeschen (bei char-Eingaben) } } while(input_failed); cout << endl; return value; } //KLASSENMETHODEN // SETTER void HotelRoom::setType(int p_type) { type = p_type; } void HotelRoom::setNr(int p_nr) { nr = p_nr; } void HotelRoom::setDays(int p_days) { days = p_days; } void HotelRoom::setTaken(bool p_taken) { taken = p_taken; } void HotelRoom::setGuest(string p_guest) { guest = p_guest; } // GETTER int HotelRoom::getType() { return type; } int HotelRoom::getNr() { return nr; } int HotelRoom::getDays() { return days; } bool HotelRoom::isTaken() { return taken; } string HotelRoom::getGuest() { return guest; } // METHODEN void HotelRoom::printBill() { if(this->isTaken()) { float price, base_price; char* desc; if (this->getType() == TYPE_DOUBLE) { base_price = PRICE_DOUBLE; desc = "Doppelzimmer"; } else { base_price = PRICE_SINGLE; desc = "Einzelzimmer"; } price = base_price * this->getDays(); for(int i = 0; i < 80; i++) { cout << "*"; }; cout << endl << endl; cout << "RECHNUNG" << endl; cout << "fuer " << this->getGuest() << endl << endl; cout << this->getDays() << " Tag(e) in Zimmer " << this->getNr() << " (" << desc << "):" << endl; cout << this->getDays() << " Tag(e) je " << base_price << " Euro ergibt " << price << " Euro Gesamtpreis." << endl << endl; cout << "Vielen Dank fuer Ihren Aufenthalt!!! Beehren Sie uns bald wieder." << endl; cout << endl; for(int i = 0; i < 80; i++ ) { cout << "*"; } cout << endl; } else { cout << endl << "ZIMMER NICHT BELEGT!" << endl; } } void HotelRoom::book(int days, string guest) { if(this->isTaken()) { cout << "Achtung: Zimmer " << this->getNr() << " ist belegt und kann nicht gebucht werden!" << endl; } else { this->setTaken(true); this->setGuest(guest); this->setDays(days); cout << "Info: Zimmer " << this->getNr() << " wurde fuer " << this->getGuest() << " " << this->getDays() << " Tag(e) gebucht." << endl; } } void HotelRoom::clear() { if(isTaken()) { this->setTaken(false); this->setGuest(""); this->setDays(0); cout << "Info: Zimmer " << this->getNr() << " wurde freigegeben." << endl; } else { cout << "Info: Zimmer ist bereits frei." << endl; } } void HotelRoom::print() { cout << "Zimmer " << getNr(); if(getType() == TYPE_DOUBLE) { cout << " (Doppelzimmer)"; } else { cout << " (Einzelzimmer)"; } cout << " ist "; if(isTaken()) { cout << "belegt von " << getGuest() << " fuer " << getDays() << " Tage." << endl; } else { cout << "frei." << endl; } } // KONSTRUKTOREN HotelRoom::HotelRoom() { HotelRoom(0, 0, false, 0, ""); } HotelRoom::HotelRoom(int p_nr, int p_type, bool p_taken, int p_days, string p_guest) { setNr(p_nr); setType(p_type); setTaken(p_taken); setDays(p_days); setGuest(p_guest); }