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 NACHKLAUSUR Studiengang: Mechatronik Studienquartal: I. Theoriequartal Prüfungsumfang: Elemente der Programmierung (Stand 10.12.03) und Musterlösungen Beispielaufgaben. Dozent: Löwe Termin: 7. April 2004 Dauer: 180 Minuten 50 Punkte sind zu erreichen: Wissen 20, Anwendung 20 und Transfer 10 Punkte. Bestanden ab 25 Punkte. TEIL I: WISSEN (40 MINUTEN) Aufgabe 1 (2 Punkte): In welcher Reihenfolge entwickelt man Prozedurköpfe, Prozedurrümpfe und Testfälle als Lösung einer Programmieraufgabe? Aufgabe 2 (2 Punkte): Warum soll man Konstanten benennen und immer symbolisch verwenden? Aufgabe 3 (2 Punkte): Sei P String die Syntax für irgendeine Programmiersprache, die Funktion Sem: P [Anything Anything] die Semantik und I: P Anything Anything ein Interpreter. Was besagt die Gleichung: I(p,e) = Sem(p)(e)? Aufgabe 4 (2 Punkte): Programmfunktionen sind ein Abstraktionskonzept. Wovon wird abstrahiert? Aufgabe 5 (2 Punkte): Schreiben sie einen aussagekräftigen Funktionskommentar für: 1 f(x:String):Card::= ?(=(x,“a“),0,+(f(s_(_s(x))),1)) Aufgabe 6 (2 Punkte): Warum sind Summen in Programmen ohne Funktionsspezialisierung sinnlos? Aufgabe 7 (5 Punkte): Geben Sie die Anzahl der Elemente der Semantik für folgende Datentypen an: (i) a():A , (ii) A ++ A: A2 , (iii) b(x:A):B , (iv) A ++ B: C und (v) d(y:C,z:C):D Aufgabe 8 (3 Punkte): Seien die Datentypen aus Aufgabe 7 gegeben und folgendes Programm: f(x:C,y:C):Card::=1 >>>f(x:A,y:C):Card::=2 >>>f(x:C,y:A):Card::=3 Warum ist das Ergebnis von f(a(),a()) nicht eindeutig bestimmt? Was fehlt? TEIL II: ANWENDUNG ( 80 MINUTEN) Aufgabe 9 (2 Punkte): Sie sollen eine Funktion potenz(x:Card,y:Card):Card entwickeln, die die Potenz xy berechnet! (a) Geben Sie Testfälle an, die Sie zum Test Ihrer Implementierung benötigen! Begründen Sie die Wahl! (b) Implementieren Sie die Funktion in LOMF! Aufgabe 10 (3 Punkte): Eine Funktion ist zu schreiben, die prüft, ob eine natürliche Zahl eine Quadratzahl ist, i. e. das Quadrat einer natürlichen Zahl ist! (a) Wie sieht der Funktionskopf in LOMF aus? (Kommentar nicht vergessen!) (b) Geben Sie Testfälle an, die Sie zum Test Ihrer Implementierung benötigen! Begründen Sie die Wahl! (c) Implementieren Sie die Funktion in LOMF! s_(x:String):String liefert x ohne den ersten Buchstaben. Falls x die leere Zeichenkette ist, ist das Ergebnis x. _s(x:String):String liefert x ohne den letzten Buchstaben. Falls x die leere Zeichenkette ist, ist das Ergebnis x. 1 Aufgabe 11 (3 Punkte): Sie sollen eine Funktion entwickeln, die prüft, ob eine natürliche Zahl „Potenzzahl“ ist, i. e. ganzzahlige Potenz einer anderen natürlichen Zahl ist! (a) Wie sieht der Funktionskopf in LOMF aus? (Kommentar wieder nicht vergessen!) (b) Geben Sie Testfälle an, die Sie zum Test Ihrer Implementierung vorbereiten? Begründen Sie die Wahl! (c) Implementieren Sie die Funktion in LOMF! Aufgabe 12 (5 Punkte): Aus den natürlichen Zahlen Card kann man ganz einfach die ganzen Zahlen Integer machen, indem man ein Vorzeichen (plus oder minus) hinzufügt. (a) (1 Punkt) Definieren Sie einen Datentype Sign, der die Werte plus und minus enthält! (b) (1 Punkt) Definieren Sie nun den Datentyp Integer als geeignete Kombination von Sign und Card! (c) (1 Punkt) Schreiben Sie auf dieser Basis die Betragsfunktion ||(x: Integer):Card in LOMF! (d) (2 Punkte) Schreiben Sie die Addition +++(x:Integer,y:Integer):Integer als LOMF-Funktion! Bei (c) und (d) können Spezialisierungen des Integer-Konstruktors auf die Typen PositiveInteger und NegativeInteger hilfreich sein! Aufgabe 13 (7 Punkte): Alle Dokumente – wie Bücher, Aufsätze oder Diplomarbeiten – haben gemeinsame Gliederungsstrukturen, die wir in dieser Aufgabe modellieren wollen. Wir unterscheiden elementare Absätze, die keine Überschrift haben und aus einem Text bestehen, und zusammengesetzte Abschnitte, die eine Überschrift besitzen und aus eine Liste von Elementen bestehen. Ein Element ist entweder Absatz oder Abschnitt. Überschriften und Texte sind hier nicht weiter strukturierte Zeichenketten (String). (a) (2 Punkte): Definieren Sie LOMF-Datentypen für die Konzepte Absatz, Abschnitt und Element! (b) (2 Punkt): Zeichnen Sie diese Struktur als UML-Diagramm! (c) (3 Punkte): Schreiben Sie eine Funktion print(e:Element):String, die den Inhalt von e ausgibt. Hinweise: Hinter jeder Überschrift und jedem Absatz wird die Zeile gewechselt (toCharacter(10)). Alle anderen Zeilenwechsel und Formatierungen bleiben außer Acht. TEIL III: TRANSFER (60 MINUTEN) Aufgabe 14 (6 Punkte): Wir greifen den Stand der Entwicklung aus Aufgabe 13 wieder auf. Erweitern Sie ihre print-Ausgabe so, dass vor jeder Abschnittsüberschrift die Abschnittsnummer ausgegeben wird! Die Abschnittsnummerierung beginnt immer bei 1. Unterabschnitte werden mit der gebräuchlichen Punkt-Notation nummeriert; also z. B. erhält der 2. Unterabschnitt im 3. Abschnitt die Nummer 3.2. Natürlich werden diese Abschnittsnummer länger, je tiefer die Gliederungshierarchie verschachtelt ist. Nummern wie 3.2.10.5.6 sind also möglich! Formatierungen, wie etwa Zwischenräume zwischen Nummer und Überschrift, sind wieder nicht zu beachten. Setzen Sie bei Ihrer Implementierung eine Funktion asString(x:Card):String für die Darstellung einer natürlichen Zahl als Zeichenkette voraus. (a) (3 Punkte) Geben Sie zunächst einen geeigneten LOMF-Datentyp für die Abschnittsnummern an! (b) (3 Punkte) Schreiben Sie die erweiterte print-Funktion! Aufgabe 15 (2 Punkte): Ein Compiler c: P1 P2 übersetze Texte in einer Programmiersprache P1 mit Semantik Sem1: P1 [Anything Anything] in Texte einer anderen Programmiersprache P2 mit Semantik Sem2: P2 [Anything Anything]. Wann ist der Compiler korrekt? Aufgabe 16 (2 Punkte): Auch den Typ Nothing kann man im LOMF-System spezialisieren. Allerdings haben wir das in der Vorlesung noch nicht gemacht. (a) An welcher Stelle kann das z. B. sinnvoll sein? (b) Warum macht es keinen Sinn mit demselben Typ X sowohl Nothing als auch einen anderen Typ A, der selbst nicht Nothing spezialisiert, zu spezialisieren? 2