Klausur

Werbung
F A C H H O C H S C H U L E
F Ü R
D I E
W I R T S C H A F T
F H D W ,
H A N N O V E R
S O F T WA R E E N G I N E E R I N G
E LEMENTE
DER
P ROGRAMMIERUNG
KLAUSUR
Studiengang: Mechatronik
Studienquartal: I. Theoriequartal
Prüfungsumfang: Elemente der Programmierung (Stand 10.12.03) und Musterlösungen Beispielaufgaben.
Dozent: Löwe
Termin: 18. Dezember 2003
Dauer: 180 Minuten
50 Punkte sind zu erreichen: Wissen 20, Anwendung 20 und Transfer 10 Punkte. Bestanden ab 25 Punkte.
TEIL I: WISSEN (45 MINUTEN)
Aufgabe 1 (2 Punkte): Warum schreibt man vor der Implementierung einer Operation Testfälle?
Aufgabe 2 (2 Punkte): Warum sollte man nicht mit Kopieren und Einfügen programmieren?
Aufgabe 3 (2 Punkte): Warum sollten die Implementierungen von Operationen kurz sein? Was kann
man tun, um aus langen Implementierungen kürzere zu machen?
Aufgabe 4 (4 Punkte): Erläutern Sie den Unterschied zwischen Syntax und Semantik einer
Programmiersprache? Was ist in diesem Zusammenhang ein Interpreter? Wann ist ein Interpreter korrekt?
Aufgabe 5 (2 Punkte): Programmiersprachliche Funktionen sind ein Abstraktionskonzept. Was gehört
zum abstrakten Teil einer Funktion, was zum konkreten?
Aufgabe 6 (2 Punkte): Schreiben sie einen aussagekräftigen Funktionskommentar für
f(x:String):Card::= ?(=(x,““),10,-(f(s_(x)),1))!1
Aufgabe 7 (2 Punkte): Warum sind programmiersprachliche Produkte ohne Projektionen sinnlos?
Aufgabe 8 (1 Punkt): Warum ist der Summentyp Card ++ Card: Card2 sinnlos?
Aufgabe 9 (3 Punkte): Geben Sie die Anzahl der Elemente in den Bedeutungen der folgenden Produktbzw. Summentypen relativ zu der Anzahl n der Elemente in der Bedeutung des Basistyps Card an:
(a) cardCopy(original:Card):CardCopy
(b) card2Times(first:Card,second:Card):Card2Times
(c) Card ++ CardCopy: 2TimesCard
1
s_(x:String):String
liefert x ohne den ersten Buchstaben. Falls x die leere Zeichenkette ist, ist das Ergebnis x.
TEIL II: ANWENDUNG ( 80 MINUTEN)
Aufgabe 10 (6 Punkte): Sie sollen die Funktion produkt(von:Card,bis:Card):Card entwickeln, die
das Produkt der Menge der positiven ganzen Zahlen von <von> ausschließlich bis <bis> einschließlich
berechnet! (Hinweis: Ist die Menge leer soll das neutrale Element bzgl. Multiplikation geliefert werden!)
(a) Geben Sie Testfälle an, die Sie zum Test Ihrer Implementierung benötigen!
(b) Begründen Sie die Wahl!
(c) Ist die Fakultätsfunktion fakultät(x:Card):Card bereits implementiert, kann man die
Implementierung der geforderten Operation durch Verknüpfung zweier passender Falkultäten
realisieren! Wie?
(d) Diese Implementierung ist in bestimmten Fällen unnötig ineffizient. Warum?
(e) Implementieren Sie die Funktion in LOMF effizienter als oben unter (c)!
(f) Nutzen Sie jetzt – gerade umgekehrt zu (c) – Ihre Funktion aus Aufgabe 10 (e) zur Implementierung
der Fakultätsfunktion.
Aufgabe 11 (2 Punkte): Die Standardimplementierung für die Fakultätsfunktion
fakultät(x:Card):Card::= x.=(0).?(1, x.*(x.-(1).fakultät))
kann im LOMF-System die Werte ab einem bestimmten x nicht mehr berechnen, da die Rekursion zu tief
wird. Das geschieht schnell, da die Rekursionstiefe2 linear von x abhängt.
Wenn man die Funktion aus Aufgabe 10 ausnutzt und Zwischenprodukte in zum Beispiel 10-er-Päckchen
berechnet3, kann man die Rekursionstiefe um eine Größenordnung reduzieren und Ergebnisse für
Eingabewerte erhalten, die um eine Größenordnung höher liegen.
(a) Schreiben Sie eine Implementierung der Fakultätsfunktion in LOMF, die diese Idee ausnutzt und zwar
mit fester Päckchengröße!4
(b) Schreiben Sie jetzt eine Implementierung der Fakultätsfunktion in LOMF, der man die Päckchengröße
als Parameter übergeben kann!
Aufgabe 12 (5 Punkte): Normalerweise darf man zwei Ausgänge elektronischer digitaler Schaltungen
nicht verbinden. Man erhält dann immer ein nicht interpretierbares Signal (). Anders ist das bei Tri-StateBauteilen. Hier können Ausgänge drei definierte logische Zustände annehmen, nämlich high, low und open.
(a) Definieren Sie einen Datentyp TriState mit den Werten high, low und open in LOMF!
Schaltet man zwei Ausgänge solcher Tri-State-Bauteile auf eine Leitung, wird das entstehende Signal durch
den Operator triState(x:TriState,y:TriState):TriState mit folgender Spezifikation bestimmt:

Ist x oder y open, dann wird der Wert des jeweils anderen Parameters (also y bzw. x) geliefert.
 Sind beide Parameter – x und y – nicht open, ist der Wert des Operators undefiniert ().
(b) Realisieren Sie den Operator triState in LOMF!
Man kann aber nicht nur 2 solcher Bauteile auf einer Leitung zusammenschalten, sondern beliebig viele.
(c) Definieren Sie den Datentyp TriStateBus als Liste von TriState’s (z.B. als lineare Liste).
Wir wollen jetzt eine solche Liste von TriState’s mit dem zweistelligen Operator triState verknüpfen.
Das soll der Operator mit dem Funktionskopf triStateBus(bus:TriStateBus):TriState erledigen.
Er liefert den TriState, der entsteht, wenn man alle TriState’s in <bus> mit triState verknüpft.
Rekursiontiefe = Maximale Anzahl der gleichzeitig angefangenen und noch nicht fertigen Funktionsanwendungen,
die zur Berechnung des Funktionswertes nötig sind.
3 Die Fakultät von 22 ist z. B. das Produkt von Päckchen1, Päckchen2 und Päckchen3. Dabei ist Päckchen1 das Produkt
der Zahlen von 1 bis 2, Päckchen2 das Produkt der Zahlen von 3 bis 12 und Päckchen3 das Produkt von 13 bis 22.
4 Achtung bei Konstanten Programmierregeln beachten!
2
2
(d) Geben Sie das neutrale Element für den Operator triState an! Es soll garantieren, dass das
Ergebnis nicht undefiniert ist, wenn (i) alle Parameter nicht undefiniert () sind und (ii) höchstens ein
Parameter nicht open ist.
(e) Realisieren Sie die Operation triStateBus in LOMF!
Aufgabe 13 (7 Punkte): Ein hierarchisches, baumartiges Netzwerk besteht aus zwei Arten von Knoten,
nämlich aus Teilnehmern und aus Vermittlungsstellen. Beide haben Adressen in Form von einfachen
Zeichenketten(String). Vermittlungsstellen haben zusätzlich Unterknoten. Es muss folgende
Konsistenzbedingung eingehalten werden:
(*) Die Adressen der Unterknoten einer Vermittlungsstelle sind paarweise verschieden.
(a) (2 Punkte): Definieren Sie LOMF-Datentypen für die Konzepte Knoten, Teilnehmer und Vermittlunsstelle!
(b) (2 Punkte): Zeichnen Sie diese Struktur als UML-Diagramm!
(c) (3 Punkte): Schreiben Sie eine Funktion eindeutigeAdressen?(knoten:Knoten):Bool, die prüft
ob <knoten> und alle seine Unterknoten die Bedingung (*) erfüllen!
(Hinweis: Sie dürfen die logischen Operationen & (und), | (oder) und ! (nicht) voraussetzen.)
TEIL III: TRANSFER (55 MINUTEN)
Aufgabe 14 (2 Punkte): Wir greifen Aufgabe 10 (e) auf. Die Rekursionstiefe lässt sich noch weiter
verringern, wenn man nicht mit festen Päckchengrößen hantiert, sondern ein Verfahren wie etwa bei
Quicksort oder beim schnellen Potenzieren von Zahlen oder Matrizen durch fortwährendes Quadrieren
realisiert! Bei der Implementierung der Funktion produkt(von:Card,bis:Card):Card kann man
schlauer (nicht linear) vorgehen und die Rekursionstiefe auf 2log(x) mit x = <bis> – <von> senken!
Wie?
Aufgabe 15 (3 Punkte): Wir greifen das Szenario aus Aufgabe 13 auf und betrachten die Möglichkeit,
jeden Knoten unterhalb eines Startknotens durch einen Adresspfad der Art „adr1/adr2/.../adrn“ eindeutig
adressieren zu können.5 Mit adri ist für i = 1 ... n jeweils eine Adresse eines direkten Unterknotens gemeint.
Implementieren Sie besorge(start:Knoten, pfad:Adresspfad):Knoten in LOMF, und zwar so, dass
der Knoten als Ergebnis geliefert wird, den man von <start> aus erreicht, wenn man <pfad> folgt.
(Hinweis: Die Qualität Ihrer Implementierung steht und fällt mit der Wahl des richtigen LOMF-Datentyps
für Adresspfade!)
Aufgabe 16 (3 Punkte): Was ist Striktheit? Was ist Laziness? Was haben beide mit einander zu tun?
Aufgabe 17 (2 Punkte):
(a) Auch den Typ Nothing kann man im LOMF-System spezialisieren. Allerdings haben wir das in der
Vorlesung noch nicht gemacht. An welcher Stelle kann das z. B. sinnvoll sein?
(b) Auf der anderen Seite ist es nicht sinnvoll und nötig, den Typ Anything generalisieren zu können.6
Warum nicht?
5
6
Ähnlich wie in einem hierarchischen Dateisystem mit Ordnern.
Geht auch in LOMF nicht!
3
Herunterladen