Problem mit Programmierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

Habe die Aufgabe für die Schule ein Programm zu schreiben mit dem simple Vorgänge in einem Supermarkt beschrieben werden können dazu sollen wir 2 Klassen wie ihr gleich sehen werdet definieren und diesen dann verschiedene Methoden und Eigenschaften zuweisen

Hier der Code:

Code: Alles auswählen

#=====================================================================#
#Die beiden Klassen werden samt Eigenschaften und Methoden eingefuehrt#
#=====================================================================#

class Kasse:
    def __init__(self,kassiererin,Warten1):
        self.kassiererin=kassiererin
        self.Warten1=Warten1
        Warten1=None
    def ausgabe():
        KundenZaehler=Kasse.Warten1
        while not KundenZaehler==None:
            print("Ich heisse",KundenZaehler.name,"und habe",KundenZaehler.artikelanzahl,"Artikel eingekauft.")
            KundenZaehler=KundenZaehler.next
    def anstellen(Kunde):

    def kassiervorgang():


class Kunde(Kasse):
    def __init__(self,name,artikelanzahl,next):
        self.name=name
        self.artikelanzahl=artikelanzahl
        self.next=next
    def ausgabe(self):
        print("Ich heisse",self.name,"und habe",self.artikelanzahl,"Artikel eingekauft.")
    def produktkauf(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)

Kasse.Warten1=Kunde1

#============#
#Hauptroutine#
#============#

Kunde.ausgabe(Kunde1)
Kunde.ausgabe(Kunde2)
Kunde.ausgabe(Kunde3)
Kunde.ausgabe(Kunde4)
Kunde.ausgabe(Kunde5)
Kunde.ausgabe(Kunde6)

Kasse.anstellen(Kunde7)

Kasse.ausgabe()



Mein eigentliches Problem ist nun wie ich hier die anstellen Methode definieren kann es entsteht hier durch den Code eine Liste bei dem jeder vorherige Kunde auf den nächsten verweist und jetzt soll beim anstellen eben ein neuer Kunde hinzukommen der hinten an diese Liste angehängt werden soll... Bei einer normalen Liste wäre das leicht mit .append zu bewerkstelligen aber hier weiß ich nicht was ich jetzt machen soll... Genauso ist es bei der kassieren-Methode wo eben der erste Kunde aus der Schlange entfernt werden soll...

Hat irgendjemand eine Idee brauche dringend Hilfe...
Zuletzt geändert von Anonymous am Freitag 11. März 2011, 18:28, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum!
Ich lass das mal hier und weiss dich auf die `next`-Attribute hin.

P.S. Benutze bitte code-/python-Tags wenn du Code postest.
BlackJack

@Dark Star: Mal ganz grundsätzlich solltest Du Deine Herangehensweise an die Programmentwicklung ändern. Du hast da schon eine Menge Quelltext geschrieben der einfach nicht funktioniert. Der kompiliert noch nicht einmal. Bis Du da alle Fehler ausgebügelt hast, und etwas Lauffähiges bekommst, bist Du bestimmt total frustriert. Fang das noch einmal von vorne an, mit Quelltext der kompiliert und soweit wie er fertig ist, auch funktioniert. Wenn er nicht kompiliert oder die schon vorhandenen Funktionen nicht das tun was sie sollen, dann schreib um Himmels willen nicht noch mehr Quelltext dazu. Eine Klasse und eine Funktion/Methode nach der anderen. Jedes mal wenn eine Funktion/Methode dazugekommen ist, diese *testen* und nicht neue Baustellen aufmachen, solange sie noch nicht das tut was sie soll.

Ich weiss ja nicht wie die Aufgabenstellung genau aussieht, aber es gibt in der Standardbibliothek im Modul `Queue` die Klasse `dequeue`. Wenn Du eine verkettete Liste selber implementieren sollst, dann muss das, wenn Du effizient an beide Enden der Schlange heran kommen musst, im Grunde auch eine eigene Klasse werden.

Ansonsten könntest Du mal einen Blick in PEP 8 -- Style Guide for Python Code werfen was die Namensgebung und Leerzeichen angeht.

Vererbung modelliert eine "ist-ein(e)"-Beziehung. Ein `Kunde` ist doch aber wohl keine `Kasse`.

Methodennamen sollten Tätigkeiten beschreiben und keine Gegenstände oder Nomen im allgemeinen. Also `ausgeben()` statt `ausgabe()`, `kassieren()` statt `kassiervorgang()`, oder `produkt_kaufen()` statt `produktkauf()`.

Umgekehrt sollten Attribute in der Regel keine Tätigkeiten beschreiben. Und wo kommt die 1 bei `Warten1` her?

`KundenZaehler` ist kein Zähler, sollte also auch nicht so heissen.
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

Oh mein Gott ich glaub ich sollte das Fach einfach abwählen^^
Naja die Tipps für das Grundsätzliche sind ja schon gut aber bringen mir momentan für die Aufgabe nichts...
@Blackjack dein Vorschlag wäre das ganze Programm noch einmal zu schreiben...Naja dann tu ich das mal wenn euch noch irgendwas einfällt was mir bei dem Problem helfen könnte dann bitte schön weiter posten
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

@Blackjack Danke für deine style-Hilfe finde es jetzt selbst schon viel übersichtlicher...

Habe zudem mir jetzt überlegt ,dass ich über den letzten Zeiger der auf None zeigt an das an das letzte Element komme...über ne Zählvariable...
Jetzt müsste ich ein neues Element anlegen und den Zeiger des letzten Elements der Liste auf das neue Element richten....
Wenn ihr Codevorschläge habt wie das funktionieren könnte wäre ich sehr dankbar...
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Dann poste doch mal den Stand der Dinge...

Ich muss gestehen, noch nicht so wirklich zu verstehen, was Du machen möchtest:
  • Du möchtest eine Kasse darstellen, an der Kunden anstehen und auf den Bezahlvorgang warten.
    Die Kasse benötigt demnach eine Methode, um Kunden in ihre Schlange aufzunehmen bzw. Kunden daraus zu entfernen und eine Methode, die den Bezahlvorgang abwickelt.
    Dabei ist zu überlegen, was mit einem Kunden geschieht, wenn er sich aus der Schlange entfernt oder aber am Ende des Bezahlvorgangs daraus entfernt wird. Soll er zurückgegeben oder gelöscht werden?
  • Jeder Kunde verfügt über einen Einkaufswagen in den man natürlich Artikel legen und sinnvollerweise auch wieder herausnehmen kann.
    Ein Kunde benötigt also eine Methode, um einen Artikel in den Wagen zu legen oder wieder herauszunehmen.
Das mit dem Zeiger verstehe ich nicht. Für eine Liste benötigst Du doch keinen Zeiger... oder was möchtest Du damit erreichen?

Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

Doch für eine Liste benötigt man einen Zeiger und das ist auch der Aufbau der Schlange die Kasse zeigt auf den ersten Kunde in der Reihe und dieser widerum immer auf den nächsten....der letzte zeiger steht auf none...
das mit dem einkaufswagen...naja also artikel dazunehmen kann man ja schon...siehe produktkauf
und das mit bezahlvorgang ...wenn das aufgerufen wird soll er eigentlich nur gelöscht werden und der 2. in der reihe soll an seinen platz in der reihe treten...

Code: Alles auswählen

#=====================================================================#
#Die beiden Klassen werden samt Eigenschaften und Methoden eingefuehrt#
#=====================================================================#

class Kasse:
    def __init__(self,kassiererin,first):
        self.kassiererin=kassiererin
        self.first=first
        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(Kunde):
    def kassieren():



class Kunde(Kasse):
    def __init__(self,name,artikelanzahl,next):
        self.name=name
        self.artikelanzahl=artikelanzahl
        self.next=next
    def ausgeben(self):
        print("Ich heisse",self.name,"und habe",self.artikelanzahl,"Artikel eingekauft.")
    def produkt_kaufen(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)

Kasse.first=Kunde1

#============#
#Hauptroutine#
#============#


BlackJack

@Dark Star: Falls das was Du "Zählvariable" nennst ein Name ist, der immer an den nächsten Kunden gebunden wird, bis dessen `next`-Attribut an ``None`` gebunden ist, dann ist das keine "Zählvariable". Eine Zählvariable *zählt* etwas, es handelt sich da also um eine ganze Zahl und nicht um Objekte vom Typ `Kunde`.

Sollte dieses Durchgehen bis zum Schlangenende wirklich für jeden Kunden gemacht werden der sich anstellt, dann brauchst Du dafür keine eigene Liste implementieren, sondern kannst gleich den `list` Datentyp von Python verwenden. Bei dem geht zwar das Anhängen effizienter, dafür muss beim Entfernen am Anfang intern auch jedes Element in der Liste einmal "angefasst" werden. Wenn ihr die Liste als verkettete Liste selber implementieren sollt, ist das Ziel ja gerade diesen Nachteil nicht zu haben, und *beide* Operationen so zu implementieren, dass man sowohl für das Anhängen am Ende, als auch das Entfernen am Anfang nicht alle Kunden in der Schlange betrachten muss, sondern eben nur konstant viele am Anfang oder am Ende.

Und wie gesagt, so eine Warteschlange, bei der man effizient an beide Enden heran kommt, gibt es schon in der Standardbibliothek: `Queue.dequeue`.

Wenn ihr gerade diesen Teil selber implementieren sollt, dann würde ich für die verkettete Liste eine eigene Klasse vorschlagen in die man nicht nur Kunden, sondern jedes beliebige Objekt hinein stecken kann. Das macht das Programm übersichtlicher und Du kannst den Typ auch einfacher isoliert von dem Rest testen. Und vielleicht bei späteren Programmen oder Aufgaben sogar wiederverwenden. Wenn Du eine eigene Klasse dafür schreibst, wirst Du wahrscheinlich feststellen, das eine nicht reichen würde. Denn wenn Du keine eigene Klasse nimmst, würde die Funktionalität der verketteten Liste auch mit *beiden* Klassen, die Du schon in Planung hast, vermischt werden.

@mutetella: Ich denke mal die Aufgabe ist es, sich Gedanken um einen Datentyp zu machen bei dem man effizient hinten Elemente anfügen und vorne weg nehmen kann. Da ist das einfachste wohl eine verkettete Liste. Und das ganze betten sie dann in ein einfaches "Realwelt"-Szenario ein, damit es nicht so trocken daher kommt.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Also das mit dem Zeiger kannst Du getrost vergessen... Wenn man so will ist eine Liste ja nichts anderes als eine Schlange und besitzt intern bereits sowas wie einen Zeiger (index):

Code: Alles auswählen

In [21]: schlange = [1, 2, 3, 4]

In [22]: schlange
Out[22]: [1, 2, 3, 4]

In [23]: schlange[0]
Out[23]: 1

In [24]: schlange[1]
Out[24]: 2

In [25]: schlange.pop(0)
Out[25]: 1

In [26]: schlange
Out[26]: [2, 3, 4]

In [27]: schlange.pop(0)
Out[27]: 2

In [28]: schlange
Out[28]: [3, 4]
Damit ließe sich die Schlange an der Kasse Kunde für Kunde abarbeiten.

Ein paar Dinge, die mir aufgefallen sind:
  • Warum legst Du ein Attribut 'kassiererin' (sind das immer Frauen?) an, wenn es doch nirgends verwendet wird. Oder kommt das noch?
  • Die Zuweisung first=None in Kasse.__init__() ist völlig sinnfrei
  • Die Methode 'Kasse.ausgabe()' wirst Du so nicht aufrufen können. Du musst ihr als erstes Argument ein Kasse()-Exemplar (Instanz) übergeben.
  • Du versuchst 'akt_Kunde' 'Kasse.first' zuzuweisen. Mit 'Kasse.first' meinst Du sicherlich 'self.first'
  • to be continued...
Wahrscheinlich wird es das Beste sein, Du schaust Dir mal das Python Tutorial an.

Danach wird Dir sicherlich vieles klarer sein.

Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

BlackJack hat geschrieben:Und wie gesagt, so eine Warteschlange, bei der man effizient an beide Enden heran kommt, gibt es schon in der Standardbibliothek: `Queue.dequeue`.
Welchen Vorteil habe ich dabei gegenüber 'list.pop()' und 'list.append()'?
BlackJack hat geschrieben:Bei dem geht zwar das Anhängen effizienter, dafür muss beim Entfernen am Anfang intern auch jedes Element in der Liste einmal "angefasst" werden.
Nur ein Performanceproblem?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
deets

@mutetella
O(1) fuer anfuegen und entfernen an den *beiden* Endpunkten. Bei Standardlisten ist das nur amortiesiert der Fall. Je nach Anwendung ist das halt aergerlich. Zuzugebenermassen aber sind das seltene Anwendungen :)

Steht auch alles schoen erklaert in der Doku:

http://docs.python.org/library/collecti ... ions.deque
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hmm... über was reden wir jetzt? Über das 'Queue- bzw. queue-Modul' oder über das 'collections-Modul'?
'collections.deque()' kann ich in diesem Fall noch verstehen, 'Queue.dequeue()' kann ich nicht einmal finden... :K

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
deets

Ich rede ueber collections. Und ich vermute, BlackJack tut das auch, und hat sich nur mit dem Queue-Modul fuer's multi-threading vertan.
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

Ok also aufgabe ist es nicht irgendwas zu optimieren das programm soll einfach nur irgendwie funktionieren...
ich belege dieses fach seit einem halben jahr und bin mit der aufgabe einfach überfordert...
die hälfte von dem was ihr da erzählt verstehe ich nicht einmal...

das mit der kassiererin da soll einfach ein name rein ist halt so vorgegeben dass es diese eigenschaft geben soll...

und wir sollen diese verkettete liste selbst implementieren deswegen führe ich die zeiger ja auch selbst ein...

zudem habe ich noch ein weiteres problem dass ich nicht verstehe warum der kunde.ausgeben-befehl nicht funktionieren will...
kann mir da vielleicht einer helfen?

wenn ich den listenbefehl von python benutzen dürfte wäre es ja kein problem aber so ist es halt nicht... wir sollen diese append und pop-befehle selbst schreiben sozusagen...
BlackJack

@Dark Star: Warum `ausgeben()` nicht funktioniert, wurde eigentlich schon gesagt. Vielleicht solltest Du erst einmal mit der Aufgabe aufhören und ein Python-Tutorial durcharbeiten um die Grundlagen von objektorientierter Programmierung, also Klassen, Methoden, Objekten, usw. zu lernen. Das ist hier wichtig und Voraussetzung zum Lösen der Aufgabe.

Und dann würde ich wirklich die verkettete Liste allgemein und unabhängig von dem Problem implementieren.

Das mit der `kassiererin` finde ich auch ziemlich diskriminierend. Wenn so etwas kritiklos in den Unterricht einfliesst zementiert das so ein bisschen, dass das "Frauenarbeit" wäre. Aber ich habe da Hoffnung auf Gleichberechtigung, denn zumindest in meiner Umgebung sehe ich auch immer mehr Kassierer an den Supermarktkassen.
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

Die "kassierein" erachte ich nicht als dermassen problematisch. Was würdest du denn bevorzugen? "kassierer"? Das wäre ja politisch auch nicht korrekt. Oder besser "kassiererIn"? Das wäre wohl politisch korrekt, aber niemand möchte das so tippen...

Ich verstehe nicht ganz, weshalb überhaupt eine verkettete Liste benutzt werden soll. Ich habe in diesem Thread keine Bedingung gesehen, die eine Solche notwendig machen würde. Ich denke, dass die Perfomranceunterschiede in diesem Fall vernachlässigbar klein sind. Ich würde einfach eine list benutzen :arrow: KISS
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

ich hab keine zeit um irgend ein tutorial durchzuarbeiten...
ich muss das bis dienstag fertig haben einfach keine chance...
zu deinem vorschlag das durch eine unabhängige liste wüsste ich nicht wie ich das machen sollte...


das hier ist die aufgabenstellung:


Kleinprojekt Supermarkt

Es soll die Kassensituation in einem Supermarkt beschrieben werden.
Hierzu sollen zwei Klassen "Kasse" und "Kunde" angelegt werden:

1. Kasse:
* Attribute: Kassiererin
* Methoden: anstellen(Kunde), kassiervorgang, ausgabe
* optionale (freiwillige) Methoden: oeffnen, schliessen, berechnungWartezeit

der Kassiervorgang nimmt den ersten Kunden der Schlange raus
bei Ausgabe werden alle Kunden der Schlange angegeben
die Methoden Oeffnen und Schliessen meinen die Besetzung der Kasse durch Personal ;)
2. Kunde:
* Attribute: Name, Artikelanzahl
* Methoden: produktkauf, ausgabe

bei Ausgabe werden der Name und die Artikelzahl ausgegeben

Ein Teil einer Befehlssequenz könnte also so aussehen:
...
kasse1.anstellen(kunde5)
kunde71.produktkauf()
kunde71.produktkauf()
kasse1.anstellen(kunde71)
kasse1.ausgabe()
kasse1.kassiervorgang()
kasse1.ausgabe()
...
Abgabe

Abgabe ist am Dienstag, dem 15. März per Stick oder per Mail
Dateiname: "NachnamenDerGruppenmitglieder(max. 3).py"

Bei Fragen stehe ich ebenfalls hier im Forum zur Verfügung
Gruß,
Th. Müller
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Die Beschreibung schreit aber danach, als sollte man die Kunden in einer Liste verwalten die einer Kasse zugeordnet ist.
problembär

Dark Star hat geschrieben:ich hab keine zeit um irgend ein tutorial durchzuarbeiten...
Ich hab' keine Zeit, Leuten mit einer so schlechten Einstellung zu helfen.
Dark Star hat geschrieben:ich muss das bis dienstag fertig haben
Ist mir voll egal. Deine Probleme gehen mich nichts an. Erst wenn Du Python wirklich lernen willst, gebe ich Dir vielleicht eine Antwort.
Zuletzt geändert von problembär am Samstag 12. März 2011, 18:00, insgesamt 2-mal geändert.
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

Aber Kunde kann ja nicht unterklasse von kasse sein sonst würde kunde ja die eigenschaften und methoden von kasse erben und das geht ja nicht...
sonst könnte man ja kunde.kassiererin schreiben das macht keinen sinn...

oder hab ich deine antwort missverstanden?
Antworten