Python Aufgabe

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.
Antworten
IlISkipperIlI
User
Beiträge: 7
Registriert: Montag 7. Juni 2021, 10:35

Hallo,

ich komme bei einer Python Aufgabe nicht weiter und hoffe, dass man mir hier weiterhelfen kann. Zur Aufgabenstellung: Ich soll ein Programm für einen Gebrauchtwagenhändler schreiben,
welches folgende Aktionen beinhaltet: a) Neuen Wagen hinzufügen b) Fahrzeug verkaufen c) Preis eines Fahrzeugs ändern d) Sortiment anzeigen e) Programm beenden.
Dabei sollen alle Aktionen in Funktionen bzw. Methoden ausgelagert werden. Als Klasse wurde die Klasse Auto mit den Attributen artikelnummer, marke, modell, farbe, baujahr und preis.
Aktionen a), d) und e) funktionieren bereits jedoch komme ich bei b) also dem entfernen eines bestimmten Objekts anhand der Artikelnummer aus einer liste und dem ändern des Preises c) mit der set_preis Funktion nicht weiter.
Habe schon vieles ausprobiert und bekomme immer eine Fehlermeldung. Autoliste.remove gibt auch nur eine Fehlermeldung raus.
Bilder vom Code sind verlinkt.

Vielen Dank,
Grüße

https://imgur.com/a/0eU4YCf
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bilder sind schlecht. Denn die kann man nicht laufen lassen. Bitte poste deinen Code direkt, mit den notwendigen Code Tags damit er lesbar dargestellt ist.
IlISkipperIlI
User
Beiträge: 7
Registriert: Montag 7. Juni 2021, 10:35

Code: Alles auswählen


from Auto import Auto


Autoliste = []

# Funktion Programm beenden
def close_programm():
    exit()

# Funktion Sortiment anzeigen
def sortiment_anzeigen():
    print(Autoliste)

# Funktion Wagen hinzufügen
def wagen_hinzufuegen():

    artikelnummer = int(input("Artikelnummer: "))
    marke = input("Marke: ")
    modell = input("Modell: ")
    farbe = input("Farbe: ")
    baujahr = int(input("Baujahr: "))
    preis = float(input("Preis: "))

    Autoliste.append(Auto(artikelnummer=artikelnummer, marke=marke, modell=modell, farbe=farbe, baujahr=baujahr, preis=preis))

# Funktion Wagen verkaufen/aus Liste entfernen
def wagen_entfernen():

    wagen = input("Gib die Artikelnummer des Wagens ein der verkauft werden soll: ")
    Autoliste.remove(Auto(artikelnummer=wagen, marke=marke, modell=modell, farbe=farbe, baujahr=baujahr, preis=preis))

while (True):

    inp = input(" Welche Aktion möchtest du durchführen ?\n\n a) Neuen Wagen hinzufügen\n b) Fahrzeug verkaufen\n c) Preis eines Fahrzeugs ändern\n d) Sortiment anzeigen\n e) Programm beenden\n")

    if inp == "e":
        close_programm()

    if inp == "d":
        sortiment_anzeigen()

    if inp == "b":
        wagen_entfernen()

    elif inp == "a":
        wagen_hinzufuegen()

IlISkipperIlI
User
Beiträge: 7
Registriert: Montag 7. Juni 2021, 10:35

Code: Alles auswählen

class Auto:
    """
    Erstellt das Objekt Auto für einen Gebrauchtwagenhändler
    """
    def __init__(self, artikelnummer, marke, modell, farbe, baujahr, preis):
        """
        Initialisiert ein neues Objekt Auto

        Argumente

        * Artikelnummer (int): Artikelnummer des Autos
        * Marke (string): Automarke
        * Modell (string): Automodell
        * Farbe (string): Farbe des Autos
        * Baujahr (int): Baujahr des Autos
        * Preis (float): Preis des Autos
        """
        self.__artikelnummer = artikelnummer
        self.__marke = marke
        self.__modell = modell
        self.__farbe = farbe
        self.__baujahr = baujahr
        self.__preis = preis

    def getArtikelnummer(self):
        return self.__artikelnummer

    def getMarke(self):
        return self.__marke

    def getModell(self):
        return self.__modell

    def getFarbe(self):
        return self.__farbe

    def getBaujahr(self):
        return self.__baujahr

    def getPreis(self):
        return self.__preis

    def setPreis(self, preis):
        self.__preis = preis

    def __repr__(self):

        ausgabe = "\nArtikelnummer: %d\n" %self.__artikelnummer
        ausgabe += "Marke: %s\n" %self.__marke
        ausgabe += "Modell: %s\n" %self.__modell
        ausgabe += "Farbe: %s\n" %self.__farbe
        ausgabe += "Baujahr: %d\n" %self.__baujahr
        ausgabe += "Preis: %f\n" %self.__preis
        return ausgabe

Benutzeravatar
sparrow
User
Beiträge: 4184
Registriert: Freitag 17. April 2009, 10:28

Variablen- und Funktionsnamen schreibt man in python klein_mit_unterstrich um sie von den Namen von Klassen (PascalCase) untersheiden zu können. Autoliste sollte also autoliste heißen. Auch module werden klein geschrieben.

exit() sollte man in einem Programm nie verwenden. Die Funktion "close_programm" ist überflüssig. Stattdessen würde man einfach die while-Schleife beenden. Dann kommt das Programm nachvollziehbar zum Ende.

Die Klammern um das "True" bei der while-Schleife sind unnötig.

Wenn man mehrere, sich ausschießende if-Bedingungen hat, verwendet man "elif". Du tust das nur im letzten Fall und bei denen davor nicht.

Verwende keine globalen Variablen.
Funktionen bekommen alles, was sie benötigen als Parameter und geben das Ergebnis per return zurück.
"autoliste" muss also als Parameter an die Funktionen übergeben werden, die autoliste benötigen.

Das mit den zwei Unterstrichen vor den Klassenvariablen ist unnötig. Es gibt den Irrglauben, die würden irgend etwas als "private" deklarieren. Die Frage ist auch, ob man die vielen getter braucht, oder ob man direkt auf den Variablen arbeiten kann.

Und zum removve:
Wenn du etwas aus der Liste entfernen willst, dann muss genau das Objekt übergeben, dass in der Liste ist. Du übergibst aber ein weiteres Auto-Objekt, dass du frisch erstellst. Das hat zwar identische Eigenschaften, aber es ist nicht das selbe Objekt wie das in der Liste.
IlISkipperIlI
User
Beiträge: 7
Registriert: Montag 7. Juni 2021, 10:35

Vielen Dank sparrow für die schnelle Antwort und die Verbesserungsvorschläge.

Das mit dem removen verstehe ich nun jedoch wie setzte ich es genau um, dass der User ein gewisses Attribut eingibt und dann das Objekt mit eben dem eingegeben Attribut aus der Liste gelöscht wird.
Benutzeravatar
sparrow
User
Beiträge: 4184
Registriert: Freitag 17. April 2009, 10:28

Deshalb hätte ich statt der Liste ein dict genommen. Dann kann dein Schlüssel das sein, wonach du suchst.
So musst du über die Liste iterieren, dir jedes Objekt anschauen, gucken ob es das gewünchte ist, es dir merken und nach der Iteration aus der Liste entfernen. Man verändert nicht, worüber man iteriert, deshalb _hinterher_.
IlISkipperIlI
User
Beiträge: 7
Registriert: Montag 7. Juni 2021, 10:35

Ja an ein Dict habe ich auch schon gedacht aber die Aufgabe lautet nunmal wie folgt:

4) Das gesamte Sortiment soll in einer Liste abgespeichert werden. Diese enthält
Objekte vom Typ Auto. Es ist sinnvoll, wenn der Zugriff auf ein Objekt immer über die
Artikelnummer stattfindet. Dazu ist es wichtig, darauf zu achten, dass jede Nummer nur
ein einziges Mal vergeben wird.

Jetzt weiß ich nicht ob ein Dict auch als eine Art Liste angesehen werden kann...
Benutzeravatar
sparrow
User
Beiträge: 4184
Registriert: Freitag 17. April 2009, 10:28

Wenn man das Wort "Liste" in dem Text durch "Datenstruktur" ersetzt, ist das ja genau das, was ein dict macht.
In meinen Augen gehört es acuh zum Programmieren, die richtige Datenstruktur zu wählen - auch wenn die Aufgabenstellung da Unsinn redet. Das kann natürlich der Aufgabensteller anders sehen
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie sparrow schon geschrieben hat, sind die ganzen Setter und Getter überflüssig.
Damit vereinfacht sich dir Klasse zu

Code: Alles auswählen

class Auto:
    """
    Erstellt das Objekt Auto für einen Gebrauchtwagenhändler
    """
    def __init__(self, artikelnummer, marke, modell, farbe, baujahr, preis):
        """
        Initialisiert ein neues Objekt Auto

        Argumente

        * Artikelnummer (int): Artikelnummer des Autos
        * Marke (string): Automarke
        * Modell (string): Automodell
        * Farbe (string): Farbe des Autos
        * Baujahr (int): Baujahr des Autos
        * Preis (float): Preis des Autos
        """
        self.artikelnummer = artikelnummer
        self.marke = marke
        self.modell = modell
        self.farbe = farbe
        self.baujahr = baujahr
        self.preis = preis

    def __repr__(self):
        ausgabe = "\nArtikelnummer: %d\n" % self.artikelnummer
        ausgabe += "Marke: %s\n" % self.marke
        ausgabe += "Modell: %s\n" % self.modell
        ausgabe += "Farbe: %s\n" % self.farbe
        ausgabe += "Baujahr: %d\n" % self.baujahr
        ausgabe += "Preis: %f\n" % self.preis
        return ausgabe
Funktionen müssen alles, was sie brauchen, über ihre Argumente bekommen, also hauptsächlich `Autoliste`.
Wenn sich if`s gegenseitig ausschließen, benutzt man elif, nicht nur beim letzten Block.

Code: Alles auswählen

# Funktion Sortiment anzeigen
def sortiment_anzeigen(autoliste):
    print(autoliste)

# Funktion Wagen hinzufügen
def wagen_hinzufuegen(autoliste):
    artikelnummer = int(input("Artikelnummer: "))
    marke = input("Marke: ")
    modell = input("Modell: ")
    farbe = input("Farbe: ")
    baujahr = int(input("Baujahr: "))
    preis = float(input("Preis: "))
    # TODO: prüfen, ob Artikelnummer schon existiert
    autoliste.append(Auto(artikelnummer=artikelnummer, marke=marke, modell=modell, farbe=farbe, baujahr=baujahr, preis=preis))

# Funktion Wagen verkaufen/aus Liste entfernen
def wagen_entfernen(autoliste):
    wagen = input("Gib die Artikelnummer des Wagens ein der verkauft werden soll: ")
    # TODO: finde Auto mit der Artikelnummer in autoliste
    auto = ...
    autoliste.remove(auto)

def main():
    autoliste = []
    while True:
        action = input(" Welche Aktion möchtest du durchführen ?\n\n a) Neuen Wagen hinzufügen\n b) Fahrzeug verkaufen\n c) Preis eines Fahrzeugs ändern\n d) Sortiment anzeigen\n e) Programm beenden\n")

        if action == "e":
            break
        elif action == "d":
            sortiment_anzeigen(autoliste)
        elif action == "b":
            wagen_entfernen(autoliste)
        elif action == "a":
            wagen_hinzufuegen(autoliste)
        else:
            print("Unbekannte Auswahl")

if __name__ == "__main__":
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@IlISkipperIlI: Die Aufgabe(n) sind aus einem Buch das vorsichtig ausgedrückt „nicht so gut ist“, und werden offenbar in mindestens einem Online-Kurs verwendet, und speziell diese Aufgabe war hier schon einmal Thema: viewtopic.php?f=1&t=49707
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
IlISkipperIlI
User
Beiträge: 7
Registriert: Montag 7. Juni 2021, 10:35

interessant, ich habe dann wohl den selben Online Kurs absolviert. Stelle jetzt nochmal meine Lösung rein die reintheoretisch funktioniert indem man die Listenposition über den Index
abfragt und dann eben an der Stelle den Preis verändert oder das Fahrzeug löscht. Ich weiß nur leider immer noch nicht ob es möglich ist die Artikelnummer abzufragen und darüber dann das korrekte Fahrzeug
zu verändern.
Zu dem Kurs: Der Kurs kam mir als Laie eigentlich recht solide rüber, kann mich da aber auch irren. Es ändert aber nichts daran, dass ich die Aufgabe zum Abschluss des Kurses lösen muss.
IlISkipperIlI
User
Beiträge: 7
Registriert: Montag 7. Juni 2021, 10:35

Code: Alles auswählen

from Auto import Auto


autoliste = []


# Funktion Sortiment anzeigen
def sortiment_anzeigen(autoliste):
    print(autoliste)

# Funktion Wagen hinzufügen
def wagen_hinzufuegen(autoliste):

    artikelnummer = int(input("Artikelnummer: "))
    marke = input("Marke: ")
    modell = input("Modell: ")
    farbe = input("Farbe: ")
    baujahr = int(input("Baujahr: "))
    preis = float(input("Preis: "))

    autoliste.append(Auto(artikelnummer=artikelnummer, marke=marke, modell=modell, farbe=farbe, baujahr=baujahr, preis=preis))

# Funktion Wagen verkaufen/aus Liste entfernen
def wagen_entfernen(autoliste):

    wagen = int(input("Gib die Position des Wagens in der Liste ein der verkauft werden soll: "))
    autoliste.remove(autoliste[wagen])

# Funktion Preis eines Fahrzeugs ändern
def preis_aendern(autoliste):

    fahrzeug = int(input("Gib die Position des Wagens in der Liste ein bei dem der Preis verändert werden soll: "))
    newpreis = int(input("Gib den neuen Preis ein: "))
    autoliste[fahrzeug].setPreis(newpreis)

while True:

    inp = input(" Welche Aktion möchtest du durchführen ?\n\n a) Neuen Wagen hinzufügen\n b) Fahrzeug verkaufen\n c) Preis eines Fahrzeugs ändern\n d) Sortiment anzeigen\n e) Programm beenden\n")

    if inp == "e":
        break

    elif inp == "d":
        sortiment_anzeigen(autoliste)

    elif inp == "b":
        wagen_entfernen(autoliste)

    elif inp == "a":
        wagen_hinzufuegen(autoliste)

    elif inp == "c":
        preis_aendern(autoliste)

    else:
        print("Unbekannte Auswahl")
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@IlISkipperIlI: warum heißt bei Dir einmal die Position `wagen` und enimal `fahrzeug`, und niemals wagen_position bzw. fahrzeug_position?
Du mußt alle Autos in autoliste durchgehen und die Artikelnummer mit der eingegebenen Artikelnummer vergleichen. Sind sie gleich, hast Du das richtige Auto gefunden.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@IlISkipperIlI: Da fehlt Fehlerbehandlung. Und auch beim hinzufügen von einem Wagen muss man nach der Artikelnummer suchen, denn die Artikelnummer darf in dem Fall noch nicht existieren, denn wenn man zwei Fahrzeuge mit der gleichen Artikelnummer im Sortiment hat, sind die nicht mehr eindeutig über die Artikelnummer identifizierbar.

Wenn Du den Index des zu löschenden Objekts kennst, dann ist `remove()` die falsche Methode, weil die das Objekt linear vom Anfang der Liste an sucht, Du kennst aber bereits den Index und brauchst deswegen nicht noch mal danach suchen lassen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten