PDA

View Full Version : حرفه ای: ورود تابع ریاضی از طریق کاربر



hadgph
پنج شنبه 14 فروردین 1393, 20:16 عصر
با سلام
داخل برنامه ام یه تابع متغییر ( مثلا f(x) ) وجود داره، که یک متغیر x داره - تابع رو باید کاربر تعیین کنه ( مثلا x^2 + sin(x)*x ) که جایگزین تابع داخل برنامه میشه و به x عدد داده می شود و جوابش در برنامه استفاده میشه و ...

از توابع ریاضی خود دات نت هم استفاده می کنم.

مشکل من در اینه که کاربر چه طوری تابع رو وارد کنه؟
اگه دوستان راهنمایی کنن یا نمونه کد داشته باشند ممنون می شم.

hadi0x7c7
پنج شنبه 14 فروردین 1393, 23:59 عصر
این چیزی که تو ذهن منه یه خورده پیچیده هست این که شما تابع رو به عنوان یه رشته در نظر بگیر بعد ورودی رو توش قرار بده حالا با الگوریتم های recursive decent این عبارت رو حساب کن. در ضمن اینم توی نت دیدم شاید بدرد بخوره
http://www.c-sharpcorner.com/UploadFile/emadbarsoum/ExpressionEvaluator12062005061411AM/ExpressionEvaluator.aspx
http://www.codeproject.com/Articles/3886/A-Math-Expression-Evaluator

سوداگر
جمعه 15 فروردین 1393, 00:53 صبح
میتونید از codedom استفاده کنید که برای کامپایل داینامیک کد استفاده میشه.
این لینک (http://www.c-sharpcorner.com/UploadFile/mgold/CodeDomCalculator08082005003253AM/CodeDomCalculator.aspx)یه مثال زده ولی توجه داشته باشید چون وارد کردن math.sin و math.pow و ... در فرمول توسط کاربر کار درستی نیست شما باید همون sin خالی رو از کاربر بگیرید و قبلش .math رو در یک رشته بچسبونید و بعد توسط codedom اون رشته رو کامپایل(محاسبه)کنید.

مهرداد صفا
جمعه 15 فروردین 1393, 08:54 صبح
سلام.
شما باید تابع رو به صورت dynamic invoke کنید.
برای این کار باید متود GetType از آبجکتی که متود مورد نظر از اعضای آن است را اجرا کنید تا Type آن را بگیرید.
در مرحله بعد با استفاده از متود Type.GetMethod می توانید یک نمونه از System.Reflection.MethodInfo از متود مورد نظر به دست بیاورید و آن را Invoke کنید.
برای درک بیشتر موضوع و مشاهده نحو کار به صورت عملی کد زیر را به جای کد مربوط به فرم کپی کنید و برنامه را اجرا کنید.:


//بسم الله الرحمن الرحیم
//اللهم صل علی محمد و آل محمد

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
TextBox text1 = new TextBox()
{
Text = "enter a number here",
Left = 20,
Top = 20,
Width = this.Width - 40
};

ListBox list1=new ListBox(){
Top=text1.Bottom+20,
Left=text1.Left,
Width=text1.Width,
Height=200,
DataSource=this.GetType().GetMethods()
.Where(method=>method.Name.EndsWith("Method"))
.Select(method=>method.Name.Replace("Method","")).ToList()};
Button button1=new Button() {
Text="OK",
Top=list1.Bottom+10,
Left=text1.Left+10};
button1.Click+=(s,e)=>this.GetType()
.GetMethod(list1.SelectedItem.ToString()+"Method")
.Invoke(this,new object[]{ Convert.ToInt32(text1.Text)});



this.Controls.Add(text1);
this.Controls.Add(list1);
this.Controls.Add(button1);
}

public void SqrtMethod(int x)
{
MessageBox.Show((Math.Sqrt(x).ToString()));
}

public void DoubleMethod(int x)
{
MessageBox.Show((x * 2).ToString());
}

public void HalfMethod(int x)
{
MessageBox.Show((x / 2).ToString());
}
//...
}
}



در کد بالا نام تمام توابعی که با کلمه Method (برای مثال) تمام شده، به عنوان آیتمهای لیست در نظر گرفته شده تا کاربر یکی از این متودها را انتخاب کند، و در رویداد کلیک button1 متود انتخاب شده با استفاده از GetMethod گرفته شده و مقدار this به عنوان نمونه (instance) و مقدار text1 به عنوان پارامتر به متود ارسال شده.

hadgph
جمعه 15 فروردین 1393, 12:13 عصر
از همه دوستان ممنونم، راه حلهای شما بهتر از من بودند
چیزی توی ذهن خودم بود این بود که فایل dll در داخل برنامه با استفاده از تابع ساخته بشه و ازش استفاده بشه که خب هم مشکل بود هم نادرست.
با تشکر از دوستان