function pos0(c:char;s:string):integer;
//pos0 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
if s[k]='(' then inc(z);
if s[k]=')' then
dec(z);
if (z=0) and (s[k]=c) then BEgin
result:=k; //Treffer
exit;
ENd;
End;
result:=0; //nichts gefunden
end;
function anfang(s:string;c:char):string;
begin
anfang:=copy(s,1,pos0(c,s)-1);
end;
function copyab(const s:string; const i:integer):string;
begin result:=copy(s,i,length(s)-i+1) end;
function ende(s:string; c:char):string;
begin
ende:=copyab(s,pos0(c,s)+1)
end;
function hoch(x,y:real):real;
begin
result:=Power(x,y); //=e = (e ) =x
end;
function Wurzel(Value, WurzelNum: Extended): Extended;
begin
try
Result := Power(Value, 1 / WurzelNum)
except
result := 0;
end;
end;
function sinus( aWinkel : extended ) : extended;
begin
Result:= sin( DegToRad(aWinkel) );
end;
function cosinus( aWinkel : extended ) : extended;
begin
Result:= cos( DegToRad(aWinkel) );
end;
function tangens( aWinkel : extended ) : extended;
begin
Result:= tan( DegToRad(aWinkel) );
end;
function TermToReal(s:string):real;
// {Bisher '+' '-' '*' '/' Klammern und 'x' integriert,
// d.h. gebrochen rationale Funktionen werden ausgewertet
begin
//showmessage(s); Empfehlenswert zum Verständnis
if pos0('+',s)>0 then result:=TermToReal(anfang(s,'+'))+TermToReal(ende(s,'+')) else
if pos0('-',s)>0 then result:=TermToReal(anfang(s,'-'))-TermToReal(ende(s,'-')) else
if pos0('*',s)>0 then result:=TermToReal(anfang(s,'*'))*TermToReal(ende(s,'*')) else
if pos0('/',s)>0 then result:=TermToReal(anfang(s,'/'))/TermToReal(ende(s,'/')) else
if pos0('^',s)>0 then result:=hoch(TermToReal(anfang(s,'^')),TermToReal(ende(s,'^'))) else
if pos0('$',s)>0 then result:=wurzel(TermToReal(anfang(s,'$')),TermToReal(ende(s,'$'))) else
if pos0('s',s)>0 then result:=sinus(TermToReal(ende(s,'s'))) else
if pos0('c',s)>0 then result:=cosinus(TermToReal(ende(s,'c'))) else
if pos0('t',s)>0 then result:=tangens(TermToReal(ende(s,'t'))) 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;