PDA

View Full Version : سوال: ساخت نرم افزاری برای رسم نمودار تابع



ABZiko
جمعه 21 آذر 1393, 20:28 عصر
سلام ، می خواستم بدونم چطور می شه همچین چیزی رو ساخت که یک تابع در یک Textbox وارد کنیم و از اون ور یک نمودار بهمون بده؟

drsina
جمعه 21 آذر 1393, 21:33 عصر
ببین اینو : https://social.msdn.microsoft.com/Forums/en-US/494e071c-aa02-4759-8b4d-39932699da0d/draw-a-function-in-c?forum=csharplanguage

elec60
شنبه 22 آذر 1393, 07:53 صبح
ببین اینو : https://social.msdn.microsoft.com/Forums/en-US/494e071c-aa02-4759-8b4d-39932699da0d/draw-a-function-in-c?forum=csharplanguage

این پاسخی که تو این لینک داده حالت خاصیه که تابع رو تو کد با استفاده از کلاس Math نوشته و با عدد گذاری تو حلقه رسمش کرده

ولی دوستمون اینو نمی خواد! قرار نیست که واسه هر نموداری کد نوشته بشه!

میخوان یه چیزی مثل MATLAB و یا Microsoft Student داشته باشن که Math Parser داشته باشه و از روی رشته ای که فرمول توس قرار داره عبارت ریاضی رو استخراج کنه. من کمی روش کار کردم و به نتایجی هم رسیدم اما هنوز کار زیاد داره. کار دشواریه.

اگه فقط محاسبات عددی باشه و متغییر داخل رشته نباشه با روش RPN میشه نتیجه رو بدست آورد ولی وقتی عبارت داخل تکست باکس فرمول باشه به این راحتی نیست.

ABZiko
شنبه 22 آذر 1393, 11:31 صبح
پس کلا سخته! درسته؟

mohammad jamalian
شنبه 22 آذر 1393, 17:40 عصر
من می خواستم قبلا همچون نرم افزاری دزست کنم ولی کار سختی بود.
ولش کردم.

rahnema1
یک شنبه 23 آذر 1393, 12:46 عصر
دوستان اونقدر پیچیده نکنید. لازم نیست چرخ دوباره اختراع بشه
با System.CodeDom.Compiler و Reflection می شه انجام داد هم در msdn و هم در stackoverflow یا جاهای دیگه هم نحوه استفاده ازش گذاشته شده
این هم یک نمونه ساده:
126574


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);

ABZiko
یک شنبه 23 آذر 1393, 13:14 عصر
ببخشید دوست عزیز، انی سورس فایل ها که قرار دادین ، باید کدوم فایل رو باز کنم، اگر می خوام توی ظاهرش یکم تغییرات بوجود بیارم؟

rahnema1
یک شنبه 23 آذر 1393, 13:37 عصر
فایل sln که در ویژوال باز میشه

golbafan
یک شنبه 03 خرداد 1394, 08:05 صبح
اگر صرفا رسم تابع مورد نیاز شما هست باید از مفسر های ریاضی استفاده کنید:

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);
}

rahnema1
یک شنبه 03 خرداد 1394, 08:09 صبح
نیازی به مفسر نیست امکانات زبان سی شارپ این قابلیت را به ما می ده که با استفاده از reflection و System.CodeDom.Compiler بتونیم یک رشته را کامپایل کنیم که در پست 6 توضیح دادم

golbafan
یک شنبه 03 خرداد 1394, 08:18 صبح
نیازی به مفسر نیست امکانات زبان سی شارپ این قابلیت را به ما می ده که با استفاده از reflection و System.CodeDom.Compiler بتونیم یک رشته را کامپایل کنیم که در پست 6 توضیح دادم

اگر بخوایم یه برنامه رو بنویسیم میتونیم از کامپایلر داخل سی# استفاده کنیم
ولی برای هر کاری اینطوری لازمه که یک برنامه بنویسیم

ایشون میخواد در تکست باکس مثلا sin x رو وارد کنه و نمودارش رسم بشه

این مثال ها رو ببینید (اگر بخواد خودش برنامه ای بنویسه که این توابع رو انجام بده خیلی سخت میشه):
http://ncalc.codeplex.com/wikipage?title=parameters&referringTitle=Home

بقول شما نیازی نیست چرخ دوباره اختراع بشه
پس بهتره برای اینکارها از همین مفسرهایی استفاده کنیم که یکی قبلا زحمتش رو کشیده
بجای اینکه اینهمه کد بزنیم:لبخندساده:

rahnema1
یک شنبه 03 خرداد 1394, 08:23 صبح
اگر بخوایم یه برنامه رو بنویسیم میتونیم از کامپایلر داخل سی# استفاده کنیم
ولی برای هر کاری اینطوری لازمه که یک برنامه بنویسیم

ایشون میخواد در تکست باکس مثلا sin x رو وارد کنه و نمودارش رسم بشه


این مثال ها رو ببینید (اگر بخواد خودش برنامه ای بنویسه که این توابع رو انجام بده خیلی سخت میشه):
http://ncalc.codeplex.com/wikipage?title=parameters&referringTitle=Home

فکر کنم پست 6 را کاملا مطالعه نکردید
داخل پست 6 یک فایل زیپ گذاشتم
کافیه فرمول را داخل تکست باکس بنویسیم تا نمودارش رسم بشه و این کار بدون هیچ مفسری انجام می شه

golbafan
یک شنبه 03 خرداد 1394, 08:28 صبح
:لبخندساده::لبخندساده::بوس:

مطالعه کردم دوست عزیز
ببین برای مثال عرض میکنم:
داخل تکسباکس : 1+Math.Cos(x)*7
که این بنظر من جالب نیست. چون بهتر بود اینطوری باشه: 1+cos(x)*7

حالا فرض کن مثالها پیچیده تر بشن
مثلا استفاده از توابعی که حتی در math موجود نباشه
یا مثلا توابعی که کاربر بخواد تعریف کنه با پارامترهای خاص!

rahnema1
یک شنبه 03 خرداد 1394, 08:42 صبح
:لبخندساده::لبخندساده::بوس:

مطالعه کردم دوست عزیز
ببین برای مثال عرض میکنم:
داخل تکسباکس : 1+Math.Cos(x)*7
که این بنظر من جالب نیست. چون بهتر بود اینطوری باشه: 1+cos(x)*7

حالا فرض کن مثالها پیچیده تر بشن
مثلا استفاده از توابعی که حتی در math موجود نباشه
یا مثلا توابعی که کاربر بخواد تعریف کنه با پارامترهای خاص!

مشکلی نداره. این فقط یک مثال ساده از امکانات سی شارپ بود تابع با پارامترهای خاص را هم به راحتی میشه داخل اون قرار داد اصلا میشه داخل تکست باکس به زبان سی شارپ برنامه نویسی کرد! دیگه چه از این بهتر :لبخند: :چشمک: