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

计算字符串表达式的值(50分)

楼主xiaoMONKEY(小猴)2005-06-10 19:05:18 在 VB / 基础类 提问

如题。我想将一串数字字符串如:(12+34)*15+23*3/16     我想得其结果,给位有什么办法? 问题点数:50、回复次数:22Top

1 楼Athickhead(穿着三角裤到处跑不叫裸奔)回复于 2005-06-10 19:49:13 得分 2

自已做编译器.Top

2 楼shanshan712(闲敲棋子落灯花)回复于 2005-06-10 19:51:44 得分 2

跟编译器的原理一样,写段词法分析的代码,然后按照算术表达式语法计算  
  不过这样有点麻烦的说,不知道其他人有什么高见,学习中^_^b。。。Top

3 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-10 20:33:12 得分 9

 
  '方法一:  
  '引用Microsoft   Script   Control   1.0  
  Private   Sub   Command1_Click()  
          Dim   MSSC   As   New   ScriptControl  
          MSSC.Language   =   "VBScript"  
          MsgBox   "计算表达式的结果是:   "   &   MSSC.Eval("(12+34)*15+23*3/16")  
          Set   MSSC   =   Nothing  
  End   Sub  
   
   
  Top

4 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-10 20:33:51 得分 2

 
    结果显示为:694.3125  
   
  Top

5 楼colin0613(红三天)回复于 2005-06-10 20:49:44 得分 5

Dim   strTemp   As   String  
  Dim   numTemp   As   Integer  
  strTemp   =   (12   +   34)   *   15   +   23   *   3   /   16  
  numTemp   =   Str(strTemp)  
   
  结果显示为:694  
   
  Dim   strTemp   As   String  
  Dim   numTemp   As   Double  
  strTemp   =   (12   +   34)   *   15   +   23   *   3   /   16  
  numTemp   =   Str(strTemp)  
   
  结果显示为:694.3125Top

6 楼DooDu(杜霖:I want,I can(开关拉))回复于 2005-06-10 21:08:29 得分 8

方法3:  
   
  Option   Explicit  
  Private   Declare   Function   EbExecuteLine   Lib   "vba6.dll"   (ByVal   pStringToExec   As   Long,   ByVal   Unknownn1   As   Long,   ByVal   Unknownn2   As   Long,   ByVal   fCheckOnly   As   Long)   As   Long  
   
  Private   Function   ExecuteLine(sCode   As   String,   Optional   fCheckOnly   As   Boolean)   As   Boolean  
          ExecuteLine   =   EbExecuteLine(StrPtr(sCode),   0&,   0&,   Abs(fCheckOnly))   =   0  
  End   Function  
   
   
  Sub   calc(ByVal   x   As   String)  
  Dim   result  
  ExecuteLine   "dim   x   as   double"  
  ExecuteLine   "x=   "   &   x  
  ExecuteLine   "clipboard.settext   x"  
  result   =   Clipboard.GetText  
  MsgBox   x   &   "="   &   result  
  Set   result   =   Nothing  
  End   Sub  
   
  Private   Sub   Command1_Click()  
  calc   Text1  
  End   Sub  
   
  Private   Sub   Form_Load()  
  Text1.Text   =   "(12   +   34)   *   15   +   23   *   3   /   16"  
  End   Sub  
  Top

7 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-10 21:21:58 得分 1

 
    MmMVP马甲   还挺利索的啊  
   
   
  Top

8 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-10 22:03:57 得分 1

MmMVP马甲的办法有个缺点,就是会冲刷调系统剪贴板的内容,下面我公布不使用剪贴板的方法:  
   
  但是需要一个"中间变量":一个专用的文本框,名称:txtExecuteLine  
   
  下面是源代码":  
   
  Private   Declare   Function   EbExecuteLine   Lib   "vba6.dll"   (   _  
          ByVal   pStringToExec   As   Long,   _  
          ByVal   Unknownn1   As   Long,   _  
          ByVal   Unknownn2   As   Long,   _  
          ByVal   fCheckOnly   As   Long)   As   Long  
   
  Private   Function   ExecuteLine(sCode   As   String,   Optional   fCheckOnly   As   Boolean)   As   Boolean  
          On   Error   Resume   Next  
          ExecuteLine   =   EbExecuteLine(StrPtr(sCode),   0&,   0&,   Abs(fCheckOnly))   =   0  
  End   Function  
   
  Function   CalcStringExpression(ByVal   szIn   As   String)   As   Long  
          On   Error   GoTo   Z  
          Form1.txtExecuteLine.Text   =   "0"  
          ExecuteLine   "s="   &   szIn   &   ":   Form1.txtExecuteLine.Text   =s"  
          CalcStringExpression   =   Val(Form1.txtExecuteLine.Text)  
          Exit   Function  
  Z:  
          CalcStringExpression   =   0  
  End   Function  
   
  '开始计算:  
  Private   Sub   Command1_Click()  
          MsgBox   CalcStringExpression("(12+34)*15+23*3/16")  
  End   Sub  
   
   
  Top

9 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-10 22:05:09 得分 0

Form1.txtExecuteLine.Text的内容为:694.3125  
   
  Top

10 楼homezj(小吉)回复于 2005-06-10 22:17:27 得分 5

调用"vba6.dll"有个历史性问题,就是在编译后,无法使用。  
  引用Microsoft   Script   Control   1.0是个解决之道。Top

11 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-10 22:50:34 得分 0

TO:小吉  
   
  是啊,呵呵,忘记说了只能在设计时才有效了  
   
  另外,该了下该函数:  
   
  Function   CalcStringExpression(ByVal   szIn   As   String)   As   Single  
          On   Error   GoTo   Z  
          Form1.txtExecuteLine.Text   =   "0"  
          ExecuteLine   "s="   &   szIn   &   ":   Form1.txtExecuteLine.Text   =s"  
          CalcStringExpression   =   Val(Form1.txtExecuteLine.Text)  
          Exit   Function  
  Z:  
          CalcStringExpression   =   0  
  End   Function  
   
   
   
  Top

12 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-10 22:51:00 得分 0

另外,改了下该函数:  
  Top

13 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-10 22:51:55 得分 0

还是我前面说的方法一简单多了  
   
  引用Microsoft   Script   Control   1.0  
   
  Top

14 楼haen_zhou(Haen)回复于 2005-06-10 22:51:58 得分 2

还是上面的几位厉害。我在实际中也用到了。但是我是自己写了个函数。能完成+-*/\,abs,cos等功能。但是由于"()"这个东西确实讨厌....Top

15 楼haen_zhou(Haen)回复于 2005-06-10 23:13:26 得分 2

建议楼主起床就结贴吧.Top

16 楼dyshadow(棉毛衫)回复于 2005-06-11 01:34:34 得分 2

牛啊,还方法1   方法2的,凯得头晕了~~~  
  @_@  
  关注!!  
  Top

17 楼szjhxu(天野)回复于 2005-06-11 02:09:44 得分 2

colin0613(红三天)   的方法最简单了.  
  Top

18 楼homezj(小吉)回复于 2005-06-11 07:58:59 得分 5

晕!colin0613(红三天)   的方法是解吗?  
   
  Dim   strTemp   As   String  
  Dim   numTemp   As   Double  
  strTemp   =   (12   +   34)   *   15   +   23   *   3   /   16  
  numTemp   =   Str(strTemp)  
  debug.print   numTemp  
   
  ==>  
   
  Dim   strTemp   As   String  
  Dim   numTemp   As   Double  
  strTemp   =   (12   +   34)   *   15   +   23   *   3   /   16  
  debug.print   strTemp  
   
  ==>  
   
  Dim   numTemp   As   Double  
  numTemp   =   (12   +   34)   *   15   +   23   *   3   /   16  
  debug.print   numTemp  
   
  ==>  
   
  debug.print   (12   +   34)   *   15   +   23   *   3   /   16  
   
  嘿!经过我化简,原来一句就搞定了!Top

19 楼wumylove1234(毁于随)回复于 2005-06-11 09:55:20 得分 2

呵呵..  
   
  怎么没有给递归求解的算法呢?  
  我好想学学啊.Top

20 楼xiaoMONKEY(小猴)回复于 2005-06-11 10:28:44 得分 0

结帐Top

21 楼tanaya(唐博士http://blog.csdn.net/tanaya)回复于 2005-06-11 11:03:41 得分 0

晕!colin0613(红三天)   的方法不是解啊Top

22 楼szjhxu(天野)回复于 2005-06-14 01:00:28 得分 0

不要把问题复杂化啊!Top

相关问题

  • 计算字符串表达式
  • 如何将一个字符串转换为能计算的数值表达式
  • 字符串表达式如何求值?
  • 求字符串表达式的值
  • 重赏:字符串表达式的翻译计算
  • 字符串变量如何转换为计算表达式?
  • 计算字符串形式的表达式
  • 求助关于字符串形式的表达式的计算
  • 如何使用XPath 计算字符串表达式
  • 怎样把字符串转成表达式并计算出结果?

关键词

  • debug
  • script
  • microsoft
  • numtemp
  • 表达式
  • mssc
  • strtemp
  • calcstringexpression
  • doublestrtemp
  • executeline

得分解答快速导航

  • 帖主:xiaoMONKEY
  • Athickhead
  • shanshan712
  • tanaya
  • tanaya
  • colin0613
  • DooDu
  • tanaya
  • tanaya
  • homezj
  • haen_zhou
  • haen_zhou
  • dyshadow
  • szjhxu
  • homezj
  • wumylove1234

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

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