首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

请教各位,怎样计算以字符串为表达式的自定义公式呢

2012-01-06 
请问各位,怎样计算以字符串为表达式的自定义公式呢?比如用户随意在textbox控件中写了一个表达式如(A1+B1*C

请问各位,怎样计算以字符串为表达式的自定义公式呢?
比如用户随意在textbox控件中写了一个表达式如(   A1+B1*C2   ),要求计算出它的值.而A1,B1,C1对应的是三个数组,也就是把对应数组的每一行全部求出来.请问各位有没有好的办法?表达式是无法确定的.加,减,乘,除,括号和数字(1,2...)是任意放置的.先谢谢各位.帮帮忙吧!苦思N天了,还是没有高效率的算法.

[解决办法]
问题可以转化成:表达式合法性的检查。对于一个表达式:(a+b*(c+d)^2)*e,如果是合法的(式中a,b,c...都是变量),在VB中result=(a+b*(c+d)^2)*e是可以直接算出来的。不用考虑什么算法。
[解决办法]
vb是解释型语言,什么是解释型语言呢?字符串为表达式的自定义公式需要计算,也就是需要解释了。
[解决办法]
不是数组还是变量的问题,就算是数组。你也是通过公式去算每一个数组中的变量进行计算。
以前我写过一个类似的程序,但源码在家里,晚上回去找找,把公式计算这部分代码发给你,希望对你有些帮助。
[解决办法]
如果计算结果的话,可以使用ScriptControl控件,这个控件的全名是“Microsoft Script Control”,实现方法如下:
创建一个程序,再Form1上分别加入一个ScriptControl控件、一个TextBox和一个CommandButton。
然后创建一个新的类,类名称为Class1,然后在Class1中加入:
Public k1 As Integer
Public a As Integer
Public b As Integer
Public c As Integer

Public ev As String

在Form1的Command1的Click事件中加入以下代码:
Dim shar As New Class1

'a b c分别为赋值
shar.a = 4
shar.b = 6
shar.c = 2

ScriptControl1.AddObject "sh ", shar
'Text1是用户输入的算式
Text1.Text = "a + b - c "
'shar.ev = "with sh " & vbcrlf & "sh.a + sh.b -sh.c " & "end with "
ScriptControl1.AddCode "Function Main() " & _
"dim a " & vbCrLf & "dim b " & vbCrLf & "dim c " & vbCrLf _
& " a = sh.a " & vbCrLf & " b = sh.b " & vbCrLf & "c = sh.c " & vbCrLf _
& vbCrLf & "kk= " & Text1.Text & vbCrLf & "sh.k1 = kk " & vbCrLf & "End Function "

ScriptControl1.Run "main "
MsgBox "结果等于: " & shar.k1, , "运算结果 "

运行程序,点Command1,就会显示运行结果。
[解决办法]
TechnoFantasy的解答非常到位,支持!
[解决办法]
那只能写个函数解释器了,我以前写遗传算法求函数最大值的时候也是用的EVAL这个函数由于要多次调用,效率就非常低了,matlab里面的EVAL函数效率还是相当高的,应该是自己写的解释器吧
[解决办法]
如果有2K多的话。。。。就算你自己写解释器也不会比ScriptControl快,因为要涉及到很多入栈、出栈和字符串判断、解析的工作。你还是用第三方工具把。
PS,我刚才用4*1000的数组,速度还是很快的,你是不是考虑下分段操作。
[解决办法]
给你个模块吧!很好用的!


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 = "1+2*3-4/5 "
End Sub
------解决方案--------------------


你是说我的模块溢出吗?
你看看字段定义的类型,每个类型都有固定的限定范围的,超出了就会溢出。可以想办法缩位或者另存补丁一下!
[解决办法]
不是段的问题,这里没有用到那里,所以不会的,我看就是数据类型问题,但是不知道修改哪里!~
[解决办法]
http://topic.csdn.net/t/20040801/14/3231596.html
[解决办法]
引用microsoft script control 1.p
Dim Ax As New MSScriptControl.ScriptControl
Ax.Language = "VbScript "
Debug.Print Ax.Eval(Text1.Text)

热点排行