Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Prüfungen im Bachelor-Studium (1. - 5. Semester) » pfp » Aufgabe 1: Wissensfragen
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
pruefungen:bachelor:pfp:loesungss13 [17.07.2014 13:16] – Alicen | pruefungen:bachelor:pfp:loesungss13 [18.02.2017 22:38] (aktuell) – kafalk | ||
---|---|---|---|
Zeile 12: | Zeile 12: | ||
==== Aufgabe 2: Petri-Netze ==== | ==== Aufgabe 2: Petri-Netze ==== | ||
- | (Wer das hier mit Zeichnungen vervollständigen möchte, darf das gerne tun!) | + | (Das originale Word-Dokument zum Bild habe ich auch hier in denselben Namensraum zwecks etwaigen Änderungen hochgeladen.) |
- | a) | + | {{: |
- | Wenn man auch ein Token ergänzen darf: | + | |
- | Mit einer erneuten Stelle ergänzen. von t1 und t3 zur Stelle hin, von der Stelle zu t2 und t4. | + | * a) (Mindestens? |
- | Wenn man Beschränkungen hinzufügen darf, mit einer Stelle mit Beschränkung 1, | + | - Oben links: Wenn man auch ein Token ergänzen darf: Mit einer erneuten Stelle ergänzen. von t1 und t3 zur Stelle hin, von der Stelle zu t2 und t4. |
- | dann von t2 und t4 zur Lockstelle, von der Lockstelle zu t1 und t3. | + | - Oben rechts: |
+ | - Unten links: Ohne Token und Beschränkung Version II: p4 zu t2 und p2 zu t4, jeweils als Doppelpfeil. | ||
+ | - Unten rechts: Ohne Token und Beschränkung: | ||
- | Ohne Token und Beschränkung: | + | * b) |
- | p4 zu t2, p2 zu t4, t1 zu p4, t3 zu p2 | + | |
- | (Praxisfern) | + | |
- | S = ( 0, 1, 1, 0, 0, 0)(Traversiert) | + | S = ( 0, 1, 1, 0, 0, 0)(Transponiert) |
| | ||
Zeile 35: | Zeile 35: | ||
0 | 0 | ||
- | c) | + | * c) |
Nein. Durch t4-> | Nein. Durch t4-> | ||
- | d) | + | * d) |
t4-> | t4-> | ||
- | ====Augabe | + | ====Aufgabe |
a) | a) | ||
- | for(int i = 0; i < nStages; i++){ | + | |
+ | boolean lastThread = (i == threads.length - 1); | ||
+ | |||
+ | inQueue< | ||
+ | |||
+ | outQueue< | ||
+ | |||
+ | threads[i] = new StageThread(i, | ||
+ | threads[i].start(); | ||
+ | } | ||
- | boolean lastThread = (i == threads.length - 1); // | + | b) |
- | inQueue<Integer> = queues[i]; | + | 2) Integer |
- | outQueue< | ||
- | threads[i] = new StageThread(i, | + | 3) outQueue.put(runStage(value)); |
- | threads[i].start(); | + | |
+ | |||
+ | 4) if(!lastThread) outQueue.put(value); | ||
+ | |||
+ | return; break auch möglich! | ||
+ | |||
+ | ==== Aufgabe 4: Schreibtischlauf ==== | ||
+ | |||
+ | a) | ||
+ | Siehe Zeile 11-12: Prüfe-Handle-Wettlaufsituation. | ||
+ | Beide bekommen die Mitteilung, dass das Lock frei ist. | ||
+ | Eine Behebung des Problems wäre beispielsweise über ein synchronized(this) um das If möglich. | ||
- | } | ||
b) | b) | ||
- | 2) Integer value = inQueue.take(); | + | Wenn f==t ist, dann wird zweimal aufs gleiche Konto und somit aufs gleiche Lock zugegriffen wird. Dann bekommt man eine IllegalMonitorStateException. |
- | 3) outQueue.put(runStage(value)); | ||
- | 4) if(!lastThread) outQueue.put(value); | + | c) |
- | return; //break auch möglich! | + | in 59-60: Deadly Embrace: |
+ | Thread A will von Konto X zu Konto Y buchen, Thread B von Y zu X. Beide lokcen in 59 das erste Konto und warten in 60 auf das zweite Konto, dass sie aber nie bekommen können, da der andere Thread es besitzt. | ||
+ | Möglichkeiten zur Behebung: Globale Ordnung über die Nummer des Kontos, oder Synchronized auf ein Objekt. | ||
+ | d) | ||
+ | in 71 kann das Geld abgefragt werden, danach wird die Bank unlocked. In withdraw kann Geld von einem Konto geändert werden, dass in der obigen Funktion bereits angeschaut und das Geld aufaddiert worden ist. Die Beträge sind dann unterschiedlich. | ||
+ | |||
+ | Gefixt über B.L.unlock() von 72 am Ende der Funktion. | ||
+ | |||
+ | |||
+ | ==== Aufgabe 5: Collatz ==== | ||
+ | |||
+ | **a)** | ||
+ | def construct: (Int => Boolean) => (Int => Int, Int => Int) => Int => Int = | ||
+ | i => (e, o) => n => if(i(n)) e(n) else o(n) | ||
+ | |||
+ | **b)** | ||
+ | def f: Int => Stream[Int] = n => n #:: f(c(n)) | ||
+ | |||
+ | **c)** | ||
+ | // toList vor foldLeft ist optional, Stream bietet auch diese Funktion | ||
+ | def oddCount: (Int, Int) => Int = (n, k) => f(n).take(k).toList.foldLeft(0)( (a, b) => if(isEven(b)) a else a+1) | ||
==== Aufgabe 6: Scala / Graphen faerben ==== | ==== Aufgabe 6: Scala / Graphen faerben ==== | ||
Zeile 84: | Zeile 121: | ||
def getFreeColor: | def getFreeColor: | ||
+ | |||
+ | Alternativ mit dropWhile: | ||
+ | |||
+ | def getFreeColor: | ||
+ | |||
+ | Rekursive Alternative: | ||
+ | |||
+ | def getFreeColor: | ||
+ | if (cs.contains(0)) { | ||
+ | getFreeColor(cs.map(_-1)) + 1 | ||
+ | } | ||
+ | else { | ||
+ | 0 | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Oder mit foldLeft | ||
+ | |||
+ | def getFreeColor: | ||
+ | list.foldLeft(0)((a, | ||
+ | |||
**b)** | **b)** | ||
def colorGraph: List[Node] => List[Coloring] => List[Coloring] = { | def colorGraph: List[Node] => List[Coloring] => List[Coloring] = { | ||
- | case Nil => cols => cols | + | nod => cols => nod match { |
- | | + | case Nil => cols |
- | | + | case n::ns=> colorGraph(ns)(nextFreeColor(cols)(n):: |
+ | } | ||
+ | } | ||