Sie sind auf Seite 1von 26

Klausur

Funktionale und objektorientierte Programmierkonzepte


Wintersemester 2017/18
3. April 2018

Ihre Matrikelnummer:

Achtung: Geben Sie keine weiteren persönlichen Daten außer der Matrikel-
nummer an!

Generelle Hinweise:
• Schreiben Sie lesbar (lesbar für die Korrektoren, nicht nur lesbar für Sie!).
• Schreiben Sie zu Ihrer Sicherheit die Matrikelnummer auf jedem Blatt in das jeweils
dafür vorgesehene Feld.
• Geben Sie in Ihrer Lösung zu jeder Aufgabe an, welcher Text zu welcher Teilaufgabe
gehört (wenn Sie Ihre Lösungen zu den Teilaufgaben strikt nacheinander, also
ohne Hin- und Hersprünge zwischen Teilaufgaben verfassen, reicht es natürlich,
die jeweilige Teilaufgabe jeweils zu Beginn anzugeben).
• Sie können selbstverständlich auch Zwischen- und Nebenergebnisse in Ihre Ab-
gabe schreiben, um leichter zum Ergebnis zu kommen. Stellen Sie dann aber die
eigentliche Lösung klar heraus.
• Sie müssen in jeder Aufgabe nur den reinen Code in HtDP-TL bzw. Java schreiben,
keine Verträge, Beschreibungen, Annotationen, Kommentare oder Checks/Tests.

Punkteverteilung:

Aufgabe 1 2 3 4 5 6 Summe
Punktzahl 24 20 22 18 20 23 127
Aufgabe 1 (HtDP-TL): 24 Punkte

Gegeben ist ein Struct-Typ abc mit zwei Feldern a und b.

Teil (a): 6 Punkte


Schreiben Sie eine Prozedur foo mit einem Parameter p. Falls p vom Typ abc und
zudem der Wert im Feld b von p eine Liste ist, liefert foo eine Liste zurück, deren
erstes Element der Wert von Feld a in p ist, und der Rest der zurückgelieferten Liste
ist die Liste im Feld b von p. Andernfalls liefert foo einfach false zurück.

Teil (b): 6 Punkte


Schreiben Sie eine Prozedur bar1 mit einen Parameter lst. Der formale Teil des Ver-
trags lautet bar1: (list of ANY) -> (list of ANY); dass lst tatsächlich eine Lis-
te ist, muss in bar1 nicht überprüft werden. Für jedes Element x in lst, das vom Typ
abc ist, soll die Ergebnisliste von bar1 das Ergebnis der Anwendung von foo auf x
enthalten. Weitere Elemente darf die Ergebnisliste von bar1 nicht enthalten.
Verbindliche Anforderung : In Teilaufgabe (b) dürfen Sie keine Prozeduren höherer
Ordnung wie etwa filter oder map verwenden, sondern deren Funktionalität muss von
Ihnen selbst geschrieben werden.

Teil (c): 7 Punkte


Schreiben Sie eine Prozedur bar2 mit einem Parameter lst und demselben Vertrag
und derselben Beschreibung wie bar1. Der Unterschied zu bar1 in Teil (b) ist, dass
der Body von bar2 ein local-Ausdruck ist. Die Funktionalität von bar2 wird nicht
wie bei bar1 von Ihnen selbst geschrieben, sondern an die in HtDP-TL eingebauten
Prozeduren map und filter delegiert. Dazu definieren Sie foo aus Teil (a) und die
für filter benötigte Prozedur elm lokal. Der Body von foo wird hier nicht nochmals
gewertet; Sie dürfen ihn durch ...“ ersetzen.

Erinnerung aus der Vorlesung :
• filter: (X -> boolean) (list of X) -> (list of X) liefert eine Liste zurück
mit allen Elementen x aus dem zweiten Parameter, bei denen der erste Parameter
von filter den Wert true liefert.
• map: (X -> Y) (list of X) -> (list of Y) liefert eine Liste zurück, die für
jedes Element x des zweiten Parameters von map das Ergebnis des ersten Parame-
ters von map angewandt auf x enthält.

Teil (d): 5 Punkte


Schreiben Sie eine Prozedur bar3 mit einem Parameter lst und demselben Vertrag
und derselben Beschreibung wie bar1 und bar2. Der Unterschied zu bar2 ist, dass foo
und elm durch lambda-Prozeduren ersetzt werden, die Sie innerhalb des Aufrufs von
map bzw. filter definieren. Die Bodies von foo und elm werden hier nicht nochmals
gewertet; Sie dürfen sie jeweils durch ...“ ersetzen.

Ihre Lösung schreiben Sie auf die folgenden Seiten bis zur nächsten Aufgabe:
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Aufgabe 2 (HtDP-TL): 20 Punkte

Verbindliche Anforderung für alle drei Teilaufgaben: Zuweisungen mit set! oder
ähnliches ist nicht erlaubt, alle Teilaufgaben müssen durch normale Rekursion gelöst
werden, wie Sie es in der Vorlesung gesehen haben.

Teil (a): 6 Punkte


Schreiben Sie eine Prozedur contains?: (list of symbol) symbol -> boolean mit
Parameternamen lst und x, die genau dann true zurückliefert, wenn mindestens ein
Element von lst gleich x ist. Dass lst und x dem Vertrag entsprechen, muss in
contains? nicht geprüft werden.
Erinnerung aus der Vorlesung : symbol=?: symbol symbol -> boolean ergibt ge-
nau dann true, wenn beide Parameter vom Symboltyp und auch dasselbe Symbol sind.

Teil (b): 6 Punkte


Schreiben Sie eine Prozedur duplicates?: (list of symbol) -> boolean mit einem
Parameter lst, die genau dann false zurückliefert, wenn kein Symbol mehr als einmal
in lst vorkommt. Dass lst dem Vertrag entspricht, muss in duplicates? nicht geprüft
werden.
Hinweis: Sie sind schnell fertig, wenn Sie contains? aus Teil (a) geeignet verwenden.

Teil (c): 8 Punkte (ein bisschen zum Knobeln!)


Schreiben Sie eine Prozedur duplicates-deep? mit einem Parameter deep-lst. Es
wird erwartet, dass deep-lst entweder ein Symbol oder eine Liste ist, deren Elemente
wiederum Symbole oder Listen sind usw. (wie mehrfach in der Vorlesung mit Zahlen
statt Symbolen gesehen, läuft dies auf Listen von Listen von ... von Symbolen hinaus);
dass deep-lst von genau dieser Form ist, muss in duplicates-deep? nicht abgeprüft
werden. Die Prozedur duplicates-deep? soll true oder false zurückliefern, und zwar
false genau dann, wenn mindestens ein Symbol mehr als einmal vorkommt.
Der Body von duplicates-deep? ist ein local-Ausdruck, in dem Sie eine Prozedur
collect mit zwei Parametern, lst und oracle, definieren. Die Prozedur collect kann
ohne Überprüfung davon ausgehen, dass lst ebenfalls eine Liste von Listen von ... Sym-
bolen ist und dass oracle eine normale Liste von Symbolen ist. Der Sinn von oracle
ist, dass darin alle bisher gefundenen Symbole gespeichert sind. Selbstverständlich darf
(und soll) duplicates? aus Teil (b) für (c) verwendet werden.

Ihre Lösung schreiben Sie auf die folgenden Seiten bis zur nächsten Aufgabe:
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Aufgabe 3 (Java): 22 Punkte

Teil (a): 2 Punkte


Schreiben Sie ein public-Interface A mit einer Objektmethode m1, die Rückgabetyp
double, einen int-Parameter n und einen char-Parameter c hat.

Teil (b): 2 Punkte


Schreiben Sie ein public-Interface B, das von A erbt und zusätzlich eine Objektmethode
m2 hat, die keine Parameter hat und einen String zurückliefert.

Teil (c): 8 Punkte


Schreiben Sie eine public-Klasse XY, die A implementiert, aber m1 nicht. Klasse XY soll
ein protected-Attribut p vom Typ long haben sowie einen public-Konstruktor mit
Parameter q vom Typ long. Der Konstruktor soll p auf den Wert von q setzen. Weiter
soll XY eine public-Objektmethode m3 mit Rückgabetyp void und Parameter xy vom
Typ XY haben, aber nicht implementieren.

Teil (d): 10 Punkte


Schreiben Sie eine public-Klasse YZ, die von XY erbt und B implementiert. Die Methode
m1 soll n+c+p zurückliefern und m2 den String "Hallo"; m3 soll den Wert p von xy auf
den Wert p des eigenen Objektes addieren. Der Konstruktor von YZ ist public, hat
einen long-Parameter r und ruft damit den Konstruktor von XY auf.

Ihre Lösung schreiben Sie auf diese und die folgenden Seiten bis zur nächsten
Aufgabe:
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Aufgabe 4 (Java): 18 Punkte

Teil (a): 6 Punkte


Schreiben Sie eine public-Klasse MyException, die von Exception erbt. Der Konstruk-
tor dieser Methode hat einen Parameter str vom Typ String und einen Parameter n
vom Typ int. Ein Objekt von MyException hat ein private-Attribut message vom
Typ String. Der Konstruktor weist message die Konkatenation aus beiden Parame-
tern zu. Die public-Methode getMessage von Exception soll so überschrieben werden,
dass message zurückgeliefert wird.
Erinnerung aus der Vorlesung : Sie können einen String und einem Wert von einem
primitiven Typ mit Operator +“ zu einem String zusammenfügen (konkatenieren).

Teil (b): 6 Punkte
Schreiben Sie eine public-Klasse X mit einer public-Klassenmethode km, die einen
int-Parameter n hat, int zurückliefert und potentiell MyException wirft. Und zwar
wirft km eine MyException mit ¨Holla¨ und n als Parameterwerten, wenn n negativ
ist. Andernfalls liefert km das Quadrat von n zurück.

Teil (c): 6 Punkte


Schreiben Sie eine public-Klasse Y mit einer public-Objektmethode m, die einen int-
Parameter n hat und int zurückliefert. Diese Methode ruft km von X mit n auf, ohne
ein Objekt von X dafür einzurichten, und liefert das Ergebnis von km zurück. Sollte
km eine Exception werfen, dann soll die Botschaft der Exception auf dem Bildschirm
ausgegeben werden.
Erinnerung aus der Vorlesung : Einen String kann man mit System.out.print
auf den Bildschirm schreiben.

Ihre Lösung schreiben Sie auf die folgenden Seiten bis zur nächsten Aufgabe:
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Aufgabe 5 (Java): 20 Punkte

Gegeben sei eine Klasse X, die generisch mit T parametrisiert ist. In Teil (a) und (b)
schreiben Sie die public-Objektmethoden m1 und m2 von X. Ihre Methoden können in
beiden Aufgabenteilen ohne Überprüfung davon ausgehen, dass der Parameter a nicht
gleich null ist und dass a positive Länge hat.

Verbindliche Anforderungen für beide Aufgabenteile: Rekursion darf nicht ver-


wendet werden, das heißt, die Aufgaben müssen durch Schleifen realisiert werden. Es
dürfen keine Klassen aus der Java-Standardbibliothek oder aus anderen Bibliotheken
verwendet werden (Arrays fallen natürlich nicht darunter).

Teil (a): 6 Punkte

Die public-Methode m1 hat ein Array a von Typ int als Parameter und Rückgabetyp
void. Nach Anwendung von m1 soll im Index i ∈ {0, . . . , a.length − 1} der Wert
a[0]+a[1]+. . .+a[i] stehen, wobei a[0], a[1], . . ., a[i] die Werte in a unmittelbar
vor Anwendung von m1 bezeichnen.

Beispiel : [3, 4, 1, 9, −5, 4] −→ [3, 3 + 4, 3 + 4 + 1, 3 + 4 + 1 + 9, 3 + 4 + 1 + 9 + (−5), 3 +


4 + 1 + 9 + (−5) + 4] −→ [3, 7, 8, 17, 12, 16]

Teil (b): 14 Punkte (ein bisschen zum Knobeln!)


Die public-Methode m2 hat ein Array a von Typ T als formalen Parameter und liefert
ein anderes Array b vom Typ T zurück, das aus a entsteht, indem jedes dritte Element
gelöscht wird, das heißt, die Elemente von a an den Indizes 0, 3, 6, 9, . . . werden nicht
nach b kopiert, alle anderen Elemente von a werden in derselben Reihenfolge, wie sie
in a stehen, nach b kopiert. Weitere Elemente hat b nicht. Sie dürfen voraussetzen,
dass a mindestens Länge 2 hat. Sie dürfen einfach Operator ¨=¨ für das Kopieren von
Elementen verwenden, und Sie dürfen davon ausgehen, dass Sie ein Array von einem
generischen Typ T ganz normal mit new in m1 mit Typnamen T einrichten können.

Unverbindliche Hinweise: Überlegen Sie sich die Gesetzmäßigkeit, nach der die
Indizes 1, 2, 4, 5, 7, 8, . . . in a auf die Indizes 0, 1, 2, 3, 4, 5, . . . in b abzubilden sind.
Für die Länge von b werden Sie eine Fallunterscheidung benötigen, je nachdem, welchen
Rest a.length dividiert durch 3 ergibt. Denken Sie auch an die letzten beiden Elemente
von a.

Ihre Lösung schreiben Sie auf die folgenden Seiten bis zur nächsten Aufgabe:
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Aufgabe 6 (Java): 23 Punkte

Wir betrachten Listen, deren Elemente vom folgenden Typ sind:


class ListItem <T> {
public T key;
public ListItem<T> next;
}

Gegeben sei eine Klasse Y, die nicht generisch parametrisiert ist. In Teil (a) und (b)
schreiben Sie public-Methoden m1 und m2 von Y, die generisch mit T parametrisiert
sind. Sie können ohne Überprüfung davon ausgehen, dass jeder Parameter vom Typ
ListItem<T> auf den Kopf einer korrekt gebildeten linearen Liste verweist (die auch
leer sein kann, das heißt, Wert null ist möglich).

Verbindliche Anforderungen für beide Aufgabenteile: Rekursion darf nicht


verwendet werden, das heißt, die Aufgaben müssen durch Schleifen realisiert werden.
Es dürfen keine Objekte mit new eingerichtet werden. Es dürfen keine Klassen aus der
Java-Standardbibliothek oder aus anderen Bibliotheken verwendet werden.

Teil (a): 8 Punkte

Die public-Methode m1 von Y hat einen Parameter head vom Typ ListItem<T>.
Rückgabewert ist null, falls die Liste leer ist, ansonsten wird key vom letzten Ele-
ment der Liste zurückgeliefert.

Teil (b): 15 Punkte (ein bisschen zum Knobeln!)

Die public-Methode m2 von Y hat einen Parameter head vom Typ ListItem<T> und
liefert auch ListItem<T> zurück. Die Methode m2 entfernt alle Elemente aus dieser
Liste, deren Position in der Liste eine Quadratzahl ist, wobei das erste Listenelement
Position 0 hat (was natürlich auch eine Quadratzahl ist). Zurückgeliefert wird der Kopf
der Ergebnisliste.

Unverbindlicher Hinweis: Führen Sie zwei int-Variable position und base mit,
wobei position die Position des nächsten zu testenden Listenelements und base die
Basis der jeweils nächsten zu betrachtenden Quadratzahl ist.

Ihre Lösung schreiben Sie auf die folgenden leeren Seiten:


Ihre Matrikelnummer (zu Ihrer Sicherheit):
Ihre Matrikelnummer (zu Ihrer Sicherheit):
Diese Seite ist nur von den Korrektoren auszufüllen!

1(a) A B C D E F

1(b) A B C D E F

1(c) A B C D E F G

1(d) A B C D E XXXXXXX

2(a) A B C D E F

2(b) A B C D E F

2(c) A B C D E F G H

3(a) A B

3(b) A B

3(c) A B C D E F G H

3(d) A B C D E F G H I J XXXXXXX

4(a) A B C D E F

4(b) A B C D E F

4(c) A B C D E F

5(a) A B C D E F

5(b) A B C D E F G H I J K L M N

6(a) A B C D E F G H

6(b) A B C D E F G H I J k L M N O

Vorletzte Spalte: Summe Punkte Teilaufgabe


Letzte Spalte: Summe Punkte Aufgabe
Unterstes Feld: Gesamtpunktzahl aus allen Aufgaben

Das könnte Ihnen auch gefallen