引申出一个问题。怎么样再VB中运行类似脚本的东西。
比如一个变量中保存有:
dim a as integer
a=10
print a
这样的VB代码,怎么样在程序中运行?
...全文
12932打赏收藏
怎么样算"1+2*3/4"的值
一个变量里面存的是类似"1+2*3/4"这样的可以计算的四则运算题,用什么简单的办法可以得到结果。请注意,要简单。如果是把这个字符串分割开再算接别说了。 引申出一个问题。怎么样再VB中运行类似脚本的东西。 比如一个变量中保存有: dim a as integer a=10 print a 这样的VB代码,怎么样在程序中运行?
'计算用户输入的表达式
'函数:MathCal
'参数:CalStr 一个数学表达式,如:23*45/9
'返回值:String,(如果成功,则返回计算结果,否则,返回 "ERR")
'例子:
Public Function MathCal(CalStr As String) As String
Dim I, N As Integer
Dim TempGs, Temp As String
Dim Vl() As String '操作数
Dim Vls As Integer '操作数的数目
Dim Si As Integer '上一操作符的位置
Dim Ads, Sus, Mus, Bys, Lks, Rks As Integer '操作符的数目
Dim Adp(), Mup(), Byp(), Lkp(), Rkp() As Integer '操作符的位置
Dim Adn(), Mun(), Byn() As Integer '操作符的排列次序
Dim Sig() As Integer '每一个操作符的位置
On Error GoTo Err
Do While True
ReDim Adp(Len(CalStr)), Mup(Len(CalStr)), Byp(Len(CalStr)) _
, Lkp(Len(CalStr)), Rkp(Len(CalStr)) As Integer
ReDim Adn(Len(CalStr)), Mun(Len(CalStr)), Byn(Len(CalStr)) _
, Lkn(Len(CalStr)), Rkn(Len(CalStr)), Sig(Len(CalStr)) As Integer
ReDim Vl(Len(CalStr))
If Len(CalStr) = 0 Then GoTo Err
If Mid$(CalStr, Len(CalStr), 1) <> "#" Then
TempGs = CalStr
For I = 1 To Len(CalStr) '将减化加
If Mid$(CalStr, I, 1) = "-" And I <> 1 Then
If Mid$(CalStr, I - 1, 1) <> "+" And Mid$(CalStr, I - 1, 1) <> "-" _
And Mid$(CalStr, I - 1, 1) <> "*" And Mid$(CalStr, I - 1, 1) <> "/" Then
TempGs = Mid$(TempGs, 1, I - 1 + N) + "+" + Mid$(CalStr, I)
N = N + 1
End If
End If
Next I
CalStr = TempGs
N = 0
For I = 1 To Len(CalStr) '处理负负得正
If Mid$(CalStr, I, 1) = "-" Then
If Mid$(CalStr, I + 1, 1) = "-" Then
TempGs = Mid$(TempGs, 1, I - 1 - N) + Mid$(CalStr, I + 2)
N = N + 2
End If
End If
Next I
CalStr = TempGs
CalStr = CalStr + "#"
End If
Select Case Mid$(CalStr, I, 1)
Case "+"
Ads = Ads + 1
Adp(Ads) = I
Adn(Ads) = Vls
Case "*"
Mus = Mus + 1
Mup(Mus) = I
Mun(Mus) = Vls
Case "/"
Bys = Bys + 1
Byp(Bys) = I
Byn(Bys) = Vls
Case "("
Lks = Lks + 1
Lkp(Lks) = I
Case ")"
Rks = Rks + 1
Rkp(Rks) = I
End Select
If Mid$(CalStr, I, 1) = "+" Or Mid$(CalStr, I, 1) = "*" Or _
Mid$(CalStr, I, 1) = "/" Or Mid$(CalStr, I, 1) = "#" Then
If Si + 1 = I And Mid$(CalStr, I + 1, 1) <> "#" _
Then '操作符非法连续或以操作符开头
GoTo Err
Else
Si = I
End If
If Not IsNumeric(Vl(Vls)) And Mid$(CalStr, I + 1, 1) <> "#" _
Then '操作数不是数字
GoTo Err
End If
Sig(Vls) = I
Vls = Vls + 1
Else
If Mid$(CalStr, I, 1) <> "(" And Mid$(CalStr, I, 1) <> ")" Then
Vl(Vls) = Vl(Vls) + Mid$(CalStr, I, 1) '制作操作数
Else
If I <> 1 Then
If ((Mid$(CalStr, I - 1, 1) = "(" And Mid$(CalStr, I, 1) = ")") Or _
(Mid$(CalStr, I - 1, 1) = ")" And Mid$(CalStr, I, 1) = "(")) _
Then '判定括号前后符号的合法性
GoTo Err
End If
End If
End If
End If
Next I
If Lks <> Rks Then
GoTo Err '左右括号数是否匹配
End If
For I = 1 To Lks
If Lkp(I) > Rkp(I) Then GoTo Err '左右括号出现顺序错误
Next I
If Lks <> 0 Then '括号处理
Do While True
For I = Lks To 1 Step -1
For N = Rks To 1 Step -1
Temp = MathCal(Mid$(CalStr, Lkp(I) + 1, Rkp(N) - Lkp(I) - 1))
If Temp <> "ERR" Then
CalStr = Mid$(CalStr, 1, Lkp(I) - 1) + Temp + Mid$(CalStr, Rkp(N) + 1)
Exit Do
End If
Next N
Next I
If Temp = "ERR" Then GoTo Err
'/括号中有错误退出
Loop
Else
If Mus <> 0 Then '乘法处理
CalStr = Mid$(CalStr, 1, Sig(Mun(1) - 1)) + Trim$(Str(Val(Vl(Mun(1))) _
* Val(Vl(Mun(1) + 1)))) + Mid$(CalStr, Val(Mup(1)) + Len(Vl(Mun(1) _
+ 1)) + 1)
Else
If Bys <> 0 Then '除法处理
CalStr = Mid$(CalStr, 1, Sig(Byn(1) - 1)) + Trim$(Str(Val(Vl(Byn(1))) _
/ Val(Vl(Byn(1) + 1)))) + Mid$(CalStr, Val(Byp(1)) + Len(Vl(Byn(1) _
+ 1)) + 1)
Else
If Ads <> 0 Then '加法处理
CalStr = Trim$(Str(Val(Vl(1)) + Val(Vl(2)))) + Mid$(CalStr, Val(Adp(1)) _
+ Len(Vl(2)) + 1)
Else
MathCal = Mid$(CalStr, 1, Len(CalStr) - 1)
Exit Function
End If
End If
End If
End If
Loop