[color=#000080]// Grob getestet 70% der Laufzeit der original Pos0[/color]
[b]function[/b] pos0([b]const[/b] c:char;[b]const[/b] s:[b]string[/b]):integer;
[color=#000080]//pos0 findet das Zeichen "+","-" ... nicht innerhalb von Klammern[/color]
[b]var[/b] k,z:integer; [color=#000080]//z:=Anzahl der Klammern[/color]
[b]begin[/b]
z := 0;
[b]for[/b] k:=1 [b]to[/b] length(s) [b]do[/b]
[b]begin[/b]
[b]if[/b] s[k]='(' [b]then[/b]
[b]begin[/b]
inc(z);
continue;
[b]end[/b];
[b]if[/b] s[k]=')' [b]then[/b]
[b]begin[/b]
dec(z);
continue;
[b]end[/b];
[b]if[/b] (z=0) [b]and[/b] (s[k]=c) [b]then[/b]
[b]begin[/b]
result:=k;
exit;
[b]end[/b];
[b]end[/b];
Result := 0;
[b]end[/b];
[b]function[/b] copyab([b]const[/b] s:[b]string[/b]; [b]const[/b] i:integer):[b]string[/b];
[b]begin[/b]
Result:=copy(s,i,length(s)-i+1)
[b]end[/b];
[b]function[/b] TermToReal(s:[b]string[/b]):real;
[color=#000080]// {Bisher '+' '-' '*' '/' Klammern und 'x' integriert,[/color]
[color=#000080]// d.h. gebrochen rationale Funktionen werden ausgewertet[/color]
[b]begin[/b]
[color=#000080]//showmessage(s); Empfehlenswert zum Verständnis[/color]
[b]if[/b] pos0('+',s)>0 [b]then[/b] result:=TermToReal(copy(s,1,pos0('+',s)-1))+TermToReal(copyab(s,pos0('+',s)+1)) [b]else[/b]
[b]if[/b] pos0('-',s)>0 [b]then[/b] result:=TermToReal(copy(s,1,pos0('-',s)-1))-TermToReal(copyab(s,pos0('-',s)+1)) [b]else[/b]
[b]if[/b] pos0('*',s)>0 [b]then[/b] result:=TermToReal(copy(s,1,pos0('*',s)-1))*TermToReal(copyab(s,pos0('*',s)+1)) [b]else[/b]
[b]if[/b] pos0('/',s)>0 [b]then[/b] result:=TermToReal(copy(s,1,pos0('/',s)-1))/TermToReal(copyab(s,pos0('/',s)+1)) [b]else[/b]
[b]if[/b] pos0('^',s)>0 [b]then[/b] result:=Power(TermToReal(copy(s,1,pos0('^',s)-1)),TermToReal(copyab(s,pos0('^',s)+1))) [b]else[/b]
[b]if[/b] pos0('$',s)>0 [b]then[/b]
[b]begin[/b]
[b]try[/b]
result:=Power(TermToReal(copy(s,1,pos0('$',s)-1)),1/TermToReal(copyab(s,pos0('$',s)+1)));
[b]except[/b]
Result := 0;
[b]end[/b];
[b]end[/b]
[b]else[/b]
[b]if[/b] pos0('s',s)>0 [b]then[/b] result:=sin(DegToRad(TermToReal(copyab(s,pos0('s',s)+1)))) [b]else[/b]
[b]if[/b] pos0('c',s)>0 [b]then[/b] result:=cos(DegToRad(TermToReal(copyab(s,pos0('c',s)+1)))) [b]else[/b]
[b]if[/b] pos0('t',s)>0 [b]then[/b] result:=tan(DegToRad(TermToReal(copyab(s,pos0('t',s)+1)))) [b]else[/b]
[b]if[/b] (s>'') [b]and[/b] (s[1]='(') [b]then[/b] [b]Begin[/b] [color=#000080]//Am Anfang und Ende eine Klammer[/color]
s:=copy(s,2,length(s)-2);
result:=TermToReal(s)
[b]End[/b] [b]else[/b]
[b]if[/b] s='x' [b]then[/b] result:=x [b]else[/b] [color=#000080]//oder TermToReal(Form1.Ex.text)[/color]
result:=StrToFloat(s);
[b]end[/b];