• Keine Ergebnisse gefunden

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
12
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Allgemeine Hinweise

1. Die Bearbeitungszeit beträgt 60 Minuten. Sie könne 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 be- ginnen! Blätter ohne diese Angaben werden nicht gewertet. Wenn Sie die Rück- seite eines Blattes verwenden, notieren Sie dies bitte auf der Vorderseite. Kenn- zeichnen Sie eindeutig, zu welcher Aufgabe eine Lösung gehört. Verwenden Sie nur die ausgegebenen Angabenblätter für Ihre Lösung.

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.

(2)

Teil 1: Theorie

1) Variablen (2 Punkte)

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

2 Variablennamen müssen mit einem Buchstaben oder Unterstrich beginnen 2 Variablenname dürfen nur aus Buchstaben und Unterstrichen bestehen 2 Variablennamen müssen mindestens aus drei Zeichen bestehen

2 Variablennamen dürfen keine reservierten Wörter (z.b. public oder break) sein

2) Interfaces (2 Punkte)

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

2 Klassen können mehrere Interfaces implementieren

2 Interfaces können Methodensignaturen und Konstanten enthalten

2 Das Implementieren eines Interface wird durch das Schlüsselwortextendsein- geleitet

2 Als Programmierer können Sie selbst entscheiden, ob eine im Interface defi- nierte Methode in einer Klasse, die dieses Interface implementiert, angelegt wird oder nicht

3) Vererbung (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) Codequalität (4 Punkte)

Nennen und Beschreiben Sie kurz jeweils ein Beispiel für eine gute und eine schlech- te Benennung einerboolean-Variable, die angibt, ob sich eine Ellipse im sichtbaren Bereich der GraphicsApp-Anwendung befindet oder nicht.

(4)

Teil 2: Codeverständnis

Hinweise: Die Methode System.out.println(String s) gibt den String-Parameter s auf der Konsole aus. Ein Zeichen(char)an einer beliebigen Position einer String-Instanz kann über die Methode charAt(int index) der String-Klasse ausgelesen werden. Die Methode indexOf(char c) der String-Klasse gibt die (erste) Position des übergebenen Zeichens in der jeweiligen String-Instanz aus. Ist das Zeichen im String nicht vorhanden, wird -1 zu- rückgegeben.

5) Codeanalyse (5 Punkte)

Geben ist die Methode doStuff(String s1, String s2). Beschreiben Sie kurz den Aufbau der Methode und nennen Sie anschließend den wahrscheinlichen Einsatz- zweck. 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 Metho- de. Markieren Sie die fehlerhaften Stellen im Code und beschreiben Sie den jeweili- gen Fehler kurz unter Angabe der Zeilennummer. Schlecht gewählte Bezeichner für Methoden 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 C h a r C o u n t e r {

2 p r i v a t e S t r i n g i n p u t S t r i n g ;

3

4 p u b l i c C h a r C o u n t e r (S t r i n g i n p u t S t r i n g ) {

5 i n p u t S t r i n g = i n p u t S t r i n g ;

6 }

7

8 p u b l i c int c o u n t C h a r (char c ) {

9 int N U M B E R _ O F _ C H A R S = 0;

10 for(int i = 0; i <= i n p u t S t r i n g . l e n g t h () ; i ++) {

11 char c u r r e n t C h a r = i n p u t S t r i n g . c h a r A t ( i ) ;

12 if( c u r r e n t C h a r = c ) {

13 N U M B E R _ O F _ C H A R S ++;

14 }

15 }

16 r e t u r n N U M B E R _ O F _ C H A R S

17 }

18

19 }

(6)

Teil 3: Code implementieren

7) Pfade (10 Punkte)

Gegeben sind die Klassen Point und BasicPath. Point beschreibt einen einzelnen Punkt in einem zweidimensionalen Koordinatensystem, die Klasse BasicPath be- schreibt einen Pfad aus mehreren Punkten (Point). Gehen Sie davon aus, dass die- ser Code korrekt ist und beachten Sie die Hinweise am Ende der Aufgabenstellung (Seite 7).

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

2 p r i v a t e int x ;

3 p r i v a t e int y ;

4

5 p u b l i c P o i n t (int x , int y ) {

6 this. x = x ;

7 this. y = y ;

8 }

9

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

11 r e t u r n x ;

12 }

13

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

15 r e t u r n y ;

16 }

17 }

1 p u b l i c c l a s s B a s i c P a t h {

2 p r o t e c t e d A r r a y L i s t< Point > p o i n t s ;

3

4 p u b l i c B a s i c P a t h () {

5 p o i n t s = new A r r a y L i s t< Point >() ;

6 }

7

8 p u b l i c void a d d P o i n t ( P o i n t p o i n t) {

9 p o i n t s . add (p o i n t) ;

10 }

11

12 }

(7)

7a)Implementieren Sie eine zusätzliche KlasseExtendedPath. Diese erbt vonBasicPath und verfügt über eine zusätzliche, öffentliche Methode length, die einen double- Wert zurückgibt. Dieser Wert beschreibt die Länge des Pfades, der sich aus den Teildistanzen zwischen der einzelnen Punkten in der ArrayList ergibt. Lagern Sie gegebenenfalls Teil der Lösung sinnvoll in zusätzliche Methoden aus.

Für die Liste gilt: Die einzelnen Punkte sind in der korrekten Reihenfolge gespeichert. Eine Liste [A,B,C] beschreibt einen Pfad von A über B nach C. Die Länge des Pfads setzt sich aus den TeilstückenA -> B und B -> Czusammen. Ihre Lösung muss für Listen mit einer beliebigen Anzahl an Punkten funktionieren.

Für die Berechnung der Distanzdzwischen zwei Punkten giltd=pdx2+dy2. Dabei istdx der Abstand (Differenz) der beiden x-Koordinaten unddy der Abstand der y-Koordinaten.

In Java können Sie die Wurzel einer Zahla mit der MethodeMath.sqrt(double a)ziehen.

(8)
(9)

8) Tetris (20 Punkte)

Gegeben ist die Klasse Tetris. Gehen Sie davon aus, dass dieser Code korrekt ist.

Die Klasse stellt das Grundgerüst für das bekannte SpielTetrisdar. Ziel dieses Spiel ist, fallende Spielsteine auf einem 2-dimensionalen Gitternetz so anzuordnen, das zusammengehörige, horizontale Linien entstehen. Diese Linien werden dann ent- fernt und alle weiteren Steine fallen entsprechen der Anzahl der entfernten Linien nach unten. Die nachstehende Grafik verdeutlicht dieses Prinzip.

Innerhalb des Spiels wird das Gitter durch ein mehrdimensionalesint-Array abge- bildet. Jede Zeile ist durch ein separates Array abgebildet, in dem jedes Element für eine einzelne Zelle steht. Durch die numerischen Werte 0 und 1 wird vermerkt, ob ein Feld frei (0) oder belegt (1) ist. Als komplett gilt eine Zeile dann, wenn alle ihre Elemente durch den numerischen Wert1 repräsentiert werden, also belegt sind. Der erste Eintrag im umschließenden Array repräsentiert die oberste Zeile des Gitters, der letzte Eintrag die unterste Zeile.

1 L e e r e s Grid : { Grid mit e i n i g e n S t e i n e n : {

2 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

3 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

4 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

5 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

6 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

7 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

8 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

9 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

10 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

11 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {1 ,0 ,0 ,0 ,1 ,1 ,0 ,0 ,0 ,0} ,

12 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {1 ,1 ,1 ,1 ,0 ,1 ,0 ,0 ,0 ,0} ,

13 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} , {1 ,1 ,1 ,1 ,1 ,1 ,1 ,0 ,0 ,0} ,

14 } }

(10)

Erweitern Sie den vorgegebenen Code, um die folgenden Teilaufgaben zu imple- mentieren. Sie müssen nur die beschriebenen Probleme lösen. Sie können bei der Bearbeitung zusätzliche Methoden anlegen um Teilbereiche Ihrer Lösung auszula- gern. Sie können sich in allen Teilaufgaben auf diese ausgelagerten Methoden bezie- hen. Gehen Sie bei der Lösung der Aufgabe davon aus, dass die Breite und Höhe des Gitters variabel sein kann.

1 p u b l i c c l a s s T e t r i s {

2 p r i v a t e int[][] grid = {

3 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

4 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

5 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

6 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

7 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

8 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

9 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

10 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

11 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

12 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

13 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0} ,

14 {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0}

15 };

16

17 p r i v a t e int r e m o v e C o m p l e t e L i n e s () {

18 // I m p l e m e n t i e r e n Sie hier I h r e n Code

19 }

20

21 p r i v a t e void m o v e A l l P i e c e s (int l i n e O f f s e t ) {

22 // I m p l e m e n t i e r e n Sie hier I h r e n Code

23 }

24 }

(11)

9a)Implementieren Sie den Rumpf der vorgegeben MethoderemoveCompleteLines.

Diese Methode entfernt alle kompletten Linien aus dem Gitter. Dabei werden, in kompletten Zeilen, alle Elemente von1auf0 gesetzt. Die übrigen Zeilen des Gitters werden weder verändert noch verschoben. Die Methode gibt einenint-Wert zurück, der die Anzahl der entfernten Zeilen beinhaltet.

9b) Implementieren Sie den Rumpf der vorgegeben Methode moveAllPieces. Die- se Methode bekommt die Position einer Gitter-Zeile als Parameter übergeben. Alle Zeilenüberdieser Linie werden um eine Position nach unten verschoben.

(12)

Referenzen

ÄHNLICHE DOKUMENTE

Jeder Algorithmus zur Suche in sortierten Daten der Länge n benötigt im schlechtesten Fall Ω(log n) Vergleichsschritte... Untere Schranke f ¨ur Suchen in

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

7b) Entwerfen Sie eine neue Klasse MailWithAttachment, die von Email erbt und über eine zusätzliche, private Instanzvariable vom Typ Attachment verfügt. Ergän- zen Sie eine

Hinweise: Mit der Methode indexOf(char c) der String-Klasse lässt sich überprüfen, ob ein Zeichen c in einem String vorkommt oder nicht. Die Methoden wird auf der

8b) Erstellen Sie eine Klasse AdTrack, die von AudioTrack erbt und zusätzlich über private Instanzvariablen für den Namen des jeweiligen Kunden sowie die vereinbar- ten Werbekosten

Vervollständigen Sie den gegebenen Code der Klasse OffsetRule um eine einfache Version der Abseitsregel beim Fussball zu implementieren. Ein Spieler wird dabei durch die Klasse

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