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.


  • Mod

    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)
    
    1. 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.

    2. Beschreib bitte mal was du mit dieser Zeile erreichen wolltest. Und wo kommt jetzt auf einma getraenkeIndex her? In dem von dir gezeigten Code wird in den Funktionen entweder auswahl oder getraenkeIndex verwendet, aber soweit ich sehen konnte nie beides in der selben Funktion.


  • Mod

    hustbaer schrieb:

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


  • Mod

    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. 😃 👍


  • Mod

    hustbaer schrieb:

    Hrhr. 😃 👍

    Ich hab' dich auch lieb.


Anmelden zum Antworten