aboutsummaryrefslogtreecommitdiff
path: root/Info
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-04-12 11:52:28 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2023-04-12 11:52:28 +0200
commit17e7828027ae3e2ef6dac2e801f5099cb7b2af8d (patch)
treea42fe1a47bc0a6ea0914ecdf079e8efbe83beb42 /Info
parentdc90d1d0659c7569e4c5e1d2d2e721b6fde96ab9 (diff)
downloadunterricht-17e7828027ae3e2ef6dac2e801f5099cb7b2af8d.tar.gz
unterricht-17e7828027ae3e2ef6dac2e801f5099cb7b2af8d.zip
update Bank projekt
* Add more comments * Better align the handout and the solution
Diffstat (limited to 'Info')
-rw-r--r--Info/10/2/Bank/Bank Lsg.json2
-rw-r--r--Info/10/2/Bank/Bank.json2
2 files changed, 2 insertions, 2 deletions
diff --git a/Info/10/2/Bank/Bank Lsg.json b/Info/10/2/Bank/Bank Lsg.json
index 0c3ffa0c..d4185437 100644
--- a/Info/10/2/Bank/Bank Lsg.json
+++ b/Info/10/2/Bank/Bank Lsg.json
@@ -1 +1 @@
-{"name":"Bank Lsg","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 // int kontoNummer = karte.kontoNummer;\n // karte.bank.konten[kontoNummer] = null;\n\n // AUFGABE 4: Ueberlege welche Effekte 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 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 // Konto konto = karte.bank.konten[karte.kontoNummer];\n // konto.betrag += betrag;\n\n // AUFGABE 3: Verhindere den Zugriff den du in AUFGABE 2 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 karte.bank.abheben(karte, -betrag);\n }\n\n /**\n * Stiehl einen beliegigen Betrag 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 karte.bank.transfer(opfer.karte.kontoNummer, karte.kontoNummer, betrag);\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 karte = opfer.karte;\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 komplett zu uebernehmen? (ZUSATZAUFGABE 2)\nhacker.uebernimmKonto(dagobert);\nprintln(hacker.name + \" mit Kontostand \" + bank.kontoStandGeben(hacker.karte));\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 Geldautomaten bereitstellt um Geld abzuheben oder einzuzahlen.\n */\nclass Bank {\n private int naechsteKundenNummer;\n private Kunde[] kunden;\n private 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 public void kontoAufloesen(Karte karte) {\n int kundenNummer = karte.kontoNummer;\n konten[kundenNummer] = null;\n kunden[kundenNummer] = null;\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 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 public void abheben(Karte karte, int betrag) {\n Konto konto = konten[karte.kontoNummer];\n konto.reduzieren(betrag);\n }\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 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 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 public int kontoStandGeben() {\n return betrag;\n }\n\n boolean reduzieren(int reduktion) {\n if(betrag <= reduktion)\n return false;\n \n betrag -= reduktion;\n return true;\n }\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<Sprite> 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<Sprite>();\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":[]}} \ No newline at end of file
+{"name":"Bank Lsg","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 // Bank bank = karte.bank;\n // int kontoNummer = karte.kontoNummer;\n // bank.konten[kontoNummer] = null;\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 Bank bank = karte.bank;\n // Konto konto = bank.konten[karte.kontoNummer];\n // konto.betrag += betrag;\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 bank.abheben(karte, -betrag);\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 karte.bank.transfer(opfer.karte.kontoNummer, karte.kontoNummer, betrag);\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 karte = opfer.karte;\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 public void kontoAufloesen(Karte karte) {\n konten[karte.kontoNummer] = null;\n kunden[karte.kontoNummer] = null;\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<Sprite> 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<Sprite>();\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":[]}} \ No newline at end of file
diff --git a/Info/10/2/Bank/Bank.json b/Info/10/2/Bank/Bank.json
index 027ede5f..97006ab5 100644
--- a/Info/10/2/Bank/Bank.json
+++ b/Info/10/2/Bank/Bank.json
@@ -1 +1 @@
-{"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 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 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(100000);\nbank.berichtAusgeben(\"2. Zwischenbericht\");\n\n// Hat der Hacker 'H' erfolgreich 1 Mio Euro von Dagobert gestohlen? (ZUSATZAUFGABE 1)\nhacker.stiehl(dagobert, 100000000);\nbank.berichtAusgeben(\"3. Zwischenbericht\");\n\n// Ist es dem Hacker 'H' erfolgreich gelungen Dagobert Konto gleich komplet zu uebernehmen? (ZUSATZAUFGABE 2)\nhacker.uebernimmKonto(dagobert);\nbank.berichtAusgeben(\"4. Zwischenbericht\");\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 Geldautomaten bereitstellt um Geld abzuheben oder einzuzahlen.\n */\nclass Bank {\n 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 = 100000000000;\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 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 public void abheben(Karte karte, int betrag) {\n Konto konto = konten[karte.kontoNummer];\n konto.reduzieren(betrag);\n }\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 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 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 public int kontoStandGeben() {\n return betrag;\n }\n\n boolean reduzieren(int reduktion) {\n if(betrag <= reduktion)\n return false;\n \n betrag -= reduktion;\n return true;\n }\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<Sprite> 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<Sprite>();\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":[]}} \ No newline at end of file
+{"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<Sprite> 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<Sprite>();\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":[]}} \ No newline at end of file