was heißt denn bitte schlechte einstellung ich habe einfach angst dass ich das ganze nicht schaffe...
und da mir die zeit nicht reicht um das tutorial diese aufgabe und meine anderen schulaufgaben zu bewältigen suche ich hier hilfe...
das hat nichts mit schlechter einstellung zu tun und wenn das so rüber kommt tut es mir leid
Problem mit Programmierung
Also, wenn das die vollstaendige Aufgabe ist, dann ist alles Gerede von dequeue & co tatsaechlich irrelevant. Oder hat euch der Lehrer gesagt, ihr muesst die Schlange als verkettete Liste erstellen?
Unabhaengig davon, ob ihr das muesst oder nicht, kann man ja erstmal alles mit einer normalen Liste implementieren.
Also, @DarkStar: deine Kasse-Implementation ist ja schon recht gut, aber vergiss mal fuer einen Moment first + so einen Kram. Mach stattdessen ein Attribut "schlange", als normale Python Liste.
Und dann implementiere deine beiden Methoden "anstellen" und "bezahlen", basierend da drauf.
Wenn das alles steht, und du bist immer noch der Meinung, es muesste eine Verkettete Liste her, dann ist das eine 3te Klasse, und die Kasse-Klasse aendert sich *minimal*. Aber daran arbeiten wir erst, wenn der Rest steht.
Und nun hurtig, bis Dienstag sind noch ca 72h Zeit...
Unabhaengig davon, ob ihr das muesst oder nicht, kann man ja erstmal alles mit einer normalen Liste implementieren.
Also, @DarkStar: deine Kasse-Implementation ist ja schon recht gut, aber vergiss mal fuer einen Moment first + so einen Kram. Mach stattdessen ein Attribut "schlange", als normale Python Liste.
Und dann implementiere deine beiden Methoden "anstellen" und "bezahlen", basierend da drauf.
Wenn das alles steht, und du bist immer noch der Meinung, es muesste eine Verkettete Liste her, dann ist das eine 3te Klasse, und die Kasse-Klasse aendert sich *minimal*. Aber daran arbeiten wir erst, wenn der Rest steht.
Und nun hurtig, bis Dienstag sind noch ca 72h Zeit...
wir dürfen die listefunktion wie gesagt nicht benutzen... das ist ja auch mein problem sonst wäre es ja einfach das ganze als liste zu implementieren
und dein vorschlag wäre im prinzip das hier?:
und dein vorschlag wäre im prinzip das hier?:
Code: Alles auswählen
class Kasse:
def __init__(self,kassiererin,schlange,first):
self.schlange=schlange
self.kassiererin=kassiererin
self.first=first
first=None
schlange=[]
def ausgabe():
akt_Kunde=Kasse.first
while not akt_Kunde==None:
print("Ich heisse",akt_Kunde.name,"und habe",akt_Kunde.artikelanzahl,"Artikel eingekauft.")
akt_Kunde=akt_Kunde.next
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ja! Es geht nicht um Vererbung, sondern stumpf um Attribute.Dark Star hat geschrieben: oder hab ich deine antwort missverstanden?
Code: Alles auswählen
class Kasse(object):
def __init__(self):
self.kunden = []
def anstellen(self, kunde):
self.kunden.append(kunde)
def kassieren(self):
self.kunden.pop(0)
Edit: Ok, hab erst jetzt registriert, dass BlackJackDich bereits darauf hingewiesen hat. Allerdings sehe ich bei der Aufgabenstellung nirgends einen Hinweis darauf, dass man Listen oder andere eingebaute Python-Datentypen nicht benutzen darf. Fehlt diese Angabe in dem obigen Posting nur, oder hast Du das nur irgend wie da hinein interpretiert?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
ok ich weiß zwar immer noch nicht ob wir die listenfunktion verwenden dürfen aber naja ich hab das jetzt einfach ma so gemacht...
funktioniert auch von daher lass ich das jetzt so wenn er meckert dann is halt pech also vielen dank schonmal an alle...
wenn ich noch fragen habe melde ich mich nochmal
Edit: Der hatte das im Unterricht mal gesagt aber kann auch sein dass ich mich verhört hab naja ich mach das jetzt so weil ich nicht wüsste wie es anders gehen sollte...
funktioniert auch von daher lass ich das jetzt so wenn er meckert dann is halt pech also vielen dank schonmal an alle...
wenn ich noch fragen habe melde ich mich nochmal
Code: Alles auswählen
class Kasse:
def __init__(self,kassiererin,schlange,first):
self.schlange=schlange
self.kassiererin=kassiererin
self.first=first
self.schlange=[]
first=None
def ausgabe():
akt_Kunde=Kasse.first
while not akt_Kunde==None:
print("Ich heisse",akt_Kunde.name,"und habe",akt_Kunde.artikelanzahl,"Artikel eingekauft.")
akt_Kunde=akt_Kunde.next
def anstellen(self,Kunde):
self.schlange.append(Kunde)
def kassieren():
self.schlange.pop(0)
Hab' da mal was zusammengeschustert, vielleicht hilft's Dir ja weiter:
Jetzt hast Du ja auch ein wenig Luft und damit Zeit, Dir das Tutorial mal vorzunehmen. Es lohnt sich. Python macht nämlich wirklich Spass...
Gruß
mutetella
EDIT: Sorry, hab' jetzt die letzten paar Beiträge nimmer gelesen... egal, Dein zuletzt geposteter Code wird so nicht funktionieren.
Sein Programm auch testen ist schon elementar...
Code: Alles auswählen
#!/usr/bin/python
#-*- coding: utf-8 -*-
class Checkout(object):
def __init__(self, cashier):
self.cashier = cashier
self.queue = []
def set_customer(self, customer):
self.queue.append(customer)
print customer,
print 'stellt sich in die Schlange.'
def get_queue(self):
print 'An der Kasse von {0} befinden sich:'.format(self.cashier)
for position, customer in enumerate(self.queue):
print customer,
print '\t an {0}. Stelle'.format(position + 1)
def cash_process(self):
if len(self.queue) > 0:
customer = self.queue.pop(0)
print customer,
print 'bezahlt und verlässt die Kasse von {0}.'.format(
self.cashier)
else:
print 'An der Kasse von {0} befindet sich kein Kunde'.format(
self.cashier)
class Customer(object):
def __init__(self, name):
self.name = name
self.products = 0
def buying(self, quantity):
self.products += quantity
def __str__(self):
return '{0} mit {1} Artikel'.format(self.name, self.products)

Gruß
mutetella
EDIT: Sorry, hab' jetzt die letzten paar Beiträge nimmer gelesen... egal, Dein zuletzt geposteter Code wird so nicht funktionieren.

Sein Programm auch testen ist schon elementar...
Zuletzt geändert von mutetella am Samstag 12. März 2011, 18:23, insgesamt 1-mal geändert.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Wozu dann der Post? :Kproblembär hat geschrieben:Erst wenn Du Python wirklich lernen willst, gebe ich Dir vielleicht eine Antwort.
@Dark Star: unabhängig davon ob ihr Listen nun nutzen dürft oder nicht, implementiere es mit Listen. Zur Not bekommst du halt deswegen Punkteanzug, aber besser als 0 Punkte für "Keine Lösung geliefert". Falls du bis Dienstag Zeit hast, kannst du ja das ja noch mit verketteten Listen implementieren, falls nicht dann lässt du das halt sein.

My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
@syntor: Also so kurz nach dem 100. Weltfrauentag sticht das besonders ins Auge. Ich würde in der Tat `kassierer` bevorzugen, weil in unseren Sprachgebrauch nun einmal in solchen Fällen die männliche Form für den "generellen" Fall verwendet wird. Es sei denn man will PC sein und "gendert" das tatsächlich. (So wirklich richtig bevorzugen würde ich ja `cashier` -- da stellt sich das Problem dann auch nicht
)
Ich meine wenn man sieht ``kasse = Kasse(kassierer='Annette')`` dann gibt es vielleicht einen der sagt, das müsste für Annette wohl Kassierer*in* heissen, aber bei ``Kasse(kassiererin='Klaus')`` ist die Gefahr eher, dass dumme Bemerkungen wie "Hihi, der Klaus is'n Mädchen" kommen. Das spiegelt auf der einen Seite wieder, dass es da immer noch so ein Rollenbild gibt, und auf der anderen verankert die Namenswahl `kassiererin` dieses Bild auch bei denen die das beiläufig und gedankenlos übernehmen.
Alternativ könnte ich mir auch vorstellen die Klasse `Kunde` in `Kundin` umzubenennen. Aber völlig unkommentiert hätte ich das keinem Inf-Lehrer durchgehen lassen.
Von der verketteten Liste steht anscheinend wirklich nichts in der Aufgabe, aber das würde ich bei einer Schul- oder auch Uni-Aufgabe schon erwarten. Eine verkette Liste ist ein grundlegender Datentyp, den man mal implementiert und verstanden haben sollte. Sinnvoll ist es IMHO auch. Eine nette Folgeaufgabe für so etwas könnte nämlich eine Simulation sein, die zum Beispiel die mittlere Wartezeit vergleicht wenn sich, wie im Supermarkt, jeder Kunde seine Kasse aussucht (die mit der kürzesten Warteschlange) mit dem Modell was man zum Beispiel bei der Post hat, wo es nur eine sehr lange Warteschlange gibt, und die dann vorne immer an den jeweils frei werdenden Schalter gehen. Und wenn man dafür ein paar Millionen Kunden durch den virtuellen Supermarkt schleust, kann es schon ins Gewicht fallen wenn da eine Operation auf den Warteschlangen bezogen auf die Anzahl der Kunden quadratische Laufzeit hat, wo lineare Laufzeit eigentlich einfach möglich wäre.
@Dark Star: Wenn die Kasse die Warteschlange einfach in einer Liste verwaltet, dann braucht man doch aber `first` bei der Kasse nicht mehr und auch `next` bei den Kunden nicht. Deine `Kasse.ausgabe()` geht doch nun *viel* einfacher.

Ich meine wenn man sieht ``kasse = Kasse(kassierer='Annette')`` dann gibt es vielleicht einen der sagt, das müsste für Annette wohl Kassierer*in* heissen, aber bei ``Kasse(kassiererin='Klaus')`` ist die Gefahr eher, dass dumme Bemerkungen wie "Hihi, der Klaus is'n Mädchen" kommen. Das spiegelt auf der einen Seite wieder, dass es da immer noch so ein Rollenbild gibt, und auf der anderen verankert die Namenswahl `kassiererin` dieses Bild auch bei denen die das beiläufig und gedankenlos übernehmen.
Alternativ könnte ich mir auch vorstellen die Klasse `Kunde` in `Kundin` umzubenennen. Aber völlig unkommentiert hätte ich das keinem Inf-Lehrer durchgehen lassen.

Von der verketteten Liste steht anscheinend wirklich nichts in der Aufgabe, aber das würde ich bei einer Schul- oder auch Uni-Aufgabe schon erwarten. Eine verkette Liste ist ein grundlegender Datentyp, den man mal implementiert und verstanden haben sollte. Sinnvoll ist es IMHO auch. Eine nette Folgeaufgabe für so etwas könnte nämlich eine Simulation sein, die zum Beispiel die mittlere Wartezeit vergleicht wenn sich, wie im Supermarkt, jeder Kunde seine Kasse aussucht (die mit der kürzesten Warteschlange) mit dem Modell was man zum Beispiel bei der Post hat, wo es nur eine sehr lange Warteschlange gibt, und die dann vorne immer an den jeweils frei werdenden Schalter gehen. Und wenn man dafür ein paar Millionen Kunden durch den virtuellen Supermarkt schleust, kann es schon ins Gewicht fallen wenn da eine Operation auf den Warteschlangen bezogen auf die Anzahl der Kunden quadratische Laufzeit hat, wo lineare Laufzeit eigentlich einfach möglich wäre.
@Dark Star: Wenn die Kasse die Warteschlange einfach in einer Liste verwaltet, dann braucht man doch aber `first` bei der Kasse nicht mehr und auch `next` bei den Kunden nicht. Deine `Kasse.ausgabe()` geht doch nun *viel* einfacher.
Na, als Ansporn!Leonidas hat geschrieben:Wozu dann der Post? :Kproblembär hat geschrieben:Erst wenn Du Python wirklich lernen willst, gebe ich Dir vielleicht eine Antwort.
Ihr doktert hier an seinem Code 'rum, aber solange er nicht mit wirklichem Interesse daran geht, das zu lernen, wird das nie was.
Insofern: Wozu eure Posts? :K
@problembär: Es hat doch letztlich geholfen nachzufragen wie die Anforderungen *genau* sind. Denn mit dem Grunddatentyp `list` scheint Dark Star ja doch besser zurecht zu kommen, als mit der Anforderung bis Dienstag eine verkettete Liste selber zu implementieren.
@ Blackjack
Vielen Dank für deine Hilfe... Das next und first hab ich übrigens nur noch drin weil mir das blöde Ding für
kasse.schlange[0] einen fehler mit object kasse hat kein attribut schlange und ich weiß nicht warum das ding das nicht haben sollte hab es ja deklariert... sehr merkwürdig
@problembär
Ich zeige großes Interesse an Python weil es mir Spaß macht aber da ich dieses Fach nunmal erst seit einem halben Jahr habe fällt es mir schwer manche der Aufgaben durchzuführen...bzw. diese 2 methoden anstellen und kassieren sind ja nur optional...weil das eben für unsere fähigkeiten doch noch relativ schwer ist...aber ich interessiere mich nunmal hierfür daher möchte ich eben auch lernen wie man diese "schwierigeren" Aufgaben angeht um das Ganze dann auch selbst zu verstehen und durchführen zu können...
Wäre nett wenn ihr mir noch helfen könntet bei meinem
Kasse.schlange[0]-Fehler...
Der tritt übrigens auch auf wenn ich nur Kasse.schlange eingebe...Bin grade etwas verwirrt
Vielen Dank für deine Hilfe... Das next und first hab ich übrigens nur noch drin weil mir das blöde Ding für
kasse.schlange[0] einen fehler mit object kasse hat kein attribut schlange und ich weiß nicht warum das ding das nicht haben sollte hab es ja deklariert... sehr merkwürdig
@problembär
Ich zeige großes Interesse an Python weil es mir Spaß macht aber da ich dieses Fach nunmal erst seit einem halben Jahr habe fällt es mir schwer manche der Aufgaben durchzuführen...bzw. diese 2 methoden anstellen und kassieren sind ja nur optional...weil das eben für unsere fähigkeiten doch noch relativ schwer ist...aber ich interessiere mich nunmal hierfür daher möchte ich eben auch lernen wie man diese "schwierigeren" Aufgaben angeht um das Ganze dann auch selbst zu verstehen und durchführen zu können...
Wäre nett wenn ihr mir noch helfen könntet bei meinem
Kasse.schlange[0]-Fehler...
Der tritt übrigens auch auf wenn ich nur Kasse.schlange eingebe...Bin grade etwas verwirrt
@ mutetella
Ich danke dir vielmals dass du dir den ganzen Aufwand gemacht hast " für mich " das Programm zu schreiben, allerdings möchte ich deinen Code nicht verwenden da es für mich wichtig ist das ganze auch zu verstehen...
Bei deinem Code verstehe ich 3 Dinge nicht
1. Was bedeutet bei deinen Print befehlen der {0}-Code und der damit zusammenhängende format-Befehl
2. deine for-schleife in range enumerate...was soll das bedeuten...
3. Deine deklaration in der Klasse Customer der Befehl __str__
Wäre dankbar für ein paar Erklärungen ansonsten finde ich deinen Code sehr gut verständlich...Ich weiß nicht warum ich es mir so umständlich mache...
Ich danke dir vielmals dass du dir den ganzen Aufwand gemacht hast " für mich " das Programm zu schreiben, allerdings möchte ich deinen Code nicht verwenden da es für mich wichtig ist das ganze auch zu verstehen...
Bei deinem Code verstehe ich 3 Dinge nicht
1. Was bedeutet bei deinen Print befehlen der {0}-Code und der damit zusammenhängende format-Befehl
2. deine for-schleife in range enumerate...was soll das bedeuten...
3. Deine deklaration in der Klasse Customer der Befehl __str__
Wäre dankbar für ein paar Erklärungen ansonsten finde ich deinen Code sehr gut verständlich...Ich weiß nicht warum ich es mir so umständlich mache...
@Dark Star: Es gibt ja auch tatsächlich kein Attribut `schlange` auf der Klasse `Kasse`. Das würde dann ja auch für alle Kassen die gleiche Schlange sein. Du definierst das Attribut auf jedem *Exemplar* einer `Kasse` in der `__init__`. Und auf dem Exemplar musst Du das Attribut auch wieder abrufen. In der `__init__` steht ja nicht ``Kasse.schlange = …``.
oh ehm ja meinte ich aber wenn ich eine kasse definiere
Kasse1=Kasse("Hermann",[Kunde1,Kunde2,Kunde3,Kunde4],Kunde1)
kassierer schlange first
und dann
print(Kasse1.schlange)
schreibe zeigt er mir eine leere liste an...genau das war das problem...den anderen fehler hatte ich dann auch entdeckt^^
Kasse1=Kasse("Hermann",[Kunde1,Kunde2,Kunde3,Kunde4],Kunde1)
kassierer schlange first
und dann
print(Kasse1.schlange)
schreibe zeigt er mir eine leere liste an...genau das war das problem...den anderen fehler hatte ich dann auch entdeckt^^
@Dark Star: Warum sollte denn da auch keine leere Liste angezeigt werden? Du sagst ja dass dieses Attribut an eine leere Liste gebunden werden soll. Dann macht Python das auch. Hättest Du hier erwartet das keine leere Liste ausgegeben wird:
Code: Alles auswählen
In [506]: xs = [1, 2, 3]
In [507]: xs = []
In [508]: print xs
[]
Der Fehler sagt ja schon alles aus: Das Objekt 'kasse' hat kein Attribut 'schlange'. Ausgehend von Deinem zuletzt geposteten Code legst Du innerhalb der '__init__'-Methode ein Attribut 'schlange' an. Das heißt, jedes Exemplar (Instanz) der Klasse 'Kasse()' besitzt ein Attribut 'schlange'. Die Klasse 'Kasse()' selbst besitzt dieses Attribut nicht:
Erstelle mal diese Klasse und gebe dann folgendes ein und schau' Dir die Fehlermeldungen an...
Code: Alles auswählen
class Kasse(object):
klasse = 'Kasse'
def __init__(self):
self.exemplar = 'Exemplar'
Code: Alles auswählen
In [185]: Kasse.klasse
Out[185]: 'Kasse'
In [186]: Kasse.exemplar
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/home/claus/Daten/Python/iPython/<ipython console> in <module>()
AttributeError: type object 'Kasse' has no attribute 'exemplar'
In [187]: test = Kasse()
In [188]: test.exemplar
Out[188]: 'Exemplar'
In [189]: test.klasse
Out[189]: 'Kasse'
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

War da nicht sowas das man in die klasse das ganze als leere liste deklarieren kann und das ganze wird dann von den eigenschaften der instanz überschrieben?
so hatte ich mir das halt eigentlich gedacht...wie wäre denn dann der richtige code muss ich da was in der klassendefinition ändern?
Edit: habs jetzt raus was ihr gemeint habt das ganze darf nich mit self.schlange=[] deklariert werden also im init befehl sondern nach self.schlange=schlange einfach nur schlange=[] außerhalb des init-Befehls...
so hatte ich mir das halt eigentlich gedacht...wie wäre denn dann der richtige code muss ich da was in der klassendefinition ändern?
Edit: habs jetzt raus was ihr gemeint habt das ganze darf nich mit self.schlange=[] deklariert werden also im init befehl sondern nach self.schlange=schlange einfach nur schlange=[] außerhalb des init-Befehls...
Um ehrlich zu sein, hab' ich das letztlich auch für mich getan. Ich stecke selbst noch in den Kinderschuhen und versuche deshalb immer gern, Lösungen zu finden.Dark Star hat geschrieben:... den ganzen Aufwand gemacht hast " für mich " das Programm zu schreiben, ...
Mein Beispiel lässt sich mit Sicherheit auch noch eleganter oder sogar sinnvoller schreiben, geh' also nicht davon aus, dass das der Weisheit letzter Schluss ist...

Zu Deinen Fragen:
1. Schau' Dir mal Format Examples aus der Python Documentation an
2. 'enumerate' ist eine built-in Funktion, Erklärung ebenfalls in der Python Documentation, hier...
3. Die '__str__'-Methode einer Klasse wird immer dann aufgerufen, wenn Du ein Exemplar derselben über die 'print'-Anweisung ausgeben möchtest. Ich habe diese Methode überschrieben und damit meinen Bedürfnissen angepasst. Man nennt das auch Polymorphismus...
Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Code: Alles auswählen
#=====================================================================#
#Die beiden Klassen werden samt Eigenschaften und Methoden eingefuehrt#
#=====================================================================#
class Kasse(object):
def __init__(self,kassiererin,schlange,first):
self.schlange=schlange
self.kassiererin=kassiererin
self.first=first
schlange=[]
first=None
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):
akt_Kunde=Kasse.first
while not akt_Kunde==None:
print("Ich heisse",akt_Kunde.name,"und habe",akt_Kunde.artikelanzahl,"Artikel eingekauft.")
akt_Kunde=akt_Kunde.next
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#
#============#
Kasse.berechne_Wartezeit(Kunde5)
Das ist jetzt der Stand der Dinge...wenn ich das jetzt mache sagt der mir, das
akt_Kunde=Kasse.schlange[0]
list index out of range.
warum tut der das an erster stelle dürfte doch jetzt eigentlich Kunde1 stehen...?