lehrkraefte:blc:informatik:ffprg1-2020:oop

Objektorientiertes Programmieren (mit Python)

Präsentation

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.

Lösungsvorschlag

Lösungsvorschlag

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.

Lösungsvorschlag

Lösungsvorschlag

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.

Lösungsvorschlag

Lösungsvorschlag

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.

Lösungsvorschlag

Lösungsvorschlag

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") 

Präsentation

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.

Lösungsvorschlag

Lösungsvorschlag

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.

Lösungsvorschlag

Lösungsvorschlag

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()
  • lehrkraefte/blc/informatik/ffprg1-2020/oop.txt
  • Last modified: 2021/03/26 18:02
  • by michael.greminger