Revision: 54511
Updated Code
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
Updated Code
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
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
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++