PDA

View Full Version : تبدیل رشته ها به توابع ریاضی؟



ali2914
سه شنبه 08 اردیبهشت 1383, 07:05 صبح
سلام. من در یکی از پروژه های دانشگاهی به مشکلی برخوردم این مساله رو هم در بخش ویژوال بیسیک و هم در بخش عمومی مطرح می کنم شاید شما راه حلی برای اون داشته باشید
به طور کلی توابع در یک برنامه بوسیله برنامه نویس در برنامه وارد می شه و برنامه کامپایل می شه و کاربر آرگومانهایی را به عنوان ورودی در بر نامه وارد می کنه که برنامه با وارد کردن اون آرگومانها در تابع و انجام محاسبات خروجی متناسب را تولید می کند.
اما مشکل ما زمانیست که نیاز باشه که کاربر تابع راهم خودش در برنامه وارد کنه به عنوان مثال
برنامه ای رو در نظر بگیرید که در ان کاربر در یک textbox یک تابع مثلy=sin(xرا وارد می کنه و باتعیین یک دامنه مناسب برای x برنامه نمودار این تابع را رسم کند
من در هیچ زبانی امکان تبدیل یک رشته ورودی به یک تابع ریاضی که بتونه ارگومان بگیره را مشاهده نکردم و به نظر می رسه که در همه زبانهاعبارت ریاضی باید در خود برنامه قبل از کامپایل وارد شود.حالا اگه شما راه حلی برای این مساله می شناسید راهنمایی کنید.حل این مساله کمک بسیار مهمیه در تولید برنامه های کاربردی برق،الکترونیک،عمران ...

linux
سه شنبه 08 اردیبهشت 1383, 09:21 صبح
:)
قبل از شما زحمتشو کشیدن یه نگاه به mathlab بنداز

rezaTavak
سه شنبه 08 اردیبهشت 1383, 20:05 عصر
سلام

آقا فاکس پرو این کار را براتون با ماکروی & انجام میده.

توابع Evaluate هم هست که در بیسیک و فاکس می دونم.

برای زیان سی هم باید شما از آدرس تابع استفاده کنید.


اگر هم هیچیک را نمی خواهید خودتان مفسر بنویسید!

کم حوصله
سه شنبه 08 اردیبهشت 1383, 22:17 عصر
توابع Evaluate هم هست که در بیسیک
میشه در این مورد یکم کامل توضیح بدهید من خیلی لنگشم :) دمت گرم حال بده که هلاکم :دلار:

ali2914
چهارشنبه 09 اردیبهشت 1383, 06:20 صبح
نخیر زحمتشو شما بکشین!عرض کردم رسم نمودار یه مثاله ما می خایم یه تابع رو از کاربر بکیریم وپردازش کنیم که رسم تمودارم جزوشه.به عر حال اگه کسی اطلاعاتی در مورد توابع Evaluate داره...

Vahab
پنج شنبه 10 اردیبهشت 1383, 00:30 صبح
Function EvaluateExpression(szExpression As String) As String
'Evaluates an algebraic expression (add/subtract/multiply/divide/exponents)

Dim iLeftParenLoc As Integer
Dim iRightParenLoc As Integer
Dim iLeftParenCount As Integer
Dim iRightParenCount As Integer
Dim szTempExpression As String
Dim szNewExpression As String
Dim szParenExpression As String
Dim iExpressionLen As Integer
Dim szChar As String
Dim iOpperatorLoc As Integer
Dim iOpperatorLoc2 As Integer
Dim szLeftExpression As String
Dim szRightExpression As String
Dim iLeftBound As Integer
Dim iRightBound As Integer
Dim szOpperator As String
Dim loop1 As Integer
Dim loop2 As Integer
Dim szTemp As String

szTemp = Replace(szExpression, " ", "")
szTemp = Replace(szTemp, "+", " + ")
szTemp = Replace(szTemp, "-", " - ")
szTemp = Replace(szTemp, "*", " * ")
szTemp = Replace(szTemp, "/", " / ")
szTemp = Replace(szTemp, "^", " ^ ")

szExpression = szTemp

szTempExpression = Trim(szExpression)
iLeftParenLoc = InStr(szTempExpression, "(")
iExpressionLen = Len(szTempExpression)
Do While iLeftParenLoc > 0
For loop1 = iLeftParenLoc To iExpressionLen
szChar = Mid(szTempExpression, loop1, 1)
If szChar = "(" Then
iLeftParenCount = iLeftParenCount + 1
ElseIf szChar = ")" Then
iRightParenCount = iRightParenCount + 1
Else
szParenExpression = szParenExpression & szChar
End If
If iLeftParenCount = iRightParenCount Then
iRightParenLoc = loop1
Exit For
End If
Next
szParenExpression = Mid(szTempExpression, iLeftParenLoc + 1, iRightParenLoc - iLeftParenLoc - 1)
szTempExpression = Left(szTempExpression, iLeftParenLoc - 1) & CStr(EvaluateExpression(szParenExpression)) & Right(szTempExpression, iExpressionLen - iRightParenLoc)
iLeftParenCount = 0
iRightParenCount = 0
iExpressionLen = Len(szTempExpression)
iLeftParenLoc = InStr(szTempExpression, "(")
Loop

For loop1 = 0 To 2
If loop1 = 0 Then
szOpperator = "^"
iOpperatorLoc = InStr(szTempExpression, " ^ ")
ElseIf loop1 = 1 Then
szOpperator = "*"
iOpperatorLoc = InStr(szTempExpression, " * ")
iOpperatorLoc2 = InStr(szTempExpression, " / ")
If (iOpperatorLoc2 < iOpperatorLoc And iOpperatorLoc2 <> 0) Or (iOpperatorLoc = 0 And iOpperatorLoc2 <> 0) Then
iOpperatorLoc = iOpperatorLoc2
szOpperator = "/"
End If
ElseIf loop1 = 2 Then
szOpperator = "+"
iOpperatorLoc = CInt(InStr(szTempExpression, " + "))
iOpperatorLoc2 = CInt(InStr(szTempExpression, " - "))
If (iOpperatorLoc2 < iOpperatorLoc And iOpperatorLoc2 <> 0) Or (iOpperatorLoc = 0 And iOpperatorLoc2 <> 0) Then
iOpperatorLoc = iOpperatorLoc2
szOpperator = "-"
End If
End If

Do While iOpperatorLoc > 0
iOpperatorLoc = iOpperatorLoc
For loop2 = iOpperatorLoc - 1 To 1 Step -1
szChar = Mid(szTempExpression, loop2, 1)
If szChar = " " Then
Exit For
End If
Next
iLeftBound = loop2
For loop2 = iOpperatorLoc + 3 To iExpressionLen
szChar = Mid(szTempExpression, loop2, 1)
If szChar = " " Then
Exit For
End If
Next
iRightBound = loop2
szLeftExpression = Trim(Mid(szTempExpression, iLeftBound + 1, iOpperatorLoc - (iLeftBound + 1)))
szRightExpression = Trim(Mid(szTempExpression, iOpperatorLoc + 3, iRightBound - (iOpperatorLoc + 3)))
Select Case szOpperator
Case "^"
szNewExpression = CStr(Val(szLeftExpression) ^ Val(szRightExpression))
Case "*"
szNewExpression = CStr(Val(szLeftExpression) * Val(szRightExpression))
Case "/"
szNewExpression = CStr(Val(szLeftExpression) / Val(szRightExpression))
Case "+"
szNewExpression = CStr(Val(szLeftExpression) + Val(szRightExpression))
Case "-"
szNewExpression = CStr(Val(szLeftExpression) - Val(szRightExpression))
End Select
szTempExpression = Left(szTempExpression, iLeftBound) & szNewExpression & Right(szTempExpression, iExpressionLen - iRightBound + 1)
iExpressionLen = Len(szTempExpression)
'iOpperatorLoc = InStr(szTempExpression, szOpperators(loop1))
If loop1 = 0 Then
szOpperator = "^"
iOpperatorLoc = InStr(szTempExpression, " ^ ")
ElseIf loop1 = 1 Then
szOpperator = "*"
iOpperatorLoc = InStr(szTempExpression, " * ")
iOpperatorLoc2 = InStr(szTempExpression, " / ")
If (iOpperatorLoc2 < iOpperatorLoc And iOpperatorLoc2 <> 0) Or (iOpperatorLoc = 0 And iOpperatorLoc2 <> 0) Then
iOpperatorLoc = iOpperatorLoc2
szOpperator = "/"
End If
ElseIf loop1 = 2 Then
szOpperator = "+"
iOpperatorLoc = InStr(szTempExpression, " + ")
iOpperatorLoc2 = InStr(szTempExpression, " - ")
If (iOpperatorLoc2 < iOpperatorLoc And iOpperatorLoc2 <> 0) Or (iOpperatorLoc = 0 And iOpperatorLoc2 <> 0) Then
iOpperatorLoc = iOpperatorLoc2
szOpperator = "-"
End If
End If
Loop
Next
EvaluateExpression = Val(szTempExpression)
End Function

Vahab
پنج شنبه 10 اردیبهشت 1383, 00:36 صبح
آقایون شرمنده فقط (جمع-تفریق-ضرب-تقسیم و توان را حساب میکند

Vahab
پنج شنبه 10 اردیبهشت 1383, 00:36 صبح
http://www.vbcode.com/asp/showzip.asp?ZipFile=http%3A%2F%2Fwww%2Evbcode%2Eco m%2Fcode%2FAzad02282002%2Ezip&theID=6320

Vahab
پنج شنبه 10 اردیبهشت 1383, 00:38 صبح
من خودم امتحان نکردم امیدوارم درست گفته باشم!!!

ali2914
پنج شنبه 10 اردیبهشت 1383, 08:17 صبح
سلام از جوابتون ممنون اما خودم یه راه آسون تر پیدا کردم(زنده باد خودم+همه شما!) می شه از script controlاستفاده کرد که البته کارش یه چیز دیگس اما می شه استفاده کرد .کدشو می زارم اینجا ببیند .به نظرم مفیده

Vahab
پنج شنبه 10 اردیبهشت 1383, 19:19 عصر
thank you