====== Objektorientiertes Programmieren (mit Python) ====== ===== Teil 1 ===== === Präsentation === {{lehrkraefte:blc:informatik:ffprg1-2020:oop1.pdf}} === Aufgabe 1 === Schreiben Sie eine Klasse "Konto" mit folgenden Eigenschaften - 2 Attribute (_inhaber, _kontostand) - 2 Methoden (Funktionen) "inhaber()" und "kontostand()" - Konstruktor "Verwenden" Sie diese Klasse, indem sie zwei Instanzen kreieren und benutzen. class Konto: def __init__(self, i, k): self._inhaber = i self._kontostand = k def inhaber(self): return self._inhaber def kontostand(self): return self._kontostand k1 = Konto("Michael", 1234) k2 = Konto("Fritz", 12340) print k1.kontostand() print k2.inhaber() === Aufgabe 2 === Schreiben Sie eine Klasse "Buchung" mit folgenden Eigenschaften - 2 Attribute (_betrag, _datum) - 2 Methoden (Funktionen) "betrag()" und "datum()" - Konstruktor mit zwei Argumenten: Betrag und Datum als string (zB. "13.4.2021"). Der string soll in ein Datum (genauer gesagt in datetime) umgewandelt werden. Importieren Sie dazu "from datetime import datetime" und wandeln Sie um (google sei erlaubt) Testen Sie diese Klasse, indem sie eine Instanz kreieren und benutzen. from datetime import datetime class Konto: def __init__(self, i, k): self._inhaber = i self._kontostand = k def inhaber(self): return self._inhaber def kontostand(self): return self._kontostand class Buchung: def __init__(self, b, d): self._betrag = b self._datum = datetime.strptime(d, "%d.%m.%Y") def betrag(self): return self._betrag def datum(self): return self._datum b1 = Buchung(456, "13.12.2021") print b1.datum() k1 = Konto("Michael", 1234) k2 = Konto("Fritz", 12340) print k1.kontostand() print k2.inhaber() === Aufgabe 3 === Fügen Sie zur Klasse Konto eine neue Methode ein "addBuchung" mit zwei Argumenten, dem Betrag und dem Datum als String. Die Klasse Konto soll eine Liste von Buchungen haben. Der Kontostand soll mit dem Hinzufügen einer Buchung entsprechend angepasst werden. from datetime import datetime class Konto: def __init__(self, i, k): self._inhaber = i self._kontostand = k self._buchungen = [] def inhaber(self): return self._inhaber def kontostand(self): return self._kontostand def addBuchung(self, betrag, datum): buchungInstanz = Buchung(betrag, datum) self._buchungen.append(buchungInstanz) self._kontostand += buchungInstanz.betrag() class Buchung: def __init__(self, b, d): self._betrag = b self._datum = datetime.strptime(d, "%d.%m.%Y") def betrag(self): return self._betrag def datum(self): return self._datum k1 = Konto("Michael", 1234) k1.addBuchung(100, "13.12.2021") print k1.kontostand() === Aufgabe 4 === Fügen Sie zur Klasse Konto eine Methode "kontostandDatum" mit einem Argument Datum (als String) ein. Diese Methode soll den Kontostand für ein Datum zurückgeben. Damit es einfacher wird, würde ich vorschlagen, die Buchungen chronologisch zu machen. Selbstverständlich kann man auch die Buchungsliste immer sortiert halten. from datetime import datetime class Konto: def __init__(self, i, k): self._inhaber = i self._kontostand = k self._buchungen = [] def inhaber(self): return self._inhaber def kontostand(self): return self._kontostand def kontostandDatum(self, dString): datum = datetime.strptime(dString, "%d.%m.%Y") index = len(self._buchungen) - 1 betrag = self._kontostand while index >= 0 and datum < self._buchungen[index].datum(): betrag = betrag - self._buchungen[index].betrag() index = index - 1 return betrag def addBuchung(self, b, d): b = Buchung(b, d) self._buchungen.append(b) self._kontostand += b.betrag() class Buchung: def __init__(self, b, d): self._betrag = b self._datum = datetime.strptime(d, "%d.%m.%Y") def betrag(self): return self._betrag def datum(self): return self._datum k1 = Konto("Michael", 100) k1.addBuchung(100, "13.12.2021") k1.addBuchung(200, "15.12.2021") k1.addBuchung(300, "17.12.2021") print k1.kontostand() print k1.kontostandDatum("12.12.2021") print k1.kontostandDatum("14.12.2021") print k1.kontostandDatum("16.12.2021") print k1.kontostandDatum("18.12.2021") ===== Teil 2 ===== === Präsentation === {{lehrkraefte:blc:informatik:ffprg1-2020:oop2.pdf}} === Aufgabe 5 === Fügen Sie bei Konto eine neue Methode "zinssatz()" welche einen fixen Zinssatz zurückgibt (zum Beispiel 0.01). Fügen Sie eine neue Subklasse "Supersparkonto" ein. Diese Subklasse hat einen flexiblen Zinssatz. Wenn der Kunde weniger als dreimal Geld abgehoben hat (= Buchungen mit negativem Betrag), dann ist der Zinssatz 1% höher als derjenige des normalen Kontos. from datetime import datetime class Konto: def __init__(self, i, k): self._inhaber = i self._kontostand = k self._buchungen = [] def inhaber(self): return self._inhaber def kontostand(self): return self._kontostand def zinssatz(self): return 0.035 def kontostandDatum(self, dString): datum = datetime.strptime(dString, "%d.%m.%Y") index = len(self._buchungen) - 1 betrag = self._kontostand while index >= 0 and datum < self._buchungen[index].datum(): betrag = betrag - self._buchungen[index].betrag() index = index - 1 return betrag def addBuchung(self, b, d): b = Buchung(b, d) self._buchungen.append(b) self._kontostand += b.betrag() class Supersparkonto (Konto): def __init__(self, i, k): Konto.__init__(self, i, k) def zinssatz(self): abgehoben = 0 for b in self._buchungen: if b.betrag() < 0: abgehoben += 1 zins = Konto.zinssatz(self) if abgehoben < 3: zins += 0.01 return zins class Buchung: def __init__(self, b, d): self._betrag = b self._datum = datetime.strptime(d, "%d.%m.%Y") def betrag(self): return self._betrag def datum(self): return self._datum k1 = Supersparkonto("Michael", 1000) k1.addBuchung(-100, "13.12.2021") k1.addBuchung(-200, "15.12.2021") print k1.zinssatz() k1.addBuchung(-300, "17.12.2021") print k1.zinssatz() === Aufgabe 6 === Füge zur Klasse Konto eine Methode "jahresabschluss()". Diese berechnet aus dem aktuellen Kontostand und dem Zinssatz die Zinsgutschrift, welche als Buchung gutgeschrieben werden soll. Teste diese Methode sowohl für eine Instanz von von Konto als auch vom Supersparkonto. Zusatz: Natürlich ist es auch möglich, die korrekte Zinsgutschrift zu berechnen (wieviele Tage war welcher Betrag auf dem Konto). Wenn jemand mit allem fertig ist, kann das gerne versucht werden. from datetime import datetime class Konto: def __init__(self, i, k): self._inhaber = i self._kontostand = k self._buchungen = [] def inhaber(self): return self._inhaber def kontostand(self): return self._kontostand def zinssatz(self): return 0.035 def kontostandDatum(self, dString): datum = datetime.strptime(dString, "%d.%m.%Y") index = len(self._buchungen) - 1 betrag = self._kontostand while index >= 0 and datum < self._buchungen[index].datum(): betrag = betrag - self._buchungen[index].betrag() index = index - 1 return betrag def addBuchung(self, b, d): b = Buchung(b, d) self._buchungen.append(b) self._kontostand += b.betrag() def jahresAbschluss(self): self.addBuchung(self.kontostand() * self.zinssatz(), "31.12.2021") class Supersparkonto (Konto): def __init__(self, i, k): Konto.__init__(self, i, k) def zinssatz(self): abgehoben = 0 for b in self._buchungen: if b.betrag() < 0: abgehoben += 1 zins = Konto.zinssatz(self) if abgehoben < 3: zins += 0.01 return zins class Buchung: def __init__(self, b, d): self._betrag = b self._datum = datetime.strptime(d, "%d.%m.%Y") def betrag(self): return self._betrag def datum(self): return self._datum k1 = Supersparkonto("Michael", 1000) k1.addBuchung(-100, "13.12.2021") k1.addBuchung(-200, "15.12.2021") k1.addBuchung(-300, "17.12.2021") print k1.kontostand() k1.jahresAbschluss() print k1.kontostand()