Return to Snippet

Revision: 54511
at January 17, 2012 02:41 by flinke_flasche


Updated Code
/*
 * 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);
}

Revision: 54510
at January 4, 2012 07:21 by flinke_flasche


Updated Code
/*
 * 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);
}

Revision: 54509
at December 30, 2011 18:38 by flinke_flasche


Initial Code
/*
 * 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);
}

Initial URL


Initial Description
HDU Deggendorf - Exercise 1st semester

Initial Title
C++ 2. Einsendeaufgabe

Initial Tags


Initial Language
C++