Witam,
zacząłem pisać kalkulator w Windows formie i tu rodzi się moje pytanie, czy jest jakaś funkcja przekształcająca napis na wyrażenie logiczne? Precyzując z "3+3" chciałbym otrzymać 9
Hej, sam programuje póki co w Javie ale z tego co widziałem to chyba w podobny sposób można to zrobić w C#. Mógłbyś swój string (3+3) przekształcić na tablicę komendą .split("+"), po czym sparsować elementy tablicy zawierające cyfry i je dodać do siebie. Doczytaj o parsowaniu i .split.
Takie dość niestandardowe i niezalecane z uwagi na bezpieczeństwo podejście, ale wrzucam:
using System;
using System.Text;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
namespace ConsoleApplication1
{
class Program
{
public static int Execute(string code)
{
var full_code = $"using System;public class Program{{public static int Main(){{ return {code}; }}}}";
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
CompilerResults result = provider.CompileAssemblyFromSource(parameters, full_code);
if (result.Errors.Count > 0)
{
var stb = new StringBuilder();
foreach (CompilerError err in result.Errors)
stb.Append($"Line:{err.Line} Error:{err.ErrorText}");
throw new Exception($"Code compilation fail. {stb.ToString()}");
}
var method = result.CompiledAssembly.GetType("Program").GetMethod("Main");
return Convert.ToInt32(method.Invoke(null, new object[] { }));
}
public static void Main(string[] Args)
{
Console.WriteLine(Execute("4-5-76-3+76+484+3"));
Console.WriteLine(Execute("5*(10/5)"));
}
}
}
PS: Na .NET Corze chyba nie zadziała.
Odwrotna Notacja Polska
@somekind było to dobre w 2012. Teraz są prostsze metody:
https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples
@Radek Bucki Do Twojego zastosowania jest dobre. Jeżeli chcesz jednak czegoś bardziej wymagającego, to takie rzeczy robi się najpierw przekształcając wyrażenie na notację beznawiasową (Odwrotna Notacja Polska), a następnie mając w takiej postaci wyrażenie się wyliczało. Gotowe algorytmy znajdziesz w sieci. Polecam to wyjście dla większej frajdy ;).
Pomysł na kalkulator od początku do końca bezsensu . Nie obraź się.