{"name":"Bank","modules":[{"name":"Kunde","text":"class Kunde {\n String name;\n Karte karte;\n\n public Kunde(String neuerName, Bank bank) {\n name = neuerName;\n karte = bank.kontoEroeffnen(this);\n }\n\n /**\n * Ueberweise einen Betrag in Euro Cent vom eigenen Konto auf ein anderes.\n */\n void ueberweisen(Kunde an, int betrag) {\n Bank bank = karte.bank;\n bank.transfer(karte.kontoNummer, an.karte.kontoNummer, betrag);\n }\n\n /**\n * Loese das eigene Konto auf\n */\n void kontoAufloesen() {\n // AUFGABE 1: Loesche das eigene Konto in der Bank.\n // Tipp: Die Referenz auf ein Objekt in einem Array kannst loeschen\n // indem du dem ensprechenden Index den besonderen Wert null zuweist.\n\n // TODO: Implementiere die Methode kontoAufloesen die mit Hilfe der Punktnotation\n // das eigene Konto in der Bank loescht.\n\n // AUFGABE 4: Ueberlege welche Effelte eine Kontoaufloesung in der Bank noch benoetigt.\n // Implementiere eine Methode mit der Signatur public void kontoAufloesen(Karte karte) in der Klasse\n // Bank die alle beonoetigten Aenderung in der Klasse Bank vornimmt.\n // Warum ist der Grundsatz der Datenkapselung bei Zustandasaenderungen mit mehreren Schritten hilfreich?\n\n // TODO: Schalte den kommentar der folgenden Zeile aus nachdem du Aufgabe 4 erledigt hast.\n // karte.bank.kontoAufloesen(karte);\n }\n}\n\nclass Hacker extends Kunde {\n\n /**\n * Schreibe dir selbst einen beliebigen Betrag in Euro Cent zu ohne Konto:einzahlen zu verwenden\n * \n * Tipp: Die Punktnotation erlaubt dir auch dich durch mehrere Referenzvariablen entlang \"zuhangeln\"\n * referenzvariable.referenzInReferenzvariable.attribute.\n */\n void erfindeGeld(int betrag) {\n // AUFGABE 2: Nutze dein Wissen ueber die fehlende Datenkapselung um den Betrag auf dem eigenen\n // Konto zu erhoehen.\n\n // TODO: Vervollstanedige diese Methode unter Verwendung der Punktnotation.\n\n // AUFGABE 3: Verhindere den Zugriff den du in AUFGABE 1 ausgenutzt hast in dem du die Klassen\n // Bank und Konto um geeignete Zugriffsmodifikatoren ergaenzt und den Grundsatz der Datenkapselung\n // anwendest.\n\n // ZUSATZAUFGABE 1: Die Programmierer der Bank waren aber nicht nur bei der Datenkapselung nachlaessig.\n // Schaffst du es dir einen beliebigen Betrag zuzuschreiben durch die geschickte Verwendung\n // der von der Klasse Bank angebotenen Methoden?\n\n // TODO: Vervollstanedige diese Methode unter Verwendung der Methoden der Klasse Bank.\n }\n\n /**\n * Stiehl einen beliegigen Betrag in Euro Cent von anderen Kunden\n * \n * Tipp: Untersuche die Methode Bank:transfer\n */\n void stiehl(Kunde opfer, int betrag) {\n // ZUSATZAUFGABE 2: Stiehl einen beliebigen Betrag von einem anderen Bank Kunden.\n // Ueberlege Dir warum dein Vorgehen moeglich ist und wie geeignete Gegenmassnahmen\n // aussehen koennten und setze diese um.\n }\n\n /**\n * Uebernimm das Konto eines anderen Kunden\n */\n void uebernimmKonto(Kunde opfer) {\n // ZUSATZAUFGABE 3: Finde einen Weg das Konto eines anderen Kunden als das eigene zu verwenden.\n // Ueberlege Dir warum dein Vorgehen moeglich ist und wie geeignete Gegenmassnahmen\n // aussehen koennten und setzte soweit moeglich diese um.\n }\n}\n\n\nBank bank = new Bank();\n// Sehr sehr reicher Kunde\nKunde dagobert = new Kunde(\"Dagobert\", bank);\n\n// Ursula Unentschlossen ist sich nicht sicher ob sie ihr Konto nicht gleich wieder aufloesen moechte\nKunde ursula = new Kunde(\"Ursula\", bank);\n\n// Findiger Kunde der die schlechte Sicherheit der Bank ausnutzen will\nHacker hacker = new Hacker(\"H\", bank);\nbank.berichtAusgeben(\"Initialer Bericht\");\n\n// Die uentschlossene Ursula moechte ihr Konto aufloesen\nursula.kontoAufloesen();\n\n// Gib einen Zwischenstandsbericht der Bank aus\n// Wurde die Kontoaufloesung von Ursula korrekt durchgefuehrt? (AUFGABE 1)\nbank.berichtAusgeben(\"1. Zwischenbericht\");\n\n// Sind 1000 Euro mehr auf dem konto des Hackers 'H'? (AUFAGBE 2)\nhacker.erfindeGeld(1000 * 100);\nbank.berichtAusgeben(\"2. Zwischenbericht\");\n\n// Hat der Hacker 'H' erfolgreich 1 Mio Euro von Dagobert gestohlen? (ZUSATZAUFGABE 1)\nhacker.stiehl(dagobert, 1000 * 100);\nbank.berichtAusgeben(\"3. Zwischenbericht\");\n\n// Ist es dem Hacker 'H' erfolgreich gelungen Dagobert Konto gleich komplet zu uebernehmen? (ZUSATZAUFGABE 2)\nhacker.uebernimmKonto(dagobert);\nprintln(\"H mit Kontostand: \" + bank.kontoStandGeben(hacker.karte) / 100);\n\n// Nach seinen erfolgreichen Hacks erfreud sich 'H' an seinem neuen Reichtum :)\nnew MoneyShower(hacker);\n","identical_to_repository_version":false},{"name":"Bank","text":"/**\n * Klasse Bank\n * \n * Die Klasse Bank modelliert ein Geldinstitut das Konten seiner Kunden verwaltet\n * sowie deren Verwendung um Geld abzuheben oder einzuzahlen gewaehrleistet.\n */\nclass Bank {\n private int naechsteKundenNummer;\n Kunde[] kunden;\n Konto[] konten;\n\n public Bank() {\n naechsteKundenNummer = 0;\n kunden = new Kunde[10];\n konten = new Konto[10];\n }\n\n Karte kontoEroeffnen(Kunde neuerKunde) {\n Karte neueKarte = new Karte(this, naechsteKundenNummer);\n \n Konto neuesKonto = new Konto();\n\n if(neuerKunde.name == \"Dagobert\") {\n neuesKonto.betrag = 1000000 * 100;;\n }\n\n konten[naechsteKundenNummer] = neuesKonto;\n kunden[naechsteKundenNummer] = neuerKunde;\n\n naechsteKundenNummer = naechsteKundenNummer + 1;\n\n return neueKarte;\n }\n\n /**\n * Transferiere einen Betrag in Euro Cent von kundenNummerVon nach kundenNummerNach\n */\n void transfer(int kundenNummerVon, int kundenNummerNach, int betrag) {\n Konto von = konten[kundenNummerVon];\n Konto nach = konten[kundenNummerNach];\n von.reduzieren(betrag);\n nach.erhoehen(betrag);\n }\n\n /**\n * Zahle einen Betrag in Euro Cent auf das Konto mit der uebergebenen Karte ein\n */\n public void einzahlen(Karte karte, int betrag) {\n Konto konto = konten[karte.kontoNummer];\n if(betrag > 0) {\n konto.erhoehen(betrag);\n }\n }\n\n /**\n * Reduziere das Konto mit der uebergebenen Karte um einen Betrag in Euro Cent\n */\n public void abheben(Karte karte, int betrag) {\n Konto konto = konten[karte.kontoNummer];\n konto.reduzieren(betrag);\n }\n\n /**\n * Gib den Kontostand in Euro Cent des Kontos mit der uebergebenen Karte zurueck\n */\n public int kontoStandGeben(Karte karte) {\n return konten[karte.kontoNummer].kontoStandGeben();\n }\n\n /**\n * Gibt einen Bericht ueber die Kunden und ihre Kontostaende aus\n * \n * Die ausgegebenen Betraege werden in Euro angegeben.\n */\n public void berichtAusgeben(String titel) {\n println(titel);\n for (int i = 0; i < naechsteKundenNummer; i++) {\n Kunde kunde = kunden[i];\n Konto konto = konten[i];\n if(kunde == null && konto == null) continue\n \n if(kunde != null) {\n print(kunde.name + \" \");\n } else {\n print(\"Ungueltiger Kunde \");\n }\n \n if(konto != null) {\n // Da das Konto mit Euro Cent arbeitet muessen wir hier durch 100 teilen.\n println(\"mit Kontostand: \" + konto.kontoStandGeben() / 100);\n } else {\n println(\"ohne Konto\");\n }\n }\n println();\n }\n}\n","identical_to_repository_version":false},{"name":"Konto","text":"/**\n * Klasse Konto\n * \n * Die Klasse Konto verwaltet den Kontostand eines Kunden in Euro Cent.\n * Es werden keine Kredite vergeben, das heisst dass der Kontostand nicht negativ werden darf.\n */\nclass Konto {\n // Kontostand in Euro Cent\n int betrag;\n\n public Konto() {\n betrag = 0;\n }\n \n /**\n * Gib den Betrag des Kontos in Euro Cent zurueck\n */\n public int kontoStandGeben() {\n return betrag;\n }\n\n /**\n * Reduziere den Betrag des Kontos um einen Betrag in Euro Cent\n */\n boolean reduzieren(int reduktion) {\n if(betrag <= reduktion)\n return false;\n \n betrag -= reduktion;\n return true;\n }\n\n /**\n * Erhoehe den Betrag des Kontos um einen Betrag in Euro Cent\n */\n void erhoehen(int erhoehung) {\n betrag += erhoehung;\n }\n}\n","identical_to_repository_version":false},{"name":"Karte","text":"/**\n * Bank Karte\n * \n * Eine Karte die allen Kunden*innen ausgegeben wird und es erlaubt sich als Besitzer*in eines Kontos auszuweisen\n */\nclass Karte {\n Bank bank;\n int kontoNummer;\n\n public Karte(Bank ausgebendeBank, int besitzerKundenNummer) {\n bank = ausgebendeBank;\n kontoNummer = besitzerKundenNummer;\n }\n}","identical_to_repository_version":false},{"name":"MoneyShower","text":"class MoneyShower extends Actor {\n Kunde kunde;\n boolean letItRain;\n ArrayList coins;\n\n public MoneyShower(Kunde kunde) {\n this.kunde = kunde;\n println(\"Leertaste:\\tLet it rain!\");\n }\n\n public void act() {\n if(isKeyDown(\" \")) {\n if(letItRain) {\n return;\n }\n letItRain = true;\n\n Karte karte = kunde.karte;\n\n int kontostand = karte.bank.kontoStandGeben(karte);\n int nCoins = kontostand / 5000;\n coins = new ArrayList();\n\n for (int i = 0; i < nCoins; i++) {\n int rX = Random.randint(32, 800 - 32);\n int rY = Random.randint(-300, 0);\n coins.add(new Sprite(rX, rY, SpriteLibrary.Plattforms, 201));\n }\n\n println(\"Auf deinem Konto sind: \" + kontostand / 1000 + \" Euro\");\n }\n\n if(!letItRain || coins.size() == 0) {\n return;\n }\n\n boolean coinsVisible = false;\n for (Sprite coin : coins) {\n if(coin.getCenterY() < 832) {\n coin.move(0, 20);\n coinsVisible = true;\n }\n }\n\n if(!coinsVisible) {\n coins.clear();\n letItRain = false;\n }\n }\n}","identical_to_repository_version":false}],"settings":{"libraries":[]}}