[Back to MATH SWAG index] [Back to Main SWAG index] [Original]
(*
From: RYAN THOMPSON
Subj: RE: MATH PARSING
*)
Function Evaluate(Equation : String) : String;
Var
Temp, Operand, Front, Rear : String;
X, Y, Par1, Par2 : Integer;
Value1, Value2, Valtemp : Real;
OperOK,
BadExp : Boolean;
Begin
If Equation = Error then begin
Evaluate:= Error;
Exit;
end;
While Pos(' ', Equation) > 0 do
Delete(Equation, Pos(' ', Equation), 1);
repeat
X:= 1;
Par1:= 0;
Par2:= 0;
repeat
If Equation[X] = '(' then Par1:= X;
If Equation[X] = ')' then Par2:= X;
Inc(X);
until (X = Length(Equation) + 1) or ((Par1 > 0) and (Par2 > 0));
If (Par2 > 0) and (Par2+1 < Length(Equation)) and
(Equation[Par2 + 1] = '(')
then Insert('x', Equation, Par2 + 1);
If (Par2 > Par1) then begin
Temp:= Equation;
Rear:= Copy(Temp, Par2 + 1, 255);
Delete(Temp, Par2, 255);
Front:= Copy(Temp, 1, Par1 - 1);
Delete(Temp, 1, Par1);
Temp:= Evaluate(Temp);
Equation:= Front + Temp + Rear;
While Pos(' ', Equation) > 0 do
Delete(Equation, Pos(' ', Equation), 1);
end
else if Par2 < Par1 then begin
Evaluate:= Error;
Exit;
end;
until Par2 <= Par1;
Value1:= 0;
repeat
If (Length(Equation) > 0) then begin
Operand:= '';
X:= 1;
While ((Equation[X] < '0') or (Equation[X] > '9'))
and (Equation[X] <> '.')
and (X < Length(Equation) + 1)
do begin
Operand:= Operand + Equation[X];
Inc(X);
end;
Delete(Equation, 1, X - 1);
end;
If Length(Equation) > 0 then begin
Temp:= '0';
X:= 1;
while (((Equation[X] <= '9') and (Equation[X] >= '0'))
or (Equation[X] = '.')) and (X < Length(Equation) + 1) do
begin
Temp:= Temp + Equation[X];
Inc(X);
end;
If (X > 10) and (Pos('.', Equation) > 9) then begin
Evaluate:= Error;
Exit;
end;
Delete(Equation, 1, X - 1);
Val(Temp, Value2, Y);
If Y <> 0 then begin
Evaluate:= Error;
Exit;
end;
end;
Temp:= '';
If Length(Operand) > 1 then begin
Temp:= Operand;
Delete(Temp, Pos('+', Temp), 1);
If Pos('-', Temp) <> Length(Temp)
then Delete(Temp, Pos('-', Temp), 1);
Delete(Temp, Pos('x', Temp), 1);
Delete(Temp, Pos('/', Temp), 1);
Delete(Temp, Pos('^', Temp), 1);
If Pos('+', Operand) = 1 then Operand:= '+'
else if Pos('-', Operand) = 1 then Operand:= '-'
else if Pos('x', Operand) = 1 then Operand:= 'x'
else if Pos('/', Operand) = 1 then Operand:= '/'
else if Pos('^', Operand) = 1 then Operand:= '^'
else Operand:= '';
end;
OperOK:= False;
If Temp = 'SIN' then begin
OperOK:= True;
Value2:= Sin(Rad(Value2));
end;
If Temp = 'COS' then begin
OperOK:= True;
Value2:= Cos(Rad(Value2));
end;
If Temp = 'TAN' then if Cos(Rad(Value2)) <> 0 then begin
OperOK:= True;
Value2:= (Sin(Rad(Value2)) / Cos(Rad(Value2)));
end
else begin
Evaluate:= Error;
Exit;
end;
If Temp = 'SQR' then begin
OperOK:= True;
Value2:= Sqrt(Value2);
end;
If Temp = 'ASIN' then begin
OperOK:= True;
Valtemp:= 1 - Sqr(Value2);
If Valtemp < 0 then begin
Evaluate:= Error;
Exit;
end
else If Sqrt(Valtemp) = 0 then Value2:= 90
else Value2:= Deg(ArcTan(Value2 / Sqrt(Valtemp)));
end;
If Temp = 'ACOS' then begin
OperOK:= True;
Valtemp:= 1 - Sqr(Value2);
If Valtemp < 0 then begin
Evaluate:= Error;
Exit;
end
else If Value2 = 0 then Value2:= 90
else Value2:= Deg(Arctan(Sqrt(Valtemp) / Value2))
end;
[Back to MATH SWAG index] [Back to Main SWAG index] [Original]