Нестандартный интерпретатор арифметического выражения - VB

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

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

Я не нашёл на форуме интерпретатора арифметического выражения. Поэтому последние три дня только им и занимался. И предлагаю вашему вниманию действующую программу. Дана форма, на форме кнопка, результат выносится в заголовок формы. Особенности программы: 1. Выполняет четыре арифметических действия 2. Функции: s(x)=sin(x), c(x)=cos(x), m(x)=abs(x), e(x)=(x) Зачем нужна функция e(x) , если она ничего не делает?? Ну 0 тоже в числе ничего не делает, а без него плохо. Арифметическое выражение выглядит примерно так (1+2)*(3+4), а в программе так е(e(1+2)*e(3+4)). Это моё Ноу-хау!! В программе используется рекурсивная процедура. При каждом обращении к ней уменьшается пара скобок. И когда она не находит скобку это означает, что все вычислено! Конечно у программы пока слабая защита от любопытного пользователя. Если он введет в текстовое поле например такой текст "Саша+Маша" , то тут нужен другой интерпретатор, этот такого сложения не знает. Тем не менее он помогает тому, кто в этом нуждается Например вводится арифметическое выражение. Если скобки вводятся неверно, то кнопка становится сразу красной. Если все верно, то кнопка зелёная. Если число скобок непарное то кнопка жёлтая. Предполагается дальнейшее совершенствование этой программы. Буду рад любым вашим советам, замечаниям и пожеланиям по адресу этой программы. Поскольку она довольно сложная, то я не жду быстрого ответа. форма
Листинг программы
  1. Option Explicit
  2. Private Sub cmdCOM_Click()
  3. b = True
  4. Ti = txtT.Text
  5. Call Main(Ti)
  6. frmG.Caption = Str(All)
  7. End Sub
  8. Private Sub txtT_Change()
  9. Dim n As Integer
  10. Ti = txtT.Text
  11. n = Ccc(Ti)
  12. cmdCOM.BackColor = _
  13. Switch(n = 2, vbRed, n = 1, vbYellow, True, vbGreen)
  14. End Sub
модуль
Листинг программы
  1. Option Explicit
  2. Option Base 1
  3. Public i%, j%, ii%, dll%, c1%, c2%, cc%
  4. Public Xx!, Yy!
  5. Public Ti As String
  6. Public asd(100) As String
  7. Public b As Boolean, All!
  8. Public Sub Main(Tu As String)
  9. If Tu = "" Then Exit Sub
  10. If b Then
  11. Call Cubo(Tu, asd())
  12. For i = 2 To 100
  13. If asd(i) = " " Then
  14. dll = i: Exit For
  15. End If
  16. Next i
  17. b = False
  18. Xx = 1
  19. Yy = 2
  20. End If
  21. c2 = 0
  22. For i = 1 To dll
  23. If asd(i) = ")" Then
  24. c2 = i: GoTo 100
  25. End If
  26. Next i
  27. If c2 = 0 Then ' Скобок НЕТ - Вычисления окончены!!
  28. All = ini(asd(2))
  29. Exit Sub
  30. End If
  31. 100:
  32. For i = c2 - 2 To 1 Step -1
  33. If asd(i) = "(" Then
  34. c1 = i: Exit For
  35. End If
  36. Next i
  37. Call Mai2(asd())
  38. Call Main(Tu)
  39. End Sub
  40. Private Sub Mai2(fog() As String)
  41. Dim n As Integer, s As String
  42. fog(c1) = " " ' Долой скобки!!
  43. fog(c2) = " "
  44. ' Унарный минус (~)
  45. For i = c1 + 1 To c2 - 1
  46. If fog(i) = "~" Then
  47. fog(i) = Str(-ini(fog(i + 1)))
  48. Call Sdv1(i, c2)
  49. i = i - 1
  50. End If
  51. Next i
  52. ' Умножение и деление
  53. For i = c1 + 1 To c2 - 1
  54. If fog(i) = "*" Then
  55. fog(i - 1) = Str(ini(fog(i - 1)) * ini(fog(i + 1)))
  56. Call Sdv2(i, c2)
  57. i = i - 2
  58. ElseIf fog(i) = "/" Then
  59. If ini(fog(i + 1)) = 0 Then
  60. fog(i - 1) = "1"
  61. Else
  62. fog(i - 1) = Str(ini(fog(i - 1)) / ini(fog(i + 1)))
  63. End If
  64. Call Sdv2(i, c2)
  65. i = i - 2
  66. End If
  67. Next i
  68. ' Сложение и вычитание
  69. For i = c1 + 1 To c2 - 1
  70. If fog(i) = "+" Then
  71. fog(i - 1) = Str(ini(fog(i - 1)) + ini(fog(i + 1)))
  72. Call Sdv2(i, c2)
  73. i = i - 2
  74. ElseIf fog(i) = "-" Then
  75. fog(i - 1) = Str(ini(fog(i - 1)) - ini(fog(i + 1)))
  76. Call Sdv2(i, c2)
  77. i = i - 2
  78. End If
  79. Next i
  80. Select Case fog(c1 - 1)
  81. Case "s": fog(c1 - 1) = SStr(Sin(ini(fog(c1 + 1))))
  82. Case "c": fog(c1 - 1) = SStr(Cos(ini(fog(c1 + 1))))
  83. Case "m": fog(c1 - 1) = SStr(Abs(ini(fog(c1 + 1))))
  84. Case "e": fog(c1 - 1) = fog(c1 + 1)
  85. End Select
  86. cc = c2 - c1 + 1
  87. For i = c1 To dll - cc
  88. fog(i) = fog(i + cc)
  89. Next i
  90. dll = dll - cc
  91. End Sub
  92. ' Преобразует строку в массив
  93. Private Sub Cubo(ByVal Tu2 As String, mn() As String)
  94. Dim k As Integer, dol As Integer
  95. Dim R As String, R1 As String
  96. Tu2 = " " + Tu2 + " "
  97. dol = Len(Tu2)
  98. For i = 1 To dol
  99. R = Mid(Tu2, i, 1)
  100. R1 = Mid(Tu2, i + 1, 1)
  101. If Not Func(R) And (R1 = "(") Then
  102. Tu2 = Left(Tu2, i) + "e" + Right(Tu2, dol - i)
  103. End If
  104. R = Mid(Tu2, i, 1)
  105. R1 = Mid(Tu2, i + 1, 1)
  106. If ((R = "(") Or (R = " ")) And R1 = "-" Then
  107. Mid(Tu2, i + 1, 1) = "~"
  108. End If
  109. dol = Len(Tu2)
  110. Next i
  111. Tu2 = Trim(Tu2)
  112. Tu2 = " e(" + Tu2 + ") "
  113. ' ==============================
  114. Erase mn
  115. dol = Len(Tu2): k = 1 'k - Индекс массива
  116. i = 0
  117. Do
  118. i = i + 1
  119. R = Mid(Tu2, i, 1)
  120. If Not Ciff(R) Then
  121. mn(k) = R: k = k + 1: GoTo 100
  122. End If
  123. If Ciff(R) Then
  124. mn(k) = R
  125. R1 = Mid(Tu2, i + 1, 1)
  126. j = 1
  127. Do While Ciff(R1)
  128. mn(k) = mn(k) + R1
  129. j = j + 1
  130. R1 = Mid(Tu2, i + j, 1)
  131. Loop
  132. i = i + j - 1
  133. k = k + 1: GoTo 100
  134. End If
  135. 100:
  136. Loop Until i >= dol
  137. End Sub
  138. Private Function SStr(s As Single) As String
  139. SStr = LTrim(Str(s))
  140. End Function
  141. Private Sub Sdv1(c0%, c2%)
  142. For j = c0 To c2 - 2
  143. asd(j + 1) = asd(j + 2)
  144. Next j
  145. asd(c2) = " "
  146. End Sub
  147. Private Sub Sdv2(c0%, c2%)
  148. For j = c0 To c2 - 2
  149. asd(j) = asd(j + 2)
  150. Next j
  151. asd(c2) = " "
  152. asd(c2 - 1) = " "
  153. End Sub
  154. Private Function ini(Tex As String) As Single
  155. Select Case Tex
  156. Case "x": ini = Xx
  157. Case "y": ini = Yy
  158. Case Else
  159. ini = Val(Tex)
  160. End Select
  161. End Function
  162. Public Function Ccc(Tex As String) As Integer
  163. Dim R As String, ll%
  164. Ccc = 0
  165. ii = 0
  166. ll = Len(Tex)
  167. For i = 1 To ll
  168. R = Mid(Tex, i, 1)
  169. If R = "(" Then
  170. ii = ii + 1
  171. ElseIf R = ")" Then
  172. ii = ii - 1
  173. End If
  174. Next i
  175. Ccc = Switch(ii < 0, 2, ii > 0, 1, True, 0)
  176. End Function
  177. Public Function Func(FF As String) As Boolean
  178. Func = True
  179. If (FF <> "s") And (FF <> "c") And (FF <> "e") And (FF <> "m") Then Func = False
  180. End Function
  181. Public Function Ciff(uu As String) As Boolean
  182. Ciff = True
  183. If (uu <> "0") And (uu <> "1") And (uu <> "2") And (uu <> "3") And (uu <> "7") _
  184. And (uu <> "4") And (uu <> "5") And (uu <> "6") _
  185. And (uu <> "8") And (uu <> "9") And (uu <> ".") Then Ciff = False
  186. End Function

Решение задачи: «Нестандартный интерпретатор арифметического выражения»

textual
Листинг программы
  1. Sub Test()
  2.  
  3. Dim ev As Eval
  4.  
  5.     Set ev = New Eval
  6.  
  7.     ev.SetVar "A", "3"
  8.     ev.SetVar "B", "4"
  9.  
  10.     ev.Scalc "(A^2+B^2)^0.5", Res$
  11.  
  12.     Debug.Print Res$
  13.  
  14.     ev.Scalc "max(1,2,4,-5)", Res$
  15.  
  16.     Debug.Print Res$
  17.  
  18.     Set ev = Nothing
  19.  
  20. End Sub

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


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

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

13   голосов , оценка 4.077 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы