如何计算字符型表达式如:12+3*5/10的值,返回数值型结果13。5如:
var 
  aaa:string;
begin
  aaa:='(12+3*6)/3';
  如何得到aaa的值返回10为数值型.
因为表达式可能为aaa:='25+6*9'
其他语言如:access中有相应的函数;exl

解决方案 »

  1.   

    bbb:integer;
    如何使bbb:=aaa
    即得到,结果10;
      

  2.   

    我的方法是解析字符串,然后用两个链表分别存储数字和操作符,之后循环存储操作符的链表,用位置比对关系得出整个串的运算结果,我刚才做了个例子,因为时间短,我没有把扩号加进来(因为运算量会加很多),只是简单的实现了加减乘除,现在贴出来给楼主看看,如果楼主有兴趣,可以自行考虑加时间的情况以及纠错处理(就是字符串不规则,比如两个运算符号相连或者除数为0等等)unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        valuelist:tstringlist;
        fhlist:tstringlist;
        function mathways(mathstr:string):string;
        procedure putvaluetolist(s1:string);
        function listisnull:boolean;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
        self.Edit2.Text:=self.mathways(self.Edit1.Text);
    end;
    //-----------------------------------------------------------------------------
    function TForm1.mathways(mathstr:string):string;
    var
       s1:string;
       i,icount:integer;
       str,str1,str2:string;
    begin
        valuelist:=tstringlist.Create();
        fhlist:=tstringlist.Create();
        self.putvaluetolist(mathstr);
        while not self.listisnull do
        begin
            for i:=0 to fhlist.Count-1 do
            begin
                if (fhlist.Strings[i]='*')or(fhlist.Strings[i]='/') then
                begin
                    str1:=valuelist.Strings[i];
                    str2:=valuelist.Strings[i+1];
                    if fhlist.Strings[i]='*' then
                    begin
                        str:=floattostr(strtofloat(str1)*strtofloat(str2));
                        valuelist.Strings[i]:=str;
                        valuelist.Delete(i+1);
                        fhlist.Delete(i);
                    end
                    else if fhlist.Strings[i]='/' then
                    begin
                        str:=floattostr(strtofloat(str1)/strtofloat(str2));
                        valuelist.Strings[i]:=str;
                        valuelist.Delete(i+1);
                        fhlist.Delete(i);
                    end;
                    break;
                end;        end;
        end;
        while  fhlist.Count>0 do
        begin
            for i:=0 to fhlist.Count-1 do
            begin            str1:=valuelist.Strings[i];
                str2:=valuelist.Strings[i+1];
                if fhlist.Strings[i]='+' then
                begin
                    str:=floattostr(strtofloat(str1)+strtofloat(str2));
                    valuelist.Strings[i]:=str;
                    valuelist.Delete(i+1);
                    fhlist.Delete(i);
                end
                else if fhlist.Strings[i]='-' then
                begin
                    str:=floattostr(strtofloat(str1)-strtofloat(str2));
                    valuelist.Strings[i]:=str;
                    valuelist.Delete(i+1);
                    fhlist.Delete(i);
                end;
                break
            end;
        end;
        s1:=valuelist.Strings[0];
        valuelist.Free;
        fhlist.Free;
        result:=s1;
    end;
    procedure TForm1.putvaluetolist(s1:string);
    var
        i:integer;
        icount:integer;
        s2:string;
    begin
        icount:=0;
        for i:=1 to length(s1) do
        begin
            if (s1[i]='*') or(s1[i]='/') or(s1[i]='+') or(s1[i]='-') then
            begin
                valuelist.Add(copy(s1,icount+1,i-icount-1));
                fhlist.Add(copy(s1,i,1));
                icount:=i;
            end;
            if i=length(s1) then
            begin
                valuelist.Add(copy(s1,icount+1,i-icount));
            end;
        end;
    end;
    function tform1.listisnull:boolean;
    var
        flag:boolean;
        i:integer;
    begin
        flag:=true;
        for i:=0 to fhlist.Count-1 do
        begin
            if (fhlist.Strings[i]='*') or(fhlist.Strings[i]='/') then
            begin
                flag:=false;
                break;
            end;
        end;
        result:=flag;
    end;
    end.