\documentclass{bschlangaul-aufgabe} \bLadePakete{java,uml} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 1}, Thematik = {Banksystem}, Referenz = 66112-2002-H.T1-A4, RelativerPfad = Examen/66112/2002/09/Thema-1/Aufgabe-4.tex, ZitatSchluessel = aud:pu:7, ZitatBeschreibung = {(entnommen aus Algorithmen und Datenstrukturen, 3. \& 4. Übungsblatt, Universität Bayreuth), Aufgabe 1}, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Vererbung, Abstrakte Klasse, Implementierung in Java, Klassendiagramm}, EinzelpruefungsNr = 66112, Jahr = 2002, Monat = 09, ThemaNr = 1, AufgabeNr = 4, } \def\TmpHinweis#1{{\footnotesize[#1]}} In\index{Vererbung} einer Anforderungsanalyse\index{Abstrakte Klasse} für ein Banksystem wird der folgende Sachverhalt beschrieben: \footcite[(entnommen aus Algorithmen und Datenstrukturen, 3. \& 4. Übungsblatt, Universität Bayreuth), Aufgabe 1]{aud:pu:7} Eine Bank hat einen Namen und sie führt Konten. Jedes Konto hat eine Kontonummer, einen Kontostand und einen Besitzer. Der Besitzer hat einen Namen und eine Kundennummer. Ein Konto ist entweder ein Sparkonto oder ein Girokonto. Ein Sparkonto hat einen Zinssatz, ein Girokonto hat einen Kreditrahmen und eine Jahresgebühr.\footcite[Thema 1 Aufgabe 4)]{examen:66112:2002:09} \begin{enumerate} %% % (a) %% \item Deklarieren Sie geeignete Klassen in Java\index{Implementierung in Java} [oder in C++], die die oben beschriebenen Anforderungen widerspiegeln! Nutzen Sie dabei das Vererbungskonzept aus, wo es sinnvoll ist! Gibt es Klassen, die als abstrakt zu verstehen sind? \TmpHinweis{Hinweis: Geben Sie sowohl ein Klassendiagramm\index{Klassendiagramm} als auch den Quellcode für die beteiligten Klassen inkl. Attributen, ohne Methoden an! Achtung: in Teilaufgabe b) werden anschließend die benötigten Konstruktoren verlangt; Um die verschiedenen Konten in einer Bank zu verwalten, eignet sich das Array NICHT als Datenstruktur. Informieren Sie sich über die Datenstruktur „ArrayList“ und verwenden Sie diese.} \begin{bAntwort} Die Klasse Konto ist abstrakt, da ein Konto immer entweder ein Spar- \emph{oder} ein Girokonto ist. Ein Objekt der Klasse Konto ist deshalb nicht sinnvoll. \begin{tikzpicture} \umlclass{Bank}{- name}{} \umlclass[below right=1cm of Bank]{Konto}{ \# kontonummer\\ \# kontostand}{} \umlclass[below left=1cm of Konto]{Girokonto}{ - kreditrahmen\\ - jahresgebühr}{} \umlclass[below right=1cm of Konto]{Sparkonto}{ - zinssatz\\}{} \umlassoc[arg=führt,pos=0.6]{Bank}{Konto} \umlinherit{Girokonto}{Konto} \umlinherit{Sparkonto}{Konto} \umlclass[right=2cm of Konto]{Besitzer}{ - name\\ - kundennumer}{} \umlassoc[arg=besitzer,pos=0.6]{Besitzer}{Konto} \end{tikzpicture} \end{bAntwort} %% % (b) %% \item Geben Sie für alle nicht abstrakten Klassen benutzerdefinierte Konstruktoren an mit Parametern zur Initialisierung der folgenden Werte: der Name einer Bank, die Kontonummer, der Kontostand, der Besitzer und der Zinssatz (bzw. Kreditrahmen und Jahresgebühr) eines Sparkontos (bzw. Girokontos), der Name und die Kundennummer eines Kontobesitzers. Ergänzen Sie die Klassen um Methoden für die folgenden Aufgaben! Nutzen Sie wann immer möglich das Vererbungskonzept aus und verwenden Sie ggf. abstrakte (bzw. virtuelle) Methoden! \TmpHinweis{Achtung: Ergänzen Sie ggf. alle benötigten Getter und Setter in den beteiligten Klassen!} \begin{bAntwort} Konstruktoren ergänzen: Bemerkung: Auch eine abstrakte Klasse kann einen Konstruktor besitzen, dieser kann nur nicht ausgeführt werden. In den abgeleiteten Klassen kann dieser Super-Konstruktor aber verwendet werden. \end{bAntwort} %% % (c) %% \item Auf ein Konto soll ein Betrag eingezahlt und ein Betrag abgehoben werden können. Soll von einem Sparkonto ein Betrag abgehoben werden, dann darf der Kontostand nicht negativ werden. Bei einer Abhebung von einem Girokonto darf der Kreditrahmen nicht überzogen werden. \begin{bAntwort} Bemerkung: Die Methode \bJavaCode{einzahlen} ist in der Klasse \bJavaCode{Konto} implementiert, da sie sich für Spar- und Girokonten nicht unterscheidet im Gegensatz zur Methode \bJavaCode{abheben}, die in beiden Klassen unterschiedlich implementiert ist. \TmpHinweis{Sie wird als abstrakte Methode in der Klasse Konto angegeben, um ihre Implementierung (Überschreiben) zu gewährleisten.} Kreditrahmen wird als negativer Wert gespeichert. Die Methoden zum Abheben liefern zusätzlich zur Änderung des Kontostandes eine Rückmeldung bezüglich Erfolg oder Misserfolg der Abbuchung. \end{bAntwort} %% % (d) %% \item Ein Konto kann eine Jahresabrechnung durchführen. Bei der Jahresabrechnung eines Sparkontos wird der Zinsertrag gutgeschrieben, bei der Jahresabrechnung eines Girokontos wird die Jahresgebühr abgezogen (auch wenn dadurch der Kreditrahmen überzogen wird). \begin{bAntwort} Anmerkung: Im Folgenden nur noch Angabe der gesuchten Methoden, alle vorherigen Implementierungen (Attribute, Konstruktoren, Methoden, s. o.) wurden nicht nochmals aufgeführt. \end{bAntwort} %% % (e) %% \item Eine Bank kann einen Jahresabschluss durchführen. Dieser bewirkt, dass für jedes Konto der Bank eine Jahresabrechnung durchgeführt wird. %% % (f) %% \item Eine Bank kann ein Sparkonto eröffnen. Die Methode soll die folgenden fünf Parameter haben: den Namen und die Kundennummer des Kontobesitzers, die Kontonummer, den (anfänglichen) Kontostand und den Zinssatz des Sparkontos. Alle Parameter sind als String-Objekte oder als Werte eines Grunddatentyps zu übergeben! Das Sparkonto muss nach seiner Eröffnung in den Kontenbestand der Bank aufgenommen sein. \TmpHinweis{Hinweis: Falls der Kunde schon mit einem Konto in der Bank geführt ist, können die Werte für das \bJavaCode{Besitzer}-Objekt übernommen werden. Schreiben Sie daher eine Hilfsmethode \bJavaCode{Besitzer schonVorhanden(String name, int kunr)}, die prüft, ob der Kunde mit \bJavaCode{name} und \bJavaCode{kunr} schon in der Liste vorhanden ist und diesen bzw. andernfalls einen neu erzeugten Besitzer zurückgibt.} \TmpHinweis{Sinnvolle/notwendige Methoden der Klasse ArrayList für diese Aufgabe: \\ \bJavaCode{public int size()}: Returns the number of elements in this list. \\ \bJavaCode{public boolean isEmpty()}: Returns true if this list contains no elements. \\ \bJavaCode{public E get(int index)}: Returns the element at the specified position in this list. \\ \bJavaCode{public boolean add(E e)}: Appends the specified element to the end of this list. \\ (siehe auch Java-Api: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)} \begin{bAntwort} \bJavaExamen{66112}{2002}{09}{Bank} \bJavaExamen{66112}{2002}{09}{Konto} \bJavaExamen{66112}{2002}{09}{Sparkonto} \bJavaExamen{66112}{2002}{09}{Girokonto} \bJavaExamen{66112}{2002}{09}{Besitzer} \end{bAntwort} \end{enumerate} \end{document}