Hallo,
ich hab ja jetzt einen Taschenrechner mit Punkt vor Strich (s.
Taschenrechner Term in FLießkommazahl)
Dieses Prinzip möchte ich verwenden, um auch eine Variable einzubauen, die vom Programm immer verändert wird.
So soll ein Graph zu einer Funktion entstehen.
Hier mein Ansatz:
Delphi-Quellcode:
Function TForm1.ParseAndCalc(
Const X:Real;
Const S:
String):
String;
//X hat jetzt den Beispielwert 1 (s.u)
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;
'
*', '
/', '
+', '
-','
X':
Begin //X wird hier in eine eigene Zeile geschrieben, damit nicht so etwas wie 3X entsteht
If SL[SL.Count - 1] = '
'
Then Begin
SL.Delete(SL.Count - 1);
End;
SL.Add(S[i]);
SL.Add('
');
SL.SaveToFile('
Dateipfad\SL.txt');
//Nur zum Test, wie die SL erstellt wird:
{Hier ist das Problem: Eingabe von X+1 wird nur gespeichert:
X
+
Die 1 fehlt. 1+X ist kein Problem...??? Also ist wahrscheinlich hier der Fehler.
Wenn ich jetzt auf den Button klicke kommt die Meldung, X sei kein gültiger Gleitkommawert...}
End;
'
': ;
// ignoriere Leerzeichen
Else Raise Exception.CreateFmt('
Ungültiges Zeichen "%s" gefunden.', [S[i]]);
End;
begin
begin
i:=0;
while i < SL.Count
do
begin
if SL[i]='
*'
then
begin
SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])*StrToFloat(SL[i+1])));
{Zahl vor und nach dem * werden multipliziert und in die Zeile der ersten Zahl geschrieben???}
SL.Delete(i);
{Jetzt soll die Zeile des Operators gelöscht werden}
SL.Delete(i);
{und die der zweiten Zahl}
{etwas wurde gefunden - fange von vorn an}
i := i-1;
end
else
if SL[i]='
/'
then
begin
SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])/StrToFloat(SL[i+1])));
SL.Delete(i);
SL.Delete(i);
i := i-1;
end
else
i := i + 1;
end;
i:=0;
while i < SL.Count
do
begin
if SL[i]='
+'
then
begin
SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])+StrToFloat(SL[i+1])));
{Zahl vor und nach dem * werden multipliziert und in die Zeile der ersten Zahl geschrieben???}
SL.Delete(i);
{Jetzt soll die Zeile des Operators gelöscht werden}
SL.Delete(i);
{und die der zweiten Zahl}
{etwas wurde gefunden - fange von vorn an}
i := i-1;
end
else
if SL[i]='
-'
then
begin
SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])-StrToFloat(SL[i+1])));
SL.Delete(i);
SL.Delete(i);
i := i-1;
end
else
i := i + 1;
end;
end;
end;
Finally
Result := '
';
For i := 0
to SL.Count - 1
do Result := Result + SL[i];
End;
Finally
SL.Free;
End;
End;
procedure TForm1.Tabelle;
var X:real;
begin
X:=1;
Rechnen.Caption:=ParseAndCalc(X,Formel.text);
//Rechnen ist ein Labelfeld, auf dem jetzt '2' stehen sollte
end;
procedure TForm1.BZeichnenClick(Sender: TObject);
begin
Tabelle;
end;
Wenn ich jetzt auf den Button klicke kommt die Meldung, X sei kein gültiger Gleitkommawert...
Also wie im Quelltext erwähnt klappt das mit dem Schreiben der SL nicht richtig...
Liebe Grüße!
__________
Sorry wegen den vielen Edits, war ein Quellcode fehler...