Benötige Hilfe bei folgenden C++ Programm Code:

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.

Hab’s nur mal kurz überflogen, aber wenn ich das richtig verstehe, sind Änderungen nur im Zweig
if (anzahlFlaschen[auswahl-1] != 0) erforderlich. Sind überhaupt noch Flaschen da, kommst du in diesen Zweig rein.
Darin wäre dann zu prüfen, ob mehr als die gewünschte Anzahl vorhanden ist oder eben nicht.
Mit dem entsprechenden Argument rufst du zahlomat->setBetrag() auf.
Wo liegt denn dein Problem? Poste doch mal deinen Ansatz.

Gruß

Michael

Hi,

Zu dem Code an sich. Er wurde wohl offensichtlich von jemandem erstellt, der die Grundprinzipien der C++ Programmierung nicht versteht, sondern eher einen Java Hintergrund hat.

Dabei geht es z.B. um

  1. Benennung der Klassen
  2. Anordnung und Benennung der Instanzvariablen
  3. Platzierung multipler Klassen in einer Datei
  4. Übermäßiges Verwenden von Heap Objekten
  5. Unnötiges Abfragen einer booleschen Variablen auf true

Ansonsten hat Michael recht. Eine Änderung von einer Handvoll Zeilen ist ausreichend.

Gruß
HH

Hi,

also ich habe den Code soweit geändert dass eine Prüfung erfolgt.
Allerdings bekomme ich es nicht hin, dass er mir (bei zu viel gewählten Flaschen) den Preis für die Anzahl der vorhandenen Flaschen ausrechnet.

Ich weiss, es ist bestimmt nichts großes und bestimmt lacht ihr darüber wenn ihr das sieht, aber ich glaube ich denke hier zu kompliziert und bekomme die Zuweisung nicht hin.
In Zeile 145 & 146 muss ich die „1“ ja so ersetzen, dass er mir die vorhandenen Flaschen als Anzahl zieht.
Daran scheitert es allerdings gerade :frowning:

/* ##################################
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;

        if (anzahlFlaschen[auswahl-1] >= anzahl)
        {
            //erst muss bezahlt werden
            //der Preis 10 ist fest vorgegeben
            cout << "Sie muessen " << anzahl * 10 << " Cent bezahlen." << endl;
            zahlomat->setBetrag(anzahl * 10);
        }

        else
        {
            cout << "Sie muessen " << 1 * 10 << " Cent bezahlen." << endl;
            zahlomat->setBetrag(1 * 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;
}

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