Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Prüfungen im Bachelor-Studium (1. - 5. Semester) » pfp » Aufgabe 1 (Wissensfragen)   (Übersicht)

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige ÜberarbeitungVorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
pruefungen:bachelor:pfp:loesungws12 [16.07.2014 10:38] lemurpruefungen:bachelor:pfp:loesungws12 [01.08.2017 19:45] (aktuell) ab21ajus
Zeile 1: Zeile 1:
 ==== Aufgabe 1 (Wissensfragen) ==== ==== Aufgabe 1 (Wissensfragen) ====
   a) falsch   a) falsch
-  b) richtig (z.B. durch Prüfe-Handle-Situationen)+  b) richtig (z. B. durch Prüfe-Handle-Situationen)
   c) falsch   c) falsch
   d) falsch   d) falsch
Zeile 12: Zeile 12:
  
   S:    S: 
-  (1, 1, 0, 0, 0) (Traversiert)+  (1, 1, 0, 0, 0) (Transponiert)
      
   M:    M: 
Zeile 26: Zeile 26:
 c) Ja c) Ja
  
-d) E: (0, 7, 0, 4+d) E: (0, 7, 0, 0
  
 +====Aufgabe 3 (Java - Präfixsumme) ====
 +a) Gauß-Filter / Weichzeichner (? -> eher Zeigerverdopplung)
 +<code java>
 +import java.util.concurrent.*;
  
-====Aufgabe 6 (Scala - Ausgehende Kanten) ====+public class ParallelPrefixSums { 
 + private static CyclicBarrier barrier; 
 + public static void calculateSums(int[] values) throws InterruptedException { 
 + barrier new CyclicBarrier(values.length); 
 + Thread[] workers new Thread[values.length]; 
 + for (int i 0; i < values.length; i++) { 
 + workers[i] new Thread(new Worker(values, i)); 
 + workers[i].start(); 
 +
 + for (int i 0; i < values.length; i++) { 
 + workers[i].join(); 
 +
 + }
  
-*a) + public static class Worker implements Runnable { 
- def outEdges: (List[V],G) => List[E] = (vs,g) => + private int[] values; 
-  g.par.filter(=> vs.contains(x._1&& !vs.contains(x._2)).toList + private int index; 
-*b+ public Worker (int[] valuesint index
- def tree: (V,G) => = (v,g) => { + this.values values; 
-    def helperList[V] => vs =>{ + this.index = index; 
-      val a = outEdges(vs,g+
-      if(a==Nil)Nil else a.head::helper(a.head._2::vs+ public void run() { 
-    + try { 
-    helper(List(v)+ int distance = 1; 
-  }+ while (distance < values.length) { 
 + barrier.await(); 
 + int target = index + distance; 
 + int rem = values[index]
 + barrier.await(); 
 + if (target < values.length) { 
 + values[target] +rem; 
 +
 + dist *= 2; 
 +
 + } catch (Exception e) { 
 + e.printStackTrace(); 
 +
 +
 +
 +
 +</code> 
 + 
 +==== Aufgabe 4 (Schreibtischlauf - Barrieren) ==== 
 + 
 +  * a) a = 1weil sowohl a++ als auch die System.out.println-Ausgabe in einem synchronized-Block stehen und beide Threads auf dieselbe Marke synchronisieren. 
 +  * bMögliche Ausgaben sind: 
 + 
 +<code> 
 +a=
 +a=2 
 +a=3 
 +Threads 1, 2, 3 started. 
 +</code> 
 + 
 +Und 
 + 
 +<code> 
 +a=1 
 +a=2 
 +Threads 1, 2, 3 started. 
 +a=3 
 +</code> 
 + 
 +Der Main-Thread synchronisiert nicht auf irgendeine Marke (insb. nicht auf BarrierTest.class), daher erscheinen ihm die synchronized-Blöcke der Threads nicht als unteilbare Einheit und er kann bereits nach a++, aber vor System.out.println die While-Schleife verlassen. 
 + 
 +  * c) 1, 2, 3, oder 4 MalJeder Thread könnte gleichzeitig b=0 am Anfang feststellen oder erst prüfen, nachdem die anderen Threads (oder ein Teil davon) das IF verlassen. 
 +  * d) Vorletzte oder letzte Zeile. Der CountDownLatch ist nur mit 3 initialisiert worden. Daher kann sich der letzte Thread irgendwo zwischen barrier.await() und latch.countDown() befinden. 
 + 
 + 
 +==== Aufgabe 5 (Scala - Snake-Sort) ==== 
 + 
 +sortAsc, sortDes waren nicht Teil der Aufgabe, sind aber zum Testen implementiert. 
 + 
 +<code=Scala> 
 +import System.{ currentTimeMillis => ct } 
 + 
 +type Row = List[Int] 
 +type Matrix = List[Row] 
 +   
 +def sortAsc: Row => Row = rs => if(rs == Nil) Nil else rs.min :: sortAsc(rs.filter(_ > rs.min)) 
 +def sortDes: Row => Row = rs => if(rs == Nil) Nil else rs.max :: sortDes(rs.filter(_ < rs.max)
 +   
 + 
 +def sortCols: Matrix => Matrix = m => 
 +  (for(col <- m.transpose) yield sortAsc(col)).toList.transpose 
 +     
 +def sortColsPar: Matrix => Matrix = m => (for(col<- m.transpose.par) yield sortAsc(col)).toList.transpose 
 +   
 +// Alternativ (laut #Scala ist die Paralleliät bei beiden äquivalent gegeben)
 +     
 +def sortColsPar2: Matrix => Matrix = m => m.transpose.par.map(sortAsc(_)).toList.transpose 
 +   
 +def sortRows: Matrix => Matrix = m =>{ 
 +  def helper: (MatrixInt) => Matrix 
 +    case (Niln) => Nil 
 +    case (m::ms, n) if(n % 2 == 0) => sortAsc(m)::helper(ms,n+1) 
 +    case (m::ms, n) if(n % 2 != 0) => sortDes(m)::helper(ms,n+1) 
 +  } 
 +  helper(m,0) 
 +
 + 
 +//Alternative ohne Helfer-Funktion: 
 +  def sortRows2: Matrix => Matrix = m => m match 
 +    case Nil => Nil 
 +    case (row::m)  => if (m.length % 2 == 0) 
 +                          sortAsc(row)::sortRows2(m) 
 +                     else  
 +                          sortDes(row)::sortRows2(m) 
 +  } 
 + 
 + 
 +def sortHelper(Int, Matrix) => Stream[(Matrix,Matrix)= {  
 +  case (n,m) =>  if (n%2==0) (m, sortRows(m)) #::sortHelper(n+1,sortRows(m)) else (m,sortCols(m)) #::sortHelper(n+1,sortCols(m))      
 +
 +   
 +def snakeSort: Matrix => Matrix = m => { 
 +  def helper: (Matrix, Int) => Matrix = (m,n) => { 
 +      val a = sortHelper(0,m)(n
 +      if(a._1 == a._2) a._2 else helper(m,n+1)     
 +  
 +  helper(m,0
 +} 
 +</code> 
 + 
 +==== Aufgabe 6 ==== 
 +Nicht mehr Teil des Vorlesungsstoffes.