Ich lerne es erst ein Paar Tagen. Mache ein Fernstudium bei ILS. Ich sollte ein Code aus meinem Studienheft bearbeiten, dass es funktioniert. Wir sind da gerade beim Klassen und Datenkapselung. Habe schon über diese Aufgabe im Internet gelesen, und viel sagen, dass es nicht gut geschrieben ist. Über __del__ Methoden usw. Das mit dem append. kommt von Lehrer, er hat das geschrieben als Beispiel, so ich habe das benutzt und es sollte mehr Getränke geben. Hier ist die Aufgabe mit dem Code:
1."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 dem 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."
2."Unser Getränkeautomat ist ein „Betrüger“. Der Preis für die Flaschen wird berech
net, 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."
Code: Alles auswählen
""" ********************************
Der Getränkeautomat Version 6
mit der Methode __init__()und __del__()
************************************"""
# die Vereinbarung der Klasse für die Münzeinheit
class Muenzeinheit:
# die Methode __init__()
def __init__ (self):
# die Attribute
self.betrag = 0
self.noch_zu_zahlen = 0
self.rueckgeld = 0
# die Methode __del__()
def __del__(self):
print("Eine Instanz der Klasse Muenzeinheit wurde gelöscht.")
# die weiteren Merhoden
def muenzen_annehmen(self, wert):
self.noch_zu_zahlen = self.noch_zu_zahlen - wert
def rueckgeld_geben(self):
# den absoluten Betrag von noch_zu_zahlen als Rückgeld liefern
self.rueckgeld = abs(self.noch_zu_zahlen)
return self.rueckgeld
def set_betrag(self, preis):
self.betrag = preis
self.noch_zu_zahlen = self.betrag
def get_noch_zu_zahlen(self):
return self.noch_zu_zahlen
# die Vereinbarung der Klasse für den Automaten
class Getraenkeautomat:
# übergeben werden die Anzahl und eine Referenz auf die Münzeinheit
def __init__(self, anzahl1, anzahl2, anzahl3, temp_zahlomat):
# die Attribute
# jetzt ist die Münzeinheit Teil des Automaten
self.zahlomat = temp_zahlomat
# eine leere Liste für die Gertänkenamen und die Anzahl der Flaschen
self.getraenk = []
self.anzahl_flaschen = []
# die Gertänke eintragen
self.getraenk.append("Limonade")
self.getraenk.append("Wasser")
self.getraenk.append("Bier")
# die Anzahl der Flaschen
# Sie werden jetzt durch die Argumente gesetzt
self.anzahl_flaschen.append(anzahl1)
self.anzahl_flaschen.append(anzahl2)
self.anzahl_flaschen.append(anzahl3)
# die Kühlung ist aus
self.kuehlung = False
def __del__(self):
print("Eine Instanz der Klasse Getraenkeautomat wurde gelöscht.")
def getraenke_waehlen(self):
# die Auswahl
print("Bitte wählen sie ein Gertänk:")
print("Es gibt folgende Auswahl:")
anzeige_auswahl = 1
for getraenk in self.getraenk:
print(anzeige_auswahl, getraenk)
anzeige_auswahl = anzeige_auswahl + 1
auswahl = int(input("Geben Sie die gewünschte Nummer ein: "))
# gibt es noch Flaschen vom gewählten Gertänk?
if self.anzahl_flaschen[auswahl - 1] != 0:
# die Anzahl der Flaschen einlesen
anzahl = int(input("Wie viele Flaschen möchten Sie? "))
# erst muss bezahlt werden
# der Preis 10 ist fest vorgegeben
print("Sie müssen", anzahl * 10, "Cent bezahlen.")
self.zahlomat.set_betrag(anzahl * 10)
while self.zahlomat.get_noch_zu_zahlen() > 0:
print("Es fehlen noch", self.zahlomat.get_noch_zu_zahlen(), "Cent.")
self.zahlomat.muenzen_annehmen(3)
# das Getränk ausgeben
auswahl = auswahl - 1
self.getraenk_ausgeben(anzahl, auswahl)
else:
print("Das gewählte Getränk ist leider nicht mehr vorhanden.")
auswahl = - 1
return auswahl
def getraenk_ausgeben(self, anzahl, getraenke_index):
# gibt es noch genügend flaschen?
if anzahl <= self.anzahl_flaschen[getraenke_index]:
print("Sie erhalten", anzahl, "Flasche(n)", self.getraenk[getraenke_index])
self.anzahl_flaschen[getraenke_index] = self.anzahl_flaschen[getraenke_index] - anzahl
else:
print("Es sind nur noch", self.anzahl_flaschen[getraenke_index], "Flaschen", self.getraenk[getraenke_index], "vorhanden.")
print("Sie erhalten den Rest.")
self.anzahl_flaschen[getraenke_index] = 0
# Geld zurückgeben
print("Sie erhalten", self.zahlomat.rueckgeld_geben(),"Cent zurück,")
def kuehlen(self, an_aus):
self.kuehlung = an_aus
if self.kuehlung == True:
print("Die Kühlung ist eingeschaltet.")
else:
print("Die Kühlung ist ausgeschaltet.")
# eine Münzeinheit erzeugen
zahlomat = Muenzeinheit()
# einen Automaten erzeugen
#die Münzeinheit und die Anzahl der Getränke werden übergeben
automat = Getraenkeautomat(10, 20, 30, zahlomat)
auswahl = - 1
# die Kühlung einschalten
automat.kuehlen(True)
# ein Getränk auswählen
while auswahl == -1:
auswahl = automat.getraenke_waehlen()
# die Kühlung ausschalten
automat.kuehlen(False)
# die Instanzen ausdrücklich freigeben
# zuerst den Automaten
del automat
# und die Münzeinheit
del zahlomat
Also habe ich versucht es zu machen. Erstes mal war Komplett alles falsch und nach ein paar Besprechungen habe ich das so geändert, und Lehrer wollte dazu noch eine Methode, wegen Datenkapselung, die die Anzahl ändert. Mein Code gerade mit Fehlern:
Code: Alles auswählen
""" ********************************
Der Getränkeautomat Version 6
mit der Methode __init__()und __del__()
************************************"""
# die Vereinbarung der Klasse für die Getränke
class Getraenk:
# die Merhode __init__() mit wert übergabe
def __init__(self, name, preis, anzahl):
# die Attribute
self.name_getraenk = name
self.preis_pro_flasche = preis
self.anzahl_flaschen = anzahl
# die weitere Methoden
def get_name_getraenk(self):
return self.name_getraenk
def get_anzahl_flaschen(self):
return self.anzahl_flaschen
def get_preis_pro_flasche(self):
return self.preis_pro_flasche
# die Vereinbarung der Klasse für die Münzeinheit
class Muenzeinheit:
# die Methode __init__()
def __init__ (self):
# die Attribute
self.betrag = 0
self.noch_zu_zahlen = 0
self.rueckgeld = 0
# die Methode __del__()
def __del__(self):
print("Eine Instanz der Klasse Muenzeinheit wurde gelöscht.")
# die weiteren Methoden
def muenzen_annehmen(self, wert):
self.noch_zu_zahlen = self.noch_zu_zahlen - wert
def rueckgeld_geben(self):
# den absoluten Betrag von noch_zu_zahlen als Rückgeld liefern
self.rueckgeld = abs(self.noch_zu_zahlen)
return self.rueckgeld
def set_betrag(self, preis):
self.betrag = preis
self.noch_zu_zahlen = self.betrag
def get_noch_zu_zahlen(self):
return self.noch_zu_zahlen
# die Vereinbarung der Klasse für den Automaten
class Getraenkeautomat:
# übergeben werden Referenzen auf die Münzeinheit
def __init__(self, temp_zahlomat):
self.zahlomat = temp_zahlomat
# Eine Liste für die Getränke
self.getraenke_liste = []
# die Getränke erzeugen
getraenk = self.getraenke_liste.append(Getraenk("Wasser", 5, 2))
getraenk = self.getraenke_liste.append(Getraenk("Limonade", 6, 20))
getraenk = self.getraenke_liste.append(Getraenk("Bier", 7, 10))
getraenk = self.getraenke_liste.append(Getraenk("Red-Bull", 8, 0))
# die Kühlung ist aus
self.kuehlung = False
def __del__(self):
print("Eine Instanz der Klasse Getraenkeautomat wurde gelöscht.")
# MEIN VERSUCH MIT FEHLER
def set_anzahl_flaschen(self, getraenk):
self.getraenke_liste[getraenk].get_anzahl_flaschen() = self.getraenke_liste[getraenk].get_anzahl_flaschen() - 5
def getraenke_waehlen(self):
# die Auswahl
print("Bitte wählen sie ein Gertänk:")
print("Es gibt folgende Auswahl:")
# 1. Möglichkeit
anzeige_auswahl = 1
for getraenk in self.getraenke_liste:
print(anzeige_auswahl, getraenk.get_name_getraenk())
anzeige_auswahl = anzeige_auswahl + 1
# 2. Möglichkeit
anzeige_auswahl = 1
for getraenk in range(len(self.getraenke_liste)):
print(anzeige_auswahl, self.getraenke_liste[getraenk].get_name_getraenk())
anzeige_auswahl = anzeige_auswahl + 1
auswahl = int(input("Geben Sie die gewünschte Nummer ein: "))
auswahl -= 1
# gibt es noch Flaschen vom gewählten Gertänk?
if self.getraenke_liste[auswahl].get_anzahl_flaschen() == 0:
print("Das gewählte Getränk ist leider nicht mehr vorhanden.")
auswahl = - 1
return auswahl
anzahl = int(input("Wie viele Flaschen möchten Sie? "))
if anzahl <= self.getraenke_liste[auswahl].get_anzahl_flaschen():
self.getraenk_ausgeben(anzahl, auswahl)
else:
print("Es sind nur", self.getraenke_liste[auswahl].get_anzahl_flaschen(), "Flaschen", self.getraenke_liste[auswahl].get_name_getraenk(), "vorhanden.")
print("Sie erhalten den Rest.")
anzahl = self.getraenke_liste[auswahl].get_anzahl_flaschen()
self.getraenk_ausgeben(anzahl, auswahl)
def getraenk_ausgeben(self, anzahl, getraenke_index):
# erst muss bezahlt werden
print("Sie müssen", anzahl * self.getraenke_liste[getraenke_index].get_preis_pro_flasche(), "Cent bezahlen.")
self.zahlomat.set_betrag(anzahl * self.getraenke_liste[getraenke_index].get_preis_pro_flasche())
while self.zahlomat.get_noch_zu_zahlen() > 0:
print("Es fehlen noch", self.zahlomat.get_noch_zu_zahlen(), "Cent.")
self.zahlomat.muenzen_annehmen(3)
# Geld zurückgeben
print("Sie erhalten", self.zahlomat.rueckgeld_geben(),"Cent zurück,")
# Flaschen ausgeben
print("Sie erhalten", anzahl, "Flasche(n)", self.getraenke_liste[getraenke_index].get_name_getraenk())
# DAS SIND MEINE VERSUCHE DIE ANAZHL ZU ÄNDERN
self.set_anzahl_flaschen(getraenke_index)
print(self.set_anzahl_flaschen(getraenke_index))
print(self.getraenke_liste[getraenke_index].get_anzahl_flaschen())
def kuehlen(self, an_aus):
self.kuehlung = an_aus
if self.kuehlung == True:
print("Die Kühlung ist eingeschaltet.")
else:
print("Die Kühlung ist ausgeschaltet.")
# eine Münzeinheit erzeugen
zahlomat = Muenzeinheit()
# einen Automaten erzeugen
#die Münzeinheit wird übergeben
automat = Getraenkeautomat(zahlomat)
auswahl = - 1
# die Kühlung einschalten
automat.kuehlen(True)
# ein Getränk auswählen
while auswahl == -1:
auswahl = automat.getraenke_waehlen()
# die Kühlung ausschalten
automat.kuehlen(False)
# die Instanzen ausdrücklich freigeben
del automat
del zahlomat
Ich dachte, dass die Instanzen als Mehrdimensionale Liste gespeichert wird, und ich auf die Werte einfach zugreifen und ändern kann, wie Sirius3 schreibt.
Sorry für die Grammatik, bin kein Deutscher
