|
|

楼主 |
发表于 2006-9-14 18:34:00
|
显示全部楼层
这是另一个,还有注释!
Public Function 计算(表达式 As String) As String
Dim i, n As Integer
Dim Temp表达式, 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(表达式)), Mup(Len(表达式)), Byp(Len(表达式)) _
, Lkp(Len(表达式)), Rkp(Len(表达式)) As Integer
ReDim Adn(Len(表达式)), Mun(Len(表达式)), Byn(Len(表达式)) _
, Lkn(Len(表达式)), Rkn(Len(表达式)), Sig(Len(表达式)) As Integer
ReDim Vl(Len(表达式))
If Len(表达式) = 0 Then GoTo Err
If Mid(表达式, Len(表达式), 1) <> "#" Then
Temp表达式 = 表达式
For i = 1 To Len(表达式) '将减化加
If Mid(表达式, i, 1) = "-" And i <> 1 Then
If Mid(表达式, i - 1, 1) <> "+" _
And Mid(表达式, i - 1, 1) <> "-" _
And Mid(表达式, i - 1, 1) <> "*" _
And Mid(表达式, i - 1, 1) <> "/" Then
Temp表达式 = Mid(Temp表达式, 1, i - 1 + n) + "+" + Mid(表达式, i)
n = n + 1
End If
End If
Next i
表达式 = Temp表达式
n = 0
For i = 1 To Len(表达式) '处理负负得正
If Mid(表达式, i, 1) = "-" Then
If Mid(表达式, i + 1, 1) = "-" Then
Temp表达式 = Mid(Temp表达式, 1, i - 1 - n) + Mid(表达式, i + 2)
n = n + 2
End If
End If
Next i
表达式 = Temp表达式
表达式 = 表达式 + "#"
End If
Vls = 1
Ads = 0: Sus = 0: Mus = 0: Bys = 0: Lks = 0: Rks = 0
For i = 1 To Len(表达式)
Select Case Mid(表达式, 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(表达式, i, 1) = "+" Or Mid(表达式, i, 1) = "*" Or _
Mid(表达式, i, 1) = "/" Or Mid(表达式, i, 1) = "#" Then
'If Si + 1 = i And Mid(表达式, i + 1, 1) <> "#" _
'Then '操作符非法连续或以操作符开头
'GoTo Err2
'Else
'Si = i
'End If
If Not IsNumeric(Vl(Vls)) And Mid(表达式, i + 1, 1) <> "#" Then '操作数不是数字
GoTo Err3
End If
Sig(Vls) = i
Vls = Vls + 1
Else
If Mid(表达式, i, 1) <> "(" And Mid(表达式, i, 1) <> ")" Then
Vl(Vls) = Vl(Vls) + Mid(表达式, i, 1) '制作操作数
Else
If i <> 1 Then
If ((Mid(表达式, i - 1, 1) = "(" _
And Mid(表达式, i, 1) = ")") _
Or (Mid(表达式, i - 1, 1) = ")" And Mid(表达式, i, 1) = "(")) _
Then '判定括号前后符号的合法性
GoTo Err4
End If
End If
End If
End If
Next i
If Lks <> Rks Then
GoTo Err5 '左右括号数是否匹配
End If
For i = 1 To Lks
If Lkp(i) > Rkp(i) Then GoTo Err6 '左右括号出现顺序错误
Next i
If Lks <> 0 Then '括号处理
Do While True
For i = Lks To 1 Step -1
For n = Rks To 1 Step -1
Temp = 计算(Mid(表达式, Lkp(i) + 1, Rkp(n) - Lkp(i) - 1))
If Temp <> "公式有错误" Then
表达式 = Mid(表达式, 1, Lkp(i) - 1) + Temp + Mid(表达式, Rkp(n) + 1)
Exit Do
End If
Next n
Next i
If Temp = "公式有错误" Then GoTo Err7
'括号中有错误退出
Loop
Else
If Mus <> 0 Then '乘法处理
表达式 = Mid(表达式, 1, Sig(Mun(1) - 1)) _
+ Trim(Str(Val(Vl(Mun(1))) _
* Val(Vl(Mun(1) + 1)))) _
+ Mid(表达式, Val(Mup(1)) _
+ Len(Vl(Mun(1) + 1)) + 1)
Else
If Bys <> 0 Then '除法处理
表达式 = Mid(表达式, 1, Sig(Byn(1) - 1)) _
+ Trim(Str(Val(Vl(Byn(1))) / Val(Vl(Byn(1) + 1)))) _
+ Mid(表达式, Val(Byp(1)) + Len(Vl(Byn(1) + 1)) + 1)
Else
If Ads <> 0 Then '加法处理
表达式 = Trim(Str(Val(Vl(1)) + Val(Vl(2)))) _
+ Mid(表达式, Val(Adp(1)) _
+ Len(Vl(2)) + 1)
Else
计算 = Mid(表达式, 1, Len(表达式) - 1)
Exit Function
End If
End If
End If
End If
Loop
Err:
'计算 = "公式有错误"
a = 1
Err2:
a = 1
Err3:
a = 1
Err4:
a = 1
Err5:
a = 1
Err6:
a = 1
Err7:
a = 1
End Function
|
|