Обратная польская запись - VBA

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста, реализовать алгоритм арифметических действий обратной польской записью.

Решение задачи: «Обратная польская запись»

textual
Листинг программы
Option Base 1
Sub Макрос1()
Dim f As String, ch As Double, mag(50) As Variant, vixp(50) As Variant
Dim L As Integer, i As Integer, j As Integer, k As Integer, smv As String
Dim rez, fv As String
ch = 0
f = InputBox("Введите формулу")
If Mid(f, 1, 1) = "-" Then f = "0" & f
L = Len(f)
j = 0: k = 0
For i = 1 To L
    smv = Mid(f, i, 1)
    If smv >= "0" And smv <= "9" Then
        ch = ch * 10 + Val(smv)
        If i = L Then
            k = k + 1
            vixp(k) = ch
        End If
        If i < L And (Mid(f, i + 1, 1) < "0" Or Mid(f, i + 1, 1) > "9") Then
            k = k + 1
            vixp(k) = ch
        End If
        Else
        If smv = "(" Then
            j = j + 1
            mag(j) = smv
            ch = 0
            Else
            If smv = ")" Then
                Do
                    If j = 0 Then
                        MsgBox "Некорректная формула! " & f
                        Exit Sub
                    End If
                    If mag(j) = "(" Then
                        j = j - 1
                        ch = 0
                        Exit Do
                    End If
                    k = k + 1
                    vixp(k) = mag(j)
                    j = j - 1
                Loop
                Else
                If smv = "+" Or smv = "-" Then
                    Do
                        If j = 0 Then
                            j = j + 1
                            mag(j) = smv
                            ch = 0
                            Exit Do
                        End If
                        If mag(j) = "(" Then
                            j = j + 1
                            mag(j) = smv
                            ch = 0
                            Exit Do
                        End If
                        k = k + 1
                        vixp(k) = mag(j)
                        j = j - 1
                    Loop
                    Else
                    If smv = "*" Or smv = "/" Then
                        Do
                            If j = 0 Then
                                j = j + 1
                                mag(j) = smv
                                ch = 0
                                Exit Do
                            End If
                            If mag(j) = "(" Or mag(j) = "+" Or mag(j) = "-" Then
                                j = j + 1
                                mag(j) = smv
                                ch = 0
                                Exit Do
                            End If
                            k = k + 1
                            vixp(k) = mag(j)
                            j = j - 1
                        Loop
                        Else
                        MsgBox "Недопстимый символ " & i & " в формуле! " & f, 0, ""
                        Exit Sub
                    End If
                End If
            End If
        End If
    End If
Next i
If j <> 0 Then
    For i = j To 1 Step -1
        k = k + 1
        vixp(k) = mag(i)
    Next i
End If
fv = ""
For i = 1 To k
    fv = fv & vixp(i) & " "
Next i
j = 0
For i = 1 To k
    If vixp(i) <> "+" And vixp(i) <> "-" And vixp(i) <> "*" And vixp(i) <> "/" Then
        j = j + 1
        mag(j) = vixp(i)
        Else
        If j = 1 Then
            MsgBox "Некорректная формула! " & f
            Exit Sub
        End If
    End If
    If vixp(i) = "+" Then
        mag(j - 1) = mag(j - 1) + mag(j)
        j = j - 1
    End If
    If vixp(i) = "-" Then
        mag(j - 1) = mag(j - 1) - mag(j)
        j = j - 1
    End If
    If vixp(i) = "*" Then
        mag(j - 1) = mag(i - 1) * mag(j)
        j = j - 1
    End If
    If vixp(i) = "/" Then
        mag(j - 1) = mag(j - 1) / mag(j)
        j = j - 1
    End If
    If vixp(i) = "(" Then
            MsgBox "Некорректная формула! " & f
            Exit Sub
    End If
Next i
rez = mag(1)
MsgBox "Формула: " & f & Chr(13) & "Обратная польская нотация: " & fv & Chr(13) & "Результат: " & rez, 0, ""
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы