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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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 ;-) )
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

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...
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

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...
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

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?
BlackJack

@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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Dark Star hat geschrieben:...muss da nicht eigentlich ne klammer um das was ausgegeben werden soll?
Wenn Du Python 3 verwendest: Ja.
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

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:

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)
könntet ihr mir das vielleicht an meinem code zeigen was ihr meint alsosozusagen belegen...
BlackJack

@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.
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

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")
Wie schreibe ich diesen Code denn jetzt über meine Liste um?
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...
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

Zudem habe ich jetzt noch ein Problem:

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.
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

sagen wir mal ich habe schlange=[Kunde1,Kunde2,Kunde3,Kunde4]

gibt es einen Befehl um herauszufinden an welcher stelle einer dieser Kunden steht?
Dark Star
User
Beiträge: 23
Registriert: Freitag 11. März 2011, 17:28

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
Antworten