Getränkeautomat, Kafee oder Tee -->Wer kann mir helfen.
-
Ich habe folgendes zu programmieren mit c++, wer kann mir die Lösung anbieten? Wäre sehr dankbar.
Ein Getränkeautomat gibt Kafee oder Tee ib Bechern aus. DIe Auswahl der Getränke und die zugehörigen Preise werden dem Kunden angezeigt. Ein Becher Kaffee kostet 50 cent, ein Becher Tee 30 cent.
Wenn ein Kunde ein Getränk aus dem Automat erhalten möchte, muss er zunächst das gewünschte Getränk auswählen und dann den gefordeten Geldbetrag einwerfen. Der Automat akzeptiert nur 10, 20 und 50 cent monzen. solange nicht ausreichend Geld aungeworfen wurde, zeigt der Automat den fehlenden Restbetrag an. Wenn der Kunde den Vorgang abbricht, erhält er sein eingeworfenes Geld zurück. Ist der gefordete Betrag mehr eingeworfen worden, gibt der Automat das gewünschte Getränk und gegebenfalls Wechselgeld aus. Ist kein Wechselgeld vorhanden, wird das eingeworfene Geld zurückgegeben.
Wenn keine Becher und7oder kein Getränk vorhanden sind, geht der Automat in den Zustand "außer Betrieb". Um den Automat wieder betriebsbereit zu machen, muss er von einem Servicemitarbeitermit neuen und Getränken befüllt werden. Der Servicemitarbeiter kann ausserdem die Geldeinnahmen des Automaten leeren und7oder Wechselgeld nachfüllen.Hier gie grafische Benutzerfläche
#include "wx/wx.h" #include "automat.h" #include "main.h" Automat::Automat(MyFrame *mf) : meinMyFrame(mf) // member - konstruktion { } // alles in automat neu initialisieren void Automat::init() { meinMyFrame->SetStatusText( "betriebsbereit", 0); //wxLogMessage( "Automat betriebsbereit"); } // wird vom frame objekt als reaktion // auf eine taste aufgerufen (s.o.) void Automat::OnKey( int key_code) { wxString message; switch( key_code) { case ID_FKT1: wxLogMessage( "Kaffee"); break; case ID_FKT2: wxLogMessage( "Tee"); break; case ID_FKT3: wxLogMessage( "Status"); break; case ID_FKT4: wxLogMessage( "Abbruch"); break; case ID_FKT5: wxLogMessage( "key '10'"); break; case ID_FKT6: wxLogMessage( "key '20'"); break; case ID_FKT7: wxLogMessage( "key '50'"); break; case ID_FKT8: wxLogMessage( "key '100'"); break; default: //unsigned ziffer=key_code-ID_OFFSET-'0'; //wxLogMessage( message.Format( "key:%d", ziffer)); wxLogMessage( "Taste '%d' ohne Funktion", key_code-ID_OFFSET-'0'); break; } } **************************************************************************** class MyFrame; /** * empfängt tasten-ereignisse von MyFrame. * Ausgabe erfolgt auch über MyFrame. */ class Automat { public: explicit Automat( MyFrame *m); void OnKey(int ); void init(); private: MyFrame * meinMyFrame; }; **************************************************************** #include "wx/wx.h" #include "automat.h" #include "main.h" /** * Das Windows Executable. */ class MyApp: public wxApp { public: virtual bool OnInit(); }; IMPLEMENT_APP(MyApp) // layout der "tastatur" const MyFrame::knopfdef MyFrame::knopftab [MyFrame::ZEILEN][MyFrame::SPALTEN]= { { { "Kaffee", ID_FKT1}, { "10", ID_FKT5}, { "1", ID_1}, { "2", ID_2}, { "3", ID_3}}, { { "Tee", ID_FKT2}, { "20", ID_FKT6}, { "4", ID_4}, { "5", ID_5}, { "6", ID_6}}, { { "Status", ID_FKT3}, { "50", ID_FKT7}, { "7", ID_7}, { "8", ID_8}, { "9", ID_9}}, { { "Abbruch", ID_FKT4}, { "100", ID_FKT8}, { "*", ID_STAR}, { "0", ID_0}, { "#", ID_HASH}} }; IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame ) BEGIN_EVENT_TABLE(MyFrame,wxFrame) EVT_MENU (ID_QUIT, MyFrame::OnQuit) EVT_TEXT (ID_QUIT, MyFrame::OnQuit) EVT_TIMER (ID_QUIT, MyFrame::OnQuit) EVT_BUTTON (ID_0, MyFrame::OnButton) EVT_BUTTON (ID_1, MyFrame::OnButton) EVT_BUTTON (ID_2, MyFrame::OnButton) EVT_BUTTON (ID_3, MyFrame::OnButton) EVT_BUTTON (ID_4, MyFrame::OnButton) EVT_BUTTON (ID_5, MyFrame::OnButton) EVT_BUTTON (ID_6, MyFrame::OnButton) EVT_BUTTON (ID_7, MyFrame::OnButton) EVT_BUTTON (ID_8, MyFrame::OnButton) EVT_BUTTON (ID_9, MyFrame::OnButton) EVT_BUTTON (ID_STAR, MyFrame::OnButton) EVT_BUTTON (ID_HASH, MyFrame::OnButton) EVT_BUTTON (ID_FKT1, MyFrame::OnButton) EVT_BUTTON (ID_FKT2, MyFrame::OnButton) EVT_BUTTON (ID_FKT3, MyFrame::OnButton) EVT_BUTTON (ID_FKT4, MyFrame::OnButton) EVT_BUTTON (ID_FKT5, MyFrame::OnButton) EVT_BUTTON (ID_FKT6, MyFrame::OnButton) EVT_BUTTON (ID_FKT7, MyFrame::OnButton) EVT_BUTTON (ID_FKT8, MyFrame::OnButton) END_EVENT_TABLE() MyFrame::MyFrame() : wxFrame( (wxFrame *)NULL, -1, "Automat", wxPoint(20,20), wxSize( SPALTEN*(BSIZE+(BSIZE/2))+(BSIZE/2),500) ), derAutomat( this) { wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); wxMenu *file_menu = new wxMenu(); file_menu->Append( ID_QUIT, "E&xit\tAlt-X"); wxMenuBar *menu_bar = new wxMenuBar(); menu_bar->Append(file_menu, "&Action"); SetMenuBar( menu_bar ); CreateStatusBar(3); SetStatusWidths( 3, (int []){ -1, 100, 100} ); for( int zeile=0; zeile<ZEILEN; ++zeile) { for( int spalte=0; spalte<SPALTEN; ++spalte) (void)new wxButton( this , knopftab[zeile][spalte].id, knopftab[zeile][spalte].label, wxPoint(BSIZE/2+(BSIZE+BSIZE/2)*spalte, 120+(BSIZE+BSIZE/2)*zeile), wxSize(BSIZE,BSIZE) ); } m_log = new wxTextCtrl( this, -1, "Log window:\n", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE ); wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) ); delete old_log; topsizer->Add( m_log, 0, wxEXPAND ); SetAutoLayout( TRUE ); SetSizer( topsizer ); derAutomat.init(); } // wird beim start der applikation ein mal aufgerufen bool MyApp::OnInit() { wxFrame *frame = new MyFrame(); frame->Show( TRUE ); return TRUE; } // wird beim verlassen des programms aufgerufen void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) { Close( TRUE ); } // wird beim drücken einer taste // von wxWindows aus aufgerufen void MyFrame::OnButton( wxCommandEvent &event) { int id=event.GetId(); derAutomat.OnKey(id); } ******************************************************************** class MyApp; enum{ // message - identifier der tasten ID_QUIT = 110, ID_OFFSET = 200, ID_0=200+'0', ID_1, ID_2, ID_3, ID_4, ID_5, ID_6, ID_7, ID_8, ID_9, ID_FKT1, ID_FKT2, ID_FKT3, ID_FKT4, ID_FKT5, ID_FKT6, ID_FKT7, ID_FKT8, ID_STAR, ID_HASH }; /** * Zuständig für das Fenster auf dem Bildschirm. * Kommunikation zu den Tasten und dem Statusfeld. */ class MyFrame: public wxFrame { public: MyFrame(); // WriteLogWindow( wxString); private: void OnQuit( wxCommandEvent &event ); void OnButton( wxCommandEvent &event); Automat derAutomat; DECLARE_DYNAMIC_CLASS(MyFrame) DECLARE_EVENT_TABLE() static const int BSIZE=50; static const int ZEILEN=4; static const int SPALTEN=5; struct knopfdef { const char * label; const wxWindowID id; }; static const knopfdef knopftab [ZEILEN][SPALTEN]; wxTextCtrl *m_log; }; ************************************************************* // THIS FILE WILL BE OVERWRITTEN BY DEV-C++! // DO NOT EDIT! #ifndef DUMMY_PRIVATE_H #define DUMMY_PRIVATE_H // VERSION DEFINITIONS #define VER_STRING "0.1.1.1" #define VER_MAJOR 0 #define VER_MINOR 1 #define VER_RELEASE 1 #define VER_BUILD 1 #define COMPANY_NAME "" #define FILE_VERSION "" #define FILE_DESCRIPTION "Developed using the Dev-C++ IDE" #define INTERNAL_NAME "" #define LEGAL_COPYRIGHT "" #define LEGAL_TRADEMARKS "" #define ORIGINAL_FILENAME "" #define PRODUCT_NAME "" #define PRODUCT_VERSION "" #endif //DUMMY_PRIVATE_H **********************************************************************++ // THIS FILE WILL BE OVERWRITTEN BY DEV-C++! // DO NOT EDIT! A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "dummy.ico" :confused:
<Hume>Code-Tags eingefügt!</Hume>
-
Hallo Roberto,
stelle eine konkrete Frage.
Auf ein "wer kann mir die Lösung anbieten?" wirst du keine Antwort bekommen.
-
Code-Tags wären auch mal ganz angenehm...
-
@Roberto1:
Schreib einen Lösungsvorschlag und man wird dir mit Sicherheit helfen, aber nicht nur indem du uns die GUI schickst, die interessiert am wenigsten, da man dieses Problem ebenfalls mit Standard-C++ lösen kann.Code-Hacker
-
Ich kann Dir einen prinzipiellen Ansatz zeigen. Hier das Zusammenspiel zwischen Klasse Automat und Person, also eine Simulation:
// main.cpp // Basiert auf einem Programm aus dem Lehrbuch von Prof. Ulrich Breymann // C++ Eine Einführung, 5. Auflage, Hanser-Verlag #include "person.h" #include "automat.h" #include <cstdlib> #include <conio.h> int zufall( int x ) // Pseudo-Zufallszahl zwischen 0 und x { return rand() % x + 1; } int main() { const int DOSENANZAHL = 5, DOSENPREIS = 2, MAXGELD = 10; GetraenkeAutomat objAutomat( DOSENANZAHL, DOSENPREIS ); // Objekt Automat while( !objAutomat.istGesperrt() ) // solange Dosen im Automat sind { cout << endl << " Anzahl Dosen: " << objAutomat.getAnzahlDosen() << endl; Person objPerson( zufall(MAXGELD) ); // eine Person betritt die Szene (ctor) if( objPerson.genugGeld( objAutomat.getGetraenkePreis() ) ) { int geld = zufall( objPerson.wievielGeld() ); objPerson.GeldEinwerfen( objAutomat, geld ); objPerson.KnopfDruecken( objAutomat ); if( objAutomat.istRueckgeldVorhanden() ) objPerson.GeldEntnehmen( objAutomat.GeldRueckGabe() ); if( objAutomat.DoseHerausgegeben() ) { objPerson.DoseEntnehmen( objAutomat ); objPerson.trinkt(); } if( objAutomat.istGesperrt() ) cout << endl << " AUTOMAT GESPERRT!!! (leer)" << endl << endl; } else objPerson.sagt( " Leider zuwenig Geld." ); }// eine Person verlässt die Szene (dtor) getch(); }
// person.h // Alle Methoden sind inline, weil sie sehr kurz sind, daher keine cpp-Datei. #ifndef PERSON_H #define PERSON_H #include <iostream> #include <string> #include "automat.h" using namespace std; class Person { public: // Konstruktor mit Initialisierungsliste Person( int anfaenglicheGelEuroenge ) : Geld( anfaenglicheGelEuroenge ) { cout << endl << " Eine Person mit " << Geld << " Euro kommt." << endl; } ~Person() // Destruktor { cout << " Eine Person geht mit " << Geld << " Euro." << endl; } bool genugGeld( int Preis ) const { return Preis <= Geld; } int wievielGeld() const { return Geld; } void sagt( string text ) const { cout << text << endl; } void trinkt() const { sagt(" Person sagt: \"gluckgluck... aaaah!\""); } void DoseEntnehmen( GetraenkeAutomat & a ) const { a.DoseFreigeben(); } void GeldEntnehmen( int Muenzen) { Geld += Muenzen; } void GeldEinwerfen( GetraenkeAutomat & a, int Muenzen ) { Geld -= Muenzen; a.MuenzenAkzeptieren( Muenzen ); } void KnopfDruecken( GetraenkeAutomat & a ) { a.GeldPruefenUndDoseHerausgeben(); } private: int Geld; // Die wichtigste Eigenschaft von Kunden! }; #endif
// automat.h // Klassendeklaration zur Simulation eines Getränkeautomaten #ifndef AUTOMAT_H #define AUTOMAT_H class GetraenkeAutomat { public: GetraenkeAutomat( int Anzahl, int Dosenpreis ); bool istGesperrt() const { return gesperrt; } bool istRueckgeldVorhanden() const { return Rueckgeld > 0; } bool DoseHerausgegeben() const { return DoseInAusgabe;} int getGetraenkePreis() const { return PreisProDose;} void DoseFreigeben() { DoseInAusgabe = false; } void GeldPruefenUndDoseHerausgeben(); void MuenzenAkzeptieren( int M ); int GeldRueckGabe(); int getAnzahlDosen() { return AnzahlDosen; } private: int AnzahlDosen; int PreisProDose; int Einnahmen; int eingeworfeneMuenzen; int Rueckgeld; bool DoseInAusgabe; bool gesperrt; GetraenkeAutomat( const GetraenkeAutomat & ); // Übergabe per Wert verbieten }; #endif
// automat.cpp #include "automat.h" #include <iostream> using namespace std; GetraenkeAutomat::GetraenkeAutomat( int Anzahl, int Dosenpreis) : AnzahlDosen(Anzahl), PreisProDose(Dosenpreis), Einnahmen(0), Rueckgeld(0), DoseInAusgabe(false), gesperrt(Anzahl <= 0) {} void GetraenkeAutomat::GeldPruefenUndDoseHerausgeben() { if( gesperrt ) { cout << " Automat leer/gesperrt!" << endl; Rueckgeld = eingeworfeneMuenzen; } else if (eingeworfeneMuenzen < PreisProDose) { cout << " Geld reicht nicht!" << endl; Rueckgeld = eingeworfeneMuenzen; } else { Einnahmen += PreisProDose; Rueckgeld = eingeworfeneMuenzen - PreisProDose; cout << " Dose faellt in Ausgabe! (rumpel)" << endl; DoseInAusgabe = true; if( --AnzahlDosen == 0 ) gesperrt = true; } } void GetraenkeAutomat::MuenzenAkzeptieren(int M) { eingeworfeneMuenzen = M; cout<< " " << M << " Euro eingeworfen" << endl; } int GetraenkeAutomat::GeldRueckGabe() { int temp = Rueckgeld; Rueckgeld = 0; cout << " Geldrueckgabe: " << temp << " Euro" << endl; return temp; }