Option Explicit
Public i As Integer, j As Integer, str1 As StringDim optr(0 To 10) As String, opnd(0 To 10) As String
Dim Precede(0 To 4, 0 To 4) As Integer
Private Sub Command1_Click()
Precede(0, 0) = 1
Precede(0, 1) = 1
Precede(0, 2) = -1
Precede(0, 3) = -1
Precede(0, 4) = 1
Precede(1, 0) = 1
Precede(1, 1) = 1
Precede(1, 2) = -1
Precede(1, 3) = -1
Precede(1, 4) = 1
Precede(2, 0) = 1
Precede(2, 1) = 1
Precede(2, 2) = 1
Precede(2, 3) = 1
Precede(2, 4) = 1
Precede(3, 0) = 1
Precede(3, 1) = 1
Precede(3, 2) = 1
Precede(3, 3) = 1
Precede(3, 4) = 1
Precede(4, 0) = -1
Precede(4, 1) = -1
Precede(4, 2) = -1
Precede(4, 3) = -1
Precede(4, 4) = 0
i = 0
j = 0
Text2.Text = Getexp(Text1.Text)
End Sub
Private Function Getexp(str1 As String) As String
Dim C1 As String, x As String, a As String, b As String, theta As String
C1 = ReadChar(str1)
Call pushoptr("#")
Do While getoptr() <> "#"
If "0" <= C1 <= "9" Then
pushopnd (C1)ElseSelect Case pre(getoptr(), C1)
Case -1
pushoptr (C1)Case 0
x = popoptr()
Case 1
theta = popoptr()
b = popopnd()
a = popopnd()
pushopnd (operate(a, theta, b))End SelectEnd If
Loop
Getexp = getopnd()
End Function
Private Function ReadChar(str1 As String) As String
ReadChar = ""
If str1 = "" Then Exit Function
ReadChar = Left(str1, 1)
str1 = Right(str1, Len(str1) - 1)
End Function
Public Function pushoptr(s As String) As String
i = i + 1
optr(i) = s
If (optr(0) = "#") ThenLabel1.Caption = "efdsf"
End If
End Function
Public Function popoptr() As String
i = i - 1
popoptr = optr(i)
End Function
Public Function getoptr() As String
getoptr = optr(i)
End Function
Public Function pushopnd(n As String) As String
j = j + 1
opnd(j) = n
End Function
Public Function popopnd() As String
j = j - 1
popopnd = opnd(j)
End Function
Public Function getopnd() As String
getopnd = opnd(j)
End FunctionPublic Function pre(c2 As String, C1 As String) As Integer
Dim n1 As Integer, n2 As Integer
Select Case c2
Case "+"
n1 = 0
Case "-"
n1 = 1
Case "*"
n1 = 2
Case "/"
n1 = 3
Case "#"
n1 = 4
End SelectSelect Case C1
Case "+"
n2 = 0
Case "-"
n2 = 1
Case "*"
n2 = 2
Case "/"
n2 = 3
Case "#"
n2 = 4
End Select
pre = Precede(n1, n2)
End Function
Public Function operate(a As String, theta As String, b As String) As String
Dim ret As Integer
Select Case theta
Case "+"
ret = Val(a) + Val(b)
Case "-"
ret = Val(a) - Val(b)
Case "*"
ret = Val(a) * Val(b)
Case "/"
ret = Val(a) \ Val(b)
End Select
operate = Str(ret)
End Function
Public i As Integer, j As Integer, str1 As StringDim optr(0 To 10) As String, opnd(0 To 10) As String
Dim Precede(0 To 4, 0 To 4) As Integer
Private Sub Command1_Click()
Precede(0, 0) = 1
Precede(0, 1) = 1
Precede(0, 2) = -1
Precede(0, 3) = -1
Precede(0, 4) = 1
Precede(1, 0) = 1
Precede(1, 1) = 1
Precede(1, 2) = -1
Precede(1, 3) = -1
Precede(1, 4) = 1
Precede(2, 0) = 1
Precede(2, 1) = 1
Precede(2, 2) = 1
Precede(2, 3) = 1
Precede(2, 4) = 1
Precede(3, 0) = 1
Precede(3, 1) = 1
Precede(3, 2) = 1
Precede(3, 3) = 1
Precede(3, 4) = 1
Precede(4, 0) = -1
Precede(4, 1) = -1
Precede(4, 2) = -1
Precede(4, 3) = -1
Precede(4, 4) = 0
i = 0
j = 0
Text2.Text = Getexp(Text1.Text)
End Sub
Private Function Getexp(str1 As String) As String
Dim C1 As String, x As String, a As String, b As String, theta As String
C1 = ReadChar(str1)
Call pushoptr("#")
Do While getoptr() <> "#"
If "0" <= C1 <= "9" Then
pushopnd (C1)ElseSelect Case pre(getoptr(), C1)
Case -1
pushoptr (C1)Case 0
x = popoptr()
Case 1
theta = popoptr()
b = popopnd()
a = popopnd()
pushopnd (operate(a, theta, b))End SelectEnd If
Loop
Getexp = getopnd()
End Function
Private Function ReadChar(str1 As String) As String
ReadChar = ""
If str1 = "" Then Exit Function
ReadChar = Left(str1, 1)
str1 = Right(str1, Len(str1) - 1)
End Function
Public Function pushoptr(s As String) As String
i = i + 1
optr(i) = s
If (optr(0) = "#") ThenLabel1.Caption = "efdsf"
End If
End Function
Public Function popoptr() As String
i = i - 1
popoptr = optr(i)
End Function
Public Function getoptr() As String
getoptr = optr(i)
End Function
Public Function pushopnd(n As String) As String
j = j + 1
opnd(j) = n
End Function
Public Function popopnd() As String
j = j - 1
popopnd = opnd(j)
End Function
Public Function getopnd() As String
getopnd = opnd(j)
End FunctionPublic Function pre(c2 As String, C1 As String) As Integer
Dim n1 As Integer, n2 As Integer
Select Case c2
Case "+"
n1 = 0
Case "-"
n1 = 1
Case "*"
n1 = 2
Case "/"
n1 = 3
Case "#"
n1 = 4
End SelectSelect Case C1
Case "+"
n2 = 0
Case "-"
n2 = 1
Case "*"
n2 = 2
Case "/"
n2 = 3
Case "#"
n2 = 4
End Select
pre = Precede(n1, n2)
End Function
Public Function operate(a As String, theta As String, b As String) As String
Dim ret As Integer
Select Case theta
Case "+"
ret = Val(a) + Val(b)
Case "-"
ret = Val(a) - Val(b)
Case "*"
ret = Val(a) * Val(b)
Case "/"
ret = Val(a) \ Val(b)
End Select
operate = Str(ret)
End Function
Public Sub InitPriorityTable()
PriorityTable(1, 1) = 1
PriorityTable(1, 2) = 1
PriorityTable(1, 3) = -1
PriorityTable(1, 4) = -1
PriorityTable(1, 5) = -1
PriorityTable(1, 6) = -1
PriorityTable(1, 7) = 1
PriorityTable(1, 8) = 1
PriorityTable(2, 1) = 1
PriorityTable(2, 2) = 1
PriorityTable(2, 3) = -1
PriorityTable(2, 4) = -1
PriorityTable(2, 5) = -1
PriorityTable(2, 6) = -1
PriorityTable(2, 7) = 1
PriorityTable(2, 8) = 1
PriorityTable(3, 1) = 1
PriorityTable(3, 2) = 1
PriorityTable(3, 3) = 1
PriorityTable(3, 4) = 1
PriorityTable(3, 5) = -1
PriorityTable(3, 6) = -1
PriorityTable(3, 7) = 1
PriorityTable(3, 8) = 1
PriorityTable(4, 1) = 1
PriorityTable(4, 2) = 1
PriorityTable(4, 3) = 1
PriorityTable(4, 4) = 1
PriorityTable(4, 5) = -1
PriorityTable(4, 6) = -1
PriorityTable(4, 7) = 1
PriorityTable(4, 8) = 1
PriorityTable(5, 1) = 1
PriorityTable(5, 2) = 1
PriorityTable(5, 3) = 1
PriorityTable(5, 4) = 1
PriorityTable(5, 5) = -1
PriorityTable(5, 6) = -1
PriorityTable(5, 7) = 1
PriorityTable(5, 8) = 1
PriorityTable(6, 1) = -1
PriorityTable(6, 2) = -1
PriorityTable(6, 3) = -1
PriorityTable(6, 4) = -1
PriorityTable(6, 5) = -1
PriorityTable(6, 6) = -1
PriorityTable(6, 7) = 0
PriorityTable(6, 8) = 10
PriorityTable(7, 1) = 1
PriorityTable(7, 2) = 1
PriorityTable(7, 3) = 1
PriorityTable(7, 4) = 1
PriorityTable(7, 5) = 1
PriorityTable(7, 6) = 10
PriorityTable(7, 7) = 1
PriorityTable(7, 8) = 1
PriorityTable(8, 1) = -1
PriorityTable(8, 2) = -1
PriorityTable(8, 3) = -1
PriorityTable(8, 4) = -1
PriorityTable(8, 5) = -1
PriorityTable(8, 6) = -1
PriorityTable(8, 7) = 10
PriorityTable(8, 8) = 20
End Sub
Public Function WordCheck(Func As String, UnknowNum As Double) '后一个是代表未知数x
Dim i As Integer 'Func 中的第几个字母
Dim j As Integer 'Word中的第几个词
Dim Flag As Boolean 'flag=true 表示上一个字母是 0,2、、、9,和小数点,
Dim k As Integer 'Num 有多少个数
Dim Num(1 To 100) As String '保存数字
Dim Length As Integer 'Func的长度
Dim Char As String '取字母
Dim m As Integer
Dim n As Integer
Dim HaveDot As Boolean
Dim ForeWord As Double '储存整数部分
Dim BehindWord As Double '储存小数部分
ForeWord = 0
BehindWord = 0
HaveDot = False
k = 0
j = 1
Word(j) = "#"
Flag = False
Func = Func & "#"
Length = Len(Func)
For i = 1 To Length
Char = Mid(Func, i, 1)
Select Case Char
Case 0 To 9, "."
k = k + 1
Num(k) = Char
Flag = True
GoTo 10
Case "+", "-", "*", "/", "^", "(", ")", "#", "x", "X" '代表结束的"#"
If Flag = True Then
For m = 1 To k 'm是小数点所在位置
If Num(m) = "." Then
HaveDot = True
Exit For
End If
Next m
If Not HaveDot Then
j = j + 1
Word(j) = 0
For n = 1 To k
Word(j) = Word(j) + Num(n) * 10 ^ (k - n)
Next n
Else
For n = 1 To m - 1
ForeWord = ForeWord + (Num(n) * 10 ^ (m - n - 1)) '整数部分
Next n
For n = m + 1 To k
On Error GoTo 20:
BehindWord = BehindWord + (Num(n) * 10 ^ ((-1) * (n - m))) '小数部分
Next n
j = j + 1
Word(j) = ForeWord + BehindWord
ForeWord = 0
BehindWord = 0
End If
k = 0
End If
j = j + 1
If Char = "X" Or Char = "x" Then
Word(j) = UnknowNum
Else
Word(j) = Char
End If
Flag = False
End Select
10:
Next i
Exit Function
20:
HasError = True
End Function
Public Function Operate() As Double
Dim Row As Integer '列
Dim Line As Integer '行
Dim Prianswer As Integer
Dim i As Integer
InitPriorityTable
ActionStack.Top = 0
DataStack.Top = 0
i = 1
ActionPushIn (Word(i))
Do While (True)
i = i + 1
On Error GoTo 20:
Select Case Word(i)
Case "+", "-", "*", "/", "^", "(", ")", "ln", "#"
Select Case ActionStack.Action(ActionStack.Top)
Case "+"
Line = 1
Case "-"
Line = 2
Case "*"
Line = 3
Case "/"
Line = 4
Case "^"
Line = 5
Case "("
Line = 6
Case ")"
Line = 7
Case "#"
Line = 8
End Select
Select Case Word(i)
Case "+"
Row = 1
Case "-"
Row = 2
Case "*"
Row = 3
Case "/"
Row = 4
Case "^"
Row = 5
Case "("
Row = 6
Case ")"
Row = 7
Case "#"
Row = 8
End Select
Prianswer = TableCheck(Line, Row)
Select Case Prianswer
Case -1 '栈顶优先级低
ActionPushIn (Word(i))
Case 1 '栈顶高,弹出运算
Select Case ActionStack.Action(ActionStack.Top)
Case "+"
DataStack.Data(DataStack.Top - 1) = DataStack.Data(DataStack.Top - 1) + DataStack.Data(DataStack.Top)
ActionOut
DataOut
i = i - 1
Case "-"
DataStack.Data(DataStack.Top - 1) = DataStack.Data(DataStack.Top - 1) - DataStack.Data(DataStack.Top)
ActionOut
DataOut
i = i - 1
Case "*"
DataStack.Data(DataStack.Top - 1) = DataStack.Data(DataStack.Top - 1) * DataStack.Data(DataStack.Top)
ActionOut
DataOut
i = i - 1
Case "/"
DataStack.Data(DataStack.Top - 1) = DataStack.Data(DataStack.Top - 1) / DataStack.Data(DataStack.Top)
ActionOut
DataOut
i = i - 1
Case "^"
DataStack.Data(DataStack.Top - 1) = DataStack.Data(DataStack.Top - 1) ^ DataStack.Data(DataStack.Top)
ActionOut
DataOut
i = i - 1
Case "(" '正确的情况下是不可能出现的情况
HasError = True
Exit Function
End Select
Case 0
ActionOut
Case 10
HasError = True
Exit Function
Case 20
'下一个是"#",DataStack中应该只有一个“#”,ActionStack中应该只有一个操作数,否则可看作是错误的结果
If DataStack.Top <> 1 Or ActionStack.Top <> 1 Or ActionStack.Action(1) <> "#" Then
HasError = True
Exit Function
Else
Operate = DataStack.Data(1)
Exit Function
End If
End Select
Case Else '操作数
DataPushIn (Word(i))
End Select
Loop
Exit Function
20:
HasError = True
End Function
可以算+,-*,/,^,(,)
是积分运算的一部分。当时,我是用这个算一些输入的表达式比较简单的函数,
其中算小数的一部分好象可以用数据类型直接转换,
当时只想到那个苯方法。
还有几个函数:
Public Function DataPushIn(Num As Double)
DataStack.Top = DataStack.Top + 1
DataStack.Data(DataStack.Top) = Num
End FunctionPublic Sub DataOut()
DataStack.Top = DataStack.Top - 1
End SubPublic Function ActionPushIn(Operation As String)
ActionStack.Top = ActionStack.Top + 1
ActionStack.Action(ActionStack.Top) = Operation
End FunctionPublic Sub ActionOut()
ActionStack.Top = ActionStack.Top - 1
End SubPublic Function TableCheck(ActNum1 As Integer, ActNum2 As Integer) As Integer
TableCheck = PriorityTable(ActNum1, ActNum2)
End Function