function pos0(
const c:char;
const s:
string):integer;
var k,z:integer;
//z:=Anzahl der Klammern
begin
z := 0;
for k:=1
to length(s)
do
begin
if s[k]='
('
then
begin
inc(z);
continue;
end;
if s[k]='
)'
then
begin
dec(z);
continue;
end;
if (z=0)
and (s[k]=c)
then
begin
result:=k;
exit;
end;
end;
Result := 0;
end;
function copyab(
const s:
string;
const i:integer):
string;
begin
Result:=copy(s,i,length(s)-i+1)
end;
function pos0Ex(
const c: Char;
const s:
string;
out ResultValue: Integer): Integer;
//pos0Ex findet das Zeichen "+","-" ... nicht innerhalb von Klammern
var k, z: Integer;
//z:=Anzahl der Klammern
begin
z := 0;
for k := 1
to Length(s)
do begin
case s[k]
of
'
(': Inc(z);
'
)':
Dec(z);
else
if (z = 0)
and (s[k] = c)
then begin
Result := k;
//Treffer
ResultValue := k;
Exit;
end;
end;
end;
ResultValue := 0;
Result := 0;
end;
function TermToReal(s:
string):real;
// {Bisher '+' '-' '*' '/' Klammern und 'x' integriert,
// d.h. gebrochen rationale Funktionen werden ausgewertet
var ps: Integer;
begin
//showmessage(s); Empfehlenswert zum Verständnis
if pos0Ex('
+',s,ps)>0
then result:=TermToReal(copy(s,1,ps-1))+TermToReal(copyab(s,ps+1))
else
if pos0Ex('
-',s,ps)>0
then result:=TermToReal(copy(s,1,ps-1))-TermToReal(copyab(s,ps+1))
else
if pos0Ex('
*',s,ps)>0
then result:=TermToReal(copy(s,1,ps-1))*TermToReal(copyab(s,ps+1))
else
if pos0Ex('
/',s,ps)>0
then result:=TermToReal(copy(s,1,ps-1))/TermToReal(copyab(s,ps+1))
else
if pos0Ex('
^',s,ps)>0
then result:=Power(TermToReal(copy(s,1,ps-1)),TermToReal(copyab(s,ps+1)))
else
if pos0Ex('
$',s,ps)>0
then
begin
try
result:=Power(TermToReal(copy(s,1,ps-1)),1/TermToReal(copyab(s,ps+1)));
except
Result := 0;
end;
end
else
if pos0Ex('
s',s,ps)>0
then result:=sin(DegToRad(TermToReal(copyab(s,ps+1))))
else
if pos0Ex('
c',s,ps)>0
then result:=cos(DegToRad(TermToReal(copyab(s,ps+1))))
else
if pos0Ex('
t',s,ps)>0
then result:=tan(DegToRad(TermToReal(copyab(s,ps+1))))
else
if (s<>'
')
and (s[1]='
(')
then begin //Am Anfang und Ende eine Klammer
s:=copy(s,2,length(s)-2);
result:=TermToReal(s)
end else
if s='
x'
then result:=x
else //oder TermToReal(Form1.Ex.text)
result:=StrToFloat(s);
end;