Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape Klausur - Informatik I – SS 05 Aufgabe Punkte 1 40 2 30 Gesamtpunkte (max. 120): 3 40 4 10 Note: Bearbeitungszeit 120 Minuten Keine Hilfsmittel Tragen Sie als erstes Ihren vollständigen Namen und Ihre Matrikelnummer ein. Name: Matrikelnummer: Fragen Sie bei Unklarheiten in der Aufgabenstellung sofort nach. Tragen Sie Ihre Lösungen nur in diese Aufgabenblätter ein und verwenden Sie auch die Rückseite (mit Bezug zur Teilaufgabe). Sollte der Platz nicht ausreichen, so erhalten Sie weitere Blätter. Geben Sie alle Aufgabenblätter ab. Falls Sie die Heftung der Klausur entfernen, dann schreiben Sie bitte auf jedes einzelne Blatt Ihren Namen und Matrikelnummer. Verwenden Sie keine Bleistifte und keine rote Farbe. Halten Sie Ihren Studentenausweis zur Kontrolle bereit. - 1 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape 1. UML, Java a) (12 Punkte) Beschreiben Sie folgenden Sachverhalt mit einem UML Klassendiagramm. Halten Sie sich bei Ihrem Entwurf an die Java Namenskonventionen. In einem Webshop sollen Produkte verkauft werden. Ein Produkt hat einen Namen, einen Einzelpreis exklusive Mehrwertsteuer und eine Bestellnummer. Die Verkaufswährung ist Euro. Jedes Produkt unterliegt genau einem Mehrwertsteuersatz (derzeit 16% oder reduzierte Mehrwertsteuer 7.5%). Der Mehrwertsteuersatz kann sich unabhängig vom Produkt ändern (z.B. von 16% auf 18% steigen). Kunden, die im Webshop einkaufen, können die angebotenen Produkte in einem Warenkorb sammeln. Der Warenkorb enthält aber nicht die Produkte selbst, sondern jeweils ein Angebot des Produkts in einer bestimmten Menge und zu einem bestimmten Einzelpreis (exklusive Mehrwertsteuer). Der Einzelpreis des Angebots ist normalerweise identisch mit dem des angebotenen Produkts, aber durch Rabatte kann der Preis im Angebot durchaus vom Produktpreis verschieden sein. Produkte sollen in einer bestimmten Menge zu einem Warenkorb hinzugefügt oder weggenommen werden können (es werden dann daraus Angebote). Rabatte und Kunden, spielen für diese Aufgabe selbst keine Rolle. Der Gesamtpreis eines Warenkorbs inklusive und exklusive Mehrwertsteuer soll berechnet werden können. Der Gesamtpreis wird beim Warenkorb nie als Attribut gespeichert. Warenkorb +getGesamtpreis() : double +getGesamtpreisInclMwst() : double +addProdukt(produkt : Produkt, int menge) : void +removeProdukt(produkt : Produkt, int menge) : void * -angebote[] Angebot Produkt -name : String -bestellnummer : String -einzelPreis : double 1 -produkt 1 -mwst Mehrwertsteuersatz -prozent : double - 2 von 12 - -anzahl : int -einzelPreis : double Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape b) (8 Punkte) Geben Sie für Ihre Klassen jeweils einen kurzen und spezifischen Kommentar an (nur der Text, keine Javadoc Tags). Klasse Kommentar Mehrwertsteuersatz Ein Mehrwertsteuersatz mit den Steuern in Prozent. Produkt Ein Produkt mit Namen, einer Bestellnummer, und einem Einzelpreis sowie genau einem Mehrwertsteuersatz. Angebot Ein Angebot einer Anzahl eines Produktes zu einem Einzelpreis. Warenkorb Ein Warenkorb mit mehreren Produktangeboten. c) (12 Punkte) Implementieren Sie die Methode zur Berechnung des Gesamtpreises inklusive Mehrwertsteuer. Gehen Sie davon aus, dass 1-n Beziehungen mit Feldern implementiert sind und dass es für alle Attribute die üblichen getter- und setter-Methoden gibt. Die Methode darf in keinem Fall eine NullPointerException werfen. public double getGesamtpreis() { double gesamtpreis = 0.0; for (int i=0; produkte != null && i < produkte.length; i++) { if (produkte[i] != null) { Mehrwertsteuer mwst = produkte[i].getMehrwertsteuer(); if (mswt != null) { gesamtpreis += produkte[i].getEinzelPreis() * (1.0 + mwst.getProzent()/100.0); } } } return gesamtpreis; - 3 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape d)(8 Punkte) Implementieren Sie eine JUnit-Testmethode, die überprüft, ob bei einem Warenkorb mit einem Produktangebot zu einem Nettopreis von 200 Euro und Mengenanzahl 3 sowie Mehrwertsteuersatz 16% der richtige Gesamtpreis (200 * 3 * 1.16 = 696 Euro) berechnet wird. Sie können davon ausgehen, dass für jede Klasse neben den getter- und setter-Methoden immer ein Konstruktor mit allen Attributen als Parameter existiert. Sie brauchen nicht die ganze JUnit-Klasse implementieren, nur die Testmethode. Der Testfall muss auch bei kleinen Ungenauigkeiten in der Zahlendarstellung korrekte Ergebnisse liefern. public void testGetGesamtpreis() { Warenkorb warenkorb = new Warenkorb(); Produkt produkt = new Produkt(200.0, 3, “Studentenfutter“); produkt.setMwst(new Mehrwertsteuer(16.0)); } assertTrue(warenkorb.getGesamtpreis() - 696.0 < 0.00001); - 4 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape 2. Sortieren a) (6 Punkte) Führen Sie bei der nachstehenden Zahlenfolge den ersten Durchlauf von Bubblesort durch. Geben Sie nach jeder einzelnen Vertauschoperation jeweils den Zwischenzustand des teilsortierten Feldes an. Benutzen Sie dazu die folgenden Felder. 7 4 9 6 1 7 2 4 3 7 4 9 6 1 7 2 3 4 7 4 9 6 1 2 7 3 4 7 4 9 1 6 2 7 3 4 7 4 1 9 6 2 7 3 4 7 1 4 9 6 2 7 3 4 1 7 4 9 6 2 7 3 4 b ) (4 Punkte) Ein Sortierverfahren heißt stabil, wenn bei jeder zu sortierenden Folge von Elemente die ursprüngliche Reihenfolge gleicher Elemente in der sortieren Folge beibehalten wird. Im folgenden Beispiel kommt die 3 zweimal vor: die unterstrichene 3 vor der „normalen“ 3. Nach Sortierung mit einem stabilen Sortieralgorithmus muss die unterstrichne 3 vor der anderen 3 auftreten: 5 3 6 2 3 1 1 2 3 3 5 6 Wenn folgende Zahlen mit einem stabilen Sortierverfahren sortiert werden, wie sieht die resultierende Reihenfolge der Zahlen aus? Geben Sie die sortierte Zahlenfolge an und ziehen Sie Pfeile von der ursprünglichen Zelle zur Zelle in der sortieren Folge. 7 4 2 5 4 1 5 4 1 2 4 4 4 5 5 7 - 5 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape c ) (6 Punkte) Ist Bubblesort ein stabiles Sortierverfahren? Begründen Sie Ihre Antwort. Wenn ja, was muss bei der Implementierung von Bubblesort beachtet werden, damit es stabil ist. Bubblesort ist stabil. Das kleinste Element wandert so weit nach links bis es auf das nächst kleinere trifft. Treffen zwei gleiche Elemente aufeinander, so dürfen Sie nicht vertauscht werden, damit die Implementierung stabil ist. d) (8 Punkte) Ist Quicksort ein stabiles Sortierverfahren? Begründen Sie Ihre Antwort. Wenn ja, was muss bei der Implementierung von Quicksort beachtet werden, damit es stabil ist. Quicksort ist nicht stabil. Bei der Partitionierung wird von links nach rechts gewandert bis ein Element gefunden wird, das größer oder gleich dem Pivot Element ist (analog von rechts nach links). Dann werden beide Elemente ausgetauscht. Man betrachte die Folge zweier Zahlen 1 und 1. Pivot Element ist 1. Der linker beziehungsweise der rechte Zeiger treffen sofort auf ein Elemente größer beziehungsweise kleiner als das Pivot Element. Die beiden 1en werden miteinander vertauscht. Danach werden die beiden Zeiger aufeinander zubewegt, überkreuzen sich und das Verfahren endet. Wie aus der Vorlesung bekannt muss allerdings bei einem Element kleiner oder gleich angehalten werden, da ansonsten nicht jede Folge richtig sortiert würde. - 6 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape e) (6 Punkte) Man betrachte Folgen von Zahlen, die zum größten Teil aufsteigend sortiert sind. Sie sollen zwischen zwei verschiedenen Implementierungen von Quicksort wählen. Beide unterscheiden sich nur in der Wahl des Pivot-Elements: 1. Die erste Implementierung wählt immer die erste Zahl des zu partitionierenden Bereichs aus, 2. die zweite Implementierung wählt immer die Zahl in der Mitte aus. Für welche Implementierung entscheiden Sie sich und warum? Für die zweite Variante, da sie einen wesentlich geringeren Zeitaufwand bei teilsortierten Zahlen hat. Bei der ersten Variante wird sehr oft die kleinste Zahl als Pivot Element gewählt und das linke Teilproblem hat dann die Größe, das Rechte die Größe n-1. Der resultierende Zeitaufwand ist O(n2). Bei der zweiten Variante wird sehr oft die mittlere Zahl als Pivot Element gewählt, die resultierenden zwei Teilprobleme sind dann etwa gleich groß. Er resultierende Zeitaufwand ist O(n log2n). - 7 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape 3. Rekursion Gegen sei folgende rekursiv definierte Funktion. 1 ,n =1 f ( n) = f (n − 1) * f (n − 1) , n > 1 a) (6 Punkte) Schreiben Sie eine rekursive Java Methode, die obige Funktion nach dem gegebenen rekursiven Schema berechnet, ohne irgendwelche Berechnungen zwischenzuspeichern und ohne weitere Vereinfachungen. public int if (n == return } else { return } } getF(int n) { 1) { 1; f(n-1) * f(n-1); b) (2 Punkte) Um welchen Typ von Rekursion handelt es sich? Verzweigende Rekursion. - 8 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape c) (4 Punkte) Geben Sie die Rekurrenzgleichung an, die das Zeitverhalten Ihrer Methode im schlimmsten Fall definiert. T(n) = c, falls n = 1 ist T(n) = 2T(n-1) + c für n > 1 d) (2 Punkte) Geben Sie den Zeitaufwand Ihrer Implementierung an? (Ohne Beweis) O(2n) - 9 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape e) (8 Punkte) Geben Sie die ersten fünf rekursiven Aufrufe für n=3 als Aufrufbaum mit Wurzel f(3) an sowie den Zustand des Laufzeitkellers, wenn der letzte Aufruf noch nicht mit return beendet wurde. Der erste (nicht rekursive) Aufruf der Methode zählt mit zu den fünf Aufrufen dazu. f(3) Aufrufbaum: f(2) f(2) f(1) f(1) Laufzeitkeller: n=2 n=3 f) (6 Punkte) Implementieren Sie eine nicht rekursive Methode, die f(n) berechnet. Der Zeitaufwand ihrer Implementierung darf O(n) nicht überschreiten. public int getF(int n) { return 1; } - 10 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape g) (12 Punkte) Wir setzen bei obiger rekursiven Definition f(1) = 2 (statt f(1) = 1). Geben Sie eine nicht rekursive Implementierung an, die f(n) berechnet. Der Zeitaufwand Ihrer Implementierung darf wieder O(n) nicht überschreiten. public int getF(int n) { int ergebniss = 2; while (n>1) { ergebniss = ergebniss * ergebniss; n--; } return ergebniss; } - 11 von 12 - Hochschule Karlsruhe – Klausur Informatik I – Prof. Dr. Christian Pape 4. UTF-8 a) (6 Punkte) Geben Sie folgende UTF-8 Codierung eines Unicodezeichens. Geben Sie das zugehörige Unicodezeichen in Hexadezimaldarstellung an. Geben Sie jeden Einzelschritt Ihrer Berechnung an. 11101100 10010010 10001101 11101100 10010010 10001101 1100 0100 1000 1101 (2P) D48E (2P) b) (4 Punkte) Stellt folgende Folge von Bits ein gültige UTF-8 codiertes Unicodezeichen dar? Begründen Sie Ihre Antwort. 1100 0001 1001 1001 Nein (1P) , da das codierte Unicodezeichen 1011001 sieben Bit lang ist und damit mit dem Schema 0xxx xxx codiert werden müsste. (2P) - 12 von 12 -