Kaffeeautomat neu proggen



  • moin moin zusammen!

    wäre jemand bereit, mir eine funktionierende main-funktion zu folgenden klassen zu schreiben???

    #include "stdafx.h"
    #include "istream.h"
    #include "ostream.h"
    
    class Stoff             // kann sowohl milch, zucker, kaffee, tee sein
    {
    public:
        Stoff();                // Konstruktor
        ~Stoff();               // Destruktor
    
    public:
        bool istnochda();           // prüft, ob noch genug "stoff" da ist
    
    public:
        int Preis;              // jeweiliger Preis
    public:
        int getPreis();         // übergibt Preis 
        void setPreis(int neuerPreis);      // damit lassen sich die einzelnen Preise editieren
    
    public:
        bool gewaehlt;          // "mit oder ohne" (zucker, milch,...)
        void auswahl();         // schaltet zwischen "mit" und "ohne" hin und her
        void auswahl(bool mit);     // setzt "mit" oder "ohne"
    };
    
    int Stoff::getPreis() 
    {
        if (gewaehlt)
        {
            return Preis;
        }
        else
        {
            return 0;
        }
    };  
    
    void Stoff::setPreis(int neuerPreis){Preis = neuerPreis;};
    
    void Stoff::auswahl(bool mit){gewaehlt = mit;};
    void Stoff::auswahl(){gewaehlt = !gewaehlt;};
    
    bool Stoff::istnochda ()
    {
        cout<<"Momentan ist alles da..."<<endl;
        return 0;
    };
    
    //---------------------------------------------------------------------------------------------------------------------------------------//
    
    class Apparat               // Getränkeautomat
    {
    public:
        Apparat();          // Konstruktor
        ~Apparat();         // Destruktor
    
    private:
        int gesamtpreis;            // Summe der Einzelpreise
        void gesamtpreisberechnung();   // ...
        void gesamtpreisanzeige();
    
        Stoff kaffee;
        Stoff tee;
        Stoff milch;
        Stoff zucker;
        Stoff wasser;
    
    public:
        void kaffee_knopf();            // Bedienelemente
        void tee_knopf();           
        void milch_knopf();
        void zucker_knopf();
        void abbruch_knopf();
    private:
        int guthaben;           // alle Preise in Cent, Guthaben = eingeworfenes Geld
        void geldeinwerfen(int geld);
        void geldrueckgabe(int geld);       // Anweisung für die Geldrückgabe
    
        int wechselgeld;            // im Apparat vorhandenes Rausgeld  
    
        void abfuellen();           // füllt Getränk ab
    
        void zuruecksetzen();       // alles auf Anfangswerte einstellen
        void einstellungen();       // Preise, ... verändern
    
        int hinweis();          // Warnmeldung, wenn kein Wechselgeld mehr da ist
    
                        // 2 Anzeigelampen:
        bool kein_kaffee_lampe;     // leuchtet, wenn kein kaffee mehr da ist, 
        bool kein_tee_lampe;        // dito für Tee
    
    };
    
    void Apparat::gesamtpreisanzeige ()
    {
        cout<<"Ihr Getraenk kostet: "<<gesamtpreis<<endl;
    };
    
    void Apparat::geldrueckgabe(int geld)
    {
        cout<<"Rausgeld: "<<guthaben-gesamtpreis<<endl;
    };
    
    void Apparat::abfuellen ()
    {
        cout<<"Ihr Getraenk wird jetzt abgefüllt!"<<endl;
    };
    
    void Apparat::gesamtpreisberechnung()   
    {
        gesamtpreis = kaffee.getPreis() + tee.getPreis() + milch.getPreis() + zucker.getPreis();
    };      
    
    void Apparat::kaffee_knopf()
    {
        if (guthaben == 0)
        {
            tee.auswahl(false);
            kaffee.auswahl(true);
            gesamtpreisberechnung();
            gesamtpreisanzeige();
        }
    };
    
    void Apparat::tee_knopf()
    {
        if (guthaben == 0)
        {
            tee.auswahl(true);
            kaffee.auswahl(false);
            milch.auswahl(false);
            zucker.auswahl(false);
            gesamtpreisberechnung();
            gesamtpreisanzeige();
        }
    };
    void Apparat::milch_knopf()
    {
        if (guthaben == 0)
        {
            if (kaffee.gewaehlt)
            {
                milch.auswahl();
                gesamtpreisberechnung();
                gesamtpreisanzeige();
            }
        }
    };
    
    void Apparat::zucker_knopf()
    {
        if (guthaben == 0)
        {
            if (kaffee.gewaehlt)
            {
                zucker.auswahl();
                gesamtpreisberechnung();
                gesamtpreisanzeige();
            }
        }
    };
    
    void Apparat::abbruch_knopf()
    {
        geldrueckgabe(guthaben);
        zuruecksetzen();
    };
    
    void Apparat::zuruecksetzen()
    {
        tee.auswahl(false);
        kaffee.auswahl(false);
        milch.auswahl(false);
        zucker.auswahl(false);  
        guthaben = 0;
    
        kein_kaffee_lampe = false;
        kein_tee_lampe = false;
    
        if (wasser.istnochda())
        {
            if (!kaffee.istnochda())
            {
                kein_kaffee_lampe = true;
            }   
            if (!tee.istnochda())
            {
                kein_tee_lampe = true;
            }
        }
        else
        {
            kein_kaffee_lampe = true;
            kein_tee_lampe = true;
        }
    };
    
    void Apparat::geldeinwerfen(int geld)
    {
        guthaben = guthaben + geld;
    
        if (guthaben >= gesamtpreis)
        {
            abfuellen();
            geldrueckgabe(guthaben - gesamtpreis);
            zuruecksetzen();
        }
    };
    
    void Apparat::einstellungen()
    {
        kaffee.setPreis(80);
        tee.setPreis(80);
        zucker.setPreis(0);
        milch.setPreis(5);
    };
    
    int Apparat::hinweis()
    {
        if (wechselgeld = 0)
        cout << "Passend zahlen" << endl;
        return 0;
    };
    


  • zuerst musst du noch die konstruktoren und destruktoren der beiden klassen implementieren.. 😉



  • zuerst musst du noch die konstruktoren und destruktoren der beiden klassen implementieren..

    meinst du etwa so:

    Stoff(start);           //prog startet  
    
    ~Stoff(ende);            //dito
    


  • ja so
    edit: warum machst du die main funktion nicht selber, ist doch ne gute übung??

    [ Dieser Beitrag wurde am 25.02.2003 um 15:41 Uhr von phippse editiert. ]



  • weil ich leider...

    a) absolut keine zeit dafür hab im moment!!! (beruflich bedingt)
    b) mir grad die zündende idee fehlt, wie ich die main zu schreiben hab...



  • es fehlen die "körper" der funktionen...

    also die konstruktoren und destruktoren müssen noch definiert werden, ... sonst gibt es einen linkerfehler



  • könntest du da mal bitte einspringen??? 🙂



  • Frage: Die Klasse ist ja schön und gut, aber soll das nur eine Übung sein oder mal richtig funktionieren? Falls es um zweiteres geht, dann musst du noch irgendwie bei Abfüllen zumindest eine Kaffee-API haben?

    MfG SideWinder



  • gedacht war die ganze sache anfangs "nur" als übung. aber wärst du so freundlich mir besagte api zu basteln?



  • Original erstellt von Code-Guru:
    gedacht war die ganze sache anfangs "nur" als übung. aber wärst du so freundlich mir besagte api zu basteln?

    fang doch einfach mal an, selber was zu programmieren und bei problemen poste diese 😉



  • lol ne kaffee api, das problem dürfte nur sein dass sie bei jeder kaffeemaschine anders aussehen muss.code guru wenn du meinst dass hier im forum leute arbeit für dich erledigen, dann bist du an der falschen Adresse.Das Forum ist eigentlich, glaub ich zumindest, für hilfe bei konkreten Problemen gedacht.

    So far,
    phippse



  • Tut mir leid, abgelehmt: erstens habe ich noch nie eine API programmiert und wäre dabei sicherlich schon überfordert und zweitens kenne ich mich mit dem Innenleben von Kaffeeautomaten nicht ganz so gut aus ;).

    MfG SideWinder



  • eine API ist doch eigentlich schon eine Klassen Definition, wo ist das Problem und um unser Kaffemaschinen OS überall laufen zu lassen nutzen wir einfach eine entsprechend hohe Abstratkion von der Hardware.

    (in dem Beispiel geh ich mal davon aus, dass es nicht für alle Systeme eine vernünfitge std lib gibt und man kein cout zur Ausgabe auf dem Display benutzen kann)

    class hardware
    {
    public:
      enum modus_t
      { 
        SLEEP /*Stromspar Modus*/, ACTIVE, /*aktiviert (Kunden eingabe)*/ 
        COMMECIAL, /*(falls vorhanden) der Modus um die Leute anzulocken, zB. 
                     durch Spielereien mit den Lampen*/
        DEACTIVATED
      };
      enum event_t
      {
        FAILURE,
        KEYPRESSED,
        MONEY,
        TIMER
      };
    
      hardware();
      ~hardware();
      enum event_t wait(void); //wait for event
      int failure(void) const; //failure id
      void failure(int id); //failure
      //Mode
      void modus(enum modus_t modus);
      enum modus_t modus(void) const;
      //I/O
      void changeled(int no);
      bool led(int no) const;
      void display(const char *out) const;
      void display(double n) const;
      bool inserted(double &money) const;
      int keypressed(void) const;
      //how many...
      int cups(void) const;
      int coffee_amount(int type) const;
      double money(void) const;
      //output...
      void cup(void);
      void coffee(int type);
      void money(double money);
      //timer
      void settimer(int seconds);
    };
    
    int types=3;
    const double prices[]=
    {2,3,1.5}
    
    enum timer_t
    { 
      SHOWCOMMERCIAL,
      OUTPUTMONEY
    };
    
    void sell(hardware &machine, double &money, int &key, enum timer_t &timer)
    {
      if(!key)
      {
        machine.display("what coffee?\n");
        if(money)
        {
          timer=OUTPUTMONEY; //gib das Geld aus in
          machine.timer(60); //60 sekunden (wenn es keien Eingabe mehr gibt)
        }
      }
      if(money)
      {
        if(money<price[key])
        {
          machine.display("needs ");
          machine.display(price[key]-money);
          machine.display("€\n");
        }
        machine.cup();
        machine.coffee(key);
        if(!machine.cup()||!machine.coffee_amount(key))
           machine.failure(0);
        if(money>price[key])
        {
          machine.display("output ");
          machine.display(money-price[key]);
          machine.display("€\n");
        }
        money=0;
        key=0;
      }
      else
      {
        key=0;
        timer=SHOWCOMMERCIAL; //schlafe in
        machine.timer(120); //2 Minuten, wenn keine Eingabe mehr erfolgt
      }
    }
    
    int main(void)
    {
      hardware machine;
      machine.modus(hardware::SLEEP);
      machine.timer(600);
      enum timer_t timer=SHOWCOMMERCIAL;
      double money=0;
      int key=0;
      for(;;)
      {
        switch(machine.wait())
        {
        case hardware::MONEY:
          {
            if(machine.modus()!=hardware::ACTIVE)
              machine.modus(hardware::ACTIVE);
            machine.timer(0);
            money=machine.money();
            machine.display("money: ");
            machine.display(money);
            machine.display("€\n);
            sell(machine,money,key,timer);
            break;
          }
        case hardware::KEYPRESSED:
          {
            if(machine.modus()!=hardware::ACTIVE)
              machine.modus(hardware::ACTIVE);
            machine.timer(0); //deaktiviere den Timer
            key=machine.keypressed();        
            machine.display("coffee: ");
            machine.display(key);
            machine.display("\n");
            if(key>types)
            {
              machine.display("invalid input\n");
              if(money)
              {
                timer=OUTPUTMONEY; //gebe das Geld aus nach
                machine.timer(60); //1 Minute
              }
              else
                machine.modus(hardware::SLEEP);
              break;
            }
            sell(machine,money,key,timer);
            break;
          }
        case hardware::TIMER:
          {
            switch(timer)
            {
            case SHOWCOMMERCIAL:
              if(machine.modus()==hardware::COMMERCIAL)
              {
                machine.modus(hardware::SLEEP);
                machine.timer(600);
                break;
              }
              else
              {
                machine.modus(hardware::COMMERCIAL); 
                machine.timer(30);
                break;
              }
            case OUTPUTMONEY:
              machine.money(money);
              money=0;
              machine.modus(hardware::SLEEP);
              machine.timer(600);
              break;
            }
          }
         case hardware::FAILURE:
           //hihi, die Maschine verschluckt das Geld, falls zwischen Eingabe des Geldes und Ausgabe des Kaffees ein Fehler auftritt :)
           machine.modus(hardware::SLEEP);
           machine.display("out of order\n");
           machine.wait(); //for help
           break;
        }
      }
    }
    

    nun muss nur noch die hardware Klasse unseren Vorgaben nach geschrieben werden, aber ich glaube nicht, dass sich so eine Arbeitsweise bei den meisten Embedded Geräten lohnt 😉

    [ Dieser Beitrag wurde am 03.03.2003 um 16:46 Uhr von kingruedi editiert. ]


Anmelden zum Antworten