sorry aber...



  • Hallo,

    ich habe ein Problem, ich komme mit einer Aufgabe einfach nicht weiter obwohl ich im kopf verstehe was zutun ist wirklich 😃 aber ich kann es Praktisch einfach nicht umsetzen! 😡 Und sorry für den langen post ich wusste nicht wie es sonst machen soll.

    Ich weis das solche fragen eher unbeliebt sind, und hab es auch deshalb solange wie möglich hinaus gezögert zu fragen, und ich möchte gleich klar stellen ich WILL KEINEN HAUSAUFGABENSERVICE! Lenkt mich bitte einfach in die richtige richtung weil ich es wirklich lernen und verstehen will.

    folgendes Problem: Das Programm soll ein "Getränkeautomat" sein.
    Der Preis für die Flaschen wird berechnet, bevor geprüft wird, ob noch genügend Flaschen vorhanden sind. Es erfolgt auch keine Rückgabe des eventuell zu viel gezahlten Geldes.
    Ä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.

    Mein problem ist in zeile 103 - 112.

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    class muenzeinheit
    {
        //die Attribute
        int betrag;
        int nochZuZahlen;
        int rueckgeld;
    
        //die Methoden
    public:
        void init();
        void muenzenAnnehmen(int wert);
        int rueckgeldGeben();
        //zum setzten des Betrags
        void setBetrag(int preis);
        //zum Abfragen des noch zu zahlenden Betrags
        int getnochZuZahlen();
    };
    
    void muenzeinheit::init()
    {
        betrag = 0;
        nochZuZahlen = 0;
        rueckgeld = 0;
    }
    
    void muenzeinheit::muenzenAnnehmen(int wert)
    {
        //den eingeworfenen Betrag abziehen
        nochZuZahlen = nochZuZahlen - wert;
    }
    
    int muenzeinheit::rueckgeldGeben()
    {
        //den absoluten Wert 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;
    }
    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
        void init();
        int getraenkeWaehlen();
        void getraenkAusgeben(int anzahl, int getraenkeIndex);
        void kuehlen(bool anaus);
    };
    void getraenkeautomat::init()
    {
        //die Getränke eintragen
        getraenk[0] = "Limonade";
        getraenk[1] = "Wasser";
        getraenk[2] = "Bier";
    
        //die Anzahl der Flaschen
        anzahlFlaschen[0] = 10;
        anzahlFlaschen[1] = 10;
        anzahlFlaschen[2] = 10;
    
        //die Kühlung ist aus
        kuehlung = false;
        //eine Instanz der Münzeinheit erzeugen
        zahlomat = new muenzeinheit();
        //die Instanz initialisieren
        zahlomat->init();
    }
    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ähltem Getränk?
        if (anzahlFlaschen[auswahl -1] < anzahl)
        {
    
           //das getränk ausgeben
            cout << "Wie viele Flaschen moechten Sie? ";
            cin >> anzahl;
            //erst muss bezahlt werde, der Preis 10 ist fest vorgegeben
            cout << "Sie muessen " << anzahl * 50 << " cent bezahlen." << endl;
            zahlomat->setBetrag(anzahl * 10);
    
            do
            {
                cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl;
                zahlomat->muenzenAnnehmen(50);
            }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, anzahl;
        //Instanz erzeugen, der zeiger auf die klasse
        getraenkeautomat *automat = new getraenkeautomat();
    
        //Instanzen initialisieren
        automat->init();
        //ein getränk wählen
        do
        {
            auswahl = automat->getraenkeWaehlen();
        }while (auswahl == -1);
    
        //die Instanzen freigeben
        delete (automat);
        return 0;
    }
    

    Ich verstehe das ich nach dem eingeben der anzahl "nur" prüfen muss ob die eingegebene anzahl größer ist als die anzahl der Flaschen im Automaten sollte das der fall sein die anzahl auf die anzahlFlaschen abändern.

    Sorry aber... leute ich bekomm es nicht gebacken! 😕

    Seid nicht zu streng mit mir 🙄 und danke an diejenigen die antworten.



  • Fragen sind diese Dinger mit dem '?' am Ende.



  • hab mich gerade echt gefreut als ich dachte mir will jemand helfen 😃 haha



  • Dann änderst du den Code eben entsprechend:

    Absolut ungetestet:

    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;
        if (auswahl < 1 || auswahl > 3) {
            // die 3 solltest du nicht von Hand einbauen, sondern berechnen. Siehe sizeof.
            // oder nimm besser ein std::array statt eines C-Style-Arrays.
            cout << "Nä, die Zahl stimmt sowas von nicht!\n";
            return -1;
        }
        //die interne nummer ist um 1 kleiner
        --auswahl;
    
        if (!anzahlFlaschen[auswahl]) {
            cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl;
            return -1;
        }
        // das getränk ausgeben
        cout << "Wie viele Flaschen moechten Sie? ";
        cin >> anzahl;
        if (anzahlFlaschen[auswahl] < anzahl) {
            anzahl = anzahlFlaschen[auswahl];
            cout << "Nicht mehr genügend Flaschen vorhangen.\n"
                 << "Ich habe Ihre Wahl daher automatisch auf " << anzahl << " gesetzt.\n";
        }
    
        // erst muss bezahlt werde, der Preis 10 ist fest vorgegeben
        cout << "Sie muessen " << anzahl * 50 << " cent bezahlen." << endl;
        // haha! 10 cent oder 50 cent?!
        zahlomat->setBetrag(anzahl * 10);
    
        do {
            cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl;
            zahlomat->muenzenAnnehmen(50);
        } while (zahlomat->getnochZuZahlen() > 0);
        // das getränk ausgeben
        getraenkAusgeben(anzahl, auswahl);
        return auswahl;
    }
    

    Ach ja, noch was:
    1. Warum init() statt Konstruktor?

    2. Warum new? Damit baut man sich gerne Fehler ein, so auch hier. Du hast ein Speicherleck - jedes init() der Münzeinheit leckt! Spricht im Getränkeautomat irgendwas gegen muenzeinheit zahlomat; statt muenzeinheit *zahlomat; ? Der zahlomat hat doch nur 3 ints! Wenn schon als Pointer, dann als unique_ptr, bitte. Aber dann müsstest du dir auch noch Gedanken um den Copy-Constructor machen. Also einfach eine Münzeinheit mit rein nehmen statt einen Pointer!

    Weiter unten auch: wozu

    getraenkeautomat *automat = new getraenkeautomat();
    ...
    delete getraenkeautomat;
    

    Warum nicht einfach:

    getraenkeautomat automat;
    

    Oder wenns unbedingt ein Pointer sein soll:

    auto automat = std::make_unique<getraenkeautomat>();
    

    3. Leere Zeilen zwischen Funktionen kosten nix!

    4. Das hier:

    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;
        }
    }
    

    meintest du das viel kürzere:

    void getraenkeautomat::kuehlen(bool anaus) {
        kuehlung = anaus;
        cout << "Die Kuehlung ist " << kuehlung ? "eingeschaltet.\n" : "ausgeschaltet.\n";
    }
    


  • vielen dank für deine sehr ausfürliche antwort 👍
    leider kenne ich vieles nicht einmal von dem du redest 🙄
    also kann ich zu deinen ganzen fragen eigentlich nur sagen: weil ich es nicht besser weis.. dieser code wurde mir zum großteil so in meinem Studienheft vorgegeben. 😕



  • Diese Aufgabe ist ja ein richtiger Klassiker: Google: muenzeinheit c++ site:www.c-plusplus.net 🙂

    Mir fällt da jetzt nichts hilfreicher als die Antwort vom Hausaufgabenservice dazu ein. Ausser dem Rat, eventuell den Kurs zu wechseln.



  • Mittagspause schrieb:

    Diese Aufgabe ist ja ein richtiger Klassiker: Google: muenzeinheit c++ site:www.c-plusplus.net 🙂

    Haha...das hatte ich auch vor, war aber zu faul. Und ich hätte das schöne Wort zahlomat genommen... 🙂


Anmelden zum Antworten