Kleines Problem mit dem Getränkeautomaten



  • Hi,
    Ich hab folgendes Problem ich hab eine Klasse hinzugefügt (getraenke) die preise namen und die anzahl der noch vorhandenen Flaschen speichert. Das funktioniert soweit auch alles es lässt sich ausführen und es kommen keine Fehler oder Warnmeldungen. Aber anstatt das er den kompletten Preis dann anzeigt zählt er von einer ewig hochen Zahl runter. Ich finde aber den Fehler nicht bin noch nicht so gut in C++ wäre Super wenn mir jemand einen Tipp geben könnte wo ich was vergessen habe zu ändern.

    hier mal der Quelltext:

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    //die Klasse getraenke
    class getraenke
    {
        public:
        //die Attribute
        string getraenk[3];
        int anzahlFlaschen[3];
        int preisProFlasche[3];
    
        //die Methoden
        //der Konstruktor
        getraenke(int anzahl1, int anzahl2, int anzahl3, int preis1, int preis2, int preis3);
        //der Destruktor
        ~getraenke();
    };
    
    getraenke::getraenke(int anzahl1, int anzahl2, int anzahl3, int preis1, int preis2, int preis3)
    {
        //die Getraenke eintragen
        getraenk[0]="Limonade";
        getraenk[1]="Wasser";
        getraenk[2]="Bier";
        //die Anzahl festlegen
        anzahlFlaschen[0]=anzahl1;
        anzahlFlaschen[1]=anzahl2;
        anzahlFlaschen[2]=anzahl3;
    
        preisProFlasche[0]=preis1;
        preisProFlasche[1]=preis2;
        preisProFlasche[2]=preis3;
    }
    getraenke::~getraenke()
    {
        cout<<"Eine Instanz der Klasse Getraenke wurde zerstört."<<endl;
    }
    //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
        bool kuehlung;
    
        //jetzt ist die Münzeinheit Teil des Getränkeautomaten
        muenzeinheit *zahlomat;
        getraenke* getraenkomat;
    
        public:
        //die Methoden
        //der Konstruktor
        //übergeben werden drei int-Typen für die Anzahl und ein Zeiger auf die Klasse muenzeinheit
    
        getraenkeautomat(muenzeinheit *tempZahlomat,getraenke *tempgetraenkomat);
    
        //der Destruktor
        ~getraenkeautomat();
    
        int getraenkeWaehlen();
        void getraenkAusgeben(int anzahl, int getraenkeIndex);
        void kuehlen(bool anaus);
    };
    
    getraenkeautomat::getraenkeautomat(muenzeinheit *tempZahlomat,getraenke *tempgetraenkomat)
    {
        //die Kühlung ist aus
        kuehlung = false;
    
        //die Instanz der Münzeinheit wird zugewiesen
        zahlomat = tempZahlomat;
        getraenkomat = tempgetraenkomat;
    }
    
    getraenkeautomat::~getraenkeautomat()
    {
        cout << "Eine Instanz der Klasse getraenkeautomat wurde zerstoert." << endl;
    }
    
    int getraenkeautomat::getraenkeWaehlen()
    
    {
        int auswahl, anzahl, preisProFlasche;
        //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 << " - " << getraenkomat->getraenk[index] << endl;
    
        // es wird geprüft ob die Eingabe richtig ist
        do{
            cout << "Bitte waehlen Sie Ihr Getraenk (Nr 1-3): ";
            cin >> auswahl;
    
        }while(auswahl>3);
    
        //gibt es noch Flaschen vom gewählten Getränk?
        if (getraenkomat->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 * preisProFlasche << " Cent bezahlen." << endl;
    
            zahlomat->setBetrag(anzahl * preisProFlasche);
    
            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 <= getraenkomat->anzahlFlaschen[getraenkeIndex])
        {
            cout << "Sie erhalten " << anzahl << " Flasche(n) " << getraenkomat->getraenk[getraenkeIndex] << endl;
            getraenkomat->anzahlFlaschen[getraenkeIndex] = getraenkomat->anzahlFlaschen[getraenkeIndex]  - anzahl;
        }
    
        else
        {
            cout << "Es sind nur noch " << getraenkomat->anzahlFlaschen[getraenkeIndex] << " Flasche(n) " << getraenkomat->getraenk[getraenkeIndex] << " vorhanden. ";
            cout << "Sie erhalten den Rest." << endl;
            getraenkomat->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
        getraenke *getraenkomat1 = new getraenke(2,6,9,10,8,6);
        muenzeinheit *einheit = new muenzeinheit();
    
        //die Münzeinheit wird jetzt übergeben
        automat = new getraenkeautomat(einheit,getraenkomat1);
    
        //ein Getränk auswählen
        do {
            auswahl = automat->getraenkeWaehlen();
        } while (auswahl == -1);
    
        //die Instanzen freigeben
        delete(automat);
    
        return 0;
    }
    

    So erstes erledigt 🙂 ok ich schau mal wo ich das finde zum einstellen 🙂
    Danke schon mal im vorraus.

    Ryo



  • Editier mal Deinen Beitrag und füg die Code Tags hinzu.
    Code markieren. Dann C++ Knopf unter dem 😞 Smiley drücken.

    Und stell mal das Warnlevel Deines Compilers höher. Meiner warnt mich nämlich, wenn ich Deinen Code kompiliere.



  • Wahrscheinlich eine nicht initialisierte Variable. Schau mal deinen Code durch, ob du sowas findest.

    Aber so auf den ersten Blick gefällt mir der Code überhaupt nicht. Und viele Kommentare sind völlig nutzlos.


Anmelden zum Antworten