Seite 1 von 2

P1: erlaubte Funktionen

Verfasst: 20. Apr 2013 11:20
von Sem
Ich möchte fragen, ob man solche Funktionen wie "split", "replaceAll" usw verwenden darf oder wir sollen nur primitive und selbstgeschriebene Funktionen bei der Lösung des Praktikums benutzen?

Re: P1: erlaubte Funktionen

Verfasst: 20. Apr 2013 11:44
von JannikV
Du darfst benutzen was die Java API so hergibt ;)

Re: P1: erlaubte Funktionen

Verfasst: 20. Apr 2013 14:09
von Sem
Danke für die Antwort. Noch kleine Frage: warum gibt es setter für "first" und kein für "last"?

Re: P1: erlaubte Funktionen

Verfasst: 20. Apr 2013 14:49
von khaled
last brauchst du nicht unbedingt sondern nur first, weil mit first du durch die ganze liste iterieren kannst (durch next) mehr sollte man nicht brauchen.

Khaled

Re: P1: erlaubte Funktionen

Verfasst: 20. Apr 2013 15:55
von Bug
Es gibt Stellen, wo es sinnvoll ist, auf last zuzugreifen (in der MathList, was ja möglich ist, denn last ist protected) anstatt zunächst über die ganze Liste zu iterieren.

Es wäre aber fatal, last zu überschreiben, denn damit würde last möglicherweise nicht mehr auf das letzte Element in der Liste zeigen, dass ja auch vom vorletzen erreichbar sein muss. Also wäre ein setter überflüssig und gäbe die Möglichkeit, durch unachtsame Verwendung eine ungültige Liste herzustellen. Genau sowas soll aber durch Kapselung in der objektorientierten Programmierung vermieden werden, darum sind die Attribute nicht public und es gibt keinen entsprechenden Setter...

Auf first hingegen zeigt kein Element, es kann überschrieben werden, ohne eine ungültige Liste zu erzeugen. Dafür verliert man dadurch aber, wenn man sie nicht irgendwie anders sichert, die Referenz auf das erste Element und dadurch auf alle Inhalte der Liste. Auch der Setter von first sollte also nur mit Bedacht eingesetzt werden.

Re: P1: erlaubte Funktionen

Verfasst: 20. Apr 2013 20:50
von Sem
habe jetzt verstanden. Danke für die Erklärung :)
Habe noch Frage: erwartet man, dass nach der Ausführung einer primitiven Operation wird das Ergebnis in Klammen stehen? Also: (2+5)=7 oder (2+5)=(7) ?

Re: P1: erlaubte Funktionen

Verfasst: 20. Apr 2013 23:52
von Sem
Verstehe nicht:

Code: Alles auswählen

ml.buildList("(7+(15*3)-9)");
ml.assembleNumbers();
ml.evaluateSimpleExpression(ml.get(3));
		
assertEquals("Not fully simplified", 7, ml.size());
assertEquals("Wrong resulting list", "(|7|+|45|-|9|)", ml.toString());
Wieso wird in evaluateSimpleExpression 3 Element übergeben: (15*3)-9) und man erwartet 45 schon ohne Klammen zurück? In step 4 geht es überhaupt nicht um Löschen der Klammen. Um die zu löschen,brauche ich noch voriges Element. Um voriges Element zu bekommen, brauche ich noch eine Schleife vom Anfang. Irgendwie nicht logisch. Wurde es sich so ausgedacht?

Re: P1: erlaubte Funktionen

Verfasst: 21. Apr 2013 01:13
von Sem
Im testEvaluate() wurde es auch Methode assembleNumbers() vergessen hier:

Code: Alles auswählen

ml = new MathList(calculators[i]);
ml.buildList(testCases[i]);
ml.evaluate();
müsste nach ml.buildList(testCases); kommen.

Re: P1: erlaubte Funktionen

Verfasst: 21. Apr 2013 14:26
von Sem
Bin hier ganz allein :cry:

noch was:
d) A complete evaluation of an expression (step by step):
(0) 54 + (545 * 234 + (4545 - 54)) * 6 + 34
(1) 54 + (545 * 234 + 4491) * 6 + 34
hier finde ich folgende Loglik:
0) finde innermost subexpression
1) Ausführung der Operationen in innermost subexpression

Ok, ich habe jetzt Referenz auf diese innermost subexpression. Aber meine Methoden findMulOrDivOperation() und findAddOrSubOperation() bekommen keine Parametern und ich kann nicht sagen: "find mal alle mul oder alle div ab diese Position". Stattdessen wird es immer wieder ab Anfang gesucht. Wäre es nicht sinnvoll in diese Methoden Parametern zu übergeben?

Re: P1: erlaubte Funktionen

Verfasst: 21. Apr 2013 18:56
von khaled
Ja deine Methoden findMulOrDivOperation() und findAddOrSubOperation() bekommen keine Parameter weil du keine Parameter brauchst, nachdem du eine dieser Methoden ausführst kriegst du eine IListElement danach "machst" du ab diese zurückgegebene Stelle deine Berechnung nachdem du deine Berechnung gemacht hast wird deine MathList anderes aussehen (nämlich ein Expression weniger).

Was hättest du die Methoden findMulOrDivOperation() und findAddOrSubOperation() sonst als Parameter gegeben?

Khaled

Re: P1: erlaubte Funktionen

Verfasst: 21. Apr 2013 19:46
von Bug
Sem hat geschrieben:Verstehe nicht:

Code: Alles auswählen

ml.buildList("(7+(15*3)-9)");
ml.assembleNumbers();
ml.evaluateSimpleExpression(ml.get(3));
		
assertEquals("Not fully simplified", 7, ml.size());
assertEquals("Wrong resulting list", "(|7|+|45|-|9|)", ml.toString());
Wieso wird in evaluateSimpleExpression 3 Element übergeben: (15*3)-9) und man erwartet 45 schon ohne Klammen zurück? In step 4 geht es überhaupt nicht um Löschen der Klammen. Um die zu löschen,brauche ich noch voriges Element. Um voriges Element zu bekommen, brauche ich noch eine Schleife vom Anfang. Irgendwie nicht logisch. Wurde es sich so ausgedacht?
Bitte dazu den JavaDoc-Kommentar zur evaluateSimpleExpression(...) beachten - die Methode ist die einzige, die prüfen kann, ob Klammern enthalten sind oder nicht und sich daher auch darum kümmern muss, diese zu beseitigen (dazu gab es auch nochmal einen expliziten Hinweis, der aber irgendwie leider verloren gegangen ist :( ) In einer aktualisierten Aufgabenstellung ist er wieder enthalten.
After executing all operations this method has to delete the parentheses around this expression if there are any.
Es ist aber durchaus möglich (und eben ja auch gewünscht), die Klammern in dieser Methode zu löschen - dazu braucht man nicht unbedingt das Vorgängerelement.
Sem hat geschrieben:Im testEvaluate() wurde es auch Methode assembleNumbers() vergessen
müsste nach ml.buildList(testCases); kommen.


Nein, dafür ist nicht der Test zuständig...

Sem hat geschrieben:Bin hier ganz allein :cry:


Sorry, auch ein Informatikstudent ist sonntags mal nicht am Rechner... :wink:

Sem hat geschrieben:
noch was:

d) A complete evaluation of an expression (step by step):
(0) 54 + (545 * 234 + (4545 - 54)) * 6 + 34
(1) 54 + (545 * 234 + 4491) * 6 + 34

hier finde ich folgende Loglik:
0) finde innermost subexpression
1) Ausführung der Operationen in innermost subexpression

Ok, ich habe jetzt Referenz auf diese innermost subexpression. Aber meine Methoden findMulOrDivOperation() und findAddOrSubOperation() bekommen keine Parametern und ich kann nicht sagen: "find mal alle mul oder alle div ab diese Position". Stattdessen wird es immer wieder ab Anfang gesucht. Wäre es nicht sinnvoll in diese Methoden Parametern zu übergeben?


Das wäre möglich, ist aber nicht die Lösungsstrategie, die in dieser Aufgabe gesucht wird - es gibt eine andere Möglichkeit, die deutlich besser zur gewählten Datenstruktur passt. Da das eine der wesentlichen Erkentnisse dieser Aufgabenstellung ist, will ich da jetzt erstmal nicht genauer drauf eingehen...

Re: P1: erlaubte Funktionen

Verfasst: 21. Apr 2013 19:57
von Sem
Wie du hast beschrieben, wird es auch funktionieren. Und funktioniert bei mir. Aber diese Zitate trifft dann nicht zu:

Code: Alles auswählen

d) A complete evaluation of an expression (step by step):
(0) 54 + (545 * 234 + (4545 - 54)) * 6 + 34
(1) 54 + (545 * 234 + 4491) * 6 + 34
Es wird zuerst 545 * 234 berechnet und danach 4545 - 54, weil wir immer ab Anfang suchen. Wenn es möglichst wäre einen Parameter zu übergeben, würde ich direkt 4545 übergeben und dann trifft es zu. Und in diesem Fall wird das Programm in wenigen Schritten ausgeführt.

Re: P1: erlaubte Funktionen

Verfasst: 21. Apr 2013 20:03
von Bug
Es ist wie gesagt auch ohne Parameter möglich, das im Beispiellauf beschriebene Verhalten zu erreichen - und es wird auch erwartet, dass dieses Verhalten erreicht wird. Es ist also nötig, eine andere Strategie zu finden, als nur findMulOrDivOperation() auf die ganze Liste anzuwenden.

Re: P1: erlaubte Funktionen

Verfasst: 21. Apr 2013 20:09
von Sem
Dann noch eine, was mir aufgefallen ist. In P1 trifft bei mir alles zu außer in diesem Teil von testEvaluate():
"(33+43)*434-45/10+((10-52)*(6-100)*(0-1)+(5*(5*(5*(((5)))))))"

und zwar:
Expected :29657
Actual :29357

Es liegt hier: 45/10. Calc ist "ic", deshalb 45/10 = 4 aber Ergebnis 29657 wäre möglich nur in dem Fall, wenn wir weiter mit 4,5 berechnen würden (29656,5) und am Ende das alles runden. Was mache ich falsch?

Re: P1: erlaubte Funktionen

Verfasst: 21. Apr 2013 21:07
von Bug
Bist du sicher, dass du die Reihenfolge der Operationen (Punkt- vor Strichrechnung) korrekt beachtest?

Ich komme mit dem Zwischenergebnis 45/10=4 nämlich durchaus auf die vom Test geforderte Lösung, wie man auch hier sehen kann: http://wolfr.am/14Hi33e