TestTask2 : testEvaluate

Blaubaer
Neuling
Neuling
Beiträge: 10
Registriert: 28. Apr 2015 16:22

TestTask2 : testEvaluate

Beitrag von Blaubaer »

Nachdem alle anderen Teiltests (aus TestTask1 und TestTask2) reibungslos funktionieren, wundert mich dieser Spezielle Test ein wenig:

- bei Testcase 1 kommt ein falsches Resultat (33 statt 35), ich weiß nicht wie das passieren konnte
- bei Testcase 2 bricht er ab mit: ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
(kann ich mir bei Verwendung von ausschließlich +-*/ nicht vorstellen)
- bei Testcase 3 will irgendeine BigInteger mit "(" initialisiert werden, was natürlich nicht funktioniert
- bei Testcase 4 gibt es eine NumberFormatException, passiert bei einer Konstruktion einer BigDecimal in einem Aufruf der sub-Methode
- bei Testcase 5 kommt ein falsches Ergebnis heraus (es ist negativ und hat bedeutend weniger Ziffern als das erwartete Ergebnis)
- schließlich und endlich: Testcase 6 erzeugt ein Timeout (ja, ich habe assembleNumbers() in evaluate() aufgerufen)

Das sieht jetzt mehr oder weniger so aus, als würde gar nichts richtig funktionieren, aber wieso laufen dann die anderen Tests :?:

Bin für jede mögliche Hilfe dankbar.

ramio
Neuling
Neuling
Beiträge: 6
Registriert: 28. Apr 2015 18:58

Re: TestTask2 : testEvaluate

Beitrag von ramio »

Hallo,

zumindest beim ersten Problem kann ich hoffentlich helfen.

Es klingt komisch, aber die 33 ergibt sich aus folgenden Rechenschritten:
3 + 5 * 6 - 5 / 10 * 100 + 2
= 33 - 0 * 102
= 33

Ich vermute mal, dass du Schleifen verwendest und darin prüfst, ob eine Multiplikation oder eine Division vorliegt, und diese ggf. ausrechnest. Am Ende der Schleife wird der Zeiger auf das nächste Element gesetzt. Dies darf aber nur geschehen, falls keine Rechnung durchgeführt wurde. Falls nämlich eine Rechnung durchgeführt wurde, musst du ausgehend vom aktuellen Element nochmal prüfen, ob eine Multiplikation oder Division vorliegt.

Code: Alles auswählen

cur = begin;
while (cur != null && cur.hasNext() && !cur.next().data().equals(Calculator.SIGN_PARENTHESIS_CLOSE)) {
	if (cur.next().data().equals(Calculator.SIGN_MUL))
		calc.mul(cur);
	else if (cur.next().data().equals(Calculator.SIGN_DIV))
		calc.div(cur);
	cur = cur.next();
}
... soll werden zu ...

Code: Alles auswählen

cur = begin;
while (cur != null && cur.hasNext() && !cur.next().data().equals(Calculator.SIGN_PARENTHESIS_CLOSE)) {
	if (cur.next().data().equals(Calculator.SIGN_MUL))
		calc.mul(cur);
	else if (cur.next().data().equals(Calculator.SIGN_DIV))
		calc.div(cur);
	else
		cur = cur.next();
}
Ich selbst habe etwas gesessen, bis ich darauf gekommen bin und habe mal einen Codeschnipsel angehängt, damit es verständlicher wird, was ich meine. Informatiker können sich ja bekanntlich schlecht ausdrücken... :D

Blaubaer
Neuling
Neuling
Beiträge: 10
Registriert: 28. Apr 2015 16:22

Re: TestTask2 : testEvaluate

Beitrag von Blaubaer »

Ah, danke. Dein Text hätte vollkommen gereicht 8) .

Jetzt laufen nummmer 1, 3 und 5, allerdings geben mir 2,4 und 6 (jeweils einzeln laufen gelassen) einen timeout :(

Ich nehme an, dass etwas an meiner Verwendung der BigDecimals falsch läuft, weiß aber beim besten Willen nicht, was genau das sein könnte.

Blaubaer
Neuling
Neuling
Beiträge: 10
Registriert: 28. Apr 2015 16:22

Re: TestTask2 : testEvaluate

Beitrag von Blaubaer »

Argh, Kopf->Tisch

ich habe doch tatsächlich bei IsAtom vergessen, den punkt zu berücksichtigen. Damit hat sich dann wohl alles.

Ruben
Erstie
Erstie
Beiträge: 22
Registriert: 28. Apr 2015 19:44

Re: TestTask2 : testEvaluate

Beitrag von Ruben »

Ich komme leider beim besten Willen nicht auf 35, sondern auf -15.
Sowohl mein Programm, als auch meine Kopfrechnung kommen immer wieder auf dieses Ergebnis.
3 + 5 * 6 - 5 / 10 * 100 + 2
3 + 30 - 5 / 10 * 100 + 2
3 + 30 - 0.5 * 100 + 2
3 + 30 - 50 + 2
33 - 50 + 2
-17 + 2
-15

Wo liegt mein Fehler/Wie kommt ihr auf 35?

hololol2
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 154
Registriert: 27. Apr 2015 14:13

Re: TestTask2 : testEvaluate

Beitrag von hololol2 »

Es wird mit Integer gerechnet, also ist 5/10=0

Ruben
Erstie
Erstie
Beiträge: 22
Registriert: 28. Apr 2015 19:44

Re: TestTask2 : testEvaluate

Beitrag von Ruben »

Danke :lol:

KaiW
Erstie
Erstie
Beiträge: 16
Registriert: 10. Apr 2015 08:02
Wohnort: Heidelberg

Re: TestTask2 : testEvaluate

Beitrag von KaiW »

Hallo zusammen,
bei mir funktionieren auch soweit alle Tests, bis auf das testEvaluate()... :|
gleiches Problem, bekomme 33 statt 35 raus...

Muss in der Methode isAtom(), auf einen Punkt in einem Element geprüft werden?
z.B. "1.2" ? oder nur ob das Element keine darauf folgenden Elemente besitzt?

hololol2
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 154
Registriert: 27. Apr 2015 14:13

Re: TestTask2 : testEvaluate

Beitrag von hololol2 »

Naja du musst prüfen, ob es keine Nachfolger gibt und ob das Element eine Zahl ist. Egal ob mit Punkt oder ohne

KaiW
Erstie
Erstie
Beiträge: 16
Registriert: 10. Apr 2015 08:02
Wohnort: Heidelberg

Re: TestTask2 : testEvaluate

Beitrag von KaiW »

habe isAtom() nochmal überarbeitet, an meinem Ergebnis 33 hat sich nichts geändert...
Des Weiteren habe ich wie im älteren post:
Ich vermute mal, dass du Schleifen verwendest und darin prüfst, ob eine Multiplikation oder eine Division vorliegt, und diese ggf. ausrechnest. Am Ende der Schleife wird der Zeiger auf das nächste Element gesetzt. Dies darf aber nur geschehen, falls keine Rechnung durchgeführt wurde. Falls nämlich eine Rechnung durchgeführt wurde, musst du ausgehend vom aktuellen Element nochmal prüfen, ob eine Multiplikation oder Division vorliegt.
meine evaluateSimpleExpression(IListElement begin) überarbeitet...
Ohne Erfolg.
Hat noch jemand eine Idee? :roll:
Dateianhänge
Fehlermeldung
Fehlermeldung
screenshot.png (143.27 KiB) 801 mal betrachtet

Benutzeravatar
felicis
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 114
Registriert: 14. Apr 2015 20:25

Re: TestTask2 : testEvaluate

Beitrag von felicis »

Die Methode evaluate() kann man seeehr einfach schreiben (atom-prüfung und rudimentär-schleife). Dadurch kann man mit Sicherheit ausschließen, dass der Fehler nicht da auftritt, sondern in evaluateSimpleExpression(). Nicht dass das viel schöner wäre, aber damit hätten wir den Fehler eingegrenzt: die Methoden hängen ja alle voneinander ab und ein Fehler am Ende kann auch am Anfang entstehen...
Übrigens würde ich auch mal debuggen und mir ansehen in welcher Methode und genau an welcher Stelle der Fehler entsteht (falsches Verhalten auftritt): Dann können wir dir auch besser helfen :)

felicis

Antworten

Zurück zu „Archiv“