s n h m r u

Minimallogo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

s n h m r u
i

Übung — Objekte und Klassen

Entwurf zur Erprobung von OOPython. Grundlage ist die Seite Übungen des Kapitels Objekte und Klassen. Jede Aufgabe bekommt eine eigene Instanz des Werkzeugs, zugeschnitten auf das, was die Aufgabe verlangt: Objekte benutzen und beobachten, eine Klasse vervollständigen, eine Klasse von Grund auf entwerfen oder das Verhalten eines Konstruktors erklären.

Aufgabe 1: Objekte erzeugen und benutzen

Gegeben ist eine Implementierung der Klasse Wuerfel:

from random import randint

class Wuerfel(object):
    def __init__(self):
        self.augen = randint(1, 6)

    def werfen(self):
        self.augen = randint(1, 6)

Im Werkzeug ist die Klasse bereits geladen. Der Quelltext liegt zum Lesen daneben, verändern lässt er sich hier nicht.

data-config dieses Werkzeugs
{
  "titel": "Aufgabe 1 — Würfel",
  "profil": "zustand-verstehen",
  "quelltextAnzeigen": true,
  "dateien": "wuerfel.py"
}

(a) Erzeuge ein Objekt der Klasse Wuerfel und öffne dazu den . Würfele über das Menü der Objektkarte so lange, bis der Würfel eine 6 liefert. Wie viele Würfe hast du gebraucht? Der hilft beim Zählen.

(b) Erzeuge einen zweiten Würfel. Würfele mit beiden, bis beide dieselbe Augenzahl zeigen (ein Pasch). Woran erkennst du im , dass es zwei verschiedene Objekte sind?

(c) Schreibe die Zeilen des Code-Spiegels für (a) als Python-Dialog auf. Welche Zeile kommt mehrfach vor?

Aufgabe 2: Eine Klasse implementieren

In Python gibt es keinen vordefinierten Datentyp für Brüche. Mit der Klasse Bruch soll diese Lücke geschlossen werden.

Wir beginnen mit dem folgenden Klassendiagramm zur Klasse Bruch:

Klassendiagramm

Im Werkzeug ist die Klasse nur angefangen: Der Konstruktor hat schon die richtigen Parameter, legt aber noch keine Attribute an, und die beiden Methoden fehlen ganz. Das Klassendiagramm im Werkzeug folgt deinem Quelltext beim Tippen — wenn es dem Diagramm oben entspricht, ist die Struktur vollständig.

data-config dieses Werkzeugs
{
  "titel": "Aufgabe 2 — Bruch",
  "hauptprogramm": "main_bruch.py",
  "profil": "selbst-programmieren",
  "dateien": "bruch.py"
}

(a) Vervollständige die Klasse im Editor, so dass Python-Dialoge der folgenden Art möglich werden. Führe den Quelltext aus, prüfe dann mit einem Objekt auf der und dem — oder starte das vorbereitete , das genau diesen Dialog enthält, und lies die Ausgabe:

>>> b = Bruch(4, 6)
>>> b.erweitern(3)
>>> b.kuerzen(2)
>>> b.zaehler
...
>>> b.nenner
...

(b) (eher schwierig) Ergänze die Klasse Bruch um eine Operation vollstaendigKuerzen. Entwickle auch dazu eine geeignete Implementierung. Teste sie mit Bruch(12, 18).

Hinweis: Mit Brüchen möchte man natürlich auch rechnen. Das werden wir aber erst in einem der folgenden Abschnitte betrachten.

Aufgabe 3: Eine Klasse konzipieren und 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.

Zähler[1]

(a) Modelliere eine Klasse Zaehler, mit der man Objekte erzeugen kann, die sich wie Zähler in der Wirklichkeit verhalten. Berücksichtige vorerst noch nicht, dass es für die Zahl eine Obergrenze gibt. Stell die modellierte Klasse zuerst per Hand mit einem Klassendiagramm dar. Implementiere die Klasse dann im Werkzeug — der Editor ist leer — und vergleiche das Klassendiagramm, das das Werkzeug zeichnet, mit deinem. Teste anschließend mit Objekten auf der .

data-config dieses Werkzeugs
{
  "titel": "Aufgabe 3 — Zähler",
  "hauptprogramm": "main_zaehler.py",
  "profil": "selbst-programmieren",
  "laden": "klick",
  "dateien": "zaehler.py"
}

(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, ...

Modelliere und implementiere auch für Zählsituationen mit einer Obergrenze eine geeignete Klasse. Schreibe sie in dieselbe Datei unter die Klasse Zaehler; beide Klassen erscheinen dann im Diagramm. Das vorbereitete zählt 65-mal hoch — passe es an deine Klasse an und prüfe an der , ob der Zähler nach 59 wirklich bei 0 weitermacht. 65-mal zu klicken wäre auch möglich, aber genau dafür gibt es Programme.

Aufgabe 4: Eine Klasse konzipieren

Grafikprogramme können geometrische Objekte (u.a. Kreise) verwalten. Überlege, welche Daten von einem Objekt der Klasse Kreis verwaltet werden müssen und welche Operationen ein Objekt der Klasse Kreis zur Verfügung stellen könnte. Beschreibe die Klasse Kreis zuerst mit einem Klassendiagramm per Hand. Entwickle dann eine geeignete Implementierung im Werkzeug. Das Diagramm, das das Werkzeug aus deinem Quelltext zeichnet, ist die Kontrolle: Es soll deinem Entwurf entsprechen.

data-config dieses Werkzeugs
{
  "titel": "Aufgabe 4 — Kreis",
  "profil": "selbst-programmieren",
  "laden": "klick",
  "dateien": "kreis.py"
}

Aufgabe 5: Konstruktoren mit flexibler Anzahl von Parametern

Die folgende Deklaration des Konstruktors erlaubt es, Objekte flexibel mit Anfangswerten zu versehen:

class Konto(object):
    def __init__(self, nummer=0, betrag=0):
        self.nr = nummer
        self.stand = betrag
        self.inhaber = None

    def einzahlen(self, betrag):
        self.stand = self.stand + betrag

    def auszahlen(self, betrag):
        self.stand = self.stand - betrag

Der nachfolgende Python-Dialog zeigt einige Möglichkeiten, Objekte zu erzeugen:

>>> k1 = Konto()
>>> k1.nr
0
>>> k1.stand
0
>>> k2 = Konto(1)
>>> k2.nr
1
>>> k2.stand
0
>>> k3 = Konto(2, 1000.0)
>>> k3.nr
2
>>> k3.stand
1000.0
>>> k4 = Konto(betrag=400.0)
>>> k4.nr
0
>>> k4.stand
400.0
data-config dieses Werkzeugs
{
  "titel": "Aufgabe 5 — Konstruktor mit Vorgabewerten",
  "profil": "zustand-verstehen",
  "quelltextAnzeigen": true,
  "laden": "klick",
  "dateien": "konto2.py"
}

(a) Erzeuge die vier Objekte k1 bis k4 über das Menü des Klassenkastens. Der Dialog zeigt für jeden Parameter seinen Vorgabewert; lass ein Feld leer, wenn im Dialog oben kein Wert übergeben wird. Vergleiche nach jedem Objekt die Zeile im Code-Spiegel mit der Zeile im Python-Dialog.

(b) Öffne zu jedem Objekt den Inspektor und erkläre, wie die jeweiligen Attributwerte zustande kommen.

(c) Bei k4 wurde nur betrag angegeben. Warum reicht dafür nicht Konto(400.0)? Probiere es aus und prüfe im Inspektor.

Quellen

Suche

v
100.161.3 Übung — Objekte und Klassen
Kopieren durch Anklicken

Rückmeldung geben