/*
Der Getränkeautomat - Einsendeaufgabe 1
*/
#include <iostream>
#include <cmath>
using namespace std;
// die Vereinbarung der Klassen
class muenzeinheit
{
// die Attribute
int betrag;
int nochZuZahlen;
int rueckgeld;
public:
// die Methoden
void init();
void muenzenAnnehmen(int wert);
int rueckgeldGeben();
// zum setzen des Betrags
void setBetrag(int preis);
// zum Abfragen des noch zu zahlenden Betrags
int getnochZuZahlen();
};
class getraenke
{
// die Attribute
int restFlaschen;
int preisProFlasche;
public:
string getraenk[6];
// die Methoden
void init();
};
class getraenkeautomat
{
// die Attribute
int anzahlFlaschen[6];
bool kuehlung;
// jetzt ist die Münzeinheit Teil des Getränkeautomaten
muenzeinheit *zahlomat;
// die Getränke sind auch Teil des Automaten
getraenke *getromat;
public:
// die Methoden
void init();
int getraenkWaehlen();
void getraenkAusgeben(int anzahl, int getraenkeIndex);
void kuehlen(bool anaus);
};
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;
}
void getraenke::init()
{
// die Getränke eintragen
getraenk[0] = "Limonade";
getraenk[1] = "Wasser";
getraenk[2] = "Bier";
getraenk[3] = "Apfelsaft";
getraenk[4] = "O-Saft";
getraenk[5] = "Bionade";
}
void getraenke::getGetraenk()
{
return getraenk[6];
}
void getraenkeautomat::init()
{
// die Anzahl der Flaschen
anzahlFlaschen[0] = 10;
anzahlFlaschen[1] = 7;
anzahlFlaschen[2] = 10;
anzahlFlaschen[3] = 10;
anzahlFlaschen[4] = 8;
anzahlFlaschen[5] = 3;
// die Kühlung ist aus
kuehlung = false;
// eine Instanz der Münzeinheit erzeugen
zahlomat = new muenzeinheit();
// die Instanz initialisieren
zahlomat->init();
// eine Instanz der Getränke erzeugen
getromat = new getraenke();
// die Instanz initialisieren
getromat->init();
}
int getraenkeautomat::getraenkWaehlen()
{
int auswahl, anzahl;
// die Auswahl
cout << "Bitte waehlen Sie ein Getraenk: " << endl;
cout << "Es gibt folgende Auswahl: " << endl;
for (int index = 0; index < 6; index++)
cout << index+1 << " - " << getromat->getGetraenk[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) " << getromat->getGetraenk[getraenkeIndex] << endl;
anzahlFlaschen[getraenkeIndex] = anzahlFlaschen[getraenkeIndex] - anzahl;
}
else
{
cout << "Es sind nur noch " << anzahlFlaschen[getraenkeIndex] << " Flasche(n) " << getromat->getGetraenk[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;
automat = new getraenkeautomat();
// Instanzen initialisieren
automat->init();
// ein Getränk auswählen
do {
auswahl = automat->getraenkWaehlen();
}while (auswahl == -1);
// die Instanzen freigeben
delete(automat);
return 0;
}