Klausur zum Kurs 1618

Werbung
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Kurs 01618
Einführung in die
objektorientierte Programmierung
_________________________________________________________
(Name, Vorname)
_________________________________________________________
(Kursdurchführung des Sommersemester 2014)
_________________________________________________________
(Straße, Nr.)
______________
(PLZ)
Nachklausur am 14.03.2015
(im Wintersemester 2014 / 2015)
________________________________________
(Wohnort)
Dreistündige Klausur
(10.00 – 13.00 Uhr)
_________________________________________________________
(Land, falls außerhalb Deutschlands)
Lesen Sie zuerst die Hinweise auf der folgenden Seite!
Matrikelnummer:
Geburtsdatum:
.
.
Klausurort: _________________________
Aufgabe
1
2
3
4
5
6
7
8
9
10
Summe
10
10
10
10
10
10
10
10
10
10
100
habe bearbeitet
maximal
erreicht
Korrektur
○ Herzlichen Glückwunsch, Sie haben die Klausur bestanden. Note: ..........
○ Sie haben die Klausur leider nicht bestanden. Für den nächsten Versuch wünschen wir Ihnen
viel Erfolg. Die nächste Klausur findet im Sommersemester 2015 statt.
Hagen, den 25.03.2015
Im Auftrag
© 2015 FernUniversität in Hagen
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Hinweise zur Bearbeitung
1. Prüfen Sie die Vollständigkeit Ihrer Unterlagen. Die Klausur umfasst auf insgesamt 21 Seiten:
 1 Deckblatt
 Diese Hinweise zur Bearbeitung
 10 Aufgaben auf Seite 3-19
 Zwei zusätzliche Seiten 10 und 21 für weitere Lösungen
2. Füllen Sie jetzt bitte zuerst das Deckblatt aus:
 Name, Vorname und Adresse
 Matrikelnummer, Geburtsdatum und Klausurort
3. Schreiben Sie Ihre Lösungen mit Kugelschreiber oder Füllfederhalter (kein Bleistift) direkt in den bei
den jeweiligen Aufgaben gegebenen, umrahmten Leerraum. Benutzen Sie auf keinen Fall die
Rückseiten der Aufgabenblätter. Versuchen Sie, mit dem vorhandenen Platz auszukommen; Sie
dürfen auch stichwortartig antworten. Sollten Sie wider Erwarten nicht mit dem vorgegebenen
Platz auskommen, benutzen Sie bitte die beiden dieser Klausur angefügten Leerseiten. Es werden
nur Aufgaben gewertet, die sich auf dem offiziellen Klausurpapier befinden. Eigenes Papier ist nur für Ihre persönlichen Notizen erlaubt.
4. Kreuzen Sie die bearbeiteten Aufgaben auf dem Deckblatt an. Schreiben Sie unbedingt auf jedes
Blatt Ihrer Klausur Ihren Namen und Ihre Matrikelnummer, auf die Zusatzblätter auch die Nummer
der Aufgabe.
5. Geben Sie die gesamte Klausur ab. Lösen Sie die Blätter nicht voneinander.
6. Es sind keine Hilfsmittel zugelassen.
7. Lesen Sie vor der Bearbeitung einer Aufgabe den gesamten Aufgabentext sorgfältig durch.
8. Es sind maximal 100 Punkte erreichbar. Wenn Sie mindestens 50 Punkte erreichen, haben Sie die
Klausur bestanden.
9. Sie erhalten die korrigierte Klausur zurück, zusammen mit einer Bescheinigung für das Finanzamt
und ggf. dem Übungsschein.
10. Legen Sie jetzt noch Ihren Studierendenausweis und einen amtlichen Lichtbildausweis bereit, dann
kann die Arbeit beginnen. Viel Erfolg!
Seite 2 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Aufgabe 1: Begriffe der Objektorientierung
(10 Punkte)
Gegeben sei das folgende Java-Programm:
package p;
interface Schnittstelle {
int eineZahl = 42;
Character eineMethode();
}
class Demo implements Schnittstelle {
static Object eineZeichenkette = "Leere Zeichenkette";
Long andereZahl;
public Demo() {
this(4711L);
}
public Demo(Long einLong) {
andereZahl = einLong;
}
public Character eineMethode() {
char c = 'a';
return c;
}
static Number andereMethode() {
return new Double(8 / 15);
}
}
(Fortsetzung der Aufgabe auf der folgenden Seite)
Seite 3 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(Fortsetzung von Aufgabe 1)
In diesem Programmfragment kommen verschiedene Elemente vor. Zählen Sie auf
 die vollqualifizierten Namen aller deklarierten Typen:
(1 Punkt)
 die (einfachen, d.h. unqualifizierten) Namen aller verwendeten Typen:
(1 Punkt)
 alle Konstruktoraufrufe:
(1 Punkt)
 alle Stellen, an denen ein Objekt eines Subtyps einer Variablen zugewiesen wird, die mit einem Supertyp typisiert ist:
(1 Punkt)
 alle Stellen, an denen automatisches Boxing stattfindet:
(2 Punkte)
 alle Methodendefinitionen (kürzen Sie den Rumpf bei Bedarf mit „…“ ab!):
(2 Punkte)
 alle Deklarationen statischer Felder:
(2 Punkte)
Seite 4 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Aufgabe 2: Klassenimplementierung
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(10 Punkte)
Gegeben sei das folgende Programmfragment:
public class ComputerDemo {
public static void main(String[] args) {
Maus m = new Maus(2);
Tastatur t = new Tastatur("Deutsch");
Computer c = new Computer(t, m);
c.maus.doppelklick(100, 75);
try {
c.tastatur.erwarteLayout("US-Englisch");
System.out.println("US-Englisches Layout!");
} catch (Exception e) {
System.out.println("Kein US-Englisches Tastaturlayout!");
}
try {
c.tastatur.erwarteLayout("Deutsch");
System.out.println("Deutsches Layout!");
} catch (Exception e) {
System.out.println("Kein deutsches Tastaturlayout!");
}
}
}
Geben Sie Implementierungen für die Klassen Maus, Tastaur und Computer an, sodass dieses Programmfragment kompiliert werden kann und bei Terminierung der main-Methode die folgenden Zeilen
auf der Konsole ausgegeben werden.
Maus mit 2 Tasten erzeugt.
Tastatur für Layout 'Deutsch' erzeugt.
Doppelklick bei (100, 75)
Kein US-Englisches Tastaturlayout!
Deutsches Layout!
Diese Zeichenketten sollen selbstverständlich durch die jeweiligen Anweisungen zusammengesetzt und
ausgegeben werden.
(Fortsetzung der Aufgabe auf der folgenden Seite)
Seite 5 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(Fortsetzung von Aufgabe 2)
Seite 6 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Aufgabe 3: Abstrakte Klassen und Interfaces
(10 Punkte)
In den folgenden Programmfragmenten haben sich gelegentlich Fehlerteufel eingeschlichen. Geben Sie
zu jedem Fragment an, ob es kompiliert werden kann und falls nicht, erklären Sie den Fehler!
class Typ {
abstract void m();
}
(1 Punkt)
abstract class Typ {
static abstract void m();
}
(1 Punkt)
abstract class Typ {
abstract int eineZahl = 42;
}
(1 Punkt)
class HilfsTyp {
Typ v = new Typ();
}
abstract class Typ {
abstract void m();
}
(1 Punkt)
abstract class Typ {
abstract void m();
}
class SubTyp extends Typ { }
(1 Punkt)
(Fortsetzung der Aufgabe auf der folgenden Seite)
Seite 7 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(Fortsetzung von Aufgabe 3)
abstract class Typ {
abstract void m();
}
abstract class SubTyp extends Typ {
}
(1 Punkt)
interface SechsterTyp {
void m(){}
}
(1 Punkt)
interface Typ {
void m();
}
class SubTyp implements Typ {
void m() { }
}
(1 Punkt)
class Klasse {
public void m() {}
}
interface Typ extends Klasse {
}
(1 Punkt)
interface Typ{
void m();
}
interface SubTyp implements Typ{
}
(1 Punkt)
Seite 8 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Aufgabe 4: Überladen und Überschreiben
(10 Punkte)
Gegeben sei das folgende Java-Programm:
class Ort {}
class Garten extends Ort {}
abstract class Pflanze {
void gießen(Ort ort) {
System.out.println("Pflanze im Ort gießen.");
void pflanzen(Ort ort, Baum nachbar) {
System.out.println("Pflanze neben Baum im Ort pflanzen.");
void pflanzen(Garten ort, Blume nachbar) {
System.out.println("Pflanze neben Blume im Garten pflanzen.");
}
class Blume extends Pflanze {
void gießen(Garten ort) {
System.out.println("Blume im Garten gießen.");
}
class Rose extends Blume {
void gießen(Garten ort) {
System.out.println("Rose im Garten gießen.");
void pflanzen(Ort ort, Baum nachbar) {
System.out.println("Rose neben Baum im Ort pflanzen.");
}
class Baum extends Pflanze {
void pflanzen(Garten ort, Pflanze nachbar) {
System.out.println("Baum neben Pflanze im Ort pflanzen.");
}
class Eiche extends Baum {
void gießen(Garten ort) {
System.out.println("Eiche im Garten gießen.");
}
}
}
}
}
}
}
}
}
public class VonBlumenUndBäumen {
public static void main(String[] args) {
Rose rose = new Rose();
Eiche eiche = new Eiche();
Blume blume = rose;
Baum baum = eiche;
Garten garten = new Garten();
Ort ort = garten;
/* [1] */
}
}
Seite 9 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
An der mit /* [1] */ markierten Stelle werden nun (einzeln und nacheinander) die folgenden Befehle
eingefügt. Kann das Programm nun kompiliert werden? Wenn ja, geben Sie die durch diese Anweisung ausgegebene Zeile an; wenn nein: Warum nicht?
rose.gießen(garten);
(1 Punkt)
blume.gießen(garten);
(1 Punkt)
baum.gießen(garten);
(1 Punkt)
blume.pflanzen(garten, blume);
(1 Punkt)
rose.pflanzen(ort, baum);
(1 Punkt)
eiche.pflanzen(ort, baum);
(2 Punkte)
baum.pflanzen(garten, baum);
(3 Punkte)
Seite 10 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Aufgabe 5: Polymorphie
Welche vier Arten von Polymorphie kennen Sie?
Charakterisieren Sie jede Art kurz!
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(10 Punkte)
(2 Punkte)
(jeweils 2 Punkte)
.
Seite 11 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Aufgabe 6: (Beschränkt) Parametrische Polymorphie(10 Punkte)
Gegeben sei die Implementierung der folgenden main-Methode:
public class TupelDemo {
public static void main(String[] args) {
Tupel<String, Long> t1 = new Tupel<String, Long>("Zeichenkette", 42L);
System.out.println(t1.toString());
// Liefert „(Zeichenkette, 42)“.
String t1ErsterWert = t1.ersterWert();
Long t1ZweiterWert = t1.zweiterWert();
Tupel<Character, Boolean> t2 = new Tupel<Character, Boolean>('?', true);
System.out.println(t2.toString());
// Liefert „(?, true)“.
Character t2ErsterWert = t2.ersterWert();
Boolean t2ZweiterWert = t2.zweiterWert();
}
}
Geben Sie eine Implementierung für die Klasse Tuple<S, T> an, sodass diese Implementierung kompiliert werden kann und durch die System.out.println(…)-Aufrufe die in den Kommentaren angegebenen Zeichenketten auf die Konsole geschrieben werden.
(5 Punkte)
(Fortsetzung der Aufgabe auf der folgenden Seite)
Seite 12 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(Fortsetzung von Aufgabe 6)
Die Klasse Tupel soll nun so verändert werden, dass
1. der erste und der zweite Wert des Tupels vom selben Typ sind;
2. die Objekte dieses Typs sortierbar sind (also miteinander verglichen werden können);
3. die in den Kommentaren angedeuteten Aufrufe der toString()-Methode die angegebenen
Rückgaben erzeugen würden.
(Die Kommentare sind so zu verstehen, dass ein Aufruf von ti.toString() nach der Initialisierung der
Variablen ti bzw. nach dem Aufruf von ti.sortiere() die angegebene Zeichenkette zurückgäbe.)
public static void main(String[] args) {
Tupel<Long> t1 = new Tupel<Long>(1L, 2L);
t1.sortiere();
Tupel<Long> t2 = new Tupel<Long>(4711L, 42L);
t2.sortiere();
// t1.toString() gäbe „(1, 2)“
// t1.toString() gäbe „(1, 2)“
// t2.toString() gäbe „(4711, 42)“
// t2.toString() gäbe „(42, 4711)“
Tupel<String> t3 = new Tupel<String>("xy", "ab"); // t3.toString() gäbe „(xy, ab)“
t3.sortiere();
// t3.toString() gäbe „(ab, xy)“
}
Hinweis: Verwenden Sie das Interface java.lang.Comparable:
public interface Comparable<T> {
/** Compares this object with the specified object for order. Returns a negative
integer, zero, or a positive integer as this object is less than, equal to, or
greater than the specified object. */
public int compareTo(T o);
}
(5 Punkte)
Seite 13 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Aufgabe 7: GUI mit AWT
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(10 Punkte)
Implementieren Sie ein Programm, welches in seiner main-Methode das folgende Fenster auf dem Display des Benutzers darstellt und das die folgenden Kriterien erfüllt:
1. Das Fenster ist 300px breit und 120px hoch.
2. Zur Positionierung der Komponenten wird das Border-Layout verwendet.
3. Das Fenster enthält drei Komponenten für die Interaktion mit dem Benutzer:
a. Oben befindet sich eine Komponente zur Eingabe von Text durch den Benutzer.
b. In der Mitte befindet sich eine Komponente zur Ausgabe von Text.
c. Unten befindet sich eine Schaltfläche mit der Beschriftung „Text kopieren“.
4. Bei einem Klick auf die Schaltfläche „Text kopieren“ soll der durch den Benutzer im oberen Teil
des Fensters eingegebene Text auch in der Komponente in der Mitte ausgegeben werden.
Die folgende Abbildung stellt das Fenster dar, nachdem ein Benutzer die Zeichenkette „Eingabetext“ in
die Texteingabekomponente eingetragen hat und danach auf die Schaltfläche „Text kopieren“geklickt
hat.
Hinweis: Sollten Ihnen die exakten Namen der benötigten Klassen und Methoden nicht geläufig sein,
dürfen Sie stattdessen auch deutschsprachige Platzhalter verwenden. Achten Sie in diesem Fall jedoch
darauf, dass die gewählten Namen selbsterklärend sind.
(Fortsetzung der Aufgabe auf der folgenden Seite)
Seite 14 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(Fortsetzung von Aufgabe 6)
Seite 15 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Aufgabe 8: Model/View/Controller
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(10 Punkte)
Stellen Sie die Kommunikation der drei Komponenten der MVC-Architektur in Form einer Grafik dar.
(4 Punkte)
Charakterisieren Sie jede der drei Komponenten.
(6 Punkte)
Seite 16 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Aufgabe 9: Arrays
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(10 Punkte)
Gegeben sei das folgende Programmfragment, welches die Quadratzahlen der Zahlen 1 ≤ 𝑛 ≤ 𝑚𝑎𝑥
berechnen, in einem Array speichern und ausgeben soll:
public class ArrayDemo {
public static void main(String[] args) {
int max = Integer.parseInt(args[0]);
/* [1] */
/* [2] */
/* [3] */
}
}
Teilaufgabe a: Erste Implementierung
(4 Punkte)
Wodurch muss /* [1] */ ersetzt werden, um das (eindimensionale) Array mit dem Namen
quadratzahlen zu initialisieren?
(1 Punkt)
Wodurch muss /* [2] */ ersetzt werden, um die Quadratzahlen in dieses Array zu
schreiben? Bitte verwenden Sie eine Schleife!
(2 Punkte)
Wodurch muss /* [3] */ ersetzt werden, um den Inhalt des Arrays auf die Konsole zu
schreiben? Bitte verwenden Sie eine Schleife – und zwar eine Schleife einer anderen Art als die, die Sie
in Ihrer Implementierung zur Ersetzung von /* [2] */ verwendet haben!
(1 Punkt)
Seite 17 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Teilaufgabe b: Zweite Implementierung
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
(6 Punkte)
In der zweiten Implementierung soll nun nicht nur die Quadratzahl gespeichert werden, sondern auch
diejenige Zahl, durch deren Quadratur sie entstanden ist. Dazu soll ein zweidimensionales Array (also
ein Array von Arrays) verwendet werden.
Wodurch muss /* [1] */ ersetzt werden, um das Array mit dem Namen quadratzahlen zu initialisieren, welches aus Arrays der Dimension 2 besteht?
(2 Punkt)
Wodurch muss /* [2] */ ersetzt werden, um die Paare aus Zahl und Quadratzahl in dieses Array zu
schreiben? Bitte verwenden Sie eine Schleife!
(2 Punkte)
Wodurch muss /* [3] */ ersetzt werden, um die Quadratzahlen in dem Format „x : y“ (wobei y die
Quadratzahl von x ist) auf die Konsole zu schreiben? Bitte verwenden Sie eine Schleife – und zwar eine
Schleife einer anderen Art als die, die Sie in Ihrer Implementierung zur Ersetzung von /* [2] */ verwendet haben.
(2 Punkt)
Seite 18 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Aufgabe 10: Modularisierung und Pakete
(10 Punkte)
Geben Sie an, ob die folgenden Aussagen wahr oder falsch sind.
Achtung! Falsche Antworten geben Minuspunkte, eine negative Gesamtpunktzahl bei dieser Aufgabe
wird Ihnen aber auf null Punkte aufgerundet.
Die Modularisierung von Programmen ist vor allem für die Ausführungsgeschwindigkeit des Programms von Bedeutung.
 Wahr
 Falsch
Es ist unter anderem auch deswegen wichtig, die Teile eines Programmes zu organisieren, damit ein Entwickler sich in der Implementierung leicht zurecht finden kann.
 Wahr
 Falsch
Die Dauer der Übersetzung kann durch die Wahl einer geeigneten
Modularisierung des Programms verkürzt werden.
 Wahr
 Falsch
Die Syntax für Pakete in Java lautet:
 Wahr
 Falsch
Java erlaubt es, ein und dieselbe Klasse gleichzeitig in mehreren
Paketen zu platzieren.
 Wahr
 Falsch
Wenn in Java in einer Klasse C des Pakets p eine andere Klasse D aus
dem Paket q verwendet werden soll, dann muss diese stets importiert werden.
 Wahr
 Falsch
Mit einem Wildcardzeichen (also dem Sternchen ‚*‘) können mit
einer einzelnen import-Anweisung alle öffentlichen Typen eines
Paketes importiert werden.
 Wahr
 Falsch
Eine als private deklarierte Klasse C des Pakets p kann in einer Klasse eines anderen Paketes q verwendet werden, wenn sie mit voll
qualifiziertem Namen importiert wird.
 Wahr
 Falsch
 Wahr
 Falsch
 Wahr
 Falsch
package einName { /* Deklaration der Elemente des Paketes*/ }
import-Anweisungen dürfen an einer beliebigen Stelle innerhalb
einer Java-Klasse stehen.
Wenn zwei Klassen p.C und q.C den gleichen Namen „C“ haben,
können diese in einem dritten Paket r nicht parallel verwendet werden.
Seite 19 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Zusätzlicher Platz für Ihre Lösungen
Ergänzung zu Aufgabe Nr.
Ergänzung zu Aufgabe Nr.
Seite 20 von 21
Nachklausur zum Kurs 01618 im Sommersemester 2014
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Zusätzlicher Platz für Ihre Lösungen
Ergänzung zu Aufgabe Nr.
Ergänzung zu Aufgabe Nr.
Seite 21 von 21
Herunterladen