计算字符串表达式的值(50分)
如题。我想将一串数字字符串如:(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




