- Bonus-Aufgabe: SIMPL
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.
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.
3. Bonus-Aufgabe: SIMPL
Beim Testen mit Hilfe der Klasse SIMPLTest bin ich auf ein kleines Problem gestoßen:
In Codezeile 159 SIMPLTest.java wird folgendes Szenario getestet:
testStatementList("a = 10; for i = 0 .. a do i = i+1; a = a-1; end", "VARS: [(a=4, i=6)], STACK: []");
Spezifikation der for-Schleife in SpezifikationSIMPL.pdf:
Laut Spezifikation wird also - egal welche Anweisungen im Body stehen! - var inkrementiert.
Äquivalenter Java-Code:
for(int i = from; i <= to; i++)//hier wird i zum 2. Mal inkrementiert!!
{
i++;//hier wird i zum 1. Mal inkrementiert
a--;
}
D.h. in jedem Schleifendurchlauf wird i 2 mal inkrementiert (1 mal implizit nach jedem Schleifendurchlauf und 1 mal durch die Anweisung „i=i+1“ im Body).
Wenn man jetzt einen Schreibtischlauf durchführt ergeben sich folgende Variableninhalte:
Initialwerte: a=10, i=0;
nach 1. Durchlauf: a=9, i=2;
nach 2. Durchlauf: a=8, i=4;
nach 3. Durchlauf: a=7, i=6;
nach 4.Durchlauf: a=6, i=8;
→ erst jetzt ist die Abbruchbedingung i>a erfüllt und die Schkeife terminiert mit a=6, i=8!
Die tatsächlichen Ergebnisse entsprechen jedoch nicht dene erwarteten:
Die erwarteten Ergebnisse erhält man dagegen nur, wenn man i bei jedem Schleifendurchlauf statt um 2 nur um 1 erhöht:
Initialwerte: a=10, i=0;
nach 1.Durchlauf: a=9, i=1;
nach 2.Durchlauf: a=8, i=2;
nach 3.Durchlauf: a=7, i=3;
nach 4.Durchlauf: a=6, i=4;
nach 5.Durchlauf: a=5, i=5;
nach 6.Durchlauf: a=4, i=6;
→ Abbruchbedingung i>a ist erfüllt und die Sschleife terminiert, jetzt erhält man auch das vorgegebene Testergebnis!
Das vorgegebene Ergebnis erhält man also nur, wenn man in der for-Schleife i nur 1 mal inkrementiert, auch wenn es laut Spezifikation der for-Schleife 2 mal inkerementiert werden müsste (1 mal im Body durch „i=i+1“ und 1 mal am Schleifenende).
Habe ich da jetzt einen Denkfehler oder ist da vielleicht dem AuD-Team ein Fehler beim Test unterlaufen?
Beim überfliegen deines Posts kann ich lediglich eine Stelle ausmachen in der die Spezifikation besagt var solle inkrementiert werden.
Ich bezweifle jetzt einfach mal, dass die entsprechend andere Inkrementierung im Code vorgegeben war.
Die Spezifikation selbst gibt nur eine Inkrementierung vor, ja:
Die 2. entsteht dadurch, dass im Code var der Variablen i entspricht:
for i = 0..a
i wird jetzt zum 1. Mal im Schleifen-Body inkrementiert:
do i = i+1
am Ende der Schleife wird var (hier i) nochmal inkrementiert:
for(int i = from; i <= to; i++)
Insgesamt also 2 mal, 1 mal zu oft für die angegebenen Testergebnisse
Es fallen mir jede Menge Möglichkeiten hierfür ein, im Endeffekt wäre eine Auswahl meinerseits rein ins Blaue geraten und folglich nicht konstruktiv genug.
Was ich mir noch am ehesten vorstellen kann: Die Reihenfolge der zwei genannten Operationen innerhalb der Schleife haben keine feste Reihenfolge. In diesem Fall liese sich
i = i + 1;
in den Schleifenkopf extrahieren bzw. ans Schleifenrumpf-Ende verfrachten und folglich der Spezifikation genüge tun.
Ist tatsaechlich ein Fehler im Testcase, deine Loesung sollte stimmen… Wird demnaechst ausgebessert, sorry dafuer :-/
Mit dem alten testcase hat es bei mir noch gestimmt - jetzt bin ich verwirrt! :-/
Vielleicht als kleiner Tipp: Denke daran, dass der Code im Schleifenrumpf die Schleifenvariable auch veraendern kann. Nach Durchlaufen der Schleife muss also erstmal der aktuelle Wert bestimmt werden, bevor irgendwas mit der Schleifenvariable gemacht wird…
Danke für den Tipp, hat geklappt!
Hab kurz ne Frage, is die Aufgabe generell noch nicht korrigiert worden oder nur bei mir nicht
Nein, wurde bei mir auch noch nicht korrigiert. Hat vielleicht damit zu tun: https://fsi.informatik.uni-erlangen.de/forum/post/127030
ok, dann is ja gut
einfach zu viel zu tun zur Zeit
Langsam wäre die Korrektur aber schon nett, bei ausreichend Punkten würde ich mir das jetzige Übungsblatt nämlich sparen…
Beste Methode in der Klausur plötzlich nicht zu wissen, wie die Aufgabe mit den B-Bäumen geht…
Die Klausur ist in 2 Monaten …
Na und? Wenn du es jetzt schon lernst, brauchst du es nachher bloß wiederholen. Wesentlich weniger Zeitaufwand als komplett lernen.
Dazu hat die Klausur in AuD fast jedes Semester eine Durchfallquote von ca. 40-70%. Bäume sind ferner eigentlich eine absolute Grundlage der Informatik und kommen neben AuD auch in vielen anderen Klausuren vor. Und man kann Grundlagen nicht von einem Tag auf den anderen lernen.
Ergebnisse sind seid ein paar Minuten draußen.
Scheint so als müsste ich nix mehr für den Schein tun
(jaja ich gebe schon weiter ab um den Lerneffekt zu haben)
Ich versteh gar nicht wieso von den 130 Leuten die wenigstens etwas vom Bonusaufgabenblatt abgegeben haben nur 60 die SIMPL-Aufgabe bearbeitet haben. Ich persönlich fand die am einfachsten von den drei Bonusaufgaben, vorallem was die Bearbeitungszeit anging.
Bei FunFun war viel vorgegeben. Und SnowBlocks ist in der Tat schwieriger, aber die Aufgabe ist ein Spiel, wodurch auch der Spaßfaktor eine Rolle spielt. Dazu war FunFun eine Parodie auf knotenpunkt, was auch das Interesse einiger Studenten wecken kann.