المشاركات : 190
المواضيع 48
الإنتساب : Sep 2013
السمعة :
5
الشكر: 196
تم شكره 219 مرات في 82 مشاركات
27-10-13, 05:43 PM
(آخر تعديل لهذه المشاركة : 27-10-13, 05:44 PM {2} بواسطة tarek.)
السلام عليكم ورحمة الله وبركاته
عندما أكتب
dim a as single = 5 +7
msgbox(a) UUUUUUU
يكون الناتج هو 12
ولكن عندما أقوم باضافة تيكست بوكس للفورم واكتب بداخله
5 + 7
ثم اكتب msgbox(textbox1.text) uuu
يعطي رسالة خطأ
قمت باضافة دالة التحويل قبل التيكست بوكس وهي Csng
نفس رسالة الخطأ فهي تستخدم مع أرقام فقط .... وليس مع علامات
===============================
المطلوب باختصار
كتابة المعادلة 5 + 7 في تيكست بوكس
واظهار الناتج في رسالة بعد الضغط على باتون
وشكرا
المشاركات : 664
المواضيع 32
الإنتساب : Oct 2013
السمعة :
81
الشكر: 776
تم شكره 992 مرات في 298 مشاركات
كود :
Dim n1 As Short = Int(TextBox1.Text.Split("+")(0))
Dim n2 As Short = Int(TextBox1.Text.Split("+")(1))
MsgBox(n1 + n2)
المشاركات : 190
المواضيع 48
الإنتساب : Sep 2013
السمعة :
5
الشكر: 196
تم شكره 219 مرات في 82 مشاركات
شكرا أخي 3booody ولكني الظااهر ما عرفتش أوصل المطلوب كويس
أنا عايز أي عملية حسابية أكتبها في التيكست بوكس يظهر ناتجها .. أنا كنت جايب مجرد مثال
مثلا لو كتب في التيكست بوكس 6+9-8*9
أو 9/6-9*(5+6)-9
يظهر الناتج
المشاركات : 664
المواضيع 32
الإنتساب : Oct 2013
السمعة :
81
الشكر: 776
تم شكره 992 مرات في 298 مشاركات
العملية بهالشكل تكون طويله ومعقده راح احاول واعطيك النتائج
المشاركات : 190
المواضيع 48
الإنتساب : Sep 2013
السمعة :
5
الشكر: 196
تم شكره 219 مرات في 82 مشاركات
انا قصدي اي عمليه ...... انا جايب أمثلة فقط .... لا أحد يلتزم .... السؤال ... كيف أحصل على ناتج أي معادلة تكتب في التيكست بوكس
المشاركات : 664
المواضيع 32
الإنتساب : Oct 2013
السمعة :
81
الشكر: 776
تم شكره 992 مرات في 298 مشاركات
تفضل طلبك لكن لازم تكون العملية بين رقمين فقط لان اذا كثرت تتعقد الامور
كود :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
On Error Resume Next
MsgBox(GetNum(TextBox1.Text))
End Sub
Function GetNum(ByVal txt As String) As Double
On Error Resume Next
If txt.Contains("+") Then
Return CDbl(txt.Split("+")(0)) + CDbl(txt.Split("+")(1))
End If
If txt.Contains("-") Then
Return CDbl(txt.Split("-")(0)) - CDbl(txt.Split("-")(1))
End If
If txt.Contains("*") Then
Return CDbl(txt.Split("*")(0)) * CDbl(txt.Split("*")(1))
End If
If txt.Contains("/") Then
Return CDbl(txt.Split("/")(0)) / CDbl(txt.Split("/")(1))
End If
End Function
المشاركات : 749
المواضيع 127
الإنتساب : Sep 2013
السمعة :
105
الشكر: 924
تم شكره 5271 مرات في 453 مشاركات
إقتباس : شكرا أخي 3booody ولكني الظااهر ما عرفتش أوصل المطلوب كويس
أنا عايز أي عملية حسابية أكتبها في التيكست بوكس يظهر ناتجها .. أنا كنت جايب مجرد مثال
مثلا لو كتب في التيكست بوكس 6+9-8*9
أو 9/6-9*(5+6)-9
يظهر الناتج
Abu Ehab : Microsoft Partner & Systems Developer
المشاركات : 901
المواضيع 34
الإنتساب : Nov 2012
السمعة :
65
الشكر: 517
تم شكره 1181 مرات في 245 مشاركات
27-10-13, 10:16 PM
(آخر تعديل لهذه المشاركة : 27-03-17, 05:57 PM {2} بواسطة @@أبورائد@@.)
السلام عليكم ورحمة الله وبركاته
أنظر هذا الموضوع
استخدام TextBox للعمليات الحسابية VB.NET
السلام عليكم ورحمة الله وبركاته
المشاركات : 190
المواضيع 48
الإنتساب : Sep 2013
السمعة :
5
الشكر: 196
تم شكره 219 مرات في 82 مشاركات
والله عاجز عن الشكر لكل من رد على الموضوع ... الاستاذ الذوق : 3booody
واستاذي الفاضل الخلوق : أبو ايهاب
والرجل المعطاء : أبو رائد
ولكن المطلوب هو : اكتب المعادلة ( أي معادلة ) في التيكست بوكس
و ليس في الكود
وسأرى الآن موضوع ابو رائد
ووالله بجد انا عاجز عن الشكر
المشاركات : 372
المواضيع 15
الإنتساب : Sep 2013
السمعة :
28
الشكر: 487
تم شكره 1677 مرات في 187 مشاركات
السلام عليكم...
تقدم أخونا أبو رائد بالحل - و هو السباق دائماً - مستخدماً مكتبة Script Control. و أريد هنا فقط أن أبين بعض الخوارزميات التي تقف وراء تحليل التعبيرات الحسابية و تقييمها.
توضيحات سريعة:
أ. المصطلح InFix (العوامل البينية) يشير إلى التعبيرات الحسابية التي نكتبها بطريقتنا المعتادة، و سمي بذلك لأن العوامل (الإشارات الحسابية) تقع بين المعاملات (الأعداد).
ب. المصطلح PostFix (العوامل البعدية) يشير إلى التعبيرات الحسابية التي تكتب فيها العوامل (الإشارات الحسابية) بعد المعاملات (الأعداد).
ج. المصطلح PreFix (العوامل القبلية) يشير إلى التعبيرات الحسابية التي تكتب فيها العوامل (الإشارات الحسابية) قبل المعاملات (الأعداد) - لن نستخدم هذا الشكل في هذا الشرح.
* إذن تقييم التعبير الحسابي يمر بخطوتين أساسيتين:
1. تحويل تعبير الـ Infix إلى تعبير PostFix.
2. تقييم تعبير الـ PostFix و الحصول على النتيجة.
* لماذا التحويل أولاً إلى الـ PostFix ؟ - لأن التعبيرات العادية (Infix) هي تعبيرات معقدة نوعاً ما حتى و إن كانت لعمليات بسيطة، فتحليلها محكوم بأسبقية العوامل (الأس له الأسبقية العليا، يليه الضرب و القسمة، ثم الجمع و الطرح). و إذا دخلت الأقواس في العملية تصبح الأمور أعقد.
أما تعبيرات الـ Postfix فلا تعاني من هذا الأمر، لأن ترتيب العوامل و المعاملات مبني أصلاً على أسبقية العوامل.
كود :
5 * 3 ===> 5 3 * ===> = 15
5 * 3 + 2 ===> 5 3 * 2 + ===> = 17 : الضرب أولاً ثم الجمع
5 * (3 + 2) ===> 5 3 2 + * ===> = 25 : الجوع أولاً ثم الضرب
*** على أية حال، الكود التالي كنت قد كتبته منذ مدة بلغة VB6 و قمت بتحويله إلى VB.NET و هو تطبيق للخوارزميتين الأساسيتين: التحويل من الـ Infix إلى الـ Postfix (الدالة InfixToPostfix)، و تقييم تعبير الـ Postfix (الدالة EvaluatePostfix). مع ملاحظة أنه يصلح لإجراء العمليات الحسابية الأساسية الخمسة: الجمع و الطرح و الضرب و القسمة و الأس (+ - * / ^) على الأعداد الصحيحة (دون فاصلة عشرية) بالإضافة طبعاً إلى استعمال الأقواس، و يمكن بسهولة إضافة باقي القسمة (Modulus) باستعمال مثلاً علامة %.
** نضع الكود التالي في بداية الكود (نحتاج إلى تضمين System.Collections من أجل استخدام الـ Stack):
كود :
Imports System.Collections
Module ExprManager
Private Function IsEmptyStack(ByVal AStack As Stack) As Boolean
Return (AStack.Count = 0)
End Function
Private Function IsOperator(ByVal AChar As Char) As Boolean
Return "^*/+-".Contains(AChar)
End Function
Private Function CompareOperators(ByVal Op1 As Char, ByVal Op2 As Char) As Integer
If Not (IsOperator(Op1) And IsOperator(Op2)) Then
Err.Raise(vbObjectError + 1001, "CompareOperators", "Operator(s) not suppoerted")
End If
Select Case Op1
Case "^"c
If Op2 = "^"c Then
Return 0
Else
Return 1
End If
Case "*"c, "/"c
Select Case Op2
Case "^"c
Return -1
Case "*"c, "/"c
Return 0
Case "+"c, "-"c
Return 1
End Select
Case "+"c, "-"c
Select Case Op2
Case "^"c, "*"c, "/"c
Return -1
Case "+"c, "-"c
Return 0
End Select
End Select
End Function
Private Function InfixToPostfix(ByVal InfixExpression As String) As String
Dim Infix As String
Dim Postfix As String
Dim InfixIndex As Integer
Dim InfixLen As Integer
Dim AChar As Char
Dim APeek As String
Dim ANumber As String
Dim MathStack As New Stack
Infix = InfixExpression.Trim()
If Infix = "" Then
Return ""
End If
Infix = Infix & ")"
ANumber = ""
Postfix = ""
InfixLen = Len(Infix) '- 1
InfixIndex = 0
MathStack.Clear()
MathStack.Push("(")
Do While (Not IsEmptyStack(MathStack)) And (InfixIndex <= InfixLen)
'AChar = Mid$(Infix, InfixIndex, 1)
AChar = Infix(InfixIndex)
If Char.IsDigit(AChar) Then
ANumber = ANumber & AChar
ElseIf AChar = "(" Then
If ANumber <> "" Then
Postfix = Postfix & ANumber & " "
ANumber = ""
End If
MathStack.Push(AChar)
ElseIf IsOperator(AChar) Then
If ANumber <> "" Then
Postfix = Postfix & ANumber & " "
ANumber = ""
End If
APeek = MathStack.Peek
If IsOperator(APeek) Then
Do While CompareOperators(APeek, AChar) >= 0
APeek = MathStack.Pop
Postfix = Postfix & APeek
APeek = MathStack.Peek
If Not IsOperator(APeek) Then Exit Do
Loop
End If
MathStack.Push(AChar)
ElseIf AChar = ")" Then
If ANumber <> "" Then
Postfix = Postfix & ANumber & " "
ANumber = ""
End If
APeek = MathStack.Peek
Do While APeek <> "("
APeek = MathStack.Pop
Postfix = Postfix & APeek
APeek = MathStack.Peek
Loop
MathStack.Pop()
End If
InfixIndex = InfixIndex + 1
Loop
If Not IsEmptyStack(MathStack) Then
Err.Raise(vbObjectError + 1002, "InfixToPostfix", "Invalid infix expression")
Else
InfixToPostfix = Postfix
End If
End Function
Private Function PerformOperation(ByVal Number1 As Double, ByVal Number2 As Double, ByVal AOperator As Char) As Double
Select Case AOperator
Case "+"c
Return Number1 + Number2
Case "-"c
Return Number1 - Number2
Case "*"c
Return Number1 * Number2
Case "/"c
If Number2 = 0 Then
Err.Raise(vbObjectError + 1004, "EvaluatePostfix", "Division by zero")
Else
Return Number1 / Number2
End If
Case "^"c
Return Number1 ^ Number2
Case Else
Err.Raise(vbObjectError + 1001, "CompareOperators", "Operator not suppoerted")
End Select
End Function
Private Function EvaluatePostfix(ByVal PostfixExpression As String) As Double
Dim Postfix As String
Dim ANumber As String
Dim AChar As Char
Dim PostfixIndex As Long
Dim PostfixLen As Long
Dim Num1 As Double
Dim Num2 As Double
Dim NumResult As Double
Dim MathStack As New Stack
Postfix = Trim$(PostfixExpression)
If Postfix = "" Then
Return 0.0
End If
Postfix = Postfix & "="
ANumber = ""
PostfixLen = Len(Postfix)
PostfixIndex = 0
MathStack.Clear()
Do While PostfixIndex <= PostfixLen
'AChar = Mid$(Postfix, PostfixIndex, 1)
AChar = Postfix(PostfixIndex)
If AChar = " " Then
If ANumber <> "" Then
MathStack.Push(CDbl(ANumber))
ANumber = ""
End If
ElseIf Char.IsDigit(AChar) Then
ANumber = ANumber & AChar
ElseIf AChar = "=" Then
If ANumber <> "" Then
MathStack.Push(CDbl(ANumber))
ANumber = ""
End If
If MathStack.Count = 1 Then
Return MathStack.Pop
Else
Err.Raise(vbObjectError + 1003, "EvaluatePostfix", "Invalid postfix expression")
End If
ElseIf IsOperator(AChar) Then
If ANumber <> "" Then
MathStack.Push(CDbl(ANumber))
ANumber = ""
End If
If IsEmptyStack(MathStack) Then
Err.Raise(vbObjectError + 1003, "EvaluatePostfix", "Invalid postfix expression")
Else
Num2 = MathStack.Pop
If IsEmptyStack(MathStack) Then
Err.Raise(vbObjectError + 1003, "EvaluatePostfix", "Invalid postfix expression")
Else
Num1 = MathStack.Pop
NumResult = PerformOperation(Num1, Num2, AChar)
MathStack.Push(NumResult)
End If
End If
End If
PostfixIndex = PostfixIndex + 1
Loop
End Function
Public Function EvaluateExpr(ByVal AExpr As String) As String
Dim PostfixExpr As String
AExpr = AExpr.Trim
If AExpr = "" Then Return ""
PostfixExpr = InfixToPostfix(AExpr)
Return EvaluatePostfix(PostfixExpr)
End Function
End Module
* ثم نستدعي الدالة EvaluateExpr لتحليل التعبير و الحصول على النتيجة، مثلاً:
كود :
TextBox2.Text = EvaluateExpr(TextBox1.Text)
نرجو الاستفادة و السلام.
بِسْمِ اللهِ الرَّحْمَنِ الرَّحِيمِ ( وَ مَا تُقَدِّمُوا لِأَنفُسِكُم مِّنْ خَيْرٍ تَجِدُوهُ عِندَ اللهِ هُوَ خَيْراً وَ أَعْظَمَ أَجْراً ) صَدَقَ اللهُ الْعَظِيمُ
|