(A+B+C)/3, 实现上述表达式, 优先顺序为(),/,+。

解决方案 »

  1.   

    这个使用算法分析的。具体不简单类似的分析算法有的。应该vc的samples中就有吧
      

  2.   

    不好意思忘了说, 假设MeanValue := GetMeanValue(meanitem);可以取到A,B,C的值(从数据库中取)。我只是想知道大家是否有比我更好的办法。
      

  3.   

    With Query1 do
      begin
        Sql.Clear;
        Sql.Add(format('(%d + %d + %d)/3',[a,b,c]));
        Open;
      end;
    Sun := Query1.Fields[0].Asinteger;
      

  4.   

    我是这样做的:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Db, ADODB;type
      TForm1 = class(TForm)
        dtsCompteMean: TADODataSet;
        ADOConnection1: TADOConnection;
        srcdtsCompteMean: TDataSource;
        Button1: TButton;
        dtsQueryMean: TADODataSet;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        function ComputeMean(MeanExpr: String): String;
        function GetMeanItem(MeanExpr : String; Pos : Integer): Char ;
        function GetMeanValue(MeanItem : Char): Double;
      public
        { Public declarations }
      end;
      function IsNumeric(Value : String): Boolean ;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
      ComputeMean('(A+B+C)/3');
    end;function TForm1.ComputeMean(MeanExpr: String): String;
    var
      SqlStr, Mean : String;
      ItemValue, MeanValue, MeanResult, Addend, Divisor : Double;
      MeanItem : Char;
      I, MeanExprLen : Integer;
    begin
      MeanValue := 0;
      MeanResult := 0;
      MeanExprLen := Length(MeanExpr);
      I := 1;
        while I < MeanExprLen do
        begin
          MeanItem := GetMeanItem(MeanExpr, I);
          case MeanItem of
          '(':
            begin
              MeanItem := GetMeanItem(MeanExpr, I);
              MeanResult := MeanValue;
            end;
          ')':
            begin        end;
          '+':
            begin
              Inc(I);
              MeanItem := GetMeanItem(MeanExpr, I);
              Addend := GetMeanValue(MeanItem);
              if IsNumeric(FloatToStr(MeanValue)) then
                MeanResult := MeanResult + Addend;
            end;
          '-':
            begin        end;
          '*':
            begin        end;
          '/':
            begin
              Inc(I);
              MeanItem := GetMeanItem(MeanExpr, I);
              if not IsNumeric(String(MeanItem)) then
                ComputeMean(MeanExpr)
              else
                Divisor := StrToFloat(String(MeanItem));
              if Divisor <> 0 then
                MeanResult := MeanResult/Divisor;
            end;
          else
            begin
              MeanValue := GetMeanValue(meanitem);
              MeanResult := MeanValue;
            end;
          end;
          Inc(I);
          Next;
        end;
        ReSult := FloatToStr(MeanResult);
        ShowMessage('结果是: '+ReSult);
    end;function TForm1.GetMeanItem(MeanExpr : String; Pos : Integer): Char ;
    var
      C: Char;
    begin
      C := Char(MeanExpr[Pos]);
      Result := C;
    end;function TForm1.GetMeanValue(MeanItem : Char): Double;
    var
      MeanValue : Double;
      SqlStr : string;
    begin
      with dtsQueryMean do
      begin
        SqlStr:= 'SELECT * FROM meanitem WHERE meanitem='+''''+MeanItem+'''';
        Close;
        CommandText := SqlStr;
        Open;    MeanValue := FieldByName('MeanItemValue').AsFloat;
        ReSult := MeanValue;
      end;  
    end;function IsNumeric(Value : String): Boolean ;
    var
      I : Integer;
      C : Char;
    begin
      for I := 1 to Length(Value) do
      begin
        C := Char(Value[I]);
        If (C in ['0'..'9']) or (C in ['.']) then
        begin
          if I = Length(Value) then
            Result := True;
        end
        else
        begin
          Result := False;
          Break;
        end;
      end;
    end;end.不过我觉得很别扭,而且很不完整。例如     '+': 部分可不可以用递归的?我想让            '(':
                     begin  
                       MeanItem := GetMeanItem(MeanExpr, I);
                       MeanResult := MeanValue;
                     end;

          else
            begin
              MeanValue := GetMeanValue(meanitem);
              MeanResult := MeanValue;
            end;
    的MeanResult := MeanValue;消失! 这样就完美一点健壮一点了吧!?