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

解决方案 »

  1.   


    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
      

  2.   


                              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
    可以算+,-*,/,^,(,)
      

  3.   

    这是我以前写的,可以对表达式判断对错,
    是积分运算的一部分。当时,我是用这个算一些输入的表达式比较简单的函数,
    其中算小数的一部分好象可以用数据类型直接转换,
    当时只想到那个苯方法。
    还有几个函数:
    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