Hassan Math 3
Hassan Math 3
unit Hassan_Math_3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Hassan_Gradient, ComCtrls, math;
type
tRealPoint = record x,y:Real; end;
tLabledConstants = record names:array of strings; values:array of Extended; end;
TLine = class
private
public
m,c:Integer;
constructor Create(gradient,intercept:Integer);
function CalcY(x:Real):Integer;
function intersection(line:Tline):TPoint;
end;
TEvaluator = class
private
fVariables: tLabledConstants; //AnsiIndexText function is needed
f
public
expression:string;
end;
function Line(m,c:integer):TLine;
function StringEval(s:string):Extended;
implementation
constructor TLine.Create(gradient,intercept:Integer);
begin
m:=gradient;
c:=intercept;
end;
function TLine.CalcY(x:real):Integer;
begin
Result:=round(m*x+c);
end;
function TLine.intersection(line:Tline):TPoint;
var x:Real;
begin
x:=(line.c-c)/(m-line.m);
Result:=Point(round(x),CalcY(x));
end;
function Line(m,c:integer):TLine;
begin
Result:=TLine.create(m,c);
end;
function StringEval(s:string):Extended;
var operator:Char; i,p,BracketLevel,x,MaxBL:Integer;
begin
//ShowMessage(s);
// ShowMessage('s = '+s);
MaxBL:=0;
BracketLevel:=0;
x:=999;
p:=0;
if length(s)=0 then result:=0
else
begin
for i:=1 to Length(s) do
begin
// ShowMessage(IntToStr(i));
case s[i] of
'(':begin Inc(BracketLevel); inc(MaxBL); end;
')':dec(BracketLevel);
'-':if not(s[i-1] in ['-','+','*','/']) then if (BracketLevel*10<=x) then
begin p:=i; x:=BracketLevel*10; end;
'+':if not(s[i-1] in ['-','+','*','/']) then if (BracketLevel*10<=x) then
begin p:=i; x:=BracketLevel*10+1; end;
'*':if (BracketLevel*10+2<=x) then begin p:=i; x:=BracketLevel*10+2; end;
'/':if (BracketLevel*10+3<=x) then begin p:=i; x:=BracketLevel*10+3; end;
'^':if (BracketLevel*10+4<=x) then begin p:=i; x:=BracketLevel*10+4; end;
end;
end;
// ShowMessage('p = '+IntToStr(p));
if p<=0 then
begin
if MaxBL>0 then s:=copy(s,MaxBL+1,length(s)-MaxBL*2);
result:=StrToFloat(s);
end
else
begin
operator:=s[P];
case operator of
'-':result:=StringEval(copy(s,1,p-1))-StringEval(copy(s,p+1,length(s)));
'+':result:=StringEval(copy(s,1,p-1))+StringEval(copy(s,p+1,length(s)));
'*':result:=StringEval(copy(s,1,p-1))*StringEval(copy(s,p+1,length(s)));
'/':result:=StringEval(copy(s,1,p-1))/StringEval(copy(s,p+1,length(s)));
'^':result:=power(StringEval(copy(s,1,p-
1)),StringEval(copy(s,p+1,length(s))));
end;
end;
end;
end;
end.