Как вычислить формулу если она в тестовом формате

Мегапризрак

Как вычислить формулу если она в тестовом формате (vb). Например сохранена в текстовом файле:"(25+20)/3"
5 ответов

Мегапризрак

Я юзаю Dynamic Linqhttp://blog.vavstech.com/2014/08/systemlinqdynamic-documentation.htmlтут есть примеры


Мегапризрак

Как вариант
Microsoft.CSharp.CSharpCodeProvider cscp = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.CompilerResults cr = cscp.CompileAssemblyFromSource(new System.CodeDom.Compiler.CompilerParameters(),
@"
using System;
namespace MyLib
{ 
 public class MyMath
 { 
 public static int MyFunc0s() { return (25+20)/3; }
 public static ****** MyFunc3d(****** x, ****** y, ****** z) { return (x + y) / z; }
 }
}
");

Type myMath = cr.CompiledAssembly.GetType("MyLib.MyMath");
var myFunc0s = (Func<int>)Delegate.CreateDelegate(typeof(Func<int>), myMath.GetMethod("MyFunc0s"));
var res1 = myFunc0s();
System.Diagnostics.Debug.WriteLine(res1);
var myFunc3d = (Func<******, ******, ******, ******>)Delegate.CreateDelegate(typeof(Func<******, ******, ******, ******>), myMath.GetMethod("MyFunc3d"));
var res2 = myFunc3d(25, 20, 3);
System.Diagnostics.Debug.WriteLine(res2);


Мегапризрак

****** v = (******)new System.Xml.XmlDocument().CreateNavigator().Evaluate(System.Xml.XPath.XPathExpression.Compile(textBox4.Text.Replace("/", "div ")));


Мегапризрак

Всем большое спасибо!!! Я сам нашёл решение
Dim РегВырУмнДел As String = "(^\-)?[0-9]+[\/\*][0-9]+"
 Dim РегПлюсМинус As String = "(^\-)?[0-9]+[\+\-][0-9]+"
 Dim РегВСкобках As String = "\([\/\*\+\-\d]+\)"
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 MsgBox(Вычисление("(5+56/7)-9*(10/5+(20-7))-(7)*60"))
 End Sub

 Public Function Вычисление(ByVal Формула As String) As String
 Формула = Формула.Replace(" ", "").Replace("+-", "-").Replace("--", "+")
 Do Until Regex.Matches(Формула, РегВСкобках).Count = 0
 Dim Выражение As String = Regex.Matches(Формула, РегВСкобках)(0).Value
 Dim ВырБезСкобок As String = Выражение.Replace("(", "").Replace(")", "")

 Формула = Strings.Replace(Формула, Выражение, ВычислениеВыражения(ВырБезСкобок))
 Loop

 If Regex.Matches(Формула, РегВСкобках).Count = 0 Then
 Формула = ВычислениеВыражения(Формула)
 End If

 Return Формула
 End Function


 Private Function ВычислениеВыражения(ByVal Выражение As String) As String '' Вычисление выражения без скобок
 Выражение = Выражение.Replace(" ", "").Replace("+-", "-").Replace("--", "+")
 If Regex.Matches(Выражение, РегВырУмнДел).Count > 0 Then
 Do Until Regex.Matches(Выражение, РегВырУмнДел).Count = 0
 Dim СокрВыр As String = Regex.Matches(Выражение, РегВырУмнДел)(0).Value
 Dim зн As Decimal
 If InStr(СокрВыр, "/") Then
 Dim Делимое As Decimal = СокрВыр.Split("/")(0)
 Dim Делитель As Decimal = СокрВыр.Split("/")(1)
 зн = Делимое / Делитель
 Else
 Dim Множитель1 As Decimal = СокрВыр.Split("*")(0)
 Dim Множитель2 As Decimal = СокрВыр.Split("*")(1)
 зн = Множитель1 * Множитель2
 End If
 Выражение = Strings.Replace(Выражение, СокрВыр, зн)
 Loop
 End If

 If Regex.Matches(Выражение, РегПлюсМинус).Count > 0 Then
 Do Until Regex.Matches(Выражение, РегПлюсМинус).Count = 0
 Dim СокрВыр As String = Regex.Matches(Выражение, РегПлюсМинус)(0).Value
 Dim зн As Decimal
 If InStr(СокрВыр, "+") Then
 Dim Слогаемое1 As Decimal = СокрВыр.Split("+")(0)
 Dim Слогаемое2 As Decimal = СокрВыр.Split("+")(1)
 зн = Слогаемое1 + Слогаемое2
 Else

 If СокрВыр.Split("-")(0) = "" Then
 Dim Вычитамемое As Decimal = СокрВыр.Split("-")(1)
 Dim Вычислитель As Decimal = СокрВыр.Split("-")(2)
 зн = -Вычитамемое - Вычислитель
 Else
 Dim Вычитамемое As Decimal = СокрВыр.Split("-")(0)
 Dim Вычислитель As Decimal = СокрВыр.Split("-")(1)
 зн = Вычитамемое - Вычислитель
 End If
 End If
 Выражение = Strings.Replace(Выражение, СокрВыр, зн)
 Loop
 End If
 Return Выражение

 End Function