Benötige Hilfe bei folgendem Code (Aufgabe Getränkeautomat)
-
Hallo ihr Lieben,
ich erlene momentan die C++-Programmiersprache, komme allerdings bei einer Aufgabe nicht weiter und benötige Hilfe den folgenden Code zu bearbeiten.
Hab in den letzten 4 Wochen schon alles mir erdenkliche Versucht, doch leider immer ohne Erfolg.
Entweder stürtzt das Programm immer komplett ab oder es wird nicht alles korrekt ausgegeben.
Ich bin nun langsam am Verzweifeln.Bitte daher um eure Hilfe.
Danke im Voraus!!!Aufgabe lautet:
Ändern Sie den Getränkeautomaten so, dass vor der Berechnung des Gesamtpreises
geprüft wird, ob noch genügend Flaschen des gewünschten Getränks vorhanden
sind. Wenn nicht, muss der Gesamtpreis aus der noch maximal verfügbaren
Anzahl Flaschen berechnet werden.Hier der vorgegebene Code:
/* ################################## Der Getränkeautomat Version 6 Mit Konstruktoren und Destruktoren ###################################*/ #include <iostream> #include <cmath> using namespace std; //die Vereinbarung der Klasse muenzeinheit class muenzeinheit { //die Attribute int betrag; int nochZuZahlen; int rueckgeld; //die Methoden public: //der Konstruktor muenzeinheit(); //der Destruktor ~muenzeinheit(); void muenzenAnnehmen(int wert); int rueckgeldGeben(); //zum Setzen des Betrags void setBetrag(int preis); //zum Abfragen des noch zu zahlenden Betrags int getnochZuZahlen(); }; muenzeinheit::muenzeinheit() { betrag = 0; nochZuZahlen = 0; rueckgeld = 0; } muenzeinheit::~muenzeinheit() { cout << "Eine Instanz der Klasse muenzeinheit wurde zerstoert." << endl; } void muenzeinheit::muenzenAnnehmen(int wert) { //den eingeworfenen Betrag abziehen nochZuZahlen = nochZuZahlen - wert; } int muenzeinheit::rueckgeldGeben() { //den absoluten Betrag von nochZuZahlen als Rückgeld liefern rueckgeld = abs(nochZuZahlen); return rueckgeld; } void muenzeinheit::setBetrag(int preis) { betrag = preis; nochZuZahlen = betrag; } int muenzeinheit::getnochZuZahlen() { return nochZuZahlen; } //die Vereinbarung der Klasse getraenkeautomat class getraenkeautomat { //die Attribute string getraenk[3]; int anzahlFlaschen[3]; bool kuehlung; //jetzt ist die Münzeinheit Teil des Getränkeautomaten muenzeinheit *zahlomat; public: //die Methoden //der Konstruktor //übergeben werden drei int-Typen für die Anzahl und ein Zeiger auf die Klasse muenzeinheit getraenkeautomat(int anzahl1, int anzahl2, int anzahl3, muenzeinheit *tempZahlomat); //der Destruktor ~getraenkeautomat(); int getraenkeWaehlen(); void getraenkAusgeben(int anzahl, int getraenkeIndex); void kuehlen(bool anaus); }; getraenkeautomat::getraenkeautomat(int anzahl1, int anzahl2, int anzahl3, muenzeinheit *tempZahlomat) { //die Getränke eintragen getraenk[0] = "Limonade"; getraenk[1] = "Wasser"; getraenk[2] = "Bier"; //die Anzahl der Flaschen //Sie werden jetzt durch die Argumente gesetzt anzahlFlaschen[0] = anzahl1; anzahlFlaschen[1] = anzahl2; anzahlFlaschen[2] = anzahl3; //die Kühlung ist aus kuehlung = false; //die Instanz der Münzeinheit wird zugewiesen zahlomat = tempZahlomat; } getraenkeautomat::~getraenkeautomat() { cout << "Eine Instanz der Klasse getraenkeautomat wurde zerstoert." << endl; } int getraenkeautomat::getraenkeWaehlen() { int auswahl, anzahl; //die Auswahl 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; //gibt es noch Flaschen vom gewählten Getränk? if (anzahlFlaschen[auswahl-1] != 0) { //das Getränk ausgeben cout << "Wie viele Flaschen moechten Sie? "; cin >> anzahl; //erst muss bezahlt werden //der Preis 10 ist fest vorgegeben cout << "Sie muessen " << anzahl * 10 << " Cent bezahlen." << endl; zahlomat->setBetrag(anzahl * 10); do { cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl; zahlomat->muenzenAnnehmen(3); } while (zahlomat->getnochZuZahlen() >0); //das Getränk ausgeben auswahl = auswahl - 1; getraenkAusgeben(anzahl, auswahl); } else { cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl; auswahl = -1; } return auswahl; } void getraenkeautomat::getraenkAusgeben(int anzahl, int getraenkeIndex) { //gibt es noch genügend Flaschen? 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; } //Geld zurückgeben cout << "Sie erhalten " << zahlomat->rueckgeldGeben() << " Cent zurueck." << endl; } 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; //Instanz erzeugen //der Zeiger auf die Klasse getraenkeautomat *automat; //die Münzeinheit erzeugen muenzeinheit *einheit = new muenzeinheit(); //die Münzeinheit wird jetzt übergeben automat = new getraenkeautomat(10, 20, 30, einheit); //ein Getränk auswählen do { auswahl = automat->getraenkeWaehlen(); } while (auswahl == -1); //die Instanzen freigeben delete(automat); delete (einheit); return 0; }
-
Hallo.
Kannst Du das Problem ein wenig eingrenzen? Ist ne Menge code.
Wann schmiert das Programm komplett ab und dann wird nicht korrekt ausgegeben?
-
Malibu1988 schrieb:
Hab in den letzten 4 Wochen schon alles mir erdenkliche Versucht, doch leider immer ohne Erfolg.
Entweder stürtzt das Programm immer komplett ab oder es wird nicht alles korrekt ausgegeben.
Ich bin nun langsam am Verzweifeln.Was ist alles erdenkliche? Hast Du am Code hin und her probiert oder hast Du versucht, C++ zu lernen und zu verstehen? Mir sieht das so aus, als hättest Du ersteres versucht. In 4 Wochen hättest Du C++ so weit lernen können, dass es funktioniert. Mag sein, dass es sich pampig anhört, aber es ist wirklich eine Empfehlung, C++ systematisch zu lernen. Fange erst mal mit Hello-World an und dann machst Du da weiter.
Und ja, ich schliesse mich CJens ab. Bitte Problem reduzieren und sagen, wie es sich verhält. Der vorliegende Code kann nicht gleichzeitig abschmieren und was nicht korrekt ausgeben. Welchen der beiden hast Du uns gezeigt?
-
Hi Cjens,
ich habe so einiges versucht, hatte bestimmt mind. 10 Varianten gespeichert, alle hatten Fehler. Aus Frust hab ich die ganzen Dateien wieder gelöscht weil sie sowieso nicht funktioniert haben.
Jetzt bereue ich das, weil ich nun froh wär nachschauen zu können was ich schon gemacht habe.Aus dem Gedächtnis kann ich folgendens noch sagen:
Z.B. wollte ich die Schleife zwischen 128 und 154 umzubauen, sodass folgendes geprüft wird:
if (anzahlFlaschen[auswahl-1] = getraenkeIndex)dann soll er den wert wie folgt ermitteln:
//erst muss bezahlt werden //der Preis 10 ist fest vorgegeben cout << "Sie muessen " << anzahlFlaschen[getraenkeIndex] * 10 << " Cent bezahlen." << endl; zahlomat->setBetrag(anzahlFlaschen[getraenkeIndex] * 10);Auch Änderungen drum rum habe ich gemacht und auch mit zwei Schleifen gearbeitet, aber ging alles in die Hose

-
Hi auch an tntnet,
ich habe versucht C++ systematisch zu erlernen und hab auch tatsächlich mit Hallo World angefangen.
Ich mach das im Rahmen eines Fernkurses, bisher hatte ich auch keine großen Probleme, aber an dieser Aufgabe verzweifel ich momentan....Der Code den ich gepostet habe, ist der der vorgegeben ist, diesen soll man entsprechend der Aufgabe bearbeiten.
Das ist die zweite Aufgabe zu diesem Code.Die erste Aufgabe zu dem Code habe ich erfolgreich gemeistert.
Da wurde folgendes verlangt:Erstellen Sie eine Klasse für Getränke. Die Klasse soll den Namen des Getränks,
den Preis pro Flasche und die noch vorhandene Anzahl Flaschen speichern können.
Ersetzen Sie dann in der letzten Version des Getränkeautomaten aus diesem Studienheft
die Attribute für die Getränke durch Instanzen der Klasse für die
Getränke. Achten Sie dabei bitte auf die Datenkapselung.
Kommentieren Sie Ihre Lösung ausreichend.Als Ergebnis habe ich folgendes: http://coliru.stacked-crooked.com/a/15c3b181e4d4e88c
Nun häng ich allerdings an der zweiten Aufgabe und bekomme es nicht hin die Prüfung der Anzahl der vorhanden Flaschen richtig miteinzubeziehen.

Edit durch Arcoth: Code ausgelagert.
-
Längeren Code bitte auf Coliru o.ä. posten. Andernfalls wird die Seite schwer navigierbar.
-
Malibu1988 schrieb:
Als Ergebnis habe ich folgendes: http://coliru.stacked-crooked.com/a/15c3b181e4d4e88c
Bin mir 99% sicher dass das nicht so gedacht war.
In der Angabe steht z.B. "Die Klasse soll den Namen des Getränks,
den Preis pro Flasche und die noch vorhandene Anzahl Flaschen speichern können."Der Name des Getränks, der Preis etc. -- alles Einzahl.
D.h. du sollst eine Klasse machen deren Objekte jeweils EIN Getränk beschreiben.Davon abgesehen...
Du sollst einfach nur, nach der Eingabe der Anzahl, gucken ob auch noch genug da ist. Und dann halt ggf. auf das Maximum (=Anzahl der noch vorhandenen Flaschen) korrigieren.Also die Anweisung "wenn nimmer genug da, dann mach halt so viel wie noch da ist" in Code übersetzen.
Dazu brauchst du nichtmal eine einzige Schleife, geschweige denn zwei.Malibu1988 schrieb:
Aus dem Gedächtnis kann ich folgendens noch sagen:
Z.B. wollte ich die Schleife zwischen 128 und 154 umzubauen, sodass folgendes geprüft wird:
if (anzahlFlaschen[auswahl-1] = getraenkeIndex)-
Mit "=" tut man nix prüfen, damit tut man Zuweisen (=alten Wert überschreiben).
Was du meinst ist vermutlich "==". Oder auch nicht, denn ich hab keinen Tau was du mit der Zeile erreichen willst. -
Beschreib bitte mal was du mit dieser Zeile erreichen wolltest. Und wo kommt jetzt auf einma
getraenkeIndexher? In dem von dir gezeigten Code wird in den Funktionen entwederauswahlodergetraenkeIndexverwendet, aber soweit ich sehen konnte nie beides in der selben Funktion.
-
-
hustbaer schrieb:
- Mit "=" tut man nix prüfen, damit tut man Zuweisen (==alten Wert überschreiben).
FTFY

-

Hasche Räächt
-
OK, ich war wohl zu ungeduldig .... ich hab gedacht es passiert nichts weil die Console nur schwarz war.
Jetzt war ich kurz in nem anderen Raum, in der Zeit hat er doch was gemacht, nun gehts ... ^^Sorry und trotzdem danke für eure Hilfe
-
Malibu1988 schrieb:
DANKE, kann geschlossen werden !!
Boah, bei der nächsten Frage die nach Schulaufgabe riecht mach ich gleich mal präventiv nen Fullquote.
-
hustbaer schrieb:
Malibu1988 schrieb:
DANKE, kann geschlossen werden !!
Boah, bei der nächsten Frage die nach Schulaufgabe riecht mach ich gleich mal präventiv nen Fullquote.
Keine Sorge, war ja gecached.
-
Hrhr.

-
hustbaer schrieb:
Hrhr.

Ich hab' dich auch lieb.