{"id":40,"date":"2014-04-29T14:07:01","date_gmt":"2014-04-29T12:07:01","guid":{"rendered":"http:\/\/192.100.1.189\/blog\/?p=40"},"modified":"2014-04-29T14:07:01","modified_gmt":"2014-04-29T12:07:01","slug":"der-getraenkeautomat","status":"publish","type":"post","link":"https:\/\/lukas.kurth.rocks\/blog\/2014\/04\/29\/der-getraenkeautomat\/","title":{"rendered":"Der Getr\u00e4nkeautomat"},"content":{"rendered":"<p style=\"text-align: justify;\">Die lieben Leute von der ILS wollten im aktuellen Studienheft einen Getr\u00e4nkeautomaten von mir haben, und folgendes kam dabei raus.<\/p>\n<p style=\"text-align: justify;\">Dazu folgende Erkl\u00e4rung:<\/p>\n<ul>\n<li style=\"text-align: justify;\">Eigentlich wollte ich die \u00dcbergabe mit &#8218;dynamischem&#8216; Array machen, das klappte aber aus verschiedenen Gr\u00fcnden nicht so ganz.<\/li>\n<li style=\"text-align: justify;\">Ich habe mich bei den Hex-Codes f\u00fcr die Umlaute an den ANSI-Code gehalten, den man unter anderem auch <a href=\"http:\/\/www.c-plusplus.de\/forum\/39326-full\">hier<\/a> findet.<\/li>\n<pre class=\"lang:cpp\" toolbar=\"false\" title=\"Zeichentabelle\">\/*Hex-Zeichentabelle f\u00fcr Umlaute\n\n Zeichen     Hex    Okt\n========================\n   '\u00c4'       8E     216\n   '\u00e4'       84     204\n   '\u00d6'       99     231\n   '\u00f6'       94     224\n   '\u00dc'       9A     232\n   '\u00fc'       81     201\n   '\u00df'       E1     341*\/<\/pre>\n<li style=\"text-align: justify;\">Ausgabe der Preise sollte eigentlich auch 2 Nachkommastellen gerundet werden. Dies konnte nach den Unterlagen aber noch nicht bewerkstelligt werden. Deshalb erfolgt die Ausgabe eben mit normalem double-Wert (Bei mir meist 0.5 etc).<\/li>\n<li>M\u00f6glicherweise (h\u00f6chstwahrscheinlich) gibt es bessere L\u00f6sungen, dies hat aber f\u00fcr mich funktioniert \ud83d\ude42<\/li>\n<\/ul>\n<p><!--more--><\/p>\n<pre class=\"lang:cpp\" title=\"\/* Getr\u00e4nkeautomat by Lukas Kurth *\/\" toolbar=\"false\">\/* Getr\u00e4nkeautomat by Lukas Kurth *\/\n\n#include <iostream>\n#include <string>\n#include <cmath>\n\nusing namespace std;\n\n\/\/ Klasse f\u00fcr Getr\u00e4nke\nclass drink {\n    \/\/ Attribute\n    string name;\n    float price;\n    int number;\n\n    \/\/ Methoden\n    public:\n    drink(string tName, int tPrice, int tNumber);\n    ~drink();\n    string getName();   \/\/ Namen auslesen\n    double getPrice();  \/\/ Preis auslesen (Kommawerte)\n    int getNumber();    \/\/ Anzahl Flaschen ausgeben\n    void setNumber(int tNumber);    \/\/ Anzahl Flaschen schreiben\n};\n\n\/\/ Konstruktor\ndrink::drink(string tName, int tPrice, int tNumber) {\n    name = tName;\n    price = tPrice;\n    number = tNumber;\n}\n\nstring drink::getName() {\n    return name;\n}\n\ndouble drink::getPrice() {\n    \/\/ Euro-Betr\u00e4ge ausgeben. Wenn Betr\u00e4ge gerade macht cout.precision nicht viel Sinn.\n    return price\/100;\n}\n\nint drink::getNumber() {\n    return number;\n}\n\nvoid drink::setNumber(int tNumber) {\n    number = tNumber;\n}\n\n\/\/ Destruktor\ndrink::~drink() {\n    cout << \"Instanz der Klasse drink wurde zerstx94rt\" << endl;\n}\n\n\/\/ Klasse f\u00fcr Geldberechnungen\nclass money{\n    \/\/ Attribute\n    int amount, debt, change;\n\n    \/\/ Methoden\n    public:\n    money();    \/\/ Konstruktor\n    ~money();   \/\/ Destruktor\n    void takeDebt(int tValue);  \/\/ Zahlender Betrag berechnen\n    double getChange();         \/\/ Wechselgeld berechnen\n    void setAmount(int tPrice); \/\/ Betrag setzen\n    int getDebt();              \/\/ Forderung \/ Zahlender Betrag\n};\n\nmoney::money() {\n    amount = 0;\n    change = 0;\n    debt = 0;   \/\/ Debt = Schuld, Forderung\n}\n\nvoid money::takeDebt(int tValue) {\n    debt = debt - tValue;\n}\n\nint money::getDebt() {\n    return debt;\n}\n\n\/\/ Wechselgeld berechnen\ndouble money::getChange() {\n    \/\/ Negativ-Wert ausgeben (absoluter Wert)\n    if(debt != 0) {\n        change = abs(debt);\n        return static_cast<double>(change) \/ 100;\n    } else {\n        return 0;\n    }\n}\n\nvoid money::setAmount(int tPrice) {\n    amount = tPrice;    \/\/ Betrag = Schuld\n    debt = amount;      \/\/ Schuld beim vollen Preis\n}\n\nmoney::~money() {\n    cout << \"Instanz der Klasse money wurde zerstx94rt\" << endl;\n}\n\n\/\/ Der Automat (Klasse)\nclass machine {\n    \/\/ Attribute\n    int number;\n\n    money *moneyUnit;   \/\/ Geldeinheit als Teil des Automaten\n    drink *drinkUnit[3]; \/\/ Getr\u00e4nkeeinheit als weiteren Teil\n\n    public:\n    machine(money *tMoney, drink *tDrink[3], int tNumber);  \/\/ Konstruktor\n    ~machine();     \/\/ Destruktor\n    int select();   \/\/ Getr\u00e4nkeauswahl\n    void dispense(int tAuswahl);    \/\/ Getr\u00e4nke ausgeben\n};\n\nmachine::machine(money *tMoney, drink *tDrink[3], int tNumber) {\n    number = tNumber;\n\n    \/\/ Zuweisung der Instanzen\n    moneyUnit = tMoney;\n    \/\/drinkUnit[3] = tDrink[3]; \/\/ Keine Array-Zuweisung\n    for(int i = 0; i < number; i++) {\n        drinkUnit[i] = tDrink[i];\n    }\n}\n\nint machine::select() {\n    int auswahl, change;\n\n    cout << \"Bitte wx84hlen Sie ein Getrx84nk.nFolgende Getrx84nke sind im Angebot:nn\";\n\n    for(int i = 0; i < number; i++) {\n        cout << i + 1 << \" - \" << (drinkUnit[i]->getName()) << endl;\n    }\n\n    cout << \"Geben Sie die Nummer des gewx81nschten Getrx84nks ein:n> \";\n    cin >> auswahl;\n\n    cout << \"nSie haben \" << drinkUnit[auswahl-1]->getName() << \" gewx84hltn\";\n\n    if(drinkUnit[auswahl-1]->getNumber() != 0) {\n        \/\/ Ausgabe mehrerer Flaschen macht f\u00fcr mich keine Sinn\n        cout << \"Sie mx81ssen \" << drinkUnit[auswahl-1]->getPrice() << \" Euro bezahlen.\" << endl;\n        \/\/ Betrag setzen in Cent Betrag (besser zum Rechnen)\n        moneyUnit->setAmount(drinkUnit[auswahl-1]->getPrice()*100);\n\n        do {\n            cout << \"Es fehlen noch \" << moneyUnit->getDebt() << \" Cent\" << endl;\n            cout << \"Bitte Mx81nzen einwerfen (10, 20, 50, 100, 200)n> \";\n            cin >> change;\n            moneyUnit->takeDebt(change);\n        } while (moneyUnit->getDebt() >0);\n\n        \/\/ auswahl = auswahl -1;\n\n        \/\/ Im Automaten eine Flasche weniger\n        drinkUnit[auswahl-1]->setNumber(drinkUnit[auswahl-1]->getNumber() - 1);\n\n        \/\/ Getr\u00e4nk ausgeben\n        dispense(auswahl);\n\n    } else {\n        cout << \"Das gewx94nschte Getrx84nk ist leider nicht mehr vorhanden.\" << endl;\n        auswahl = -1;\n    }\n\n    return auswahl;\n}\n\nvoid machine::dispense(int tAuswahl){\n    \/\/ Anzahl f\u00e4llt weg. Ansonsten: Anzahl kleiner als verf\u00fcgbare Flaschen ??\n    cout << \"nSie erhalten eine Flasche \" << drinkUnit[tAuswahl]->getName();\n    cout << \" und \" << moneyUnit->getChange() << \" Euro Wechselgeldn\" << endl;\n}\n\nmachine::~machine() {\n    cout << \"Instanz der Klasse machine zerstx94rt\" << endl;\n}\n\nint main()\n{\n    int auswahl, number = 3;\n\n    \/\/Instanzen erzeugen\n    machine *automat;\n    money *moneyUnit = new money();\n    drink *drinks[3]; \/\/ Zeiger auf Klasse\n\n    \/\/ Getr\u00e4nke erstellen\n    drinks[0] = new drink(\"Wasser\", 50, 10);\n    drinks[1] = new drink(\"Limonade\", 150, 20);\n    drinks[2] = new drink(\"Vodka\", 1000, 1);\n\n    automat = new machine(moneyUnit, drinks, number);\n\n    cout << \"Getrx84nkeautomat \/ Vending Machine\" << endl;\n    cout << \"#################################n\" << endl;\n\n    do {\n        auswahl = automat->select();\n    } while (auswahl == -1);\n\n    \/\/ Instanzen freigeben\n    delete(moneyUnit);\n    for(int i = 0; i < number; i++) {\n        delete(drinks[i]);\n    }\n    delete(automat);\n\n    return 0;\n}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Die lieben Leute von der ILS wollten im aktuellen Studienheft einen Getr\u00e4nkeautomaten von mir haben, und folgendes kam dabei raus. Dazu folgende Erkl\u00e4rung: Eigentlich wollte ich die \u00dcbergabe mit &#8218;dynamischem&#8216; Array machen, das klappte aber aus verschiedenen Gr\u00fcnden nicht so ganz. Ich habe mich bei den Hex-Codes f\u00fcr die Umlaute an den ANSI-Code gehalten, den [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,15,9],"tags":[],"class_list":["post-40","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-c","category-programmierung"],"_links":{"self":[{"href":"https:\/\/lukas.kurth.rocks\/blog\/wp-json\/wp\/v2\/posts\/40","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lukas.kurth.rocks\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lukas.kurth.rocks\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lukas.kurth.rocks\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lukas.kurth.rocks\/blog\/wp-json\/wp\/v2\/comments?post=40"}],"version-history":[{"count":0,"href":"https:\/\/lukas.kurth.rocks\/blog\/wp-json\/wp\/v2\/posts\/40\/revisions"}],"wp:attachment":[{"href":"https:\/\/lukas.kurth.rocks\/blog\/wp-json\/wp\/v2\/media?parent=40"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lukas.kurth.rocks\/blog\/wp-json\/wp\/v2\/categories?post=40"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lukas.kurth.rocks\/blog\/wp-json\/wp\/v2\/tags?post=40"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}