• Keine Ergebnisse gefunden

Wiederholungsklausur: Einführung in die objektorientierte Programmierung mit Java 15WS

N/A
N/A
Protected

Academic year: 2021

Aktie "Wiederholungsklausur: Einführung in die objektorientierte Programmierung mit Java 15WS"

Copied!
13
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Allgemeine Hinweise

1. Die Bearbeitungszeit beträgt 60 Minuten. Sie können 50 Punkte erreichen.

2. Verwenden Sie für das Lösen der Aufgaben die Programmiersprache Java. Alle gegebenen Code-Fragmente sind ebenfalls in Java verfasst. Halten Sie sich an die bekannten Regeln zur Codequalität.

3. Schreiben Sie Ihren Namen, Vornamen, Studiengang und Ihre Matrikelnum- mer leserlich unten auf jedes Angabenblatt bevor Sie mit der Bearbeitung beginnen! Blätter ohne diese Angaben werden nicht gewertet. Wenn Sie die Rückseite eines Blattes verwenden, notieren Sie dies bitte auf der Vorderseite.

Kennzeichnen Sie eindeutig, zu welcher Aufgabe eine Lösung gehört.

4. Benutzen Sie keine Bleistifte, keine rotschreibenden Stifte und kein TippEx (oder ähnliche Produkte).

5. Die Klausur ist als Closed Book-Klausur angelegt. Sie dürfen keine mitgebrach- ten Quellen oder Notizen zur Bearbeitung der Aufgaben verwenden. Techni- sche Hilfsmittel sind ebenfalls nicht erlaubt.

6. Wenden Sie sich bei Unklarheiten in den Aufgabenstellungen immer an die Klausuraufsicht (Hand heben). Hinweise und Hilfestellungen werden dann, falls erforderlich, offiziell für den gesamten Hörsaal durchgegeben. Aussagen unter vier Augen sind ohne Gewähr.

7. Geben Sie keine mehrdeutigen (oder mehrere) Lösungen an. In solchen Fällen wird stets die Lösung mit der geringeren Punktzahl gewertet. Eine richtige und eine falsche Lösung zu einer Aufgabe ergeben also null Punkte. Das gilt auch für die Multiple Choice-Fragen. Kreuzen Sie bei einer Frage zwei richtige und zwei falschen Möglichkeiten an, ergibt das in der Summe null Punkte.

(2)

Teil 1: Theorie

1) Konstruktoren (2 Punkte)

Kreuzen Sie alle korrekten Aussagen an, die für Konstruktoren in Java gelten.

2 Konstruktoren können über das Schlüsselwortnewaufgerufen werden.

2 In einer Klasse können mehrere Konstruktoren definiert werden.

2 In Konstruktoren einer Unterklasse kann der geerbte Konstruktor der Ober- klasse immer nur als letzter Befehl aufgerufen werden.

2 Beim Deklarieren eines Konstruktors kann ein beliebiger Name verwendet wer- den.

2) Funktionen und Methoden (2 Punkte)

Kreuzen Sie alle korrekten Aussagen an, die für Funktionen und Methoden in Java gelten.

2 Bei jeder Deklaration einer Methode muss zwingend ein Zugriffsmodifikator angegeben werden.

2 Im Rumpf einer Methode muss zwingend das Schlüsselwort return auftau- chen.

2 Nicht-statische Methoden werden immer im Kontext der Klassen-Instanz aus- geführt, zu der sie gehören.

2 In einer Klasse können Methoden gleichen Namens durch unterschiedliche Parameter überladen werden.

3) Zugriffsmodifikatoren (2 Punkte)

Welchen Zugriffsmodifikator darf eine Instanzvariable in einer Superklasse haben, damit mögliche Subklassen direkt auf diese geerbte Eigenschaft zugreifen könne?

2 public 2 private 2 protected 2 hidden

(3)

4) Datenstrukturen (4 Punkte)

Sie schreiben ein Java-Programm, dass die Adressdaten mehrerer Personen spei- chert. Die Adressliste soll durchsuchbar sein. Zur Laufzeit werden neue Adressen bzw. Personen ergänzt. Jede Adresse besteht aus einem Namen, einer Straße, einer Hausnummer, einer Postleitzahl und einer Stadt. Beschreiben und begründen Sie kurz, wie Sie die einzelnen Adressen und wie Sie die gesamte Liste der Adressen sinnvoll in Ihrem Programm abbilden können. Sie müssen hier keinen eigenen Code schreiben.

(4)

Teil 2: Codeverständnis

Hinweise: Mit der Methode indexOf(char c) der String-Klasse lässt sich überprüfen, ob ein Zeichenc in einem String vorkommt oder nicht. Die Methoden wird auf der jeweiligen String-Instanz aufgerufen. Kommt das Zeichen im String vor, gibt die Methode die erste entsprechende Stelle im String alsint-Wert zurück. Kommt das Zeichen nicht vor, wird-1 zurückgegeben.

5) Codeanalyse (5 Punkte)

Gegeben ist die Methode doStuff(String s1, String s2). Beschreiben Sie kurz den Aufbau der Methode und nennen Sie anschließend den wahrscheinlichen Ein- satzzweck. Gehen Sie davon aus, dass der gegebene Code korrekt ist.

1 p u b l i c S t r i n g d o S t u f f (S t r i n g s1 , S t r i n g s2 ) {

2 S t r i n g r e s u l t = " ";

3 for(int i = 0; i < s1 . l e n g t h () ; i ++) {

4 char c = s1 . c h a r A t ( i ) ;

5 if( s2 . i n d e x O f ( c ) != -1 && r e s u l t . i n d e x O f ( c ) == -1) {

6 r e s u l t += c ;

7 }

8 }

9 r e t u r n r e s u l t ;

10 }

(5)

6) Fehler finden (5 Punkte)

Finden Sie die Konventionsverstöße, Syntaxfehler und Bugs in der folgenden Klasse.

Markieren Sie die fehlerhaften Stellen im Code und beschreiben Sie den jeweiligen Fehler kurz unter Angabe der Zeilennummer. Schlecht gewählte Bezeichner für Me- thoden und Variablen sowie fehlerhafte Einrückungen zählen nicht als Fehler. Im Code sind fünf Fehler zu finden.

1 p u b l i c c l a s s N u m b e r F o r m a t t e r {

2

3 p u b l i c s t a t i c f i n a l S t r i n g d e f a u l t D e l i m i t e r = " , ";

4 p r i v a t e S t r i n g d e l i m i t e r ;

5

6 p u b l i c N u m b e r F o r m a t t e r () {

7 this. d e l i m i t e r = d e f a u l t D e l i m i t e r ;

8 }

9

10 p u b l i c N u m b e r F o r m a t t e r (S t r i n g d e l i m i t e r ) {

11 d e l i m i t e r = d e l i m i t e r ;

12 }

13

14 p u b l i c int g e t F o r m a t t e d N u m b e r (int n ) {

15 S t r i n g tmp = S t r i n g. v a l u e O f ( n ) ;

16 S t r i n g r e s u l t = " ";

17 for(int i = tmp . l e n g t h () , j = 1; i >= 0; i - - , j ++) {

18 r e s u l t = tmp . c h a r A t ( i ) + r e s u l t ;

19 if( j %3 == 0 && i > 0) {

20 r e s u l t == this. d e l i m i t e r + r e s u l t ;

21 }

22 }

23 r e t u r n r e s u l t ;

24 }

25 }

(6)

Teil 3: Code implementieren

7) Suche im Bibliothekskatalog (15 Punkte)

Gegeben ist die KlassenLibraryApp, das Interface Searchable und das EnumType. LibraryApp beschreibt eine rudimentäre Anwendung zur Verwaltung eines Biblio- thekskatalogs. In der ArrayListwerden die verschiedenen Einträge gespeichert. Die Methode add fügt einen neuen Eintrag zum Katalog hinzu. Die Methode search gibt eineArrayList mit allen Einträgen zurück, die mit der übergebene Suchanfra- ge übereinstimmen. Gültige Einträge sind Instanzen aller Klassen, die das Interface Searchableimplementieren. Dieses gibt zwei Methoden vor, um ein Objekt hinsicht- lich einer Suchanfrage abzugleichen sowie um den Medientypen des gespeicherten Objekts abzufragen. Die Auswahl der möglichen Medientypen wird über dasEnum Typevorgegeben.

1 p u b l i c c l a s s L i b r a r y A p p {

2 p r i v a t e A r r a y L i s t< S e a r c h a b l e > l i b r a y ;

3

4 p u b l i c L i b r a r y A p p () {

5 l i b r a y = new A r r a y L i s t< S e a r c h a b l e >() ;

6 }

7

8 p u b l i c void add ( S e a r c h a b l e item ) {

9 l i b r a y . add ( item ) ;

10 }

11

12 p u b l i c A r r a y L i s t< S e a r c h a b l e > s e a r c h (S t r i n g q u e r y ) {

13 A r r a y L i s t< S e a r c h a b l e > r e s u l t = new A r r a y L i s t< S e a r c h a b l e

>() ;

14 for( S e a r c h a b l e item : l i b r a y ) {

15 if( item .m a t c h( q u e r y ) ) {

16 r e s u l t . add ( item ) ;

17 }

18 }

19 r e t u r n r e s u l t ;

20 }

21 }

1 p u b l i c i n t e r f a c e S e a r c h a b l e {

2 p u b l i c b o o l e a n m a t c h(S t r i n g q u e r y ) ;

3 p u b l i c Type g e t T y p e () ;

4 }

1 p u b l i c enum Type {

2 BOOK

3 }

(7)

Aufgabe:Implementieren Sie eine zusätzliche KlasseBook. Diese implementiert das InterfaceSearchable. Die Klasse verfügt über zwei Instanzvariablen zum Speichern des Autoren und des Buchtitel. In einer weiteren Instanzvariable wird die Seitenzahl gespeichert. Alle drei Werte sollen im Konstruktor mit Hilfe von entsprechenden Parameter gesetzt werden. Verwenden Sie sinnvolle Bezeichner und Datentypen.

Implementieren Sie anschließen die beiden Interface-Methoden. Die MethodegetType soll den WertBookaus dem Enum Typezurückgeben. Die Methode matchgibttrue zurück, wenn der als Parameter übergeben String query im Buchtitel und/oder im Autorennamen enthalten ist. Andernfalls wirdfalsezurückgegeben.

Strings in Java:Mit Hilfe der Instanz-Methodecontains(CharSequence s)der String-Klasse können Sie überprüfen, ob ein String die übergebene Zeichenkette enthält (Rückgabe:true) oder nicht (Rückgabe false). Als Parameter können Sie z.B. einen anderen String überge- ben.

(8)
(9)

8) Pokemon Go (15 Punkte)

In dieser Aufgabe implementieren Sie eine Komponente für das Spiel Pokemon Go.

In diesem Spiel bewegt sich der Spieler über eine virtuelle Karte und kann Pokemon fangen, die sich in einem bestimmten Radius um ihn herum aufhalten. Für diese vereinfachte Variante des Spiels wird eine zwei-dimensionale Karten angenommen.

Sowohl die Position des Spielers als auch die der Pokemon werden als Koordinaten- paare auf dieser Karte abgebildet. Befindet sich der Spieler etwa am unteren, linken Rand der Karte, ist seine Position (x=0, y=0). Die nachstehende Grafik bildet die beschrieben Karte ab:

Für die Implementierung der Aufgabenstellung sind bereits einige Klassen vorgege- ben. Betrachten Sie die dort gegebenen Funktionen als vollständig und funktionie- rend. Sie müssen keine Änderungen oder Ergänzungen an den vorgegeben Klassen durchführen. Für die genaue Verwendung der vorgegebene Methoden, können Sie sich auf die Kommentare im Code beziehen.

PokemonHelper: Diese Klasse dient Ihnen als Schnittstelle zu den Spieldaten. Sie kön- nen sich über die Methode getCurrentPokemonOnMap eine Liste aller Pokemon auf der Karte ausgeben lassen. Mit Hilfe der MethodecheckIfPokemonIsInCatchDistance können Sie überprüfen, ob ein beliebiges Pokemon sich innerhalb einer bestimmten Distanz zum Spieler aufhält. Die MethodehasNewPosition gibt true zurück, wenn eine neue Spielerposition vorhanden ist. Ist dies der Fall, kann diese Position über die MethodegetNewPosition ausgelesen werden. Ob anschließend eine weitere Po- sition vorhanden ist, kann durch erneutes Abfragen (hasNewPosition) festgestellt werden.

Pokemon: Diese Klasse bildet ein Pokemon ab. Jedes Pokemon hat eine aktuelle Positi- on und einen Namen. Beide Werte können perGetter-Methoden ausgelesen werden.

Position: Diese Klasse bildet eine Position auf der Karte ab. Jede Position besteht aus einemx- und einem y-Wert. Beide Werte lassen sich per Getter-Methoden ausle-

(10)

sen. Instanzen dieser Klasse werden zur Speicherung der Position von Spieler und Pokemon verwendet.

Erweitern Sie den vorgegebenen Code der KlassePokemonApp, um die folgende Auf- gabenstellung zu implementieren. Sie müssen nur die beschriebenen Probleme lö- sen. Sie können bei der Bearbeitung zusätzliche Methoden anlegen, um Teilbereiche Ihrer Lösung auszulagern.

Aufgabe: Erweitern Sie die Methode walk der Klasse PokemonApp. Verwende Sie die PokemonHelper-Instanz um solange neue Spieler-Positionen abzufragen, bis die entsprechende Methodenullzurückliefert.

Für jede Spieler-Position soll Ihr Programm folgen Aufgaben erledigen.

• Prüfen Sie, ob sich Pokemon in der Nähe befinden, die gefangen werden kön- nen. Die maximale Distanz zum Fangen eines Pokemon wird in der Konstanten MAX_CATCH_DISTANCEangegeben.

• Befinde sich ein Pokemon in der Nähe, dass noch nicht gefangen wurde, soll es in die ArrayList myPokemon aufgenommen werden. Zusätzlich wird in diesem Fall der TextEin wildes POKEMON taucht auf. Du hast es gefangen.ausgegeben.

Dabei wirdPOKEMONmit dem Namen des jeweiligen Pokemon ersetzt.

• Befinde sich ein Pokemon in der Nähe, das bereits gefangen wurde, wird der TextEin wildes POKEMON taucht auf. Diese Art hast du schon gefangen.ausgege- ben. Dabei wirdPOKEMONmit dem Namen des jeweiligen Pokemon ersetzt.

1 p u b l i c c l a s s P o k e m o n A p p {

2 p r i v a t e s t a t i c f i n a l int M A X _ C A T C H _ D I S T A N C E = 3;

3 p r i v a t e A r r a y L i s t< Pokemon > m y P o k e m o n ;

4 p r i v a t e P o k e m o n H e l p e r h e l p e r ;

5

6 p u b l i c void walk () {

7 m y P o k e m o n = new A r r a y L i s t< Pokemon >() ;

8 h e l p e r = new P o k e m o n H e l p e r () ;

9

10 // F u e g e n Sie hier I h r e n e i g e n e n Code ein . Sie k o e n n e n auch w e i t e r e M e t h o d e e r g a e n z e n .

11

12 }

13

14 }

Textausgabe in Java:Mit der MethodeSystem.out.println(String s)können Sie Text aus-

(11)

1 p u b l i c c l a s s P o k e m o n {

2 // ...

3 p u b l i c S t r i n g g e t N a m e () {

4 r e t u r n name ;

5 }

6 p u b l i c P o s i t i o n g e t C u r r e n t P o s i t i o n () {

7 r e t u r n c u r r e n t P o s i t i o n ;

8 }

9 }

1 p u b l i c c l a s s P o s i t i o n {

2 // ...

3 p u b l i c int getX () {

4 r e t u r n x ;

5 }

6 p u b l i c int getY () {

7 r e t u r n y ;

8 }

9 }

1 p u b l i c c l a s s P o k e m o n H e l p e r {

2 /* Gibt true zurueck , wenn eine neue S p i e l e r p o s i t i o n v e r f u e g b a r ist .

3 * A n d e r n f a l l s wird f a l s e z u r u e c k g e g e b e n . */

4 p u b l i c b o o l e a n h a s N e w P o s i t i o n () {/* ... */}

5

6 /* Gibt die neue S p i e l e r p o s i t i o n z u r u e c k .

7 * Wenn k e i n e neue P o s i t i o n v e r f u e g b a r ist , wird null z u r u e c k g e g e b e n . */

8 p u b l i c P o s i t i o n g e t N e w P o s i t i o n () {/* ... */}

9

10 /* Gibt eine A r r a y L i s t mit a l l e n P o k e m o n zurueck , die a k t u e l l auf der K a r t e zu f i n d e n sind . */

11 p u b l i c A r r a y L i s t< Pokemon > g e t C u r r e n t P o k e m o n O n M a p () {/* ...

*/}

12

13 /* Gibt true zurueck , wenn die E n t f e r n u n g z w i s c h e n dem u e b e r g e b e n e n P o k e m o n p o k e m o n und der u e b e r g e b e n e n

14 * P o s i t i o n p o s i t i o n n i c h t g r o e s s e r als der Wert von m a x C a t c h D i s t a n c e ist . */

15 p u b l i c b o o l e a n c h e c k I f P o k e m o n I s I n C a t c h D i s t a n c e ( P o s i t i o n position , P o k e m o n pokemon , int m a x C a t c h D i s t a n c e ) {/* ...

*/}

16 }

(12)
(13)

Referenzen

ÄHNLICHE DOKUMENTE

Die Methode move soll f¨ ur eine geometrische Figur die Position der Figur ver¨ andern, wenn durch einen ¨ außeren Tick das Objekt aufgefordert wird, sich zu bewegen. Sehen sie

• Da die Zugriffs-Operatoren für Iteratoren für alle Container einheitlich sind, ist es diesem Template egal, ob es sich um eine list , eine deque , einen string oder was auch

• Zu beachten ist hier, dass eine Deklaration eines Objekts des Typs struct Node ∗ auch dann zulässig ist, wenn struct Node noch nicht bekannt ist, da der benötigte Speicherplatz

Ziel: Entwicklung eines Tests für die Methode add() unter Verwendung von JUnit .... Automatische Tests mit JUnit Ein erstes

Gegeben ist die Klasse WayPoint. Diese Klasse beschreibt einen Punkt auf einer zwei- dimensionalen Karte anhand einer x- und y-Koordinate. Die Methode bekommt einen Parameter vom

Geben sind die abstrakte Basisklasse Item sowie das Enum Type. Entwerfen Sie mit diesen Vorgaben weitere Klassen um ein Programm zur Verwaltung von Filmen zu entwerfen. Item stellt

Innerhalb des Spiels wird das Gitter durch ein mehrdimensionales int-Array abge- bildet. Jede Zeile ist durch ein separates Array abgebildet, in dem jedes Element für eine

Für die Suche im Bestand können alle Medien mit einer beliebigen Anzahl an Schlagwörtern (Tags) ausge- zeichnet werden. Lagern Sie Ihren Code wenn nötig in weitere Methoden