两个表 1。基本参数表 2。表达式表
表结构如下:
1.基本参数表:base
baseid      string   基本参数编码
basename    string   基本参数名称
basevalue   double   基本参数数值
2.表达式表:exprisstion
expid       string   表达式编码
expname     string   表达式名称
表中数据如下
base表
baseid                 basename           basevalue
  a                      长                   2
  b                      宽                   12
  c                      ds                   43
exprisstion  表
expid                  expname          
  fx                     a*b+2              
  wx                     fx*2+a+c*b
  tx                     wx+fx+(c*a)*2我的问题是    如果我输入tx则样得到这样的值   
((a*b+2)*2+a+c*b)+(a*b+2)+(c*a)*2
就是最后表达式全部要化成基本参数编码。分不够还可以加,这一提问我发两帖。解决我给200分。 

解决方案 »

  1.   

    首先查表将tx = wx+fx+(c*a)*2 化为((a*b+2)*2+a+c*b)+(a*b+2)+(c*a)*2,这应该不难。
    扫描一边即可。
    再将表达式转换为操作符后置,这样就可以去掉括号,有专门的操作符后置算法,记得以前版的程序员高级程序员资料里提到算法,网上可以下载到。
    余下的运用查数据表即可。
      

  2.   

    从tx开始啊,先把wx变成(wx),然后查表把wx的值replace进去,
    然后再把fx变成(fx),再查表把fx的值replace进去,不就行了?
    可以写一个存储过程来做,比较快
      

  3.   

    同意singlesword(歪歪一剑) 的作法,不要用存储过程,那样维护起来很麻烦把你的上述算法封装在一个类中。你的东东好像除了扫描表外没有别的算法,因为你的东东都是可变的。如果不是干脆写成常量表达式岂不更简单
      

  4.   

    如果用递归的方法会简单点
    尝试了一下,应该可以function uncode(s:string):string;
    begin
      将表达式s分割为各个操作数(比如fx,a,b)的列表和操作符(+ -等);
    if s能够分为几个操作数
    begin
       //将操作数字符串依次调用uncode;
       返回results:= uncode(操作数1) + 操作符1 + uncode(操作数2) + 操作符2 + ...;
    end
    else //s 为单操作数比如fx, a..
    begin
      if 操作数字符串s在baseid中,返回results:= s;
      else 在 exprisstion表中查找expid = s 的记录,返回results:= uncode(expname);
    endreturn
      

  5.   

    用存储过程和用函数都不是关键,关键是大家像1楼说的“扫描一遍”,觉得不对,应该是N遍,有可能fx包含ex,ex包含dx,dx包含cx,....,当然不能有循环调用,是树形的运算树
    如果用简单的递归,其实是一个深度优先的递归算法
    你也可以将其定义为广义表....
    其实这些已经有比较标准的算法,很多数据结构书里都有
      

  6.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        BitBtn1: TBitBtn;
        procedure BitBtn1Click(Sender: TObject);
      private
      public
        function re(var AStr: String): boolean;
        function trans(var AStr: String): boolean;
      end;var
      Form1: TForm1;implementation{$R *.dfm}function TForm1.re(var AStr: String): boolean;
    var
      i: Integer;
      Str: String;
      Exp: String;
    begin
      Exp := '';
      Str := '(' + AStr +')';
      AStr := '';
      result := false;
      for i := 1 to Length(Str) do
      begin
        if (Str[i] in ['+','-','*','/','(',')']) then
        begin
          if Exp <> '' then
          begin
            if trans(Exp) then result := true;
            AStr := AStr + Exp;
            Exp := '';
          end;
          AStr := AStr + Str[i];
        end
        else
          Exp := Exp + Str[i];
      end;
      Delete(AStr,1,1);
      Delete(AStr,Length(AStr),1);
    end;function TForm1.trans(var AStr: String): boolean;
    begin
      //请加以修改,Astr 在exprisstion表中出现就替换AStr,不出现返回false;
      //为保险起见可以先在exprisstion中查找,找不到就到base表中查找,再找不到就报错
      result := true;
      if Astr = 'fx' then
        AStr := '(a*b+2)'
      else
        if AStr = 'wx' then
          AStr := '(fx*2+a+c*b)'
        else
          if Astr = 'tx' then
            AStr := '(wx+fx+(c*a)*2)'
          else
            result := false;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      a: String;
    begin
      a := 'wx';
      repeat
      until not re(A);
      ShowMessage(a);
    end;end.