Seite 1 von 1
Hilfe für Aufgabe
Verfasst: Montag 30. Mai 2022, 17:04
von KasallaGina
Hallo Leute, bei der Aufgabe weiß ich mir echt keinen Rat mehr. Wir sollen ein Programm schreiben in dem man Tiere in einer Klasse mit Name und Gattung angeben soll und das so oft wie man will. Wenn man alle Tiere eingegeben wurden, soll man mit "enter" aus der Schleife kommen und es sollen alle eingegebenen Tiere geprintet werden.
Also wäre mein Ablauf:
-Klasse mit Methoden definieren
-Schleife in der man so viele Tiere eingeben kann wie man will
-Und am Ende printen
Nur dann überschreibt sich die Klasse immer.
Die Aufgabe ist mit angehängt, danke für die Hilfe!
Re: Hilfe für Aufgabe
Verfasst: Montag 30. Mai 2022, 17:50
von Sirius3
Mit Code kann man immer besser helfen. Was hast Du also schon versucht und was tut nicht so, wie Du es brauchst?
Aber beantworte mal folgende Fragen:
Welche Datenstruktur ist geeignet, um viele Exemplare des selben Typs zu speichern?
Was ist der Unterschied zwischen einer Klasse und einer Instanz der Klasse?
Re: Hilfe für Aufgabe
Verfasst: Montag 30. Mai 2022, 18:10
von KasallaGina
class Tier:
def __init__(self):
self.name = None
self.gattung = None
tier1 = Tier()
tier1.name = input('Name:')
tier1.gattung = input('Gattung:')
print(f'{tier1.name} ist von der Gattung {tier1.gattung}')
Sorry ich bin leider ein totaler Neuling in diesem Forum deswegen weiß ich nicht wie ich das in nem Code einfüge. Mit dem Programm kann ich den Namen eines Tieres und die GAttung eingeben, welche mir am Ende ausgegeben wird. Nur muss das theoretisch in eine Schleife gefasst werden, die mich so viele Tiere abfragt wie ich eingeben wollte. nur wenn ich das mache überschreibe ich die Klasse ja immer wieder.
Ich persönlich würde es lieber mit einem dict oder einer Liste machen, aber diese sollen laut Aufgabenstellung nicht benutzt werden.
Re: Hilfe für Aufgabe
Verfasst: Montag 30. Mai 2022, 18:34
von Sirius3
Wo steht, dass man keine Liste verwenden darf?
Eine Liste ist ja die übliche Datenstruktur, um mehrere Exemplare zu speichern.
Wie lautet die genaue Aufgabenstellung?
Eine Instanz sollte nach dem __init__-Aufruf ein fertiges Objekt liefern, daher sollte man alles, was die Instanz ausmacht, als Argumente übergeben:
Code: Alles auswählen
class Tier:
def __init__(self, name, gattung):
self.name = name
self.gattung = gattung
def main():
name = input('Name:')
gattung = input('Gattung:')
tier = Tier(name, gattung)
print(f'{tier.name} ist von der Gattung {tier.gattung}')
if __name__ == "__main__":
main()
Re: Hilfe für Aufgabe
Verfasst: Montag 30. Mai 2022, 18:36
von __blackjack__
@KasallaGina: Unter dem Textfeld wo „Schnellantwort“ als Überschrift drüber steht, sind zwei Schaltflächen „Vollständiger Editor & Vorschau“ und „Absenden“. Über die erste bekommst Du ein grösseres Textfeld für die Eingabe des Beitrags und darüber sind Schaltflächen die helfen Formatierungscodes in den Beitragstext einzufügen. Eine davon ist mit „</>“ beschriftet und fügt Code-Tags um den ausgewählten Text ein. Zwischen denen sollte Quelltext stehen, dann bleibt die Einrückung erhalten und es gibt auch farbige Syntaxhervorhebung. Das sieht dann so aus mit Deinem Quelltext:
Code: Alles auswählen
class Tier:
def __init__(self):
self.name = None
self.gattung = None
tier1 = Tier()
tier1.name = input('Name:')
tier1.gattung = input('Gattung:')
print(f'{tier1.name} ist von der Gattung {tier1.gattung}')
Was bei dem Quelltext zumindest mal ungewöhnlich ist, ist das die `__init__()`-Methode eigentlich ein mehr oder weniger unfertiges Objekt hinterlässt. Manchmal macht es Sinn Attribute mit `None` vorzubelegen, aber ein Tier ohne Name und Gattung ist nicht wirklich ein brauchbares Tier-Objekt. Diese Werte sollten der `__init__()` bereits übergeben werden.
Man nummeriert keine Namen. Dann will man sich entweder passendere Namen überlegen, oder gar keine Einzelnamen verwenden sondern eine Datenstruktur verwenden. Womit wir wieder bei der Frage von Sirius3 wären, welche Datenstruktur sich denn eignen würde eine Anzahl von Tier-Objekten zu speichern.
Zwischenstand für ein Tier ohne Datenstruktur und Möglichkeit mehrere Tiere einzugeben, sähe jedenfalls so aus:
Code: Alles auswählen
#!/usr/bin/env python3
class Tier:
def __init__(self, name, gattung):
self.name = name
self.gattung = gattung
def main():
tier = Tier(input("Name: "), input("Gattung: "))
print(f"{tier.name} ist von der Gattung {tier.gattung}.")
if __name__ == "__main__":
main()
Sowohl die Eingabe als auch die Ausgabe wird ein paar mehr Zeilen werden für diese Aufgabe, wobei die Ausgabe eher mit einer zusätzlichen Zeile auskommt. Bei der Eingabe braucht man ein paar mehr Zeilen, aber auch nicht wirklich viele.
Vielleicht noch als Hinweis, dass bei der Eingabe sich eine ”Endlosschleife” anbietet (``while True:``) die abgebrochen werden kann (``break``) wenn man festgestellt hat, dass der Benutzer statt einen Namen einzugeben einfach nur die Eingabetaste gedrückt hat.
Re: Hilfe für Aufgabe
Verfasst: Donnerstag 2. Juni 2022, 17:44
von PyGuest
Wenn die Bedingung wirklich so ist, dass Du keine Liste benutzen sollst, aber alle Tiere erste am Ende aufgelistet werden sollen, dann könntest Du natürlich auch einen Text fortschreiben
Ich nehme jetzt mal den Code von Blackjack und erweitere den wie angekündigt um eine Endlosschleife und eine Abbruchbedingung
Code: Alles auswählen
#!/usr/bin/env python3
class Tier:
def __init__(self, name, gattung):
self.name = name
self.gattung = gattung
def main():
kompletter_zoo = ""
while True:
tier = Tier(input("Name: "), input("Gattung: "))
if tier.name == "":
break
kompletter_zoo += f"{tier.name} ist von der Gattung {tier.gattung}.\n"
print(kompletter_zoo)
if __name__ == "__main__":
main()
Man kann das natürlich auch so machen, dass die Gattung nicht mehr eingegeben werden muss, wenn der Name des Tiers leer bleibt, aber das findest Du sicher alleine raus.
Re: Hilfe für Aufgabe
Verfasst: Donnerstag 2. Juni 2022, 20:12
von __blackjack__
Wobei da als erstes der Hinweis kommt, dass Zeichenketten und ``+=`` in einer Schleife ineffizient ist, weil dabei immer grösser werdende Zeichenketten kopiert werden, und das die idiomatische Lösung in Python das sammeln der Teilzeichenketten in einer Liste ist, die dann am Ende mit der `str.join()`-Methode zusammengesetzt werden.