سلام ، می خواستم بدونم چطور می شه همچین چیزی رو ساخت که یک تابع در یک Textbox وارد کنیم و از اون ور یک نمودار بهمون بده؟
سلام ، می خواستم بدونم چطور می شه همچین چیزی رو ساخت که یک تابع در یک Textbox وارد کنیم و از اون ور یک نمودار بهمون بده؟
این پاسخی که تو این لینک داده حالت خاصیه که تابع رو تو کد با استفاده از کلاس Math نوشته و با عدد گذاری تو حلقه رسمش کرده
ولی دوستمون اینو نمی خواد! قرار نیست که واسه هر نموداری کد نوشته بشه!
میخوان یه چیزی مثل MATLAB و یا Microsoft Student داشته باشن که Math Parser داشته باشه و از روی رشته ای که فرمول توس قرار داره عبارت ریاضی رو استخراج کنه. من کمی روش کار کردم و به نتایجی هم رسیدم اما هنوز کار زیاد داره. کار دشواریه.
اگه فقط محاسبات عددی باشه و متغییر داخل رشته نباشه با روش RPN میشه نتیجه رو بدست آورد ولی وقتی عبارت داخل تکست باکس فرمول باشه به این راحتی نیست.
پس کلا سخته! درسته؟
من می خواستم قبلا همچون نرم افزاری دزست کنم ولی کار سختی بود.
ولش کردم.
دوستان اونقدر پیچیده نکنید. لازم نیست چرخ دوباره اختراع بشه
با System.CodeDom.Compiler و Reflection می شه انجام داد هم در msdn و هم در stackoverflow یا جاهای دیگه هم نحوه استفاده ازش گذاشته شده
این هم یک نمونه ساده:
eval.zip
CodeDomProvider provider =CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = false;
cp.IncludeDebugInformation = false;
cp.ReferencedAssemblies.Add( "System.dll" );
cp.GenerateInMemory = true;
cp.WarningLevel = 3;
cp.TreatWarningsAsErrors = false;
cp.CompilerOptions = "/optimize";
string source =
@"using System;
namespace ns{
public class myclass{
public myclass(){}
public double myexp(double x){
return " + textBox1.Text + @";
}
}
}";
var result = provider.CompileAssemblyFromSource(cp,source);
if (result.Errors.Count > 0) {
return null;
}
Assembly asm= result.CompiledAssembly;
Type t =asm.GetType("ns.myclass");
MethodInfo methodInfo = t.GetMethods()[0];
object classInstance = Activator.CreateInstance(t, null);
double min =-1.0 , max = 5.0;
IEnumerable data = Enumerable.Range(0,300).Select(
i => new {
x = i*(max-min)/300.0+min,
y = methodInfo.Invoke(classInstance, new object[]{i*(max - min) /300.0 + min})
}
).ToArray();
chart1.Series[0].Points.DataBind(data,"x","y",null);
ببخشید دوست عزیز، انی سورس فایل ها که قرار دادین ، باید کدوم فایل رو باز کنم، اگر می خوام توی ظاهرش یکم تغییرات بوجود بیارم؟
فایل sln که در ویژوال باز میشه
اگر صرفا رسم تابع مورد نیاز شما هست باید از مفسر های ریاضی استفاده کنید:
http://ncalc.codeplex.com/
http://flee.codeplex.com/
مثلاy=sin(x)رو در نظر بگیر:
باید y رو برای x از x1 تا x2 بدست بیاری:
مثلا
x1=0
x2=9
مثال: باید این فاصله رو مثلا به 100 قسمت تقسیم کنی و برای هر x باید y رو بدست بیاری:
x=x1;
for i=0 to 99
{
x=x+i/100;
y=calc("sin(x)");
chart.add(x,y);
}
نیازی به مفسر نیست امکانات زبان سی شارپ این قابلیت را به ما می ده که با استفاده از reflection و System.CodeDom.Compiler بتونیم یک رشته را کامپایل کنیم که در پست 6 توضیح دادم
اگر بخوایم یه برنامه رو بنویسیم میتونیم از کامپایلر داخل سی# استفاده کنیم
ولی برای هر کاری اینطوری لازمه که یک برنامه بنویسیم
ایشون میخواد در تکست باکس مثلا sin x رو وارد کنه و نمودارش رسم بشه
این مثال ها رو ببینید (اگر بخواد خودش برنامه ای بنویسه که این توابع رو انجام بده خیلی سخت میشه):
http://ncalc.codeplex.com/wikipage?t...ringTitle=Home
بقول شما نیازی نیست چرخ دوباره اختراع بشه
پس بهتره برای اینکارها از همین مفسرهایی استفاده کنیم که یکی قبلا زحمتش رو کشیده
بجای اینکه اینهمه کد بزنیم
مطالعه کردم دوست عزیز
ببین برای مثال عرض میکنم:
داخل تکسباکس :1+Math.Cos(x)*7
که این بنظر من جالب نیست. چون بهتر بود اینطوری باشه:1+cos(x)*7
حالا فرض کن مثالها پیچیده تر بشن
مثلا استفاده از توابعی که حتی در math موجود نباشه
یا مثلا توابعی که کاربر بخواد تعریف کنه با پارامترهای خاص!