(a[01]=1)and(d[51]>30)or(s[78]='xxk')and(c[23]<>v[20])and((a[46]<47)or(d[42]>2))or(v[15]<=2.36)对这个表达式求值,假设表达式中所有数组都是已知的在线给分等待中...

解决方案 »

  1.   

    procedure TForm1.Button21Click(Sender: TObject);
    var
      s, subStr: String;
      i,istart: Integer;
    begin
      s := '(a01=1)and(d51>30)or(s78=xxk)and(c23<>v20)and((a46<47)or(d42>2))or(v15<=2.36)';
      istart := 1;
      for i:=1 to Length(s) do
      begin
        if (s[i] in ['=','>','<']) then
        begin
          memo1.Lines.Add(copy(s,istart,i-istart));
          istart := i;
        end;
      end;
      memo1.Lines.Add(copy(s,istart,Length(s)-istart+1));  s := '';
      for i:=0 to memo1.Lines.Count-2 do
      begin
        subStr := memo1.Lines[i];
        if Length(subStr) <> 1 then
          s := s + Copy(subStr,1,Length(subStr)-2) + '[' + Copy(subStr,Length(subStr)-1,2) + ']'
        else
          s := s + subStr;
      end;
      s := s + memo1.Lines[memo1.Lines.Count-1];
      showMessage(s);
    end;
      

  2.   

    写个解释器还是很累的,看起来至少要解析算术表达式,字符表达式,关系表达式和逻辑表达式。偷懒的办法,把数组的值替换进去,然后放到SQL里去select。
      

  3.   

    没有,几乎每天我都在说我没有QQ,甚至我不知道msn是个什么东西,看来我该去注册一个qq了.
      

  4.   

    不会吧,老大,QQ没有不要紧,可MSN是一定要有的啊,快去注册吧
      

  5.   

    放到sql语句中执行,然后取出执行结果不就行了
      

  6.   

    偷懒的办法,把数组的值替换进去,然后放到SQL里去select。
    ----------------------------------------------------
    都在教訓俺?
      

  7.   

    行吗????我这是oracle,我也试也,可不通
      

  8.   

    系统自带vbscript controlfunction U_Compute_strValue(ss: string): integer;
    var
        Script: TScriptControl;
    begin
        try
            Script := TScriptControl.Create(nil);
            Script.Language := 'vbscript';
            Result := Script.Eval(ss);
        except
            result := 0;
        end;
    end;
      

  9.   

    "假设表达式中所有数组都是已知的"
    看完楼主的另一个贴子,把a01 --> a[01]转换,是为了用数组存数吧?
    其实,不用转换,用TStringList存数就行.var
      sl:TStringList;
      Value:string;
    begin
      sl := TStringList.Create;
      try
        sl.Add('a01=1');
        sl.Add('d51=17');
        sl.Add('s78=''xxk''');    Value := sl.Values['s78'];//按名取数
        ShowMessage(Value);
      finally
        sl.Free
      end;
    end;