Dear all,
Hum qua thầy có gthieu 1 bài toán với yêu cầu: nhập 1 hàm số, có biến x, các toán tử +-*/
Cho x 1 giá trị, làm sao xuất ra kết quả của hàm số với giá trị biến x đó.
VD
input : 5 + x * 3 + (6 + x) * 4 + 3 * ( x + 9) và x = 3
output 86
Bà con tính lại xem đúng ko
Mình biết 1 giải thuật gọi là Ký số Balan để có thể làm đc chuyện này
http://vi.wikipedia.org/wiki/K%C3%AD_ph%C3%A1p_Ba_LanĐọc nó thì hằm bà lằng lên, đại loại nó sắp xếp vô các mảng hay cây để ưu tiên tính toán!
Tuy nhiên, mình có 1 ý tưởng hay hơn, ngắn gọn hơn, ăn gian hơn
Nếu các bạn để ý, nếu mình khai bao 1 số int chẳng hạn, và gán giá trị số int đó = 1 biểu thức toán học
Vi dụ:
int i = 5 + 3 * 3 + (6 + 3) * 4 + 3 * ( 3 + 9);
thì i sẽ mang giá trị 86. Như vậy mình nghĩ rằng ... tự C# hay .net hay khỉ khỉ j bên dưới, nó tự làm đc điều này!
Vậy thật ...tiện nếu mình lợi dụng nó đc
kết quả mình có như sau:
- Code:
-
using System;
using System.Reflection;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.Write("Nhap bieu thuc toan hoc: ");
string txtbieuthuc = "5 + x * 3 + (6 + x) * 4 + 3 * ( x + 9)";//Console.ReadLine();
Console.Write("Nhap gia tri X: ");
string txtGiatriX = Console.ReadLine();
txtbieuthuc = XulyChuoi(txtbieuthuc, txtGiatriX);
Console.WriteLine(txtbieuthuc);
Compile(txtbieuthuc);
Console.Read();
}
static public string XulyChuoi(string Code, string bien)
{
Code = Code.Replace("X", bien);
return Code.Replace("x", bien);
}
static public void Compile (string Code)
{
try
{
string sCode = @"
using System;
class Calc
{
public void Main ()
{
Console.WriteLine(Convert.ToString(" + Code + @"));
}
} ";
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler compiler = codeProvider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.MainClass = "Calc.Main";
parameters.IncludeDebugInformation = false;
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies ())
{
parameters.ReferencedAssemblies.Add (asm.Location);
}
CompilerResults results = compiler.CompileAssemblyFromSource(parameters, sCode);
object o = results.CompiledAssembly.CreateInstance("Calc");
Type type = o.GetType ();
MethodInfo m = type.GetMethod("Main");
m.Invoke (o, null);
}
catch
{
}
}
}
}
Do mình lười quá nên ko bắt lỗi nếu bạn nhập biểu thức ko đúng :p nên ráng nhập cho hợp lý đủ toán tử.
Tuy nhiên, cách này là cách ... lười biếng, xài lại cái đã có chứ ko tư duy j hết!
Bạn nào có ý kiến về giải thuật cho xin ý kiến với!!!