Habe Einen Wahrscheinlich kleinen Denkfehler
-
Also es geht um Folgenden Code:
#include <iostream> #include <cmath> using namespace std; class muenzeinheit { int betrag; int nochZuZahlen; int rueckgeld; public: void init(); void muenzenAnnehmen(int wert); int rueckgeldGeben(); void setBetrag(int preis); int getnochZuZahlen(); }; void muenzeinheit::init() { betrag = 0; nochZuZahlen = 0; rueckgeld = 0; } void muenzeinheit::muenzenAnnehmen(int wert) { nochZuZahlen = nochZuZahlen - wert; } int muenzeinheit::rueckgeldGeben() { rueckgeld = abs(nochZuZahlen); return rueckgeld; } void muenzeinheit::setBetrag(int preis) { betrag = preis; nochZuZahlen = betrag; } int muenzeinheit::getnochZuZahlen() { return nochZuZahlen; } class getraenke { string getraenk[3]; int anzahlFlaschen[3]; int kostenProFlasche[3]; muenzeinheit *zahlomat; public: void init(); int getraenkeWaehlen(); void getraenkeAusgeben(int anzahl, int getraenkeIndex); }; void getraenke::init() { getraenk[0] = "Limonade"; getraenk[1] = "Wasser"; getraenk[2] = "Bier"; anzahlFlaschen[0] = 10; anzahlFlaschen[1] = 10; anzahlFlaschen[2] = 10; kostenProFlasche[0] = 15; kostenProFlasche[1] = 10; kostenProFlasche[2] = 13; zahlomat = new muenzeinheit(); zahlomat->init(); } int getraenke::getraenkeWaehlen() { int auswahl, anzahl; cout << "Bitte waehlen Sie ein Getraenk: " << endl; cout << "Es gibt folgende Auswahl: " << endl; for (int index = 0; index < 3; index++) cout << index+1 << " - " << getraenk[index] << endl; cout << "Geben Sie die gewuenschte Nummer ein: "; cin >> auswahl; if (anzahlFlaschen[auswahl-1] != 0) { cout << "Wie viele Flaschen moechten Sie? "; cin >> anzahl; getraenkeAusgeben(anzahl, auswahl); //NACHDEM DIE ANZAHL EIGENTLICH IN getraenkeAusgeben(anzahl, auswahl) GEÄNDERT WERDEN SOLLTE SOLL //AB HIER ES EIGENTLICH WEITER GEHEN UND DIE NEUE anzahl ZUM WEITER RECHNEN VERWENDET WERDEN //ABER DAS PASSIERT NICHT UND ICH WEISS NICHT WARUM cout << "Die anzahl ist " << anzahl << endl; cout << "Sie muessen " << anzahl * kostenProFlasche[auswahl-1] << " Cent bezahlen." << endl; zahlomat->setBetrag(anzahl * kostenProFlasche[auswahl-1]); do { cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl; zahlomat->muenzenAnnehmen(3); } while (zahlomat->getnochZuZahlen() > 0); auswahl = auswahl-1; } else { cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl; auswahl = -1; } cout << "Sie erhalten " << zahlomat->rueckgeldGeben() << " Cent zurueck." << endl; return auswahl; } void getraenke::getraenkeAusgeben(int anzahl, int getraenkeIndex) { if (anzahl <= anzahlFlaschen[getraenkeIndex]) { cout << "Sie erhalten " << anzahl << " Flasche(n) " << getraenk[getraenkeIndex] << endl; anzahlFlaschen[getraenkeIndex] = anzahlFlaschen[getraenkeIndex] - anzahl; } else { cout << "Es sind nur noch " << anzahlFlaschen[getraenkeIndex] << " Flasche(n) " << getraenk[getraenkeIndex] << " vorhanden. "; cout << "Sie erhalten den Rest." << endl; //DAS SOLL anzahl AUS getraenke::getraenkeWaehlen() VERÄNDERN anzahl = anzahlFlaschen[getraenkeIndex]; cout << "Die anzahl ist " << anzahl << endl; anzahlFlaschen[getraenkeIndex] = 0; cout << "Die anzahlFlaschen ist " << anzahlFlaschen[getraenkeIndex] << endl; } } class getraenkeautomat { bool kuehlung; public: void init(); void kuehlen(bool anaus); }; void getraenkeautomat::init() { kuehlung = false; } void getraenkeautomat::kuehlen(bool anaus) { if (anaus == true) { kuehlung = true; cout << "Die Kuehlung ist eingeschaltet. " << endl; } else { kuehlung = false; cout << "Die Kuehlung ist ausgeschaltet. " << endl; } } int main() { int auswahl; getraenkeautomat *automat; automat = new getraenkeautomat(); getraenke *trink; trink = new getraenke(); trink->init(); automat->kuehlen(true); do { auswahl = trink->getraenkeWaehlen(); } while (auswahl == -1); automat->kuehlen(false); delete(automat); delete(trink); return 0; }
Ich hab die stelle Kommentiert um die es geht.
Das blöde ist das er die "anzahl" nicht wirklich verändert
bzw. hab ich mit den cout << ... anzahl ... es versucht nachzuvollziehen
er ändert das nur in dem abschnitt wo ich die veränderung einleite aber nicht allgemein
ich weis nicht wo mein denkfehler liegt
-
Dann gib doch aus der Funktion den neuen Wert zurück, oder benutze eine Referenz.
-
Hatte es mit return versucht aber da meckert er weil es ja ne void ist
und mach ich int draus meckert er wegen den texten die er ausgeben soll
oder so
und was du mit einer Referenz meinst weis ich nicht
-
gamercd2k schrieb:
mach ich int draus meckert er wegen den texten die er ausgeben soll
oder soCopy&paste Fehlermeldungen + aktuellen Code.
-
Hier wenn ich ein return einfüge aber void lasse
#include <iostream> #include <cmath> using namespace std; class muenzeinheit { int betrag; int nochZuZahlen; int rueckgeld; public: void init(); void muenzenAnnehmen(int wert); int rueckgeldGeben(); void setBetrag(int preis); int getnochZuZahlen(); }; void muenzeinheit::init() { betrag = 0; nochZuZahlen = 0; rueckgeld = 0; } void muenzeinheit::muenzenAnnehmen(int wert) { nochZuZahlen = nochZuZahlen - wert; } int muenzeinheit::rueckgeldGeben() { rueckgeld = abs(nochZuZahlen); return rueckgeld; } void muenzeinheit::setBetrag(int preis) { betrag = preis; nochZuZahlen = betrag; } int muenzeinheit::getnochZuZahlen() { return nochZuZahlen; } class getraenke { string getraenk[3]; int anzahlFlaschen[3]; int kostenProFlasche[3]; muenzeinheit *zahlomat; public: void init(); int getraenkeWaehlen(); void getraenkeAusgeben(int anzahl, int getraenkeIndex); }; void getraenke::init() { getraenk[0] = "Limonade"; getraenk[1] = "Wasser"; getraenk[2] = "Bier"; anzahlFlaschen[0] = 10; anzahlFlaschen[1] = 10; anzahlFlaschen[2] = 10; kostenProFlasche[0] = 15; kostenProFlasche[1] = 10; kostenProFlasche[2] = 13; zahlomat = new muenzeinheit(); zahlomat->init(); } int getraenke::getraenkeWaehlen() { int auswahl, anzahl; cout << "Bitte waehlen Sie ein Getraenk: " << endl; cout << "Es gibt folgende Auswahl: " << endl; for (int index = 0; index < 3; index++) cout << index+1 << " - " << getraenk[index] << endl; cout << "Geben Sie die gewuenschte Nummer ein: "; cin >> auswahl; if (anzahlFlaschen[auswahl-1] != 0) { cout << "Wie viele Flaschen moechten Sie? "; cin >> anzahl; getraenkeAusgeben(anzahl, auswahl); //NACHDEM DIE ANZAHL EIGENTLICH IN getraenkeAusgeben(anzahl, auswahl) GEÄNDERT WERDEN SOLLTE SOLL //AB HIER ES EIGENTLICH WEITER GEHEN UND DIE NEUE anzahl ZUM WEITER RECHNEN VERWENDET WERDEN //ABER DAS PASSIERT NICHT UND ICH WEISS NICHT WARUM cout << "Die anzahl ist " << anzahl << endl; cout << "Sie muessen " << anzahl * kostenProFlasche[auswahl-1] << " Cent bezahlen." << endl; zahlomat->setBetrag(anzahl * kostenProFlasche[auswahl-1]); do { cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl; zahlomat->muenzenAnnehmen(3); } while (zahlomat->getnochZuZahlen() > 0); auswahl = auswahl-1; } else { cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl; auswahl = -1; } cout << "Sie erhalten " << zahlomat->rueckgeldGeben() << " Cent zurueck." << endl; return auswahl; } void getraenke::getraenkeAusgeben(int anzahl, int getraenkeIndex) { if (anzahl <= anzahlFlaschen[getraenkeIndex]) { cout << "Sie erhalten " << anzahl << " Flasche(n) " << getraenk[getraenkeIndex] << endl; anzahlFlaschen[getraenkeIndex] = anzahlFlaschen[getraenkeIndex] - anzahl; } else { cout << "Es sind nur noch " << anzahlFlaschen[getraenkeIndex] << " Flasche(n) " << getraenk[getraenkeIndex] << " vorhanden. "; cout << "Sie erhalten den Rest." << endl; //DAS SOLL anzahl AUS getraenke::getraenkeWaehlen() VERÄNDERN anzahl = anzahlFlaschen[getraenkeIndex]; cout << "Die anzahl ist " << anzahl << endl; anzahlFlaschen[getraenkeIndex] = 0; cout << "Die anzahlFlaschen ist " << anzahlFlaschen[getraenkeIndex] << endl; } //DA MIT RETURN IN void return anzahl; } class getraenkeautomat { bool kuehlung; public: void init(); void kuehlen(bool anaus); }; void getraenkeautomat::init() { kuehlung = false; } void getraenkeautomat::kuehlen(bool anaus) { if (anaus == true) { kuehlung = true; cout << "Die Kuehlung ist eingeschaltet. " << endl; } else { kuehlung = false; cout << "Die Kuehlung ist ausgeschaltet. " << endl; } } int main() { int auswahl; getraenkeautomat *automat; automat = new getraenkeautomat(); getraenke *trink; trink = new getraenke(); trink->init(); automat->kuehlen(true); do { auswahl = trink->getraenkeWaehlen(); } while (auswahl == -1); automat->kuehlen(false); delete(automat); delete(trink); return 0; }
Dann kommt die Fehler meldung:
error: return-statement with a value, in function returning 'void' [-fpermissive]|
und hier wenn ich return einfüge und auf int wechsel
#include <iostream> #include <cmath> using namespace std; class muenzeinheit { int betrag; int nochZuZahlen; int rueckgeld; public: void init(); void muenzenAnnehmen(int wert); int rueckgeldGeben(); void setBetrag(int preis); int getnochZuZahlen(); }; void muenzeinheit::init() { betrag = 0; nochZuZahlen = 0; rueckgeld = 0; } void muenzeinheit::muenzenAnnehmen(int wert) { nochZuZahlen = nochZuZahlen - wert; } int muenzeinheit::rueckgeldGeben() { rueckgeld = abs(nochZuZahlen); return rueckgeld; } void muenzeinheit::setBetrag(int preis) { betrag = preis; nochZuZahlen = betrag; } int muenzeinheit::getnochZuZahlen() { return nochZuZahlen; } class getraenke { string getraenk[3]; int anzahlFlaschen[3]; int kostenProFlasche[3]; muenzeinheit *zahlomat; public: void init(); int getraenkeWaehlen(); void getraenkeAusgeben(int anzahl, int getraenkeIndex); }; void getraenke::init() { getraenk[0] = "Limonade"; getraenk[1] = "Wasser"; getraenk[2] = "Bier"; anzahlFlaschen[0] = 10; anzahlFlaschen[1] = 10; anzahlFlaschen[2] = 10; kostenProFlasche[0] = 15; kostenProFlasche[1] = 10; kostenProFlasche[2] = 13; zahlomat = new muenzeinheit(); zahlomat->init(); } int getraenke::getraenkeWaehlen() { int auswahl, anzahl; cout << "Bitte waehlen Sie ein Getraenk: " << endl; cout << "Es gibt folgende Auswahl: " << endl; for (int index = 0; index < 3; index++) cout << index+1 << " - " << getraenk[index] << endl; cout << "Geben Sie die gewuenschte Nummer ein: "; cin >> auswahl; if (anzahlFlaschen[auswahl-1] != 0) { cout << "Wie viele Flaschen moechten Sie? "; cin >> anzahl; getraenkeAusgeben(anzahl, auswahl); //NACHDEM DIE ANZAHL EIGENTLICH IN getraenkeAusgeben(anzahl, auswahl) GEÄNDERT WERDEN SOLLTE SOLL //AB HIER ES EIGENTLICH WEITER GEHEN UND DIE NEUE anzahl ZUM WEITER RECHNEN VERWENDET WERDEN //ABER DAS PASSIERT NICHT UND ICH WEISS NICHT WARUM cout << "Die anzahl ist " << anzahl << endl; cout << "Sie muessen " << anzahl * kostenProFlasche[auswahl-1] << " Cent bezahlen." << endl; zahlomat->setBetrag(anzahl * kostenProFlasche[auswahl-1]); do { cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl; zahlomat->muenzenAnnehmen(3); } while (zahlomat->getnochZuZahlen() > 0); auswahl = auswahl-1; } else { cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl; auswahl = -1; } cout << "Sie erhalten " << zahlomat->rueckgeldGeben() << " Cent zurueck." << endl; return auswahl; } // HIER DAS int GEÄNDERT int getraenke::getraenkeAusgeben(int anzahl, int getraenkeIndex) { if (anzahl <= anzahlFlaschen[getraenkeIndex]) { cout << "Sie erhalten " << anzahl << " Flasche(n) " << getraenk[getraenkeIndex] << endl; anzahlFlaschen[getraenkeIndex] = anzahlFlaschen[getraenkeIndex] - anzahl; } else { cout << "Es sind nur noch " << anzahlFlaschen[getraenkeIndex] << " Flasche(n) " << getraenk[getraenkeIndex] << " vorhanden. "; cout << "Sie erhalten den Rest." << endl; //DAS SOLL anzahl AUS getraenke::getraenkeWaehlen() VERÄNDERN anzahl = anzahlFlaschen[getraenkeIndex]; cout << "Die anzahl ist " << anzahl << endl; anzahlFlaschen[getraenkeIndex] = 0; cout << "Die anzahlFlaschen ist " << anzahlFlaschen[getraenkeIndex] << endl; } //DA MIT RETURN IN void return anzahl; } class getraenkeautomat { bool kuehlung; public: void init(); void kuehlen(bool anaus); }; void getraenkeautomat::init() { kuehlung = false; } void getraenkeautomat::kuehlen(bool anaus) { if (anaus == true) { kuehlung = true; cout << "Die Kuehlung ist eingeschaltet. " << endl; } else { kuehlung = false; cout << "Die Kuehlung ist ausgeschaltet. " << endl; } } int main() { int auswahl; getraenkeautomat *automat; automat = new getraenkeautomat(); getraenke *trink; trink = new getraenke(); trink->init(); automat->kuehlen(true); do { auswahl = trink->getraenkeWaehlen(); } while (auswahl == -1); automat->kuehlen(false); delete(automat); delete(trink); return 0; }
Dann kommt die Fehlermeldung:
||=== Build: Debug in getraenkeautomat version1 (compiler: GNU GCC Compiler) ===|
error: prototype for 'int getraenke::getraenkeAusgeben(int, int)' does not match any in class 'getraenke'|
error: candidate is: void getraenke::getraenkeAusgeben(int, int)|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
-
Du mußt, entsprechend der Fehlermeldung, natürlich auch in der Klassendeklaration die Funktion ändern.
-
Hast du den Fehler mal gelesen? Die Meldung ist doch eindeutig. Die Zeilen 60 und 129 sind inkonsistent.
Ansonsten ein paar dringende Verbesserungen:
- Lass den Quatsch mit new und delete. Brauchst du in C++ niemals, ist praktisch immer ein Fehler. C++ ist nicht Java. Warum nicht einfach
getraenkeautomat automat;
anstatt
getraenkeautomat *automat; automat = new getraenkeautomat();
? Gleiches gilt für alle anderen Stellen.
- Klassendesign 1: Lass den Quatsch mit den init-Methoden. Wenn etwas init heißt, dann ist es wahrscheinlich ein Konstruktor. Bei init muss der Aufrufer aufpassen, dass er nicht falsch macht, bei Konstruktoren wird er gezwungen alles richtig zu machen. Natürlich nur, wenn die init/Konstruktor-Funktion auch sinnvoll definiert ist, was bei dir nicht der Fall zu sein scheint. Die setzen ja nur leere Werte und anschließend muss dann nochmals eine set-Methode aufgerufen werden, damit man das Objekt benutzen kann. Der Aufrufer muss also an zwei Dinge denken, die er tun muss, und an die richtige Reihenfolge. Definier stattdessen einen Konstruktor, mit den nötigen Argumenten, der dann sofort ein komplett funktionsfähiges Objekt zurück gibt. Kürzer, lesbarer, einfache, und man kann gar nichts falsch machen.
- Klassendesign 2: Deine Klassen sind gleichzeitig überdesigned, als auch fehldesigned. Die machen viel zu viel, und auch viel zu viel, was gar nicht zu ihrer Beschreibung passt. Deine muenzeinheit ist auf keinen Fall etwas, was man irgendwie mit dem Begriff Münzeinheit verbinden würde. Es scheint eher so etwas wie eine Geldtransaktion zu sein.
Ebenso: getraenke ist eindeutig keine Sammlung von Getränken, sondern offenbar ein Getränkeautomat. getraenkeautomat ist eindeutig kein Getränkeautomat, sondern ein leerer Kühlschrank.
Warum hat der Geldautomat (also getraenke) eine Münzeinheit? Hast du schon einmal einen Geldautomaten gesehen, der so etwas hat? Wenn eine Münzeinheit einer Geldtransaktion entspricht, dann ist das doch eine Sache des Kaufvorgangs. Und tatsächlich wird der zahlomat nur in der Verkaufmethode benutzt. Wieso ist er dann Teil des Geldautomats. - Klassendesign 3: Der Getränkeautomat (getraenke) hat jeweils drei unabhängige Eigenschaften: Name der Getränkesorte, Anzahl dieser Sorte, Preis dieser Sorte. Na, hoffentlich kommt da niemand versehentlich durcheinander. Wenn es doch bloß eine Möglichkeit gäbe, zusammengehörige Eigenschaften zu einer Klasse von Objekten zusammen zu fassen...
-
Damit das return einen Sinn hat, musst du den Wert natürlich auch noch entgegennehmen.
-
`
Lass den Quatsch mit new und delete. Brauchst du in C++ niemals, ist praktisch immer ein Fehler. C++ ist nicht Java. Warum nicht einfach
C++:
getraenkeautomat automat;
anstatt
C++:
getraenkeautomat *automat; automat = new getraenkeautomat();
`
Ich weis was du meinst und ich denke das das hier mir nur zeigen soll wie die funktion ist wie sie möglich ist und soweiterich lerne ja noch bin noch recht weit am anfang
geh nur nach lernheft vor aber zwischendurch soll man selbst versuchen ein problem zu lösen.`
Damit das return einen Sinn hat, musst du den Wert natürlich auch noch entgegennehmen.
`
wie genau meinst du das mit entgegengenommen werden
-
Hmm hab jetzt mal alles versucht aber irgendwie will das alles nicht klappen
Es muss ja irgendwie möglich sein an angegebener stelle die anzahl zu ändern
int getraenke::getraenkeWaehlen() { int auswahl, anzahl; cout << "Bitte waehlen Sie ein Getraenk: " << endl; cout << "Es gibt folgende Auswahl: " << endl; for (int index = 0; index < 3; index++) cout << index+1 << " - " << getraenk[index] << endl; cout << "Geben Sie die gewuenschte Nummer ein: "; cin >> auswahl; if (anzahlFlaschen[auswahl-1] != 0) { cout << "Wie viele Flaschen moechten Sie? "; cin >> anzahl; getraenkeAusgeben(anzahl, auswahl); //NACHDEM DIE ANZAHL EIGENTLICH IN getraenkeAusgeben(anzahl, auswahl) GEÄNDERT WERDEN SOLLTE SOLL //AB HIER ES EIGENTLICH WEITER GEHEN UND DIE NEUE anzahl ZUM WEITER RECHNEN VERWENDET WERDEN //ABER DAS PASSIERT NICHT UND ICH WEISS NICHT WARUM cout << "Die anzahl ist " << anzahl << endl; cout << "Sie muessen " << anzahl * kostenProFlasche[auswahl-1] << " Cent bezahlen." << endl; zahlomat->setBetrag(anzahl * kostenProFlasche[auswahl-1]); do { cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl; zahlomat->muenzenAnnehmen(3); } while (zahlomat->getnochZuZahlen() > 0); auswahl = auswahl-1; } else { cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl; auswahl = -1; } cout << "Sie erhalten " << zahlomat->rueckgeldGeben() << " Cent zurueck." << endl; return auswahl; }
und zwar von da aus:
void getraenke::getraenkeAusgeben(int anzahl, int getraenkeIndex) { if (anzahl <= anzahlFlaschen[getraenkeIndex]) { cout << "Sie erhalten " << anzahl << " Flasche(n) " << getraenk[getraenkeIndex] << endl; anzahlFlaschen[getraenkeIndex] = anzahlFlaschen[getraenkeIndex] - anzahl; } else { cout << "Es sind nur noch " << anzahlFlaschen[getraenkeIndex] << " Flasche(n) " << getraenk[getraenkeIndex] << " vorhanden. "; cout << "Sie erhalten den Rest." << endl; //DAS SOLL anzahl AUS getraenke::getraenkeWaehlen() VERÄNDERN anzahl = anzahlFlaschen[getraenkeIndex]; cout << "Die anzahl ist " << anzahl << endl; anzahlFlaschen[getraenkeIndex] = 0; cout << "Die anzahlFlaschen ist " << anzahlFlaschen[getraenkeIndex] << endl; } }
-
Nur zum Verständnis
#include <iostream> #include <cmath> using namespace std; class muenzeinheit { int betrag; int nochZuZahlen; int rueckgeld; public: void init(); void muenzenAnnehmen(int wert); int rueckgeldGeben(); void setBetrag(int preis); int getnochZuZahlen(); }; void muenzeinheit::init() { betrag = 0; nochZuZahlen = 0; rueckgeld = 0; } void muenzeinheit::muenzenAnnehmen(int wert) { nochZuZahlen = nochZuZahlen - wert; } int muenzeinheit::rueckgeldGeben() { rueckgeld = abs(nochZuZahlen); return rueckgeld; } void muenzeinheit::setBetrag(int preis) { betrag = preis; nochZuZahlen = betrag; } int muenzeinheit::getnochZuZahlen() { return nochZuZahlen; } // Klasse für Getaenke erzeugen class getraenke { //Getraenke string getraenk[3]; //Flaschenanzahl int anzahlFlaschen[3]; //Kosten pro Flasche int kostenProFlasche[3]; muenzeinheit *zahlomat; public: void init(); int getraenkeWaehlen(); void getraenkeAusgeben(int anzahl, int getraenkeIndex); }; //Getraenke initialisieren void getraenke::init() { //Name der Getraenke getraenk[0] = "Limonade"; getraenk[1] = "Wasser"; getraenk[2] = "Bier"; //Anzahl der Flaschen anzahlFlaschen[0] = 10; anzahlFlaschen[1] = 10; anzahlFlaschen[2] = 10; //Kosten Pro Flasche kostenProFlasche[0] = 15; kostenProFlasche[1] = 10; kostenProFlasche[2] = 13; zahlomat = new muenzeinheit(); zahlomat->init(); } //Die Getraenkeauswahl int getraenke::getraenkeWaehlen() { int auswahl, anzahl; cout << "Bitte waehlen Sie ein Getraenk: " << endl; cout << "Es gibt folgende Auswahl: " << endl; for (int index = 0; index < 3; index++) cout << index+1 << " - " << getraenk[index] << endl; cout << "Geben Sie die gewuenschte Nummer ein: "; cin >> auswahl; if (anzahlFlaschen[auswahl-1] != 0) { cout << "Wie viele Flaschen moechten Sie? "; cin >> anzahl; cout << "Sie muessen " << anzahl * kostenProFlasche[auswahl-1] << " Cent bezahlen." << endl; zahlomat->setBetrag(anzahl * kostenProFlasche[auswahl-1]); do { cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl; zahlomat->muenzenAnnehmen(3); } while (zahlomat->getnochZuZahlen() > 0); auswahl = auswahl-1; getraenkeAusgeben(anzahl, auswahl); } else { cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl; auswahl = -1; } return auswahl; } //Getraenke Ausgabe void getraenke::getraenkeAusgeben(int anzahl, int getraenkeIndex) { if (anzahl <= anzahlFlaschen[getraenkeIndex]) { cout << "Sie erhalten " << anzahl << " Flasche(n) " << getraenk[getraenkeIndex] << endl; anzahlFlaschen[getraenkeIndex] = anzahlFlaschen[getraenkeIndex] - anzahl; } else { cout << "Es sind nur noch " << anzahlFlaschen[getraenkeIndex] << " Flasche(n) " << getraenk[getraenkeIndex] << " vorhanden. "; cout << "Sie erhalten den Rest." << endl; anzahlFlaschen[getraenkeIndex] = 0; } cout << "Sie erhalten " << zahlomat->rueckgeldGeben() << " Cent zurueck." << endl; } class getraenkeautomat { bool kuehlung; public: void init(); void kuehlen(bool anaus); }; void getraenkeautomat::init() { kuehlung = false; } void getraenkeautomat::kuehlen(bool anaus) { if (anaus == true) { kuehlung = true; cout << "Die Kuehlung ist eingeschaltet. " << endl; } else { kuehlung = false; cout << "Die Kuehlung ist ausgeschaltet. " << endl; } } int main() { int auswahl; getraenkeautomat *automat; automat = new getraenkeautomat(); //Instanz der Klasse getraenk erstellen getraenke *trink; trink = new getraenke(); trink->init(); automat->kuehlen(true); do { auswahl = trink->getraenkeWaehlen(); } while (auswahl == -1); automat->kuehlen(false); delete(automat); //Die Instanz der Klasse getraenk wieder beenden delete(trink); return 0; }
Das ist der Getränkeautomat aber dieser zockt einen ab wenn man mehr als 10 flaschen käuft
Dann rechnet er mit der eingegeben anzahl der flaschen und lässt einen dann diesen preis bezahlen sagt aber einem das man nur die 10 bekommt weil mehr nicht da sindEr soll die restliche anzahl ermitteln und davon den preis berechnen und soweiter
-
Juhu habs rausbekommen
hab ursprünglich mal wieder nicht das große ganze gesehen naja man lernt ja noch
wen es interessiert hier der Richtige Code
#include <iostream> #include <cmath> using namespace std; class muenzeinheit { int betrag; int nochZuZahlen; int rueckgeld; public: void init(); void muenzenAnnehmen(int wert); int rueckgeldGeben(); void setBetrag(int preis); int getnochZuZahlen(); }; void muenzeinheit::init() { betrag = 0; nochZuZahlen = 0; rueckgeld = 0; } void muenzeinheit::muenzenAnnehmen(int wert) { nochZuZahlen = nochZuZahlen - wert; } int muenzeinheit::rueckgeldGeben() { rueckgeld = abs(nochZuZahlen); return rueckgeld; } void muenzeinheit::setBetrag(int preis) { betrag = preis; nochZuZahlen = betrag; } int muenzeinheit::getnochZuZahlen() { return nochZuZahlen; } class getraenke { string getraenk[3]; int anzahlFlaschen[3]; int kostenProFlasche[3]; muenzeinheit *zahlomat; public: void init(); int getraenkeWaehlen(); void getraenkeAusgeben(int anzahl, int getraenkeIndex); }; void getraenke::init() { getraenk[0] = "Limonade"; getraenk[1] = "Wasser"; getraenk[2] = "Bier"; anzahlFlaschen[0] = 10; anzahlFlaschen[1] = 10; anzahlFlaschen[2] = 10; kostenProFlasche[0] = 15; kostenProFlasche[1] = 10; kostenProFlasche[2] = 13; zahlomat = new muenzeinheit(); zahlomat->init(); } int getraenke::getraenkeWaehlen() { int auswahl, anzahl; cout << "Bitte waehlen Sie ein Getraenk: " << endl; cout << "Es gibt folgende Auswahl: " << endl; for (int index = 0; index < 3; index++) cout << index+1 << " - " << getraenk[index] << endl; cout << "Geben Sie die gewuenschte Nummer ein: "; cin >> auswahl; cout << "Ihr gewaehltes Getraenk Kostet " << kostenProFlasche[auswahl-1] << " cent pro Flasche!" << endl; if (anzahlFlaschen[auswahl-1] != 0) { cout << "Wie viele Flaschen moechten Sie? "; cin >> anzahl; //der zu zahlende Betrag muss direkt nach der Angabe der Anzahl festgelegt werden zahlomat->setBetrag(anzahl * kostenProFlasche[auswahl-1]); auswahl = auswahl-1; //und dann wird überprüft ob noch genug Flaschen da getraenkeAusgeben(anzahl, auswahl); //den zu zahlenden Betrag entnehme ich dann von getnochZuZahlen cout << "Sie muessen " << zahlomat->getnochZuZahlen() << " Cent bezahlen." << endl; do { cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl; zahlomat->muenzenAnnehmen(3); } while (zahlomat->getnochZuZahlen() > 0); } else { cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl; auswahl = -1; } cout << "Sie erhalten " << zahlomat->rueckgeldGeben() << " Cent zurueck." << endl; return auswahl; } void getraenke::getraenkeAusgeben(int anzahl, int getraenkeIndex) { if (anzahl <= anzahlFlaschen[getraenkeIndex]) { cout << "Sie erhalten " << anzahl << " Flasche(n) " << getraenk[getraenkeIndex] << endl; //der zu zahlende Betrag muss hier neu gesetzt werden zahlomat->setBetrag(anzahl * kostenProFlasche[getraenkeIndex]); anzahlFlaschen[getraenkeIndex] = anzahlFlaschen[getraenkeIndex] - anzahl; } else { cout << "Es sind nur noch " << anzahlFlaschen[getraenkeIndex] << " Flasche(n) " << getraenk[getraenkeIndex] << " vorhanden. "; cout << "Sie erhalten den Rest." << endl; //der zu zahlende Betrag muss hier neu gesetzt werden zahlomat->setBetrag(anzahlFlaschen[getraenkeIndex] * kostenProFlasche[getraenkeIndex]); anzahlFlaschen[getraenkeIndex] = 0; } } class getraenkeautomat { bool kuehlung; public: void init(); void kuehlen(bool anaus); }; void getraenkeautomat::init() { kuehlung = false; } void getraenkeautomat::kuehlen(bool anaus) { if (anaus == true) { kuehlung = true; cout << "Die Kuehlung ist eingeschaltet. " << endl; } else { kuehlung = false; cout << "Die Kuehlung ist ausgeschaltet. " << endl; } } int main() { int auswahl; getraenkeautomat *automat; automat = new getraenkeautomat(); getraenke *trink; trink = new getraenke(); trink->init(); automat->kuehlen(true); do { auswahl = trink->getraenkeWaehlen(); } while (auswahl == -1); automat->kuehlen(false); delete(automat); delete(trink); return 0; }
-
Da die Aufgabe hier seit 2013 andauernd wieder kommt und jeder Mal derselbe Quatsch mit dem new (Speicherleck) und dem merkwürdigen Klassendesign passiert, würde ich mal von einem schlechten Lehrer ausgehen.
Siehe auch: https://www.google.de/search?q=%22Die+Kuehlung+ist+eingeschaltet%22+site%3Awww.c-plusplus.net
Edit: Anführungszeichen im Link musste ich durch %22 ersetzen.