Übungen
Aufgabe 1: Klassendeklarationen analysieren; Objekte erzeugen und benutzen
Gegeben ist die Deklaration einer Klasse Kartenhand
:
class Kartenhand(object):
def __init__(self):
self.kartenListe = []
self.anzahl = 0
def hinzufuegen(self, karte):
self.kartenListe = self.kartenListe + [karte]
self.anzahl = self.anzahl + 1
def wegnehmen(self, karte):
if karte in self.kartenListe:
i = self.kartenListe.index(karte)
del self.kartenListe[i]
self.anzahl = self.anzahl - 1
(a) Analysiere zunächst die Klasse Kartenhand
. Welche Attribute werden hier festgelegt?
Was sollen sie verwalten?
Welche Methoden gibt es? Was sollen sie leisten?
Beschreibe die Klasse auch mit einem Klassendiagramm.
(b) Im folgenden Python-Dialog sind die Ausgaben von Python durch Fragezeichen ersetzt. Was steht an Stelle der Fragezeichen? Überprüfe deine Vermutungen.
>>>
>>> meineKarten = Kartenhand()
>>> meineKarten.hinzufuegen('P-B')
>>> meineKarten.kartenListe
?
>>> meineKarten.hinzufuegen('H-10')
>>> meineKarten.kartenListe
?
>>> meineKarten.hinzufuegen('P-A')
>>> meineKarten.kartenListe
?
>>> meineKarten.wegnehmen('H-10')
>>> meineKarten.kartenListe
?
>>> meineKarten.wegnehmen('X-7')
>>> meineKarten.kartenListe
?
>>> meineKarten.anzahl
?
(c) Die folgende Deklaration der Klasse Kartenhand
unterscheidet sich von der oben
gezeigten nur im Konstruktor.
class Kartenhand(object):
def __init__(self, kartenGegeben):
self.kartenListe = kartenGegeben
self.anzahl = len(self.kartenListe)
def hinzufuegen(self, karte):
self.kartenListe = self.kartenListe + [karte]
self.anzahl = self.anzahl + 1
def wegnehmen(self, karte):
if karte in self.kartenListe:
i = self.kartenListe.index(karte)
del self.kartenListe[i]
self.anzahl = self.anzahl - 1
Was ist hier anders? Wozu könnte das gut sein? Betrachte hierzu auch den folgenden Python-Dialog.
>>>
>>> meineKarten = Kartenhand(['X-A', 'H-A', 'P-7'])
>>> meineKarten.kartenListe
['X-A', 'H-A', 'P-7']
>>> meineKarten.anzahl
3
(d) Hier eine weitere Variante zur Klasse Kartenhand
.
class Kartenhand(object):
def __init__(self, kartenGegeben):
self.kartenListe = kartenGegeben
self.anzahl = len(self.kartenListe)
def existiertKarte(self, karte):
if karte in self.kartenListe:
ergebnis = True
else:
ergebnis = False
return ergebnis
def hinzufuegen(self, karte):
if not self.existiertKarte(karte):
self.kartenListe = self.kartenListe + [karte]
self.anzahl = self.anzahl + 1
def wegnehmen(self, karte):
if self.existiertKarte(karte):
i = self.kartenListe.index(karte)
del self.kartenListe[i]
self.anzahl = self.anzahl - 1
Erläutere die Unterschiede zu den bisher betrachteten Klassendeklarationen. Führe selbst einen Python-Dialog zum Testen aus. Dokumentiere mit diesem Dialog das Verhalten der einzelnen Methoden der Klasse.
Aufgabe 2: Klassen implementieren; Objekte erzeugen und benutzen
Das Spiel 17 und 4 soll hier mit einem Dodekaederwürfel gespielt werden. Ein solcher Würfel ist ein Körper mit 12 regelmäßigen Fünfecken als Flächen.
Gegeben ist ein Klassendiagramm mit einem Bauplan für Dodekaederwürfel:
(a) Erläutere die Bestandteile der Klasse Dodekaederwuerfel
:
Welche Attribute und Methoden sind vorgesehen? Wofür sind sie im vorliegenden Kontext gedacht?
(b) Implementiere zunächst die Klasse Dodekaederwuerfel
.
Entwickle dann einen Python-Dialog zum Testen dieser Klasse.
(c) Ermittle mit einem Testprogramm, wie oft man einen Dodekaederwürfel (durchschnittlich) werfen
muss, bis die Summe der Augenzahlen der Würfelwürfe die Zahl 21 überschreitet.
Benutze die Klasse Dodekaederwuerfel
, um ein Würfelobjekt zu erzeugen.
Aufgabe 3: Eine Klasse implementieren
Ein Zähler ist ein Gerät (Objekt), mit dem man hochzählen kann, und den man gezielt wieder auf Null setzen kann. Man benutzt solche Geräte z.B. bei Verkehrszählungen.
(a) Gegeben ist ein Klassendiagramm zur Modellierung der Klasse Zaehler
.
Beschreibe kurz die im Klassendiagramm vorkommenden Bestandteile.
Implementiere und teste anschließend die Klasse Zaehler
.
(b) Wenn man eine Uhr simulieren möchte, dann benötigt man einen Sekunden- bzw. Minutenzähler, der so zählt:
0, 1, 2, 3, ..., 58, 59, 0, 1, 2, 3, ..., 58, 59, 0, 1, 2, ...
Ein Stundenzähler zählt entsprechend:
0, 1, 2, 3, ..., 23, 0, 1, 2, 3, ..., 23, 0, 1, 2, ...
Erläutere die erforderlichen Veränderungen im Klassenmodell. Implementiere die modfizierte Klasse.
Aufgabe 4: Eine Klasse modellieren und implementieren
Für viele Spiele benötigt man eine Art Punktekonto. Auf dieses Konto kann man eine vorgegebene Anzahl von Punkten "einzahlen", der Punktekontostand erhöht sich dann entsprechend. Man kann analog auch eine vorgegebene Anzahl von Punkten "abheben", natürlich nur, wenn genügend Punkte auf dem Konto sind.
Entwickle zunächst ein Klassendiagramm mit allen benötigten Attributen und Methoden. Entwickle anschließend eine passende Implementierung und teste sie.
Aufgabe 5: Eine Klasse modellieren und implementieren
Zum Nudelkochen im Ferienlager werden genau 2 Liter Wasser benötigt. Zum Abmessen stehen nur ein kleiner Eimer, der 3 Liter fasst, und ein etwas größerer Eimer, der 4 Liter fasst, zur Verfügung. Kann das funktionieren?
Mit Hilfe eines geeigneten Objekts sollen solche Umfüllsysteme simuliert werden. Ein Umfüllsystem soll dabei aus einer festen / variablen Anzahl von Gefäßen bestehen. Jedes Gefäß hat eine vorgegebene Kapazität. Man kann ein Gefäß vollständig auffüllen, komplett leeren. Man kann zudem den Inhalt in ein anderes Gefäß umfüllen - natürlich nur soviel wie da reinpasst.
(a) Überlege, welche Daten ein Objekt zur Simulation eines Umfüllsystems verwalten muss und welche Operationen es ausführen können muss. Entwickle ein passendes Klassendiagramm mit allen benötigten Attributen und Methoden.
(b) Entwickle anschließend eine Implementierung der modellierten Klasse und teste sie.
Quellen
- [1]: Dodekaeder - Urheber: w:de, Rovnet - Lizenz: Public Domain
- [2]: Zähler - Urheber: Wesha - Lizenz: Creative Commons BY-SA 3.0