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 so

    Copy&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.


  • Mod

    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 soweiter

    ich 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 sind

    Er 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.


Anmelden zum Antworten