C++ 2. Einsendeaufgabe


/ Published in: C++
Save to your folder(s)

HDU Deggendorf - Exercise 1st semester


Copy this code and paste it in your HTML
  1. /*
  2.  * Datum: 23.12.2011
  3.  * Hochschule: HDU - Deggendorf
  4.  * Studiengang: 1. Semsester WI
  5.  * Name: Dominik Fischer
  6.  * Kurs: Grundlagen der Softwareentwicklung I
  7.  * Thema: Erste Pr����¯�¿�½������¸fungsstudienarbeit zur Vorlesung
  8.  * Abgabe: Bis 09.01.2011 18:00 Uhr
  9.  */
  10.  
  11. // Standardbibliotheken einbinden
  12. #include <cstdlib>
  13. #include <iostream>
  14. #include <vector>
  15. using namespace std;
  16. // Klasse definieren
  17. class HotelRoom {
  18. private:
  19. int type, nr, days;
  20. bool taken;
  21. string guest;
  22. public:
  23. // Setter
  24. void setType(int);
  25. void setNr(int);
  26. void setDays(int);
  27. void setTaken(bool);
  28. void setGuest(string);
  29.  
  30. // Getter
  31. int getType();
  32. int getNr();
  33. int getDays();
  34. bool isTaken();
  35. string getGuest();
  36.  
  37. // Konstruktoren
  38. HotelRoom();
  39. HotelRoom(int, int, bool, int, string);
  40.  
  41. // Methoden
  42. void printBill();
  43. void book(int, string);
  44. void clear();
  45. void print();
  46. };
  47.  
  48. // Prototypen definieren
  49. void header(char*); // Funktion zum Zeichnen einer Ueberschrift
  50. int getInt(char*, char*, int, int); // Funktion fuer die Eingabe eines Int-Wertes
  51. string getString(char*, char*); // Funktion fuer die Eingabe eines Stings
  52. bool execMenu(); // Ausgabe des Menues
  53. void showRooms(bool, bool); // Zimmer am Bildschirm ausgeben
  54. void bookRoom(); // Zimmer buchen
  55. void clearRoom(); // Zimmer freigeben
  56. void createBill(); // Rechnung erstellen
  57. void searchRoomByNr(); // Zimmer nach Nummer suchen inkl. Eingabe
  58. void searchRoomByGuest(); // Zimmer nach Gast suchen inkl. Eingabe
  59. HotelRoom *findRoomByNr(int); // Zimmer nach Nummer Suchen
  60. HotelRoom *findRoomByGuest(string); // Zimmer nach Gast Suchen
  61. HotelRoom *findFreeRoom(int); // Freies Zimmer nach Typ suchen
  62.  
  63.  
  64. // Konstanten definieren
  65. #define PRICE_DOUBLE 70 // Preis Doppelzimmer
  66. #define PRICE_SINGLE 50 // Preis Einzelzimmer
  67. #define TYPE_DOUBLE 302 // Doppelzimmer-Typ
  68. #define TYPE_SINGLE 301 // Einzelzimmer-Typ
  69. #define COUNT_DOUBLE 10 // Anzahl Doppelzimmer
  70. #define COUNT_SINGLE 10 // Anzahl Einzelzimmer
  71.  
  72.  
  73. // Globaler Vektor fuer alle Zimmer
  74. vector<HotelRoom> rooms(COUNT_DOUBLE + COUNT_SINGLE);
  75.  
  76. /*
  77.  * @return kein Rueckgabewert
  78.  * @desc Startroutine des Programms
  79.  */
  80. int main() {
  81. // Variablen deklaration
  82. bool replay;
  83.  
  84. // Raume vorbelegen
  85. for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) {
  86. // Einzel und Doppelzimmer haben andere Nummern;
  87. if(i >= COUNT_SINGLE) {
  88. rooms[i].setType(TYPE_DOUBLE);
  89. rooms[i].setNr(200 + i);
  90. } else {
  91. rooms[i].setType(TYPE_SINGLE);
  92. rooms[i].setNr(100 + i);
  93. }
  94.  
  95. rooms[i].setTaken(false);
  96. }
  97.  
  98. do {
  99. system("CLS");
  100. header("Willkommen bei der Hotelzimmerverwaltung");
  101.  
  102. replay = execMenu();
  103. system("PAUSE");
  104. } while(replay);
  105.  
  106. return 0;
  107. }
  108.  
  109. /*
  110.  * @return false wenn Programm beendet werden soll
  111.  * @desc Gibt Menue am Bildschirm aus und steuert dessen Eingabe
  112.  */
  113. bool execMenu() {
  114. cout << endl;
  115. cout << " * Informationsabfrage " << endl;
  116. cout << " - Belegte Zimmer anzeigen (1)" << endl;
  117. cout << " - Freie Zimmer anzeigen (2)" << endl;
  118. cout << " - Alle Zimmer anzeigen (3)" << endl;
  119. cout << " * Zimmer belegen (4)" << endl;
  120. cout << " * Zimmer freigeben (5)" << endl;
  121. cout << " * Rechnung erstellen (6)" << endl;
  122. cout << " * Suchen" << endl;
  123. cout << " - Nach Nr (7)" << endl;
  124. cout << " - Nach Gast (8)" << endl;
  125. cout << " * Programmende (9)" << endl;
  126. cout << " " << endl;
  127.  
  128. int choice = getInt("Geben Sie Ihre Auswahl ein:","Es sind nur Werte zwischen 1 und 9 erlaubt",1,9);
  129.  
  130. switch (choice) {
  131. case 1:
  132. showRooms(true, false);
  133. break;
  134. case 2:
  135. showRooms(false, true);
  136. break;
  137. case 3:
  138. showRooms(true, true);
  139. break;
  140. case 4:
  141. bookRoom();
  142. break;
  143. case 5:
  144. clearRoom();
  145. break;
  146. case 6:
  147. createBill();
  148. break;
  149. case 7:
  150. searchRoomByNr();
  151. break;
  152. case 8:
  153. searchRoomByGuest();
  154. break;
  155. case 9:
  156. return false;
  157. break;
  158. }
  159.  
  160. return true;
  161. }
  162.  
  163. /*
  164.  * @desc Bucht freies Zimmer nach Typ mit Tage und Namen
  165.  */
  166. void bookRoom() {
  167. int type = getInt("Doppel-[302] oder Einzelzimmer[301]?","Geben Sie 301 fuer Einzel- und 302 fuer Doppelzimmer ein ",301,302);
  168.  
  169. HotelRoom *r = findFreeRoom(type);
  170. if(!r) {
  171. cout << "Es wurde kein freies Zimmer gefunden!" << endl;
  172. } else {
  173. int days = getInt("Geben Sie die Buchungstage ein:","Ungueltige Nummer eingegeben!",0,365);
  174. string guest = getString("Geben Sie den Gaeste-Namen ein:","Sie muessen einen Gast angeben!");
  175. r->book(days, guest);
  176. }
  177. }
  178.  
  179. /*
  180.  * @desc Liest Zimmernummer ein und gibt das Zimmer aus, falls gefunden
  181.  */
  182. void searchRoomByNr() {
  183. int nr = getInt("Geben Sie die Zimmernummer ein:","Ungueltige Nummer eingegeben!",100,299);
  184.  
  185. HotelRoom *r = findRoomByNr(nr);
  186. if(!r) {
  187. cout << "Das gesuchte Zimmer wurde nicht gefunden!" << endl;
  188. } else {
  189. r->print();
  190. }
  191. }
  192.  
  193.  
  194. /*
  195.  * @desc Liest Gastnamen ein und gibt das Zimmer aus, falls gefunden
  196.  */
  197. void searchRoomByGuest() {
  198. string guest = getString("Geben Sie den Gast ein:","Eingaben erforderlich");
  199.  
  200. HotelRoom *r = findRoomByGuest(guest);
  201. if(!r) {
  202. cout << "Der gesuchte Gast wurde nicht gefunden!" << endl;
  203. } else {
  204. r->print();
  205. }
  206. }
  207.  
  208. /*
  209.  * @desc Liest Zimmernummer ein und gibt dieses Zimmer frei, falls gebucht
  210.  */
  211. void clearRoom() {
  212. int nr = getInt("Geben Sie die Zimmernummer ein:","Ungueltige Nummer eingegeben!",100,299);
  213.  
  214. HotelRoom *r = findRoomByNr(nr);
  215. if(!r) {
  216. cout << "Das gesuchte Zimmer wurde nicht gefunden!" << endl;
  217. } else {
  218. r->clear();
  219. }
  220. }
  221.  
  222. /*
  223.  * @desc Liest Zimmernummer ein und erstellt eine Rechnung, falls gebucht
  224.  */
  225. void createBill() {
  226. int nr = getInt("Geben Sie die Zimmernummer ein:","Ungueltige Nummer eingegeben!",100,299);
  227.  
  228. HotelRoom *r = findRoomByNr(nr);
  229. if(!r) {
  230. cout << "Das gesuchte Zimmer wurde nicht gefunden!" << endl;
  231. } else {
  232. r->printBill();
  233. }
  234. }
  235.  
  236. /*
  237.  * @type Doppel oder Einzelzimmer (siehe Konstanten)
  238.  *
  239.  * @return Das erste freie Zimmer in der Liste mit passendem Typ o. eine Nullreferenz bei keinen Freien
  240.  * @desc Sucht nach einem freien Zimmer
  241.  */
  242. HotelRoom *findFreeRoom(int type) {
  243. HotelRoom *ret, *r;
  244. for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) {
  245. r = &rooms[i];
  246. if(!r->isTaken() && r->getType() == type) {
  247. return r;
  248. }
  249. }
  250. return ret;
  251. }
  252.  
  253. /*
  254.  * @nr Nummer nach der gesucht werden soll
  255.  *
  256.  * @return Das gefundene Zimmer oder eine Nullreferenz bei keinem Gefundenen
  257.  * @desc Sucht nach der Zimmernummer
  258.  */
  259. HotelRoom *findRoomByNr(int nr) {
  260. HotelRoom *ret, *r;
  261. for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) {
  262. r = &rooms[i];
  263. if(r->getNr() == nr) {
  264. return r;
  265. }
  266. }
  267. return ret;
  268. }
  269.  
  270. /*
  271.  * @guest Gast nach dem gesucht werden soll
  272.  *
  273.  * @return Das gefundene Zimmer oder eine Nullreferenz bei keinem Gefundenen
  274.  * @desc Sucht nach dem Gast
  275.  */
  276. HotelRoom *findRoomByGuest(string guest) {
  277. HotelRoom *ret, *r;
  278. for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) {
  279. r = &rooms[i];
  280. if(r->isTaken() && guest.compare(r->getGuest()) == 0) {
  281. return r;
  282. }
  283. }
  284. return ret;
  285. }
  286.  
  287. /*
  288.  * @taken Belegte Zimmer anzeigen
  289.  * @free Freie Zimmer anzeigen
  290.  *
  291.  * @desc Gibt die Zimmer in Listenform aus
  292.  */
  293. void showRooms(bool taken, bool free) {
  294. HotelRoom r;
  295. for(int i = 0; i < COUNT_DOUBLE + COUNT_SINGLE; i++) {
  296. r = rooms[i];
  297. if(r.isTaken() && taken || !r.isTaken() && free) {
  298. r.print();
  299. }
  300. }
  301. }
  302.  
  303. /*
  304.  * @label Ueberschrift
  305.  *
  306.  * @return Kein Rueckgabewert
  307.  * @desc Gibt eine Ueberschrift aus umrandet mit Sternchen
  308.  */
  309. void header(char* label) {
  310. int length = 0;
  311. for(int i = 0; label[i] != '\0'; i++) {
  312. length++;
  313. }
  314.  
  315. for (int i = 0; i < length + 2; i++) {
  316. cout << "*";
  317. }
  318.  
  319. cout << endl << "*" << label << "*" << endl;
  320.  
  321. for (int i = 0; i < length + 2; i++) {
  322. cout << "*";
  323. }
  324.  
  325. cout << endl << endl;
  326. }
  327.  
  328. /*
  329.  * @label Ueberschrift
  330.  * @error Fehlermeldung
  331.  * @min Minimalwert
  332.  * @max Maximalwert
  333.  *
  334.  * @return Den Eingegebenene Int-Wert
  335.  * @desc Gibt das Label aus, erfraegt den Int-Wert, ueberprueft auf Min und Max, sowie gueltige Eingabe (!char, etc.)
  336.  */
  337. int getInt(char* label, char* error, int min, int max) {
  338. bool input_failed = true;
  339. int value = 0;
  340.  
  341. do {
  342. cout << label << endl;
  343. cin >> value;
  344.  
  345. input_failed = (value < min || value > max) || !cin; // Gueltigkeit des Wertes pruefen (!cin prueft auf "nicht" int Eingaben
  346. if(input_failed) {
  347. cout << error << endl << endl;
  348. cin.clear(); // Fehlerstatus loeschen (bei char-Eingaben)
  349. cin.ignore(); // Fehlerhafte Eingabe loeschen (bei char-Eingaben)
  350. }
  351. } while(input_failed);
  352. cout << endl;
  353.  
  354. return value;
  355. }
  356.  
  357. /*
  358.  * @label Ueberschrift
  359.  * @error Fehlermeldung
  360.  *
  361.  * @return Den Eingegebenene String-Wert
  362.  * @desc Gibt das Label aus, erfraegt den String-Wert, ueberprueft auf gueltige Eingabe
  363.  */
  364. string getString(char* label, char* error) {
  365. bool input_failed = true;
  366. string value = "";
  367.  
  368. do {
  369. cout << label << endl;
  370. cin >> value;
  371.  
  372. input_failed = (value.size() == 0) || !cin; // Gueltigkeit des Wertes pruefen (!cin prueft auf "nicht" int Eingaben
  373. if(input_failed) {
  374. cout << error << endl << endl;
  375. cin.clear(); // Fehlerstatus loeschen (bei char-Eingaben)
  376. cin.ignore(); // Fehlerhafte Eingabe loeschen (bei char-Eingaben)
  377. }
  378. } while(input_failed);
  379. cout << endl;
  380.  
  381. return value;
  382. }
  383.  
  384. //KLASSENMETHODEN
  385. // SETTER
  386.  
  387. void HotelRoom::setType(int p_type) {
  388. type = p_type;
  389. }
  390.  
  391. void HotelRoom::setNr(int p_nr) {
  392. nr = p_nr;
  393. }
  394.  
  395. void HotelRoom::setDays(int p_days) {
  396. days = p_days;
  397. }
  398.  
  399. void HotelRoom::setTaken(bool p_taken) {
  400. taken = p_taken;
  401. }
  402.  
  403. void HotelRoom::setGuest(string p_guest) {
  404. guest = p_guest;
  405. }
  406.  
  407. // GETTER
  408.  
  409. int HotelRoom::getType() {
  410. return type;
  411. }
  412.  
  413. int HotelRoom::getNr() {
  414. return nr;
  415. }
  416.  
  417. int HotelRoom::getDays() {
  418. return days;
  419. }
  420.  
  421. bool HotelRoom::isTaken() {
  422. return taken;
  423. }
  424.  
  425. string HotelRoom::getGuest() {
  426. return guest;
  427. }
  428.  
  429. // METHODEN
  430. void HotelRoom::printBill() {
  431. if(this->isTaken()) {
  432. float price, base_price;
  433. char* desc;
  434. if (this->getType() == TYPE_DOUBLE) {
  435. base_price = PRICE_DOUBLE;
  436. desc = "Doppelzimmer";
  437. } else {
  438. base_price = PRICE_SINGLE;
  439. desc = "Einzelzimmer";
  440. }
  441. price = base_price * this->getDays();
  442.  
  443. for(int i = 0; i < 80; i++) { cout << "*"; };
  444. cout << endl << endl;
  445.  
  446. cout << "RECHNUNG" << endl;
  447. cout << "fuer " << this->getGuest() << endl << endl;
  448. cout << this->getDays() << " Tag(e) in Zimmer " << this->getNr() << " (" << desc << "):" << endl;
  449. cout << this->getDays() << " Tag(e) je " << base_price << " Euro ergibt " << price << " Euro Gesamtpreis." << endl << endl;
  450. cout << "Vielen Dank fuer Ihren Aufenthalt!!! Beehren Sie uns bald wieder." << endl;
  451.  
  452.  
  453. cout << endl;
  454. for(int i = 0; i < 80; i++ ) { cout << "*"; }
  455. cout << endl;
  456. } else {
  457. cout << endl << "ZIMMER NICHT BELEGT!" << endl;
  458. }
  459.  
  460. }
  461.  
  462. void HotelRoom::book(int days, string guest) {
  463. if(this->isTaken()) {
  464. cout << "Achtung: Zimmer " << this->getNr() << " ist belegt und kann nicht gebucht werden!" << endl;
  465. } else {
  466. this->setTaken(true);
  467. this->setGuest(guest);
  468. this->setDays(days);
  469. cout << "Info: Zimmer " << this->getNr() << " wurde fuer " << this->getGuest() << " " << this->getDays() << " Tag(e) gebucht." << endl;
  470. }
  471. }
  472.  
  473. void HotelRoom::clear() {
  474. if(isTaken()) {
  475. this->setTaken(false);
  476. this->setGuest("");
  477. this->setDays(0);
  478. cout << "Info: Zimmer " << this->getNr() << " wurde freigegeben." << endl;
  479. } else {
  480. cout << "Info: Zimmer ist bereits frei." << endl;
  481. }
  482. }
  483.  
  484. void HotelRoom::print() {
  485. cout << "Zimmer " << getNr();
  486. if(getType() == TYPE_DOUBLE) { cout << " (Doppelzimmer)"; }
  487. else { cout << " (Einzelzimmer)"; }
  488.  
  489. cout << " ist ";
  490. if(isTaken()) {
  491. cout << "belegt von " << getGuest() << " fuer " << getDays() << " Tage." << endl;
  492. } else {
  493. cout << "frei." << endl;
  494. }
  495. }
  496.  
  497. // KONSTRUKTOREN
  498.  
  499. HotelRoom::HotelRoom() {
  500. HotelRoom(0, 0, false, 0, "");
  501. }
  502. HotelRoom::HotelRoom(int p_nr, int p_type, bool p_taken, int p_days, string p_guest) {
  503. setNr(p_nr);
  504. setType(p_type);
  505. setTaken(p_taken);
  506. setDays(p_days);
  507. setGuest(p_guest);
  508. }

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.