Das lässt sich ja relativ einfach lösen indem du nur bei '+' und '-' breakst.
Schön ist das aber eigentlich nich wenn man nicht weiss worans liegt^^
Delphi-Quellcode:
case index of
0: Result := Seg1 * Seg2;
1: Result := Seg1 / Seg2;
2: begin
Result := Seg1 + Seg2;
break;
end;
3: begin
Result := Seg1 - Seg2;
break;
end;
end;
€dit
Es liegt daran dass der Operator der zuerst gefunden wird, nicht zuerst berechnet wird.
Wenn du 2*3+3 eingibst findet die funktion zuerst 2*3, gibt 3+3 recursiv weiter und rechnet das dann aus.
Dann steht in der ersten instanz 2*6 und das ergibt 12.
Wenn man die reihenfolge umdreht(also zuerst auf '+' und '-' prüft), findet die funktion zuerst 3+3 und gibt 2*3 weiter.
Das ergibt richtigerweise 3+6 = 9.
Weil die funktion ohne break einfach weiterläuft findet sie nachdem sie das '*' gefunden hat, das '+' neu und macht genau das selbe als würden die operatoren umgekehrt geprüft :=)
Delphi-Quellcode:
OpFound := False;
Result:= 0;
for index := 0 to 3 do begin
case index of
0: Op := '+';
1: Op := '-';
2: Op := '*';
3: Op := '/';
end;
if pos(Op,Formular) > 1 then begin
OpFound := True;
Seg1 := BerechneTerm(copy(Formular,1,pos(Op,Formular) - 1));
Seg2 := BerechneTerm(copy(Formular,pos(Op,Formular) + 1,length(Formular)));
case index of
0: Result := Seg1 + Seg2;
1: Result := Seg1 - Seg2;
2: Result := Seg1 * Seg2;
3: Result := Seg1 / Seg2;
end;
break;
end;
end;
if Not OpFound then Result := StrToFloat(Formular);