定义了三个整形变量:A、B、C,由于A、B、C是动态的数据,没有一个固定的值,但A、B、C之间存在着某种关系,如有可能是:A=B+C或A=B*C或(A+C)*A=B或A-B=C 或...... 总之这种关系是未知的,先由人来识别出这种关系,再将其输入电脑中,让电脑按照我们输入的公式来计算。
在DELPHI程序中,我想用一个文本框来输入这种算术公式,但有一个问题:文本框中的公式如何能被程序正确识别,如我想输入:A*(B-A)=C+B 然后我想让程序按这条公式来计算,这段代码如何编写啊?
其实说得简单一点就是:如何将文本框中输入的字符算术公式转变成为可在DELPHI中执行的程序代码。这个功能有点像计算器吧,但普通的计算器只能识别加减乘除,在这里它是要识别任何一条算术等式的。小弟平时很少用到这个功能,所以真的不懂这个怎么做,麻烦知道的大虾们能帮一下,重谢了,急!!!!!在线等!!!!
在DELPHI程序中,我想用一个文本框来输入这种算术公式,但有一个问题:文本框中的公式如何能被程序正确识别,如我想输入:A*(B-A)=C+B 然后我想让程序按这条公式来计算,这段代码如何编写啊?
其实说得简单一点就是:如何将文本框中输入的字符算术公式转变成为可在DELPHI中执行的程序代码。这个功能有点像计算器吧,但普通的计算器只能识别加减乘除,在这里它是要识别任何一条算术等式的。小弟平时很少用到这个功能,所以真的不懂这个怎么做,麻烦知道的大虾们能帮一下,重谢了,急!!!!!在线等!!!!
把它当作SQL语句来执行,取得运算结果。
比如LUA,MS javascript引擎都可以..
var
temp: Extended;
begin
if not FIsErr then
begin
temp := Term;
while FToken in ['+','-'] do
case (FToken) of
'+':
begin
Match('+');
temp := temp + Term;
end;
'-':
begin
Match('-');
temp := temp - Term;
end;
end; //case
Result := temp;
end;
end;
function TSmpExprCalc.Factor: Extended;
var
temp: Extended;
begin
if not FIsErr then
if FToken = '(' then
begin
Match('(');
temp := exp;
Match(')');
end
else if (FToken in ['0'..'9']) then
begin
temp := FindNum;
end
else
RaiseError(eeExprBadExp);
Result := temp;
end;
procedure TSmpExprCalc.Pre(var AStr: string);
var
len, i: integer;
temp: string;
begin
AStr := trim(AStr);
AStr := StringReplace(AStr, ')(', ')*(', [rfReplaceAll]);
len := length(AStr);
temp := AStr;
for i := 1 to len-2 do
begin
if ((AStr[i] in ['0'..'9','.']) and (AStr[i+1] = '(')) then
insert('*',temp,i+1);
end;
AStr := temp;
len := length(AStr);
for i := 1 to len-1 do
begin
if ((AStr[i] = ')') and (AStr[i+1] in ['0'..'9','.'])) then
insert('*',temp,i+1);
end;
AStr := temp;
len := length(AStr);
for i := len-1 downto 1 do
begin
if (AStr[i] in ['+','-','*','/']) then
begin
if (AStr[i-1] in ['+','-','*','/']) then
begin
delete(temp,i-1,1) ;
end;
end;
end; // END FOR
AStr := temp;
end;function TSmpExprCalc.Term: Extended;
var temp:Extended;
begin
if not FIsErr then
begin
temp := Factor;
while FToken in ['*','/'] do
case (FToken) of
'*':
begin
Match('*');
temp := temp*Factor;
end;
'/':
begin
Match('/');
temp := temp/Factor;
end;
end; //case
result := temp;
end;
end;