PDA

View Full Version : سوال: چگونه ميتوانم مقدار فرمول را كه در اين رشته قراردارد بدست آورم



حبیب
یک شنبه 23 فروردین 1388, 09:03 صبح
با سلام
من يك متغيير دارم كه بدين صورت است:
"str1="2.5*10^3
وقتي مقدار آنرا ميخواهم 2.5 را برمي گرداند (val(str1
من چگونه ميتوانم مقدار خود فرمول را كه در اين رشته قراردارد بدست آورم يعني2500 را به من بدهد

نكته اينكه اين رشته هميشه يك فرمول رياضي در vb است

majjjj
یک شنبه 23 فروردین 1388, 10:16 صبح
شما مشکلت اینه که میخواهی عملیات ریاضی رو درون یک رشته انجام بدی اگه قصد داری مقادیر رو از چند متغیر بگیری این کد کمکتون میکنه اگه هم بعضی مقادیر ثابت هستن بجای متغیر ها از ثابت ها استفاده کنید

Private Sub Form_Load()
Dim str1 As String
Dim str2 As String
Dim str3 As String
str1 = "2.5"
str2 = "10"
str3 = "3"
Me.Caption = (Val(str1)) * (Val(str2) ^ Val(str3))
End Sub

xxxxx_xxxxx
یک شنبه 23 فروردین 1388, 21:01 عصر
اونطور كه ايشون بيان كردند ممكن هست عبارت رياضي كه تو اون متغير رشته اي قرار داره متفاوت باشه.
براي اين كار شما خودتون بايد كاراكتر به كاراكتر رشته رو تحليل كنيد و در انتها عبارت رو محاسبه كنيد. (كاري كه كامپايلرها انجام ميدن).
به اين ترتيب كه از كاراكتر اول شروع كنيد تاجايي كه عدد هست رو در يك متغير قرار بديد (ميتونيد از تابع val كمك بگيريد. اين تابع تا زمانيكه به يك كاراكتر غيرعددي نرسه رشته رو به عدد تبديل مي كنه).
عدد ها رو تو متغيرهاي عددي ذخيره كنيد (مثلاً n1 , n2 , n3, ...) اگر كاراكتر موردنظر يك عملگر بود (+ و - و * و ^) اونها رو هم كه تعدادشون زياد نيست تو متغيرهاي ديگه اي ذخيره كنيد. (مثلاً op1 , op2 , op3 , ...).
در انتها هم يك عدد (n1) رو با عدد بعديش (n2) توسط عملگر (op1) محاسبه كنيد.

اين كار بسياز ساده هست ولي زماني مشكل ميشه كه بحث اولويت عملگرها مطرح ميشه. با اين حال به خاطر كم بودن تعداد (نوع) عملگرها باز ميشه يه جورايي اين كارو كرد.
اما وقتي سخت تر ميشه كه پرانتزها هم تو اين عبارت وجود داشته باشند. اونوقت ديگه ميشه گفت كار بسيار مشكلي هست.
اين كاري هست كه كامپايلرها طي سه عمل Scanning و Parsing و Semantic Analysis انجام ميدن.

ASKaffash
دوشنبه 24 فروردین 1388, 08:59 صبح
سلام
اگر از Provider مربوط به SQLServer استفاده کنید هر فرمولی را میتوانید حساب کنید مثلا همین فرمول شما :


Private Sub Command1_Click()
Me.Text1.Text = "2.5*Power(10,3)"
Me.Adodc1.RecordSource = "Select Value=" + Me.Text1.Text
Me.Adodc1.Refresh
Me.Caption = Me.Adodc1.Recordset!Value
End Sub

حبیب
دوشنبه 24 فروردین 1388, 13:18 عصر
سلام دوست عزیز
شما کافیه دابل کوتیشن ها رو برداری .همین.


دوست عزيز كوتيشن ها دست من نيست
همانطوريكه گفتم من يك متغيير دارم كه داخل آن يك رشته است كه آن رشته هم يك فرمول رياضي است

Babak.Hassanpour
دوشنبه 24 فروردین 1388, 13:54 عصر
عزیز جان شرمنده من الان متوجه شدم .شما میخوای مثلا کاربر فرمول رو توی تکست باکس وارد کنه ، برنامه جواب رو محاسبه کنه درسته؟
اگه آره بفرما ضمیمه رو نگاه کن

اگرم نه بازم ببخش و یکم بیشتر توضیح بده

حبیب
سه شنبه 25 فروردین 1388, 11:01 صبح
با تشكر از همه عزيزاني كه پاسخ دادند
مي دانيم كه خود ويژوال بيسيك فرمول را حساب مي كند مشكل من اين است كه اينجا فرمول بصورت رشته است
در فاكس پرو ما اگر جلو يك رشته علامت & بگذاريم مثل اين است كه كوتيشن ها را حذف كرده ايم و فرمول را خودش حساب مي كند من هم فكر مي كنم كه بايد در vb همچنين چيزي وجود داشته باشد كه بتوانيم به vb بگوييم اين رشته نيست بلكه فرمول است تا خودش اينرا حساب كند
لذا اگر عزيزان در اين زمينه چيزي به ذهنشان مي رسد لطفا پاسخ دهند


در ضمن من خودم يك تابع بسيار خوب هم براي اينكار دارم كه براي شما هم مي گذارم ولي همانطور كه گفتم منظور من چيز ديگري است.http://h2irankhah.persiangig.ir

m..r..h
شنبه 05 دی 1388, 14:47 عصر
با تشكر از همه عزيزاني كه پاسخ دادند
مي دانيم كه خود ويژوال بيسيك فرمول را حساب مي كند مشكل من اين است كه اينجا فرمول بصورت رشته است
در فاكس پرو ما اگر جلو يك رشته علامت & بگذاريم مثل اين است كه كوتيشن ها را حذف كرده ايم و فرمول را خودش حساب مي كند من هم فكر مي كنم كه بايد در vb همچنين چيزي وجود داشته باشد كه بتوانيم به vb بگوييم اين رشته نيست بلكه فرمول است تا خودش اينرا حساب كند
لذا اگر عزيزان در اين زمينه چيزي به ذهنشان مي رسد لطفا پاسخ دهند


در ضمن من خودم يك تابع بسيار خوب هم براي اينكار دارم كه براي شما هم مي گذارم ولي همانطور كه گفتم منظور من چيز ديگري است.http://h2irankhah.persiangig.ir


سلام اقا . به نتیجه ای هم رسیدید . این اخری که گفتید یعنی همون فاکس پرو که گفتید اگه & نذاریم می فهمه فرموله خیلی قشنگ بود . یعنی VB همچین امکانی داره ؟
لطفا پاسخ بدهید .

مهرایزد
دوشنبه 07 دی 1388, 01:32 صبح
سلام اقا . به نتیجه ای هم رسیدید . این اخری که گفتید یعنی همون فاکس پرو که گفتید اگه & نذاریم می فهمه فرموله خیلی قشنگ بود . یعنی VB همچین امکانی داره ؟
لطفا پاسخ بدهید .

در پاسخ در فاکس پرو بلی هست اما در vb نباید باشه ولی بهتر اینو دوستانی که VB کار می کنند پاسخ بدند. این کد تو فاکس پرو کار می کنه.


a=10
b=20
c=a*b
// print c
?c
// print value of formula
? &c
-----------
OutPut:
a*b
200

majjjj
سه شنبه 08 دی 1388, 12:31 عصر
اخ از این فاکس که هنوز هم منم باهاش کار میکنم و این مشکل ها هنوز هم وجود داره خوب فاکس یک بانک اطلاعاتی هست که بصورت درونی خیلی از کارهاش رو انجام میده من که تاحالا در مورد vb همچین چیزی ندیدم

mojtaba69
چهارشنبه 22 دی 1389, 11:55 صبح
سلام دوستان عزیز !
من در این مورد یک کد معرکه پیدا کردم !
لازم به ذکر است که من خودم #c کار هستم :متفکر:
اما خیلی دنبال این کد گشتم به این تاپیک هم سر زدم ولی چیز به درد بخوری پیدا نکردم!
اما بالاخره بر اثر کاوش زیاد در ایتنرنت به مدت یک روز متوالی تونستم این کد معرکه را پیدا کنم!
این کد به زبان #c هست با یکم تغییر می تونید به vb تبدیل کنید !
این کد خیلی زیرکانه نوشته شده!
در واقع با استفاده از ویژگی jscript مشکل فرمول string حل کرده!
کد به شرح زیر است که در یک کلاس قرار دادم!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.JScript;

namespace WindowsFormsApplication1
{
class Evaluator
{
public static int EvalToInteger(string statement)
{
string s = EvalToString(statement);
return int.Parse(s.ToString());
}

public static double EvalToDouble(string statement)
{
string s = EvalToString(statement);
return double.Parse(s);
}

public static string EvalToString(string statement)
{
object o = EvalToObject(statement);
return o.ToString();
}

public static object EvalToObject(string statement)
{
return _evaluatorType.InvokeMember(
"Eval",
BindingFlags.InvokeMethod,
null,
_evaluator,
new object[] { statement }
);
}

static Evaluator()
{
ICodeCompiler compiler;
compiler = new JScriptCodeProvider().CreateCompiler();

CompilerParameters parameters;
parameters = new CompilerParameters();
parameters.GenerateInMemory = true;

CompilerResults results;
results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource);

Assembly assembly = results.CompiledAssembly;
_evaluatorType = assembly.GetType("Evaluator.Evaluator");

_evaluator = Activator.CreateInstance(_evaluatorType);
}

private static object _evaluator = null;
private static Type _evaluatorType = null;
private static readonly string _jscriptSource =

@"package Evaluator
{
class Evaluator
{
public function Eval(expr : String) : String
{
return eval(expr);
}
}
}";
}
}


این هم dll هست که اضافه کردم!
64923
امیدوارم به دررتون بخوره

MEHR_2008
چهارشنبه 22 دی 1389, 15:21 عصر
گشتم نبود نگرد كه نيست ! به اون سادگي و قشنگي فاكس نميتونيد با كمي تغييرات ميشه آخه من هم يه كليپر كار بودم.!

kimprog
چهارشنبه 22 دی 1389, 21:19 عصر
شما ميتوانيد از Microsoft Script control استفاده كنيد (با اضافه كردن آن ازطربق منوي Component)... بعد فرمول را در متد Eval قراردهيد
Text1.Text = ScriptControl1.Eval("2.5*10^3")