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

Dies ist eine alte Version des Dokuments!


Aufgabe 1

a) 1 und 4

b) 2 und 4 (???) (einerseits bessere Lastverteilung, andererseits mehr Overhead / Synchronisationsaufwand)

c) 2 und 3 (siehe Seite 26 VL Folie: https://www2.cs.fau.de/teaching/SS2016/PFP/slides/secure/pfp-08.pdf )

Aufgabe 2

a)

 AtomicInteger activeThreads = new AtomicInteger(0); 

b)

boolean manageThreads(String linkUrl) {
if (curThreads.incrementAndget() <= maxThreads) {
    CrawlThread t = new CrawlThread(linkUrl);
    t.start();
} else {
	curThreads.decrementAndGet();
	return false;
} 
} // END OF manageThreads

c)

public void run() {
process();
curThreads.decrementAndGet();
}

d)

synchronized(visitedUrls) {
if(!visitedUrls.contains(linkUrl)){
	doVisit = true;
	visitedUrls.add(linkUrl);
	}
}

Aufgabe 4

a) 3

Nein ist nicht möglich, s wird bereits mit anderen Werten belegt bevor das Programm parallel ausgeführt wird. Die Sichtbarkeit der in Zeile 25 festgelegten Werte ist gewährleistet.

b) 3

Ja, „Geralt“ ist eine mögliche Ausgabe. Die Sichtbarkeit der Veränderungen der Threads ist nicht garantiert.

c) 4

Nein, da die Threads wieder gejoint wurden. Das Programm ist somit nicht mehr parallel. Die Sichtbarkeit ist im (einzigen) Thread gewährleistet.

Aufgabe 5

  • a)
def insert: (List[Int], Int) => List[Int] = (ls, v) => ls match {
  case Nil => List(v)
  case x::xs => {
    if (v <= x) {
      v :: x :: xs
    }
    else {
      x :: insert(xs, v)
    }
}

Alternativ:

def insert: (List[Int], Int) => List[Int] = (ls, v) => {
    val p = ls.partition(_ <= v)
    p._1 ::: v :: p._2
}

Alternativ:

def insert: (List[Int], Int) => List[Int] = (ls, v) =>
    (for (l <- ls if l <= v) yield l) ::: (v :: (for (l <- ls if l > v) yield l))
  • b)
def sort: List[Int] => List[Int] = ls =>
  ls.foldRight(List[Int]())((v, sortedList) => insert(sortedList, v))
// Alternativ zu "List[Int]()":
// Nil: List[Int]
// Aber unbedingt mit Typangabe, sonst schlägt Scala's Type Inference fehl
  • c)
def sortAllWith: (List[Int] => List[Int]) => List[List[Int]] => List[List[Int]] =
  sortFun => ls => for (cur <- ls) yield sortFun(cur)

Aufgabe 6

  • a)
def testInside: (Ellipse, Ellipse) => (Double, Double) => Boolean =
  (e1, e2) => (x, y) => isInside(e1, x, y) && isInside(e2, x, y)
  • b)
def tupleStream: Stream[Double] => Stream[(Double, Double)] = s =>
  (s.head, s.tail.head) #:: tupleStream(s.tail.tail)
 
  // alternativ
  (s(0), s(1)) #:: tupleStream(s.drop(2))
  • c)
def monteCarlo: (Ellipse, Ellipse) => Int => Int = (e1, e2) => count => {
 
  // Stream aus Punkten
  val pointStream = tupleStream(randomStream)
 
  pointStream.take(count).par.filter(p => testInside(e1, e2)(p._1, p._2)).length
  // .count wirft einen komischen Fehler von Scalas Type Inference System
  // "missing argument list for method count" => .length oder .size benutzen
}