aboutsummaryrefslogtreecommitdiff
path: root/Info/10/2/Bank/Bank.json
blob: 97006ab51951e66a85c6957f020954eaaf855bda (plain)
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 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":[]}}