Klausur - Informatik I

Werbung
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 -
Herunterladen