Математические выражения. Метод Eval из VBS

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

MethodEval Математические выражения. Метод Eval из VBS

Dim objScript As Object = CreateObject("MSScriptControl.ScriptControl")
objScript.Language = "VBScript"
Label1.Text = "Ответ: " & objScript.Eval(TextBox1.Text)

Можно возводить квадрат, вычислять синус, косинус и т.д

Остальные математические функции.

  Метки: , , , ,
  Евгений
  Просмотров: 3 661
  Запись опубликована в 07:17

4 комментария

  • Емаё, а как я мучился, пытаясь реализовать это фиг знает как...

  • В .Net это можно так сделать:
     
     
    Public Function Решить(ByVal выражение As String) As String
            Dim myCode As CodeDomProvider = CodeDomProvider.CreateProvider("VB")
            Dim myPar As New CompilerParameters()
            'формируем виртуальный класс, в котором будет производиться расчет
            Dim myCodeBody As New System.Text.StringBuilder()
            myCodeBody.AppendLine("Public Class MyCalculator")
            myCodeBody.AppendLine("Public Function Calc() As Double")
            'TextBox1.Text.ToLower().Replace("x", TextBox2.Text) - меняем икс в формуле (TextBox1) на число указанное в TextBox2
            '.Replace(",", ".") - меняем запятые на точки, т.к. в VB в качестве десятичного разделителя используются точки
            myCodeBody.AppendLine(String.Format("Return {0}", выражение))
            myCodeBody.AppendLine("End Function")
            myCodeBody.AppendLine("End Class")
            'компилируем
            Dim myResult As CompilerResults = myCode.CompileAssemblyFromSource(myPar, myCodeBody.ToString())
            If myResult.Errors.HasErrors Then
                'какие-то ошибки
                For i As Integer = 0 To myResult.Errors.Count - 1
                    If myResult.Errors(i).ErrorText = "Ожидалось выражение." Then
                        MsgBox(myResult.Errors(i).ErrorText, MsgBoxStyle.Critical, "Ошибка")
                    End If
                Next
                Return "Ошибка!"
            End If
            'ошибок нет, выдергиваем наш класс
            Dim myAsm As Assembly = myResult.CompiledAssembly()
            Dim myCls As Object = myAsm.CreateInstance("MyCalculator", True)
            'выводим результат
            Return myCls.Calc().ToString
        End Function

    • Вычисление происходит дольше, но все равно плюс, что такое можно сделать. 

      Запостю.

Есть что сказать? Тогда действуй!


:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-o :-P :-D :-? :) :( :!: 8-O 8)