P1 Task2 EvaluateSimpleExpression

dlorych
Erstie
Erstie
Beiträge: 17
Registriert: 25. Apr 2015 13:05

P1 Task2 EvaluateSimpleExpression

Beitrag von dlorych »

Hallo,

EvaluateSimpleExpression läuft bei dem Test bei mir nicht richtig. Im Test wird (7+(15*3)-9) erstellt. Davon wird (15*3)-9) als begin übergeben. Meine Funktion macht daraus 45-9) (überprüfe ich mit einer printAll-Methode ganz am Ende der EvaluateSimpleExpression-Methode). Im Test jedoch ist die gesamtListe jedoch plötzlich (7+(45-9).

Hier nochmal der Verlauf der Werte:
( 7 + ( 15 * 3 ) - 9 ) ->die komplette Liste, bereits assembled
( 15 * 3 ) - 9 ) ->der an meine Methode übergebene Teil (begin)
45 - 9 ) ->der Wert von begin ganz am Ende der Methode
( 7 + ( 45 - 9 ) ->das Ergebnis des Tests

Woran könnte das liegen?

Viele Grüße, Dominik

moritz31
Erstie
Erstie
Beiträge: 13
Registriert: 27. Okt 2014 12:34

Re: P1 Task2 EvaluateSimpleExpression

Beitrag von moritz31 »

du musst am Anfang noch die ( entfernen, dann stimmt das ganze schon =) weil ja nur der Ausdruck zwischen () von der Methode ausgewertet werden soll

Rapha167
Mausschubser
Mausschubser
Beiträge: 49
Registriert: 30. Apr 2015 19:00

Re: P1 Task2 EvaluateSimpleExpression

Beitrag von Rapha167 »

ich würde dir vorschlagen die ( klammer direkt zu beginn zu entfehrnen und die ) klammer nach dem ablauf der rechen operation, du kannst ja einfach die loiste durchlaufen bis du "irgendein" ) findest.

dlorych
Erstie
Erstie
Beiträge: 17
Registriert: 25. Apr 2015 13:05

Re: P1 Task2 EvaluateSimpleExpression

Beitrag von dlorych »

@moritz
das ist nicht mein Problem, das problem ist, dass am Ende einfach eine Klammer im Testwert auftaucht, die ganz am Ende meiner Methode noch nicht da war.
@Rapha
das probier ich mal aus, wenn ich Zeit finde. Bisher entferne ich die beiden Klammern um den zu berechnenden Wert erst ganz am Ende, da ich in diesem Fall die Position von den Klammern eindeutig weiß, nämlich das 1. und 3. Element von begin (falls es die Klammern überhaubt gibt).

Rapha167
Mausschubser
Mausschubser
Beiträge: 49
Registriert: 30. Apr 2015 19:00

Re: P1 Task2 EvaluateSimpleExpression

Beitrag von Rapha167 »

du brauchst die positionen der klammern nicht kennen wenn du das ganze so machst:

ist das 1. element eine klammer, dann direkt entfehrnen dh:
wenn Listelement x die klammer enthält:

x.setData(x.next().data());
x.setNext(x.next().next();



nun deine rechenoperation bis zum ende durchführen(also bis zu einer ")" klammer oder einem null element)

ANSCHLIESSEND die ) klammer entfehrnen und zwar einfach von beginn an alle elemente durchlaufen bis du eine ) klammer findest oder beim null element ankommst.

so brauchst du dir nichtmal gedanken machen ob es klammern gibt oder nicht, weil sie automatisch entfehrnt werden und du keine zeigerb bauchst um dir die positionen zu merken.

dlorych
Erstie
Erstie
Beiträge: 17
Registriert: 25. Apr 2015 13:05

Re: P1 Task2 EvaluateSimpleExpression

Beitrag von dlorych »

Letztendlich funktioniert mein code aber auch so, nur irgendwas läuft im Test falsch. Meine Berechnung liefert zu jedem Zeitpuntk den richtigen Wert, nur im Test ist dann plötzlich eine Klammer vor dem Wert von begin. (hinter printAll hab ich immer die Konsolenausgabe kommentiert, ganz rechts, damit man die Komentierung besser sieht)

Code: Alles auswählen

{
		// TODO implement this in task 2
		printAll(begin); 																// (15*3)-9)
		MathList tmp = new MathList((MathElement) begin);
		IListElement endOfExpression = null;
		for(IListElement elem=tmp.first(); elem!=null; elem=elem.next()){ 				//alles nach der Klammer wird entfernt
			if(elem.next()==null || elem.data().equals(Calculator.SIGN_PARENTHESIS_CLOSE)){
					endOfExpression = elem.next();
					elem.setNext(null);
					break;
			}
		}
		if(tmp.isAtom())
			return;
		printAll(tmp.first()); 															// (15*3)
		while(tmp.findMulOrDivOperation()!=null){ 										//Berechnung...
			IListElement MoD = tmp.findMulOrDivOperation();
			if(MoD.next().data().equals(Calculator.SIGN_MUL))
				tmp.calc.mul(MoD);
			else if(MoD.next().data().equals(Calculator.SIGN_DIV))
				tmp.calc.div(MoD);
				
		}
		while(tmp.findAddOrSubOperation()!=null){
			IListElement AoS = tmp.findAddOrSubOperation();
			if(AoS.next().data().equals(Calculator.SIGN_ADD))
				tmp.calc.add(AoS);
			else if(AoS.next().data().equals(Calculator.SIGN_SUB))
				tmp.calc.sub(AoS);
		}
		printAll(tmp.first()); 															// (45)
		IListElement lastElem=null;
		for(IListElement elem = tmp.first(); elem!=null; elem=elem.next())
			lastElem=elem;
		lastElem.setNext(endOfExpression); 										//der nicht zu berechnende Teil wird wieder angefügt
		begin=tmp.first(); 
		printAll(begin); 															//(45)-9)
		if(begin.data().equals(Calculator.SIGN_PARENTHESIS_OPEN) && begin.next().next().data().equals(Calculator.SIGN_PARENTHESIS_CLOSE)){
				begin=begin.next(); 											//Klammern werden entfernt, falls es sie gibt
				begin.setNext(begin.next().next());
				printAll(begin); 													// 45-9)
		}	
		printAll(begin); 															// 45-9)
	}

dlorych
Erstie
Erstie
Beiträge: 17
Registriert: 25. Apr 2015 13:05

Re: P1 Task2 EvaluateSimpleExpression

Beitrag von dlorych »

Ich hab das Problem gelöst, vielen Dank für die Hilfe^^

Antworten

Zurück zu „Archiv“