Benutzer-Werkzeuge

Webseiten-Werkzeuge


schule:programmieruebungen_klassen

Dies ist eine alte Version des Dokuments!


Programmierübungen zu Klassen und Objekten

Klasse Auto

Für ein Autohaus ist eine Klasse Auto zu entwickeln. Folgende Datenfelder sind bei einem Auto zu verwalten:

  • Hersteller (String)
  • Laufleistung in km (Ganzzahl)
  • Preis in EUR (Kommazahl)
  • Farbe (String)
  • Unfallwagen (boolean)
  • Kraftstoff (String)
  • Leistung in PS (Kommazahl)

Ein Objekt vom Typ Auto soll mit folgender Codezeile erzeugt werden können:

  a = Auto(hersteller="Ford", laufleistung=125000, preis=7999.99,
           farbe="silber metallic", unfallwagen=False, kraftstoff="Diesel",
           ps=101.0)

Der Aufruf a.ausgabe()) sollte in etwa folgendes Ergebnis ausgeben:

  Hersteller: Ford
  Preis: 7999.99 EUR
  Motor: 101.0 PS (Diesel)
  KM-Stand: 125000 km
  Farbe: silber metallic
  unfallfrei

Der Zusatz “unfallfrei” soll nur ausgegeben werden, wenn das Datenfeld “Unfallwagen” den Wert false hat. Entwickeln Sie diese Klasse Auto und testen Sie diese mit den folgenden Codezeilen.

Klassen für geometrische Objekte

Kreis
radius: double
farbe: string
__init__(radius:double)
get_radius(): double
berechne_flaeche(): double
berechne_umfang(): double
  1. Erstelle eine Klasse Kreis nach dem obigen Klassendiagramm. Der Default-Wert für die Farbe soll „rot“ sein.
  2. Erstelle drei unterschiedliche Instanzen und teste damit die Methoden.
  3. Erstelle auf ähnliche Weise ein Klassendiagramm und den Quelltext für eine Klasse „Rechteck“.

Klasse für Brüche

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:

Bruch
zaehler: int
nenner: int
Bruch(z:int, n:int)
erweitern(k: int)
kuerzen(k: int)

(a) Entwickle eine geeignete Implementierung zu dieser Klasse, so dass Python-Dialoge der folgenden Art möglich werden:

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

(b) (eher schwierig) Ergänze die Klasse Bruch um eine Operation vollstaendigKuerzen. Entwickle auch dazu eine geeignete Implementierung.

>>> b.vollstaendigKuerzen()
>>> b.zaehler
2.0
>>> b.nenner
3.0

Quelle

Klasse für Zähler

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) 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 mit einem Klassendiagramm dar. Implementiere und teste anschließend die entwickelte Klasse.

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

Quelle

Klassen für Adam und Eva

In der Bibel steht, dass Adam und Eva die ersten Menschen auf der Erde waren und von Gott geschaffen wurden.

Du bist nun in der Rolle von Gott. Erstelle eine Methode god(), die zwei Menschen Adam und Eva zurückliefert. Adam ist vom Typ Man und Eva vom Typ Woman. Sowohl Man als auch Woman sind von Human abgeleitet sind.

Tiere: Hunde und Katzen

Vererbung A, B, C

Welche Ausgabe erzeugt das folgende Programm, wenn an der Stelle BLOCK_1234 jeweils Block 1, 2, 3 oder 4 eingesetzt wird?

Führe das Programm nicht aus, sondern überlege, wie die Ausgabe lautet.

class A:
    def m1(self):
        return "m1 von A "
 
    def m2(self):
        return "m2 von A "
 
    def m3(self):
        return "m3 von A "
 
class B(A):
    def m1(self):
        return "m1 von B "
 
class C(B):
    def m3(self):
        return "m3 von C "
 
 
######
a = A()
b = B()
c = C()
a2 = A()
 
q = ''
 
BLOCK_1234
 
print(q)
q += b.m1()  # Block 1
q += c.m2()
q += a.m3()
q += c.m1() # Block 2
q += c.m2()
q += c.m3()
q += a.m1() # Block 3
q += b.m2()
q += c.m3()
q += a2.m1() # Block 4
q += a2.m2()
q += a2.m3()

Klasse für Geister

Erstelle eine Klasse Ghost. Sie wird ohne Parameter instanziiert und besitzt das Attribut color, das zu Beginn zufällig auf „weiß“, „gelb“ oder „rot“ gesetzt wird.

Klasse für Bankkonto

Erstelle für eine Bank eine Klasse User mit den folgenden Methoden:

  • withdraw method
    • Subtracts money from balance
    • One parameter, money to withdraw
    • Raise ValueError if there isn't enough money to withdraw
  • check method
    • Adds money to baleance
    • Two parameters, other user and money
    • Other user will always be valid
    • Raise a ValueError if other user doesn't have enough money
    • Raise a ValueError if checking_account isn't true for other user
  • add_cash method
    • Adds money to balance
    • One parameter, money to add
    • Return a string with name and balance(see examples)

Additional Notes:

  • Checking_account should be stored as a boolean
  • No input numbers will be negitive
  • Float numbers will not be used so, balance should be integer
  • No currency will be used
konto.py
class User:
    'Ein Kunde mit einem Konto.'
 
 
# Tests
 
jeff = User(name='Jeff', balance=70, checking_account=True)
joe = User(name='Joe', balance=70, checking_account=False)
 
jeff.withdraw(2)
assert jeff.balance == 68
 
joe.check(jeff, 50)
assert joe.balance == 120
assert jeff.balance == 18
 
try:
    jeff.check(joe, 80)  # raises ValueError
    assert False, "Value Error missing"
except ValueError:
    assert True
 
joe.checking_account = True # Enables checking for Joe
jeff.check(joe, 80) 
jeff.balance == 98
joe.balance == 40
 
try:
    joe.check(jeff, 100) # Raises a ValueError
    assert False
except ValueError:
    assert True
 
jeff.add_cash(20.00)
jeff.balance == 118
print("Alles Tests bestanden")

schule/programmieruebungen_klassen.1578292367.txt.gz · Zuletzt geändert: 2020-01-06 07:32 von marco.bakera