Das Parsen ist recht einfach ... wie es schon genannt wurde, kann man einfach von vorn nach hinten Zeichen für Zeichen durchgehn und sie entsprechend ihrem Typ (Zahl oder Operator) auf ein Array oder eine StringListe aufteilen.
Ein etwas effektiverer Weg mittels Copy steckt in dem ebenfalls schon verlinkten MatheParser, aber die Geschwindigkeit der Einzelzeichenbehandlung ist für diesen Zweck hier auch vollkommend ausreichend.
Delphi-Quellcode:
Function ParseAndCalc(
Const S:
String):
String;
Var SL: TStringList;
i: Integer;
Begin
SL := TStringList.Create;
Try
Try
SL.Add('
');
For i := 1
to Length(S)
do
Case S[i]
of
'
0'..'
9', '
,', '
.':
Begin
SL[SL.Count - 1] := SL[SL.Count - 1] + S[i];
End;
'
*', '
/', '
+', '
-':
Begin
If SL[SL.Count - 1] = '
'
Then Begin
// eine leere Zeile kommt vor, wenn mehrere Operatoren
// hintereinander liegen, z.B. bei '1*+2' bzw. '1 * +2'
SL.Delete(SL.Count - 1);
End;
SL.Add(S[i]);
SL.Add('
');
End;
'
': ;
// ignoriere Leerzeichen
Else Raise Exception.CreateFmt('
Ungültiges Zeichen "%s" gefunden.', [S[i]]);
End;
// hier alles in SL ausrechnen
Finally
Result := '
';
For i := 0
to SL.Count - 1
do Result := Result + SL[i];
End;
Finally
SL.Free;
End;
End;
Procedure TForm1.Button1Click(Sender: TObject);
Begin
Edit2.Text := ParseAndCalc(Edit1.Text);
End;
Die ZIP enthält die EXE und den wie hier gekürzten QuellCode.
In der passwortgeschützen 7-Zip steckt der komplette Code.
Das Paswort gebe ich gern an nicht Schüler und andere Interessenten raus, wo ich das Gefühl hab, daß sie es nicht als Hausaufgabenlösung mißbrauchen.
PS: Es sind da auch nur 64 zusätzliche Zeilen mit je 7-8 Zeilen pro Operator (+ - * / und den Vorzeichen + -).
und zum Ausprobieren kennt die Demo also diese Operatoren und den Dezimalpunkt (deutsches Windows = "," und englisches Windows = "."), so wie es halt von StrToFloat behandelt wird.
Wie es ausgerechnet hab ich oben erklärt und es wird einfach nur nacheinander je Operator in einer For-Schleife geschaut ob der Operator vorhanden und berechenbar ist und dann wird wie oben beschrieben vorgegangen.