Problem mit Programmierung
In diesem Fall heißt das, dass die Liste leer ist. Warum sollte an erster Stelle 'Kunde1' stehen wenn der Liste nichts hinzugefügt wird? Ich kann keine Zuweisung finden...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

also das enumerate ist im prinzip nur um eine liste auszugeben...
das __str__ ist eine vordefinierte funktion die schon in python vorhanden ist und jedes mal aufgerufen wird wenn der print-Befehl genutzt wird...was ist der sinn von deinem code das versteh ich nicht ganz
und das mit dem format ist sozusagen eine elegantere weise um in den print befehlen auf variablen zuzugreifen...
das __str__ ist eine vordefinierte funktion die schon in python vorhanden ist und jedes mal aufgerufen wird wenn der print-Befehl genutzt wird...was ist der sinn von deinem code das versteh ich nicht ganz
und das mit dem format ist sozusagen eine elegantere weise um in den print befehlen auf variablen zuzugreifen...
achso omg bin ich doof
wollte eigentlich von kasse1 die wartezeit berechnen lassen...
ok jetzt bin ich ganz verwirrt hab da glaub ich nen denkfehler drin ist glaub ich gar nicht so dass ich das nicht in code umsetzen kann sondern einfach dass meine gedankengänge falsch sind...
wollte eigentlich von kasse1 die wartezeit berechnen lassen...
ok jetzt bin ich ganz verwirrt hab da glaub ich nen denkfehler drin ist glaub ich gar nicht so dass ich das nicht in code umsetzen kann sondern einfach dass meine gedankengänge falsch sind...
mutetella hab jetzt grade mal deinen code in python kopiert um zu schauen was da rauskommt bei deinem ausgabe-befehl von schlange aber der meckert mir die print-befehle an muss da nicht eigentlich ne klammer um das was ausgegeben werden soll?
@Dark Star: In Python wird nichts deklariert [1]_. Die Zuweisungen an `schlange` und `first` auf Klassenebene sind unnötig -- was soll das bringen? Und natürlich ist bei deinem Quelltext auch ``Kasse.schlange`` leer und damit ein Zugriff auf ein Element an Index 0 nicht möglich. Aber warum sollte die *Klasse* überhaupt eine Schlange besitzen? Die *Exemplare* besitzen doch schon eine, und auf *die* musst Du dann auch zugreifen. Das Objekt `Kasse` ist keine Kasse, sondern beschreibt das Verhalten und die Eigenschaften einer Kasse. Konkrete Kassen erhält man erst wenn man Exemplare dieser `Kasse` erstellt.
Weder `__str__` noch `format()` haben direkt mit `print()` zu tun. Die `__str__()` sagt wie ein Objekt als Zeichenkette repräsentiert werden soll. Und `format()` ist eine Methode von Zeichenketten um Objekte in eine Zeichenkette mit entsprechenden Platzhaltern hinein zu formatieren. Beides kann unabhängig von ``print``/`print()` verwendet werden.
.. [1] Ist nicht ganz korrekt, aber Attribute von Objekten werden nicht deklariert.
Weder `__str__` noch `format()` haben direkt mit `print()` zu tun. Die `__str__()` sagt wie ein Objekt als Zeichenkette repräsentiert werden soll. Und `format()` ist eine Methode von Zeichenketten um Objekte in eine Zeichenkette mit entsprechenden Platzhaltern hinein zu formatieren. Beides kann unabhängig von ``print``/`print()` verwendet werden.
.. [1] Ist nicht ganz korrekt, aber Attribute von Objekten werden nicht deklariert.
Wenn Du Python 3 verwendest: Ja.Dark Star hat geschrieben:...muss da nicht eigentlich ne klammer um das was ausgegeben werden soll?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Es tut mir Leid dass ich euch so nerve aber ich bin grad total überfordert...also das mit dem __str__ und format hab ich jetzt verstanden aber wie müsste das jetzt aussehen...
Das ist der Code:
könntet ihr mir das vielleicht an meinem code zeigen was ihr meint alsosozusagen belegen...
Das ist der Code:
Code: Alles auswählen
#=====================================================================#
#Die beiden Klassen werden samt Eigenschaften und Methoden eingefuehrt#
#=====================================================================#
class Kasse(object):
def __init__(self,kassierer,schlange,first):
self.schlange=schlange
self.kassierer=kassierer
self.first=first
def berechne_Wartezeit(Kunde):
akt_Kunde=Kasse.schlange[0]
akt_artikelanzahl=0
anzahl_kunden_vor_kunde=0
while not akt_Kunde==Kunde:
akt_artikelanzahl=akt_Kunde.artikelanzahl+akt_artikelanzahl
akt_Kunde=akt_Kunde.next
anzahl_kunden_vor_kunde+=1
wartezeit=akt_artikelanzahl*5+20*anzahl_kunden_vor_kunde+akt_artikelanzahl*3 #beispielhaft wird hier pro Artikel 5 Sekunden gerechnet + den Bezahlvorgang (20 Sekunden) + eintüten (pro Artikel 3 Sekunden)
print("Ich habe eine Wartezeit von",wartezeit,"Sekunden")
def ausgeben(self):
for i in enumerate(self.schlange):
print()
def anstellen(self,Kunde):
self.schlange.append(Kunde)
def kassieren(self):
self.schlange.pop(0)
class Kunde():
def __init__(self,name,artikelanzahl,next):
self.name=name
self.artikelanzahl=artikelanzahl
self.next=next
artikelanzahl=0
def ausgeben(self):
print("Ich heisse",self.name,"und habe",self.artikelanzahl,"Artikel eingekauft.")
def produkt_kaufen(self):
self.artikelanzahl+=1
def produkt_weglegen(self):
self.artikelanzahl-=1
#==============================================================#
#Anfaegliche Kunden und geoeffnete Kassen werden bereitgestellt#
#==============================================================#
Kunde7=Kunde("Johann",3,None)
Kunde6=Kunde("Willi",6,None)
Kunde5=Kunde("Jens",5,Kunde6)
Kunde4=Kunde("Herbert",3,Kunde5)
Kunde3=Kunde("Peter",4,Kunde4)
Kunde2=Kunde("Hans",3,Kunde3)
Kunde1=Kunde("Mayer",2,Kunde2)
Kasse1=Kasse("Anne",[Kunde1,Kunde2,Kunde3,Kunde4],None)
Kasse.first=Kunde1
#============#
#Hauptroutine#
#============#
Kasse1.berechne_Wartezeit(Kunde3)
@Dark Star: Wirf doch bitte erst einmal den Quelltext und die Attribute für die verkettete Liste raus. Keine `first`- und `next`-Attribute mehr und keinen Quelltext der darauf zugreift. Das brauchst Du nicht mehr wenn Du die Warteschlange in einer `list` verwaltest.
Dann arbeite wirklich mal in einem Tutorial durch, um zu lernen wie das mit Klassen und Methoden funktioniert, und was der Unterschied zwischen einer Klasse und einem Exemplar (engl. "instance") ist. Wie viele Argumente muss eine Methode entgegen nehmen? Welche Namenskonvention gibt es für das erste Argument? Und was wird an diese erste Argument automatisch gebunden, wenn man eine Methode auf einem Exemplar aufruft? Die Antworten auf diese Fragen musst Du Dir selber erarbeiten, denn sie sind relativ kurz von uns beantwortbar, und dann könntest Du auch den Quelltext anpassen, hast es dadurch aber noch nicht verstanden.
In der `berechne_Wartezeit()` versuchst Du immer noch (oder schon wieder) auf ein Attribut auf der *Klasse* (`schlange`) zuzugreifen, dass es dort nicht gibt. Die Klasse brauchst Du bei diesem Quelltext nur und ausschliesslich um ein Exemplar zu erstellen. Sonst nicht. Alles andere geschieht auf und mit einem konkreten Exemplar. Vielleicht hilft es Dir ja Dich an die übliche Namenskonvention zu halten, dass nur Klassennamen mit einem Grossbuchstaben beginnen um nicht durcheinander zu kommen. Diese Konventionen haben ja einen Sinn. Wenn Du das beherzigst, dann weisst Du, dass Du nach einem gross geschriebenen Namen in diesem Programm keinen Punkt-Operator einsetzen darfst. ``Kasse.irgendwas`` ist schon ab dem Punkt die falsche Idee.
Dann arbeite wirklich mal in einem Tutorial durch, um zu lernen wie das mit Klassen und Methoden funktioniert, und was der Unterschied zwischen einer Klasse und einem Exemplar (engl. "instance") ist. Wie viele Argumente muss eine Methode entgegen nehmen? Welche Namenskonvention gibt es für das erste Argument? Und was wird an diese erste Argument automatisch gebunden, wenn man eine Methode auf einem Exemplar aufruft? Die Antworten auf diese Fragen musst Du Dir selber erarbeiten, denn sie sind relativ kurz von uns beantwortbar, und dann könntest Du auch den Quelltext anpassen, hast es dadurch aber noch nicht verstanden.
In der `berechne_Wartezeit()` versuchst Du immer noch (oder schon wieder) auf ein Attribut auf der *Klasse* (`schlange`) zuzugreifen, dass es dort nicht gibt. Die Klasse brauchst Du bei diesem Quelltext nur und ausschliesslich um ein Exemplar zu erstellen. Sonst nicht. Alles andere geschieht auf und mit einem konkreten Exemplar. Vielleicht hilft es Dir ja Dich an die übliche Namenskonvention zu halten, dass nur Klassennamen mit einem Grossbuchstaben beginnen um nicht durcheinander zu kommen. Diese Konventionen haben ja einen Sinn. Wenn Du das beherzigst, dann weisst Du, dass Du nach einem gross geschriebenen Namen in diesem Programm keinen Punkt-Operator einsetzen darfst. ``Kasse.irgendwas`` ist schon ab dem Punkt die falsche Idee.
Code: Alles auswählen
def berechne_Wartezeit(Kunde):
akt_Kunde=Kasse.schlange[0]
akt_artikelanzahl=0
anzahl_kunden_vor_kunde=0
while not akt_Kunde==Kunde:
akt_artikelanzahl=akt_Kunde.artikelanzahl+akt_artikelanzahl
akt_Kunde=akt_Kunde.next
anzahl_kunden_vor_kunde+=1
wartezeit=akt_artikelanzahl*5+20*anzahl_kunden_vor_kunde+akt_artikelanzahl*3
print("Ich habe eine Wartezeit von",wartezeit,"Sekunden")
ich muss da ja irgendwie zählen können wie viele kunden und wie viele artikel noch in der warteschlange sind...
Also das Ganze ohne die next-Befehle...da gibts ja irgendwie nichts durch was ich die ersetzen könnte...
Zudem habe ich jetzt noch ein Problem:
Wenn ich das hier mache wird Mayer aus der Schlange entfernt aber wenn ich das programm dann nochmal laufen lasse ist er wieder drin weil er dann ja zuerst wieder:
Kasse1=Kasse("Anne",[Kunde1,Kunde2,Kunde3,Kunde4]) macht...
Wie kann ich das umgehen?
Code: Alles auswählen
#=====================================================================#
#Die beiden Klassen werden samt Eigenschaften und Methoden eingefuehrt#
#=====================================================================#
class Kasse(object):
def __init__(self,kassierer,schlange):
self.schlange=schlange
self.kassierer=kassierer
def berechne_Wartezeit(Kunde):
akt_Kunde=Kasse.schlange[0]
akt_artikelanzahl=0
anzahl_kundn_vor_kunde=0
while not akt_Kunde==Kunde:
akt_artikelanzahl=akt_Kunde.artikelanzahl+akt_artikelanzahl
akt_Kunde=akt_Kunde.next
anzahl_kunden_vor_kunde+=1
wartezeit=akt_artikelanahl*5+20*anzahl_kunden_vor_kunde+akt_artikelanzahl*3 #beispielhaft wird hier pro Artikel 5 Sekunden gerechnet + den Bezahlvorgang (20 Sekunden) + eintueten (pro Artikel 3 Sekunden)
print("Ich habe eine Wartezeit von",wartezeit,"Sekunden")
def ausgeben(self):
if len(self.schlange)>0:
print ("An der Kasse von",self.kassierer,"befinden sich:")
for position, Kundein enumerate(self.schlange):
print (Kunde.name,"an Stelle",position+1)
else:
print("An der Kass von",self.kassierer,"befinden sich keine Kunden")
def anstellen(self,Kunde):
self.schlange.apend(Kunde)
def kassieren(self):
if len(self.schlange)>0:
Kunde=self.schange.pop(0)
print(Kunde.name,"hat bezahlt und verlässt die Schlange von",self.kassierer)
else:
print("An der Kasse von",self.kassierer,"befinden sich keine Kunden")
class Kunde():
def __init__(self,name,artikelanzahl,next):
self.name=name
self.artikelanahl=artikelanzahl
self.next=next
artikelanzahl=0
def ausgeben(self):
print("Ich heisse",self.name,"und habe",self.artikelanzahl,"Artikel eingekauft.")
def produkt_kaufen(self):
self.artikelanzahl+=1
def produkt_wglegen(self):
self.artikelanzahl-=1
#==============================================================#
#Anfaegliche Kunden und geoeffnete Kassen werden bereitgestellt#
#==============================================================#
Kunde7=Kunde("Johann",3,None)
Kunde6=Kunde("Willi",6,None)
Kunde5=Kunde("Jens",,Kunde6)
Kunde4=Kunde("Herbert",3,Kunde5)
Kunde3=Kunde("Peter",4,Kunde4)
Kunde2=Kune("Hans",3,Kunde3)
Kunde1=Kunde("Mayer",2,Kunde2)
Kasse1=Kasse("Ane,[Kunde1,Kunde2,Kunde3,Kunde4])
Kasse1.anstellen(Kunde)
#============#
#Hauptroutine#
#============#
Kasse.kassieren()
Wenn ich das hier mache wird Mayer aus der Schlange entfernt aber wenn ich das programm dann nochmal laufen lasse ist er wieder drin weil er dann ja zuerst wieder:
Kasse1=Kasse("Anne",[Kunde1,Kunde2,Kunde3,Kunde4]) macht...
Wie kann ich das umgehen?
Zuletzt geändert von Dark Star am Montag 14. März 2011, 15:03, insgesamt 1-mal geändert.
Ok habe jetzt den ganzen next und first Kram da rausgeschmissen also die Aufgabe ist jetzt schonmal erfüllt jetzt fang ich mal dran zu arbeiten wie ich das Ganze noch etwas schöner gestalten und vielleicht noch ein bisschen Benutzerkontakt einbauen kann...
Danke für eure Hilfe wenn ich noch Fragen habe melde ich mich nochmal...
@Blackjack
Dein letzter Kommentar hat mir sehr weitergeholfen, das Ganze läuft jetzt und ich verstehe es sogar XD
Danke für eure Hilfe wenn ich noch Fragen habe melde ich mich nochmal...
@Blackjack
Dein letzter Kommentar hat mir sehr weitergeholfen, das Ganze läuft jetzt und ich verstehe es sogar XD