CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

怎样计算出用字符窜表示的数学表达式的值?

楼主blucecat(广种薄收)2002-02-12 14:50:04 在 Delphi / VCL组件开发及应用 提问

千万不要太复杂 问题点数:20、回复次数:18Top

1 楼syl79()回复于 2002-02-12 15:33:14 得分 0

不好意思,据我所知这是比较复杂的。我以前用C写过一个一样的程序,是先把字符串转换成波兰或者是逆波兰表达式,然后用栈作为辅助数据结构求出结果。  
  如果你需要的的话我可以把C源程序给你作参考。Top

2 楼blucecat(广种薄收)回复于 2002-02-13 16:06:56 得分 0

在vfp中  
  str="2+3"  
  ?&str  
  结果为5  
   
  就这么简单!!!  
   
   
  在delphi   或   vc中有这么简单的方法吗?Top

3 楼redlegend_126_com(redlegend)回复于 2002-02-13 21:01:18 得分 0

可以查找运算符号,把数分离出来,在运算!Top

4 楼hfkobe(沙哈拉)回复于 2002-02-13 23:19:20 得分 0

关注Top

5 楼phy(被爱捶死)回复于 2002-02-13 23:40:32 得分 0

要是在javascript   中就更简单了,直接用val,可惜是在delphi中Top

6 楼blucecat(广种薄收)回复于 2002-02-15 12:43:02 得分 0

upTop

7 楼dext(德克斯特)回复于 2002-02-15 18:58:07 得分 0

相当于basic   的   print  
  相当于pascal   的   write  
  相当于c   的   printf  
   
  还犹豫什么,Delphi有源码  
   
  Top

8 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2002-02-15 21:28:59 得分 0

我的主页有个DLL,delphi的,可以解决问题,要给我分!!!  
  http://lyhome.3322.net/lysoft/Expression.dll  
  稍后我会发布源代码!Top

9 楼tangyong_delphi()回复于 2002-02-16 12:28:08 得分 0

lyhome.3322.net怎么是英文的,lyhome.3322.net/lysoft我上不去  
  Expression.dll  
  怎么用?Top

10 楼spell(问到底)回复于 2002-02-16 14:47:52 得分 0

。Top

11 楼buff(答案)回复于 2002-02-16 16:40:32 得分 0

rxlib中有一个控件可以计算Top

12 楼li_zhifu(东北人)回复于 2002-02-16 20:02:44 得分 0

唉,你们都是怎么了,这个问题M$已经有了一个解决方案了。在Win2K下在Delphi中Import   ActiveX Control,选Microsoft   Script   Control 1.0,安装,在应用程序中  
  ScriptControl1.Language:='JavaScript';  
  ShowMessage(ScriptControl1.Eval('2*3+5'));  
  就可以了。  
  在Win98中可以把Win2K下的msscript.ocx拷过来用。  
  此控件可以进行复杂的运算,如支持'(',组合运算等。甚至可以对整型数进行位运算。Top

13 楼bokei(一夜好眠)回复于 2002-02-18 02:45:02 得分 0

先把中缀表达式转成后缀表达式,以后就可以计算了。  
  如果想自己写的话,看看数据结构。里面有介绍Top

14 楼wr960204(武稀松)回复于 2002-02-18 08:13:16 得分 0

看一下数据结构的书几乎每一本都有讲到用堆栈的方法实现的Top

15 楼eulb(执子之手,与子偕老)回复于 2002-02-18 10:11:07 得分 20

CSDN   -   技术频道   -   文档中心   -   Delphi                
       
  标题           计算出用字符串表示的数学表达式的值         ly_liuyang(原作)      
       
  关键字           字符串   表达式    
       
   
   
  //   built   by   Liu   Yang   2002.1.8  
   
  library   Expression;  
   
  uses   Dialogs,   Math,   SysUtils;  
   
  Const  
      Symbol_Mod='M';     Symbol_Div='D';  
      Symbol_Shl='L';     Symbol_Shr='R';  
      Symbol_Or='O';       Symbol_Xor='X';  
      Symbol_And='A';  
   
  function   ConvertExpression(ExpressionString:PChar):PChar;   stdcall;  
  var   inputexp:string;  
  begin  
      inputexp:=ExpressionString;  
      //convert   input   expression   to   recognize   expression  
      if   pos('=',inputexp)=0   then   inputexp:=inputexp+'='   else   inputexp:=Copy(inputexp,1,Pos('=',inputexp));  
      inputexp:=UpperCase(inputexp);  
      inputexp:=StringReplace(inputexp,'   ','',[rfReplaceAll]);  
      inputexp:=StringReplace(inputexp,'MOD',Symbol_Mod,[rfReplaceAll]);  
      inputexp:=StringReplace(inputexp,'DIV',Symbol_Div,[rfReplaceAll]);  
      inputexp:=StringReplace(inputexp,'AND',Symbol_And,[rfReplaceAll]);  
      inputexp:=StringReplace(inputexp,'XOR',Symbol_Xor,[rfReplaceAll]);  
      inputexp:=StringReplace(inputexp,'OR',Symbol_Or,[rfReplaceAll]);  
      inputexp:=StringReplace(inputexp,'SHL',Symbol_Shl,[rfReplaceAll]);  
      inputexp:=StringReplace(inputexp,'SHR',Symbol_Shr,[rfReplaceAll]);  
      inputexp:=StringReplace(inputexp,'(-','(0-',[rfReplaceAll]);  
      if   pos('-',inputexp)=1   then   inputexp:='0'+inputexp;  
      Result:=PChar(inputexp);  
  end;  
   
  function   ParseExpression(ExpressionString:PChar):   extended;   stdcall;  
  var  
      nextch:char;  
      nextchpos,position:word;  
      inputexp:string;  
  procedure   expression(var   ev:extended);forward;  
  procedure   readnextch;  
  begin  
      repeat  
          if   inputexp[position]='='   then   nextch:='='  
                          else  
                                    begin  
                                        inc(nextchpos);  
                                        inc(position);  
                                        nextch:=inputexp[position];  
                                    end;  
      until   (nextch<>'   ')   or   eoln;  
  end;  
  procedure   error(ErrorString:string);  
  begin  
      MessageDlg('Unknown   expression     :   '+ErrorString,mterror,[mbok],0);  
      exit;  
  end;  
  procedure   number(var   nv:extended);  
  var   radix:longint;   snv:string;  
  function   BinToInt(value:   string):   integer;  
  var   i,size:integer;  
  begin       //   convert   binary   number   to   integer  
      result:=0;  
      size:=length(value);  
      for   i:=size   downto   1   do  
              if   copy(value,i,1)='1'  
              then   result:=result+(1   shl   (size-i));  
  end;  
  begin  
      nv:=0;  
      snv:='';  
      while   nextch   in   ['0'..'9','A'..'F']   do  
          begin  
  //             nv:=10*nv+ord(nextch)-ord('0');  
              snv:=snv+nextch;  
              readnextch;  
          end;  
      //   parse   Hex,   Bin  
      if   snv<>''   then  
            if   snv[Length(snv)]='B'  
                  then   nv:=BinToInt(Copy(snv,1,Length(snv)-1))  
                  else   if   nextch='H'   then   begin   nv:=StrToInt('$'+snv);   readnextch;   end  
                                                        else   nv:=StrToInt(snv);  
      if   nextch='.'   then  
                                            begin  
                                                radix:=10;  
                                                readnextch;  
                                                while   nextch   in   ['0'..'9']   do  
                                                    begin  
                                                        nv:=nv+(ord(nextch)-ord('0'))/radix;  
                                                        radix:=radix*10;  
                                                        readnextch;  
                                                    end;  
                                              end;  
  end;Top

16 楼eulb(执子之手,与子偕老)回复于 2002-02-18 10:12:20 得分 0

续  
   
  procedure   factor(var   fv:extended);  
  Var   Symbol:string;  
      function   CalcN(Value:integer):extended;  
      var   i:integer;  
      begin  
          Result:=1;  
          if   Value=0   then   Exit  
                else   for   i:=1   to   Value   do  
                              Result:=Result*i;  
      end;  
      function   ParseFunction(var   FunctionSymbol:string):boolean;  
      begin  
          FunctionSymbol:='';  
          while   not   (nextch   in   ['0'..'9','.','(',')','+','-','*','/','='])   do  
              begin  
                  FunctionSymbol:=FunctionSymbol+nextch;  
                  readnextch;  
              end;  
          if   FunctionSymbol='ABS'   then   Result:=true   else  
          if   FunctionSymbol='SIN'   then   Result:=true   else  
          if   FunctionSymbol='COS'   then   Result:=true   else  
          if   FunctionSymbol='TG'   then   Result:=true   else  
          if   FunctionSymbol='TAN'   then   Result:=true   else  
          if   FunctionSymbol='ARCSIN'   then   Result:=true   else  
          if   FunctionSymbol='ARCCOS'   then   Result:=true   else  
          if   FunctionSymbol='ARCTG'   then   Result:=true   else  
          if   FunctionSymbol='ARCTAN'   then   Result:=true   else  
          if   FunctionSymbol='LN'   then   Result:=true   else  
          if   FunctionSymbol='LG'   then   Result:=true   else  
          if   FunctionSymbol='EXP'   then   Result:=true   else  
          if   FunctionSymbol='SQR'   then   Result:=true   else  
          if   FunctionSymbol='SQRT'   then   Result:=true   else  
          if   FunctionSymbol='PI'   then   Result:=true   else  
          if   FunctionSymbol='NOT'   then   Result:=true   else  
          if   FunctionSymbol='N!'   then   Result:=true   else  
          if   FunctionSymbol='E'   then   Result:=true   else  
                Result:=false;  
      end;  
  begin  
      Case   nextch   of  
          '0'..'9'   :   number(fv);  
          '('   :   begin  
                          readnextch;  
                          expression(fv);  
                          if   nextch=')'  
                                then   readnextch   else   error(nextch);  
                      end  
          else   if   ParseFunction(Symbol)   then  
                          if   nextch='('   then  
                                begin  
                                    readnextch;  
                                    expression(fv);  
                                    if   Symbol='ABS'   then   fv:=abs(fv)   else  
                                    if   Symbol='SIN'   then   fv:=sin(fv)   else  
                                    if   Symbol='COS'   then   fv:=cos(fv)   else  
                                    if   Symbol='TG'   then   fv:=tan(fv)   else  
                                    if   Symbol='TAN'   then   fv:=tan(fv)   else  
                                    if   Symbol='ARCSIN'   then   fv:=arcsin(fv)   else  
                                    if   Symbol='ARCCOS'   then   fv:=arccos(fv)   else  
                                    if   Symbol='ARCTG'   then   fv:=arctan(fv)   else  
                                    if   Symbol='ARCTAN'   then   fv:=arctan(fv)   else  
                                    if   Symbol='LN'   then   fv:=ln(fv)   else  
                                    if   Symbol='LG'   then   fv:=ln(fv)/ln(10)   else  
                                    if   Symbol='EXP'   then   fv:=exp(fv)   else  
                                    if   Symbol='SQR'   then   fv:=sqr(fv)   else  
                                    if   Symbol='SQRT'   then   fv:=sqrt(fv)   else  
                                    if   Symbol='NOT'   then   fv:=not(Round(fv))   else  
                                    if   Symbol='N!'   then   fv:=CalcN(Round(fv))   else  
                                          error(symbol);  
                                    if   nextch=')'   then   readnextch   else   error(nextch);  
                                end   else   begin       //   parse   constant  
                                                      if   Symbol='PI'   then   fv:=3.14159265358979324   else  
                                                      if   Symbol='E'   then   fv:=2.71828182845904523   else   error(symbol);  
                                                  end   else   begin   error(Symbol);   fv:=1;     end;  
      end;  
  end;  
  procedure   Power_(var   pv:extended);  
  var  
      multiop:char;  
      fs:extended;  
  begin  
      factor(pv);  
      while   nextch   in   ['^']   do  
          begin  
              multiop:=nextch;  
              readnextch;  
              factor(fs);  
              case   multiop   of  
              '^':if   pv<>0.0   then   pv:=exp(ln(pv)*fs)   else   error(multiop);  
              end;  
          end;  
  end;  
  procedure   term_(var   tv:extended);  
  var  
      multiop:char;  
      fs:extended;  
  begin  
      Power_(tv);  
      while   nextch   in   ['*','/',Symbol_Mod,Symbol_Div,Symbol_And,Symbol_Shl,Symbol_Shr]   do  
          begin  
              multiop:=nextch;  
              readnextch;  
              Power_(fs);  
              case   multiop   of  
              '*':tv:=tv*fs;  
              '/':if   fs<>0.0   then   tv:=tv/fs   else   error(multiop);  
              Symbol_Mod:tv:=round(tv)   mod   round(fs);       //   prase   mod  
              Symbol_Div:tv:=round(tv)   div   round(fs);       //   parse   div  
              Symbol_And:tv:=round(tv)   and   round(fs);       //   parse   and  
              Symbol_Shl:tv:=round(tv)   shl   round(fs);       //   parse   shl  
              Symbol_Shr:tv:=round(tv)   shr   round(fs);       //   parse   shr  
              end;  
          end;  
  end;  
  procedure   expression(var   ev:extended);  
  var  
      addop:char;  
      fs:extended;  
  begin  
      term_(ev);  
      while   nextch   in   ['+','-',Symbol_Or,Symbol_Xor]   do  
          begin  
              addop:=nextch;  
              readnextch;  
              term_(fs);  
              case   addop   of  
              '+':ev:=ev+fs;  
              '-':ev:=ev-fs;  
              Symbol_Or:ev:=round(ev)   or   round(fs);           //   parse   or  
              Symbol_Xor:ev:=round(ev)   xor   round(fs);       //   parse   xor  
              end;  
          end;  
  end;  
  BEGIN  
      inputexp:=ConvertExpression(ExpressionString);  
      if   pos('=',inputexp)=0   then  
            inputexp:=ConvertExpression(ExpressionString);  
      position:=0;  
      while   inputexp[position]<>'='   do  
          begin  
              nextchpos:=0;  
              readnextch;  
              expression(result);  
          end;  
  END;  
   
  function   ParseExpressionToStr(ExpressionString:PChar):PChar;   stdcall;  
  var   ES:string;  
  begin  
      ES:=ExpressionString;  
      if   pos('=',ES)=0  
            then   ES:=ES+'='  
            else   ES:=Copy(ES,1,Pos('=',ES));  
      ES:=ES+FormatFloat('0.000000000000',ParseExpression(ExpressionString));  
      Result:=PChar(ES);  
  end;  
   
  function   Version:PChar;   stdcall;  
  begin  
      Result:='Calculator   Dll   Build   2001.10.25   Made   By   Liu   Yang   All   Rights   Reserved';  
  end;  
   
  Exports  
      ConvertExpression,   ParseExpression,   ParseExpressionToStr,   Version;  
  end.  
  Top

17 楼zswang(伴水清清)(专家门诊清洁工)回复于 2002-02-18 23:15:06 得分 0

http://kingron.myetang.com/zsfunc0k.htm  
  (*//  
  标题:计算表达式  
  说明:加、减、乘、除及括号;请大家多多测试  
  设计:Zswang  
  日期:2002-01-26  
  支持:wjhu111@21cn.com  
  //*)Top

18 楼nnwq(乖仔)回复于 2002-02-19 14:16:45 得分 0

gzTop

相关问题

  • 字符串转数学表达式
  • 字符串转数学表达式
  • 求助:字符串(表达式)怎么转换成数学表达式?
  • 字符串表达式如何求值?
  • 求字符串表达式的值
  • 如何将字符串转化为数学表达式?
  • 如何把字符串 "2+3" 转成数学表达式 2+3?
  • 如何把字符串解析为相应的数学表达式?
  • "10+3+5-6"这个字符串怎样把它变成数学表达式?
  • 请问高手,怎样验证字符串数学表达式是否正确?

关键词

  • .net
  • win2k
  • 数据结构
  • delphi
  • inputexp
  • snv
  • nextch
  • 表达式
  • functionsymbol
  • readnextch

得分解答快速导航

  • 帖主:blucecat
  • eulb

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo