Programmiertechnik II Klausur WS 2017/18 Angewandte Informatik Bachelor Name Matrikelnummer Aufgabe Punkte Aufgabe Punkte Zwischensumme 1 10 2 8 3 12 4 20 5 8 58 6 14 7 20 8 12 9 16 Summe 120 Note Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 1/12
Aufgabe 1 (10 Punkte) Die Klasse NameList ist wie folgt definiert. class NameList { public String name; public NameList next; public NameList(String s, NameList l) { this.name = s; this.next = l; a) Beschreiben Sie mit einem Speicherbelegungsbild, was durch folgende Anweisungen geleistet wird: NameList[] namelistarr = new NameList[3]; namelistarr[0] = new NameList("Peter", null); namelistarr[0] = new NameList("Anne", namelistarr[0]); namelistarr[2] = new NameList("Maria", null); namelistarr[2].next = new NameList("Josef", null); b) Was wird auf die Konsole ausgegeben, wenn die Anweisungen aus a) und dann folgende Anweisungen durchgeführt werden. for (NameList list : namelistarr) for (NameList p = list; p!= null; p = p.next) System.out.println(p.name); Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 2/12
Aufgabe 2 (8 Punkte) Die Knoten eines Binärbaums sind durch folgende Klasse definiert: class Node { int data; Node left; Node right; // Referenz auf linkes Kind // Referenz auf rechtes Kind Node(int x, Node l, Node r) { data = x; left = l; right = r a) Der Binärbaum (2) entsteht aus dem Binärbaum (1), indem die Zahl 4 durch 44 ersetzt und ein neuer Knoten mit der Zahl 55 eingefügt wird. Schreiben Sie mit Hilfe der Variablen root genau 2 Java-Anweisungen, die das leisten. b) Der Binärbaum (3) entsteht aus dem Binärbaum (2), indem der rechte Teilbaum der Wurzel root an den Knoten 2 als rechtes Kind eingehängt und dann der Wurzelknoten gelöscht wird. Schreiben Sie genau 2 Java-Anweisungen, die das leisten. Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 3/12
Aufgabe 3 QuickSort (12 Punkte) Das 11-elementige Feld a = {5, 6, 10, 4, 8, 7, 3, 2, 9, 1, 5 wird mit Quicksort ohne 3-Median-Strategie sortiert. Außerdem ist Quicksort so modifiziert, dass Teilfelder mit genau 2 Elementen mit einem einfachen Vertauschungsschritt sortiert werden. Beschreiben Sie, wie sich das Feld a beim Sortieren ändert. Benutzen Sie eine tabellenartige Darstellung wie in der Vorlesung. Geben Sie außerdem die Aufrufstruktur von Quicksort an. 5 6 10 4 8 7 3 2 9 1 5 Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 4/12
Aufgabe 4 Sortierte, verkettete Liste mit Hilfskopfknoten (20 Punkte) Um die Worthäufigkeiten in einem Text zu ermitteln, soll eine Klasse WordCount realisiert werden. WortCount speichert Wörter (Strings) mit ihren Häufigkeiten (int-zahl) in einer linear verketteten Liste mit Hilfskopfknoten. Die Wörter sind nach absteigender Häufigkeit sortiert. a) Definieren Sie einen Konstruktor. b) Schreiben Sie eine Methode add(w), die die Worthäufigkeit von w hochzählt. Kommt das Wort w nicht vor, wird es mit der Häufigkeit 1 eingefügt. Ansonsten wird der Häufigkeitszähler um 1 erhöht. Die Reihenfolge der Wörter in der verketteten Liste kann sich dabei ändern! Hinweis: eine private Methode add(w,h), die eine neues Wort w mit der Häufigkeit h einfügt, ist hilfreich. c) get(i) liefert das (i+1)-häufigste Wort zurück (i = 0: das häufigste Wort, i = 1: zweit-häufigste Wort, etc.). Falls kein solches Wort existiert, dann wird null zurückgeliefert. public class WordCount { static private class Node { private Node next; private String w; // Wort private int n; // Häufigkeit private Node(Node p, String w, int n) { this.n=n; this.w=w; next=p; private Node head; Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 5/12
Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 6/12
Aufgabe 5 Collection (8 Punkte) Ein Verlag gibt mehrere Zeitschriften heraus, die jeweils von mehreren Personen abonniert werden können. Schreiben Sie für die Klasse Verlag eine Methode abonnenten(), die die Menge aller Abonnenten zurückliefert, die irgendeine Zeitschrift dieses Verlags abonnieren. Die im UML-Diagramm aufgeführten Methoden dürfen verwendet werden. Benutzen Sie außerdem geeignete Collection-Typen. public Set<Person> abonnenten() { Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 7/12
Aufgabe 6 Bäume (14 Punkte) Ein Baum besteht aus einem Bezeichner (String) und einer (evtl. leeren) Liste mit Teilbäumen. Auf der nächsten Seite ist eine unvollständig definierte Klasse Baum gegeben. Die Methode main erzeugt den oben abgebildeten Baum. a) Ergänzen Sie die gegebene Klasse um geeignete Instanzvariablen und vervollständigen Sie den Konstruktor. b) Definieren Sie eine Methode add(baum b), die den Baum b zur Liste mit Teilbäumen dazufügt. c) Schreiben Sie eine Methode height(), die die maximale Höhe des Baums zurückgibt. Der oben gezeigte Baum hat die Höhe 2. d) Schreiben Sie eine Methode search(string s) die zurückgibt, wie oft der Bezeichner s im Baum vorkommt. Im oben gezeigten Baum kommt der Bezeichner aa dreimal vor. Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 8/12
class Baum { public Baum(String bez) { // Neuer Baum mit Bezeichner bez public void add(baum b){ public int height() { public int search(string bez) { public static void main(string[] args) { Baum b = new Baum("aa"); Baum b1 = new Baum("bb"); b.add(b1); b.add(new Baum("cc")); b.add(new Baum("dd")); b1.add(new Baum("aa")); b1.add(new Baum("aa")); Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 9/12
Aufgabe 7 Java-Collections (20 Punkte) Für ein Buchhaltungsprogramm ist eine Klasse Ausgabe (beschaffter Artikel, Anschaffungsjahr und Kosten) definiert. a) Schreiben Sie eine Methode getjahresausgaben(list), die für eine Liste list von Ausgaben die Jahresausgaben erstellt und zurückliefert. Die Jahresausgaben werden durch eine Map realisiert, die für jedes Jahr die Summe aller Ausgaben speichert. b) Schreiben Sie eine Methode printjahresausgaben(ja), die mittels einer Schleife für ja die Ausgaben für jedes Jahr in einer Zeile ausgibt. c) Schreiben Sie eine Methode printjahresausgabennachkostensortiert(ja), die die Jahresausgaben ja nach den Kosten absteigend sortiert ausgibt. Kopieren Sie dazu ja in eine Liste, die dann mit einem sort-aufruf geeignet sortiert und ausgegeben wird. class Ausgabe { public String artikel; public int jahr; public double kosten; // Jahr, in dem der Artikel gekauft wurde // Artikel-Kosten public static Map<Integer, Double> getjahresausgaben(list<ausgabe> list) { public static void printjahresausgaben(map<integer, Double> ja) { public static void printjahresausgabennachkostensortiert(map<integer, Double> ja) { Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 10/12
Aufgabe 8 Subtyping (12 Punkte) a) Die Methode copy(dest, src) aus der Klasse Collections kopiert alle Elemente aus der Liste src in die Liste dest. static <T> void copy(list<? super T> dest, List<? extends T> src) Von welchem Typ dürfen die Parameter sein? Kennzeichnen Sie dazu in folgender Tabelle die korrekten Parametertypen mit +. dest src Korrekt? List<Integer> LinkedList<Number> List<Integer> LinkedList<Integer> LinkedList<Object> ArrayList<Double> ArrayList<Double> ArrayList<Integer> LinkedList<Number> List<Integer> Set<Object> List<Integer> ArrayList<Integer> List<Integer> b) Die Klassen Kreis, Quadrat und Figur seien wie folgt definiert: class Figur {... class Kreis extends Figur implements Comparable<Kreis> {... class Quadrat extends Figur implements Comparable<Quadrat> {... Geben Sie für diese drei Typen alle Untertypbeziehungen an. Berücksichtigen Sie dabei die Klasse Object. c) Welche Parametertypen sind beim Aufruf der Methode sort aus der Klasse Collections erlaubt? Kennzeichnen Sie dazu in folgender Tabelle die korrekten Parametertypen mit +. static <T extends Comparable<? super T>> void sort(list<t> l); Parametertyp Korrekt ( + oder - )? ArrayDeque<Kreis> LinkedList<Kreis> ArrayList<Figur> ArrayList<Quadrat> List<Object> List<? extends Kreis> Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 11/12
Aufgabe 9 Java 8 (16 Punkte) Gegeben ist die Klasse LV für Lehrveranstaltungen und eine Liste lvlist von Lehrveranstaltungen: class LV { public String name; public int sem; // Semester, in dem die LV stattfindet public int anzstud; // Anzahl Studierende in der LV LV(String n, int s, int n) {name = n; sem = s; anzstud = n; LinkedList<LV> lvlist = new LinkedList<>(); lvlist.add(new LV( Prog2,2,30)); lvlist.add(new LV( Prog1,1,50)); // a) Definieren Sie ein Prädikat istgross, das prüft, ob eine Lehrveranstaltung mehr als 40 Studierende hat. b) Definieren Sie ein 2-stelliges Prädikat findetstatt, das prüft, ob die Lehrveranstaltung lv im Semester sem stattfindet. c) Schreiben Sie einen removeif-aufruf, der aus der Liste lvlist alle Lehrveranstaltungen entfernt, die nicht im 2. Semester stattfinden. Verwenden Sie dabei das Prädikat findetstatt aus b). d) Erzeugen Sie aus der Liste lvlist einen Strom und berechnen Sie die Anzahl der großen Lehrveranstaltungen. Verwenden Sie dabei das Prädikat istgross aus a). e) Erzeugen Sie aus der Liste lvlist einen Strom und berechnen Sie die Anzahl der Studierende, die im zweiten Semester studieren. Verwenden Sie dabei das Prädikat findetstatt aus b). Prof. Dr. O. Bittel, HTWG Konstanz WS 2017/18 12/12