定义了三个整形变量: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中执行的程序代码。这个功能有点像计算器吧,但普通的计算器只能识别加减乘除,在这里它是要识别任何一条算术等式的。小弟平时很少用到这个功能,所以真的不懂这个怎么做,麻烦知道的大虾们能帮一下,重谢了,急!!!!!在线等!!!!

解决方案 »

  1.   

    可以将变量名替换为相应的值,借助数据库来计算,例如:SQL SERVER
    把它当作SQL语句来执行,取得运算结果。
      

  2.   

    使用一个脚本引擎吧.
    比如LUA,MS javascript引擎都可以..
      

  3.   

    function TSmpExprCalc.exp: Extended;
    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;