Programmiertechnik II Klausur SS 2017 Angewandte Informatik Bachelor Name Matrikelnummer Aufgabe Punkte Aufgabe Punkte Zwischensumme 1 6 2 8 3 14 4 22 5 16 66 6 24 7 13 8 17 Summe 120 Note Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 1/13
Aufgabe 1 (6 Punkte) Beschreiben Sie mit einem Speicherbelegungsbild, was durch die main-methode geleistet wird. Es genügt das Speicherbelegungsbild anzugeben, nachdem alle Anweisungen der main-methode ausgeführt worden sind. class Node { Node next; int data; Node(int x, Node p) { next = p; data = x; public static void main(string[] a) { Node p = new Node(3, null); p = new Node(5, p); Node q = p; q.next = new Node(2, q.next); p = p.next; Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 2/13
Aufgabe 2 (8 Punkte) Für Knoten einer linear verketteten Liste sei folgende Klasse definiert: class Node { Node next; int data; Node(Node n, int x) { next = n; data = x Die folgende Abbildung zeigt drei verschiedene Zustände einer linear verketteten Liste. begin zeigt auf den ersten Knoten und end zeigt auf den letzten Knoten. a) Schreiben Sie eine Folge von Anweisungen, die die Liste von Zustand (1) in Zustand (2) überführt. Verwenden Sie keine Schleife und benutzen Sie nur die Variable end. b) Schreiben Sie eine Folge von Anweisungen, die die Liste von Zustand (2) in Zustand (3) überführt. Verwenden Sie keine Schleife und benutzen Sie nur die Variablen begin und end. Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 3/13
Aufgabe 3 QuickSort mit 3-Median-Strategie (14 Punkte) Das 12-elementige Feld a = {15, 12, 2, 20, 10, 8, 7, 1, 4, 11, 6, 13 wird mit Quicksort mit 3-Median- Strategie sortiert. Beschreiben Sie, wie sich dabei das Feld a ändert. Benutzen Sie eine tabellenartige Darstellung wie in der Vorlesung. Geben Sie außerdem die Aufrufstruktur von Quicksort an. Die 3-Median-Strategie soll dabei wie folgt umgesetzt werden: Sortieren Sie die 3 Zahlen a[li], a[m] und a[re] mit m = (li+re)/2 (a[li] ist das Element am linken Rand, a[m] ist das Element in der Mitte und a[re] ist das Element am rechten Rand). Vertauschen Sie dann a[m] mit a[re]. Die 3-Median-Strategie darf in einem Schritt durchgeführt werden (d.h. eine Zeile in der Tabelle). Außerdem soll folgende Vereinfachung berücksichtigt werden: Besteht das zu sortierende Teilfeld nur aus 2 oder 3 Elementen, dann darf das Teilfeld durch einfache Vertauschungsschritte sortiert werden. Die Vertauschungen dürfen in einem Schritt durchgeführt werden (d.h. eine Zeile in der Tabelle). 15 12 2 20 10 8 7 1 4 11 6 13 Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 4/13
Aufgabe 4 Linear verkettete Liste (22 Punkte) Eine Liste von Variablennamen mit ihren int-werten soll in einer linear verketteten Liste ohne Hilfskopfknoten verwaltet werden. Wird auf einen Variablenamen zugegriffen, so rückt der entsprechende Eintrag an den Listenanfang. Damit kann ein späterer Zugriff auf den gleichen Variabennamen effizienter erfolgen (most recently used name list). Definieren Sie folgende Methoden: a) add(n,v) fügt einen neuen Eintrag mit Name n und Wert v an den Anfang der Liste. Kommt der Name n in der Liste bereits vor, dann bleibt die Liste unverändert. b) get(n) liefert den Wert der Variablen mit Name n zurück. Falls der Name n nicht vorkommt wird null zurückgeliefert. Falls n vorkommt, dann rückt der entsprechende Eintrag an den Anfang der List. public class MRUNameList { static private class Node { private String name; // Variabenname // Wert der Variablen private int value; private Node next; private Node(String n, int v, Node p) { name=n; value=v; next=p; private Node head = null; public void add(string n, int v) { public Integer get(string n) { Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 5/13
c) Wie muss die Klasse ergänzt werden, damit die gegebene statische Methode print(l) alle Variablennamen der Liste l ausgibt. Geben Sie nur den nötigsten Code an! public class MRUNameList { // s. o. public static void print(mrunamelist l) { for (String n : l) System.out.println(n); Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 6/13
Aufgabe 5 Bäume (16 Punkte) Es sollen arithmetische Ausdrücke mit "+", "*" und int-zahlen als baumartige Strukturen dargestellt werden. Beispielsweise lässt sich der arithmetische Ausdruck (2+3)*4 durch folgenden Baum darstellen: Für die Knoten dieser Bäume steht eine Java-Klasse Expr (expression) zur Verfügung. Es gibt zwei Arten von Knoten: Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 7/13
Operator-Knoten: val ist vom Typ String und hat den Wert "+" oder "*". Die beiden Referenzen left und right (linker und rechter Operand) müssen ungleich null sein. Operanden-Knoten: val ist vom Typ Integer und gibt den Operanden an. Die beiden Referenzen left und right müssen null sein. Beachten Sie, dass der Typ von val Object ist. Damit ist sowohl der String-Typ als auch der Integer-Typ kompatibel. Die Methode main baut den oben gezeigten Ausdruck p = (2+3)*4 auf. class Expr { public Object val; public Expr left; public Expr right; public Expr(Expr e1, Expr e2, Object v){ left = e1; right = e2; val = v; public static void main() { Expr a = new Expr(null,null,2); // Operand 2 Expr b = new Expr(null,null,3); // Operand 3 Expr c = new Expr(null,null,4); // Operand 4 Expr s = new Expr(a,b,"+"); Expr p = new Expr(s,c,"*"); // Summe // Produkt System.out.println(countOp(p)); // 2 System.out.println(eval(p)); // 20 a) Schreiben Sie eine rekursive Methode countop(expr), die die Anzahl der Operatoren in expr zählt. Beispielsweise ergibt countop(p) den Wert 2. expr!=null darf vorausgesetzt werden. b) Schreiben Sie eine rekursive Methode eval(expr), die den Ausdruck expr auswertet. Beispielsweise ergibt eval(p) den Wert 20. expr!=null darf vorausgesetzt werden. Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 8/13
static int countop(expr e) { static double eval(expr e) { Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 9/13
Aufgabe 6 Java-Collections (24 Punkte) In der Klasse Info wird die Information festgehalten, dass ein Mitarbeiter in einem Projekt eine bestimmte Programmiersprache eingesetzt hat. Mitarbeiter werden durch ihre Personalnummer und Programmiersprachen durch einen String (z.b. "Java") dargestellt. class Info { public int mnr; // Personalnummer des Mitarbeiters; public String ps; // Programmiersprache; public Info(int n, String s) { mnr = n; ps = s; Folgendes Beispiel zeigt, wie eine kleine Info-Liste aufgebaut sein kann. Mitarbeiter mit Personalnummer 1 hat "Java" und "C/C++" eingesetzt und Mitarbeiter mit Personalnummer 2 hat "Python" und "Java" eingesetzt. List<Info> list = new LinkedList<>(); list.add(new Info(1, "Java")); list.add(new Info(2, "Python")); list.add(new Info(2, "Java")); list.add(new Info(1, "C/C++")); Definieren Sie auf der nächsten Seite die folgenden Methoden: a) Schreiben Sie eine statische Methode getprogspr(list), die für eine Info-Liste list eine Menge (Set) von Programmiersprachen zurückliefert, die in list vorkommen. b) Schreiben Sie eine Methode getmapmatops(list), die für eine Info-Liste list eine Map zurückliefert, die zu jedem Mitarbeiter die Menge aller Programmiersprachen abspeichert, die dieser Mitarbeiter schon eingesetzt hat. c) Schreiben Sie eine Methode getmappstoma(mapmatops). Die Methode bekommt mit dem dem Parameter mapmatops eine Map übergeben, die zu jedem Mitarbeiter die Menge aller eingesetzten Programmiersprachen abspeichert. Die Methode liefert eine Map zurück, die zu jeder Programmiersprache, die Menge der Mitarbeiter abspeichert, die diese Programmiersprache bereits eingesetzt haben. Die Methode berechnet damit die invertierte Map. Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 10/13
static Set<String> getprogspr(list<info> list){ static Map<Integer,Set<String>> getmapmatops(list<info> list){ static Map<String,Set<Integer>> getmappstoma(map<integer,set<string>> mapmatops){ Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 11/13
Aufgabe 7 Subtyping (13 Punkte) Gegeben sind die 5 Klassen Spiel, Brettspiel, Kartenspiel, Skat und Doppelkopf mit folgenden Untertypbeziehungen: a) Eine Methode zum Ausgeben von Spielen ist in zwei Versionen definiert. Von welchem Typ muss der Parameter spieleliste sein, damit ein Aufruf der Methode korrekt typisiert ist. Kennzeichnen Sie in folgender Tabelle die korrekten Aufrufe mit "+". static void print_v1(list<spiel> spieleliste) {... static void print_v2(list<? extends Spiel> spieleliste) {... Typ von spieleliste print_v1(spieleliste) print_v2(spieleliste) Set<Spiel> LinkedList<Skat> ArrayList<Spiel> List<Object> Collection<Spiel> List<Kartenspiel> b) Die statische Methode copy kopiert alle Kartenspiele aus der Liste src in die Liste dest. static void copy(list<? super Kartenspiel> dest, List<? extends Spiel> src) Von welchem Typ müssen die Parameter dest und src sein, damit ein Aufruf der Methode korrekt typisiert ist. Kennzeichnen Sie in folgender Tabelle die korrekten Aufrufe mit "+". Typ von dest Typ von src LinkedList<Object> List<Brettspiel> ArrayList<Skat> Collection<KartenSpiel> List<Spiel> ArrayList<Spiel> LinkedList<Kartenspiel> List<Brettspiel> LinkedList<Object> Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 12/13
Aufgabe 8 Java 8 (17 Punkte) Gegeben ist die Klasse Point für Punkte in der Ebene und eine Liste plist von 3 Punkten: class Point { public double x; public double y; public Point(double x, double y) {this.x = x; this.y = y; public String tostring() {return "Point{" + "x=" + x + ", y=" + y + ''; List<Point> plist = Arrays.asList(new Point(2,3), new Point(1,2), new Point(0,1)); a) Definieren Sie eine Funktion dist vom Typ Function als Lambda-Ausdruck, die den Abstand eines Punkts zum Ursprung zurückliefert. Hinweis: für den Punkt (x,y) ist der Abstand zum Ursprung x " + y " b) Definieren Sie ein Prädikat leone vom Typ Predicate, das mit Hilfe der Funktion dist prüft, ob ein Punkt im Einheitskreis liegt. Hinweis: für Punkte im Einheitskreis ist die Distanz 1. c) Schreiben Sie einen Aufruf, der die Liste der Punkte plist nach ihren Distanzen zum Ursprung sortiert. Ergänzen Sie folgenden sort-aufruf um einen geeigneten Lambda-Ausdruck. Die Funktion dist darf verwendet werden. plist.sort( ); d) Erzeugen Sie aus der Punkteliste plist einen Strom und führen Sie folgende Strom- Operationen durch: alle Punkte, die im Einheitskreis liegen, mittels der filter-methode entfernen alle Punkte mit Hilfe der map-methode durch ihre Distanzen ersetzen sortieren und ausgeben der Distanzen. Die Funktion dist aus a) und das Prädikat leone aus b) dürfen verwendet werden. e) Ergänzen Sie folgende Stromverarbeitung um Operationen, so dass eine Folge von Punkten (0,0), (1,1),... (99,99) ausgegeben wird. Stream.iterate(0, x -> x+1).foreach(system.out::println); Prof. Dr. O. Bittel, HTWG Konstanz SS 2017 13/13