CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  语言基础/算法/系统设计

+1-2+3计算出表达式的值

楼主Jute(东方明珠)2005-01-19 17:47:51 在 Delphi / 语言基础/算法/系统设计 提问

在Edit1.text的字符串值中有以三种情况:  
  (1)   +1-2+3      
  (2)   -1-2+3  
  (3)   1-2+3  
   
  要求计算出表达式的值,看有没有好的算法,我给100分。 问题点数:100、回复次数:10Top

1 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2005-01-19 17:54:58 得分 0

去我的Blog看  
  http://blog.csdn.net/ly_liuyang  
   
  http://lysoft.7u7.netTop

2 楼zzbomb(麽麽茶)回复于 2005-01-19 17:56:44 得分 0

case   LeftStr(S,   1)   of  
  Top

3 楼kiboisme(蓝色光芒)(www.1284.net/)(软件开发机器人for delphi)回复于 2005-01-19 17:58:23 得分 0

用LY的方法不错。  
   
  也可以  
  'Select   '+Edit1.text   +   '   as   AValue';  
  AduQuery.Open;  
  ........  
  :)))))Top

4 楼pilicat(Delphi迷)回复于 2005-01-19 18:00:55 得分 20

使用TScriptControl控件吧,这是一个ActiveX近件,需要你自己安装。  
   
  它在ActiveX对象列表中叫Microsoft   Script   Control  
   
  安装后,在窗体上放一个控件,然后,像这样写代码:  
   
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      //初始化引擎语言为Javascript  
      ScriptControl1.Language:='Javascript';  
      //计算表达式的值,其中,Edit1中有表达式  
      //该控件还可以实现更复杂的计算,试试吧!  
      ShowMessage(ScriptControl1.Eval(Edit1.Text));  
  end;  
   
   
  大量电脑书籍下载:  
  http://www.netyi.net/in.asp?id=ForMoreU  
  Top

5 楼meiqingsong(阿飛)回复于 2005-01-19 18:58:03 得分 30

1.ScriptControl  
  uses  
          ComObj  
   
  .....  
   
   
  function   Eval(expStr:   string):   string;  
  var  
          js:   OleVariant;  
  begin  
          js   :=   CreateOleObject('ScriptControl');  
          js.Language   :=   'JavaScript';  
          Result   :=   js.Eval(expStr);  
          js   :=   Unassigned;  
  end;  
   
   
   
  Eval('((123+112)*12+21*(4562-60))*3/7   +   50')=41776.5714285714  
   
  2.   用数据库,   select    
  3.  
  uses  
      Math,Sysutils;  
   
      procedure   Bracket(mText:   string;   var   nLStr,   nCStr,   nRStr:   string);  
      function   Calc(mText:   string):   string;  
   
  implementation  
   
  procedure   Bracket(mText:   string;   var   nLStr,   nCStr,   nRStr:   string);  
  var  
      L,   R:   Integer;  
      I:   Integer;  
      B:   Boolean;  
  begin  
      nLStr   :=   '';  
      nCStr   :=   '';  
      nRStr   :=   '';  
      B   :=   True;  
      L   :=   0;  
      R   :=   0;  
      for   I   :=   1   to   Length(mText)   do  
          if   B   then   begin  
              if   mText[I]   =   '('   then  
                  Inc(L)  
              else   if   mText[I]   =   ')'   then  
                  Inc(R);  
              if   L   =   0   then  
                  nLStr   :=   nLStr   +   mText[I]  
              else   if   L   >   R   then  
                  nCStr   :=   nCStr   +   mText[I]  
              else   B   :=   False;  
          end   else   nRStr   :=   nRStr   +   mText[I];  
      Delete(nCStr,   1,   1);  
  end;   {   Bracket   }  
   
  function   Calc(mText:   string):   string;  
  var  
      vText:   string;  
   
      function   fCalc(mText:   string):   string;  
      var  
          vLStr,   vCStr,   vRStr:   string;  
          I,   J,   K,   L:   Integer;  
      begin  
          L   :=   Length(mText);  
          if   Pos('(',   mText)   >   0   then   begin  
              Bracket(mText,   vLStr,   vCStr,   vRStr);  
              Result   :=   Calc(vLStr   +   fCalc(vCStr)   +   vRStr);  
          end   else   if   (Pos('+',   mText)   >   0)   or   (Pos('-',   mText)   >   0)   then   begin  
              I   :=   Pos('+',   mText);  
              J   :=   Pos('-',   mText);  
              if   I   =   0   then   I   :=   L;  
              if   J   =   0   then   J   :=   L;  
              K   :=   Min(I,   J);  
              vLStr   :=   Copy(mText,   1,   Pred(K));  
              vRStr   :=   Copy(mText,   Succ(K),   L);  
              if   vLStr   =   ''   then   vLStr   :=   '0';  
              if   vRStr   =   ''   then   vRStr   :=   '0';  
              if   I   =   K   then  
                  Result   :=   FloatToStr(StrToFloat(fCalc(vLStr))   +   StrToFloat(fCalc(vRStr)))  
              else   Result   :=   FloatToStr(StrToFloat(fCalc(vLStr))   -   StrToFloat(fCalc(vRStr)))  
          end   else   if   (Pos('*',   mText)   >   0)   or   (Pos('/',   mText)   >   0)   then   begin  
              I   :=   Pos('*',   mText);  
              J   :=   Pos('/',   mText);  
              if   I   =   0   then   I   :=   L;  
              if   J   =   0   then   J   :=   L;  
              K   :=   Min(I,   J);  
              vLStr   :=   Copy(mText,   1,   Pred(K));  
              vRStr   :=   Copy(mText,   Succ(K),   L);  
              if   vLStr   =   ''   then   vLStr   :=   '0';  
              if   vRStr   =   ''   then   vRStr   :=   '0';  
              if   I   =   K   then  
                  Result   :=   FloatToStr(StrToFloat(fCalc(vLStr))   *   StrToFloat(fCalc(vRStr)))  
              else   Result   :=   FloatToStr(StrToFloat(fCalc(vLStr))   /   StrToFloat(fCalc(vRStr)))  
          end   else   if   Pos('_',   mText)   =   1   then  
              Result   :=   FloatToStr(-StrToFloat(fCalc(Copy(mText,   2,   L))))  
          else   Result   :=   FloatToStr(StrToFloat(mText));  
      end;  
  var  
      I,   L:   Integer;  
  begin  
      vText   :=   '';  
      L   :=   Length(mText);  
      for   I   :=   1   to   L   do  
          if   (mText[I]   =   '-')   and   (I   <   L)   and   (not   (mText[Succ(I)]   in   ['+',   '-',   '(',   ')']))   then  
              if   (I   =   1)   or   ((I   >   1)   and   (mText[Pred(I)]   in   ['*',   '/']))   then  
                  vText   :=   vText   +   '_'  
              else   if   (I   >   1)   and   (mText[Pred(I)]   in   ['+',   '-'])   then  
                  vText   :=   vText   +   '+_'  
              else   vText   :=   vText   +   mText[I]  
          else   vText   :=   vText   +   mText[I];  
      Result   :=   fCalc(vText);  
  end;   {   Calc   }  
   
   
  end.Top

6 楼wozhuchuanwei(一个组件编写者,就一定是一个更优秀的Delphi开发者)回复于 2005-01-19 20:15:50 得分 0

对头  
  都说了哈  
  Top

7 楼Jute(东方明珠)回复于 2005-01-20 10:49:54 得分 0

有哪位再给我算法的Top

8 楼songyanbin(孤叶)回复于 2005-01-20 11:10:30 得分 50

uses   ComObj;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      vScriptControl:   OleVariant;  
  begin  
      vScriptControl   :=   CreateOleObject('MSScriptControl.ScriptControl');  
      vScriptControl.Language   :=   'VBScript';  
      Caption   :=   vScriptControl.Eval('1-2+3');  
  end;  
  Top

9 楼songyanbin(孤叶)回复于 2005-01-20 11:14:02 得分 0

为了       meiqingsong(阿飛)       的第3个算法   此贴   收藏Top

10 楼xmchw(xmchw)回复于 2005-01-20 11:32:31 得分 0

upTop

相关问题

  • 急:如何识别表达式,并计算其表达式的值
  • 急:如何识别表达式,并计算其表达式的值
  • 请问:如何实现计算CString中表达式的值?
  • 表达式求值问题的计算/eg.3*9/5(2-11)
  • 计算字符串表达式的值(50分)
  • SOS!请问如何输入一个表达式并计算其值?
  • 计算表达式的值,挺麻烦的问题,请大家帮忙!!!
  • 怎样计算出用字符窜表示的数学表达式的值?
  • Excel中如何只计算公式中一部分表达式的值?
  • 关于计算文本框中输入的代数表达式的值

关键词

  • .net
  • 控件
  • js
  • javascript
  • mtext
  • 表达式
  • vtext
  • ncstr
  • nlstr
  • nrstr

得分解答快速导航

  • 帖主:Jute
  • pilicat
  • meiqingsong
  • songyanbin

相关链接

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

广告也精彩

反馈

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