Klausur vom 29 07 2008 -- Lösung(update mit verbesserter Version)

zum vergleichen und diskutieren

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Klausur vom 29 07 2008 – Lösung(update mit verbesserter Version)
hier mal meine lösung der klausur vom 29 07 2008…
für alle die die klausuren durchrechnen als vorbereitung fuer die klausur !

es werden heute im lauf des tages noch mehr klausuren mit lösungen von mir geupped.

kein anspruch auf richtigkeit, es gibt leider keine musterlösungen ,daher , wenn ihr denkt es ist etwas falsch, bitte posten, dann aender ich es ggf ab.

http://www.speedyshare.com/files/21053821/08-07-29_klausurhochladen.pdf


bei Aufgabe 6 habe ich noch als Abstraktion:

λSalat. Hans Wurst


weil man sagen kann dass (Lambda Wurst Salat. “smthing”) eigentlich

(lambda wurst.(lambda Salat.‘smthng’)) ist, da es ge curried wurde?

macht sinn, ich werds ausbessern. ich vergess das immer :smiley:


sehr cool, danke dir!


ist das nicht falsch?


dachte auch falsch, synchronized wird nicht vererbt…


ihr habt Recht !

“Bei Methodengehört
das Schlüsselwort synchronized übrigens nicht zum Methodenrumpf und wird somit
auch nicht automatisch vererbt.”

Quelle: http://www.mi.fh-wiesbaden.de/~barth/fsbsc/ss09/Synchronisierung.pdf

habe es schon ausgebessert, warte mit dem uppen aber bis noch ein bisschen mehr verbessert ist, und lads dann spaeter neu hoch !


Zum Schreibtischlauf (Aufgabe 4)

bei d) komme ich auf 5 Möglichkiten

nämlich eine mögliche letzte ausgabe (4<5) wenn t1 am schluss dran ist,
und 4 mögliche letzte ausgaben, wenn t2 die letzte ausgabe macht

bei e) nur auf 2


Vergleichsoperator ist nicht gleich Zuweisungsoperator, haben dir das Deine AUD-Studenten nicht gesagt? Spass beiseite.

Ich kenne nur eine Sprache bei der =für beides benutzt wird: =… (BASIC)
In der Beziehung ist Haskell und Java gleich…

es muss im 1. Wächter bei entfernen heißen: x == l


haha ja klar , hab die leider vergessen. typo.

…zum andren kram mit den schreibtischlaeufen: ich checks aus und verbessers dann !


Also ich denk, dass sich bei der 4e ( schreibtischlauf) durch das voletile nix ändert und es weiterhin 5 Mgl gibt.
Wenn man mal ins Script 4 Seite 35,36 schaut, wird man lesen, dass voletile lediglich die sichtbarkeit garantiert aber nicht den gegenseitigen ausschluss…

Desweiteren geht 5c wesentlich einfacher :

einfach [] ys = ys
einfach (x:xs) ys = if(elem x ys)
then einfach xs (entfernen x ys)
else einfach xs (einfuegen x ys)


hier meine loesung, waren (IMO!!!) paar kleinigkeiten falsch (schreibtischlauf) bei arne
und den haskellcode kann man nich ansatzweise lesen und “einfach” geht wesentlich schoener (als nebelwerfers loesung)

http://klangregen.de/~ull/upload/priv/08-07-29_klausur.ulls.loesung.pdf

€: oh hab lambda vergessen, dachte das wars, ich ess erstma was


jo der haskell kram war ausser huefte geschossen(funzte aber wohl), und ohne verwendung der zuvor geschriebenen funktionen. geht , wesentlich einfacher, wie vorher schon angemerkt.
:smiley: :smiley:


is ja kein problem, aber was is mit dem schreibtischlauf? stimmt das was ich da hab? Was meint ihr?


Beim Schreibtischlauf wird ja gefragt: Mit wie vielen verschiedenen Ausgaben kann sich das Programm beenden?
Ich dachte, dass das gleichbedeutend wäre mit : “Wie viele unterschiedliche Ausgaben kann das Programm in der letzten Zeile ausgeben?”
Denn dann wäre ja die Antwort bei d) 5 ansonsten 8.
Was ist nun die richtige Interpretation? :nuts:


gewagt, aber koennte durchaus sein :frowning:


hm jo, is fieß. vorallem da sich das durch 3 teilaufgaben zieht diese unklare definition…

n paar von euch haben ja bei voletile nen anderes ergebnis als ohne voletile. Könnt mir das vllt jemand klar machen warum? Meiner meinung nach ändert sich durch das voletile immer noch nix…


kurze erklaerung:

static int a,b = 0;

thread a: int a = 5; int b = 4;

thread d: system.out.printlnt (a + " " + b); // nehme vereinfachterweise an System.out. waeren atomar

a.start();d.start()

MIT VOLATILE:
man weiss nicht wann d seinen systemout macht.

kann sein, dass er ihn macht bevor a irgendwas macht.
dann wuerde er ==> 0 0 ausgeben

kann aber auch sein dass er ihn macht wenn a schon die eins beschrieben hat ==> 5 0

kann sein dass er ihn erst macht wenn a schon durch ist mit allem ==> 5 4

OHNEVOLATILE

man weiss wieder nich wer genau anfaengt.
ABER: der compiler kann die zuordnungen int a = 5;int b = 4 umordnen, dh wenn b beschrieben ist, heisst das nicht das auch a beschrieben ist, nur weil es im code vorher steht.
ausserdem kann es sein dass thread d UEBERHAUPT keine veraenderung sieht an a und b weil er gleich, von anfang an, lokale kopien erzeugt.

das bedeutet also fuer die moeglichkeiten:

kann sein dass a komplett fertig ist, und d aber keine veraenderung sieht: 0 0
kan nsein dass a komplett fertig ist und d veraenderung sieht: 5 4

kann sein dass a nur bis zuweisung a kommt d dann anfaengt, d aber keine veraenderung sieht: 0 0
kann sein dass a nur bis zuweiseung a kommt und d dann anfaengt, dveraednerung sieht: 5 0

kann sein dass a zuweisung b zuerst ausfuehrt und dann nicht bis zuweisung a kommt, d aber keine veraenderung sieht: 0 0
kann sien dass a zuweisung b zuerst ausfuehrt und dann nicht bis zuweisung a kommt, d veraenderung sieht: 0 4

kann dass a die zuwiesungen vertauscht und komplett fertig wird, d aber keine veraenderungen sieht: 0 0
kann sein dass a die zuweisungen vertauscht und komplett fertig wird, d veraenderungen sieht: 5 4

kann sein dass d anfaengt und fertig wird bevor a angefangen hat und demzufolge auch 0 0 ausgibt.

du siehst, einige moeglichkeiten uebrschneiden sich bei dem was rauskommt. wen du aber threads hast die beide was ausgeben gibts nette anzahl von moeglichkeiten durch die moeglich “code”-reihenfolge-veraenderung die compiler in den threads vornehmen koennen, und der tatsache dass threads evtl veraenderungne gar nicht sehen.


Zu dem Erreichbarkeitsgraphen…

da fehlt meiner Ansicht nach 0200 → 0101 → 0002 genauso wie 0200 → 0110 → 0020 oder irre ich da?