天下足球十大悲情球队:[VB]表达式识别

来源:百度文库 编辑:中科新闻网 时间:2024/05/01 07:25:15
我想知道例如"3+2*5/4"这样的表达式到底是怎么识别的,也就是想要识别模块(或函数)的源代码。
一楼正解~~

黯寂的枯叶 作弊;抄袭

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

我写过,代码不见了,给你说原理吧
两个数组,一个放运算符,一个放运算数
扫描这个表达式,发现运算符的话,判断与前一个运算符的级别,低或等于的话就运算前面一个
比如3+5-3,当扫描到-时候,级别与+相同,就运算3+5
如果级别高的话,就保存到数组中去
比如3+2*5,就保存到数组中去
遇到数字的话,就一直等到遇到运算符才将这个数放到运算数数组中去。

从网上也可以搜索到很多类似的源代码

利用Access中的函数Eval("")可计算字符串表达式的值
Dim acc As Object
Set acc = CreateObject("access.application")
Debug.Print acc.eval("3*4+5")
前提是电脑已安装Aceess

数据结构中,应用栈的一个例子,用后缀表示计算表达式,估计很多认都做过的。
先是按照顺序读取该表达式
当输入是运算符的时候,要判断运算符的优先级,如果优先级和之前的运算优先级相等或者低,就进行上一个运算符的运算,如果优先级高,就要继续读取

我写过,代码不见了,给你说原理吧
两个数组,一个放运算符,一个放运算数
扫描这个表达式,发现运算符的话,判断与前一个运算符的级别,低或等于的话就运算前面一个
比如3+5-3,当扫描到-时候,级别与+相同,就运算3+5
如果级别高的话,就保存到数组中去
比如3+2*5,就保存到数组中去
遇到数字的话,就一直等到遇到运算符才将这个数放到运算数数组中去。

从网上也可以搜索到很多类似的源代码

计算机只认识2进制,转换后再辨别吧 。我瞎猜的lll呵呵然后来个选择语句,是哪种运算,哈哈