Hilfe für 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
KasallaGina
User
Beiträge: 2
Registriert: Montag 30. Mai 2022, 16:54

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!
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
KasallaGina
User
Beiträge: 2
Registriert: Montag 30. Mai 2022, 16:54

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.
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
PyGuest
User
Beiträge: 28
Registriert: Mittwoch 25. Mai 2022, 10:57

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten