تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)!
#1
السلام عليكم ورحمة الله وبركاته ،
هاقد عدت من جديد في الجزء الثاني من الموضوع الذي كنت قد طرحته منذ ايام


كما كنت قد قلت في الجزء الاول من الموضوع انه بنهاية هذه الأجزاء سيكون بإمكانك عمل آلة حاسبة احترافية نوعاً ما ،،
أعتبر هذه الأجزاء مجرد شرارة لك ، ودعنا نرى ابداعاتك !!
اعود وأكرر قد أكون لست أول من فكر في شيء مثل هذا ، ولكنني استخدمت اسلوبي الخاص !!
هيا بنا نبدأ
بسم الله الرحمن الرحيم
عنوان المقال : فصل العمليات الحسابية من النوع String، ( الجزء الثاني : العمليات المتعددة ).
مستوى المقال : مبتدأ – متوسط .
اللغة المستخدمة : VB.Net .
تقييم المقال : ( متروك للقارئ ) .
ثانياً : دالة ايجاد ناتج عمليات متعددة :


- ماذا أعني بـ "عمليات متعددة " ؟ :
العملية المتعددة هي التي يكون بها اكثر من رمز عملية ، وأكثر من عدديين ،
مثلا يمكن اعتبار كلا من "5+6/2" و "5*4^2+3" عمليات متعددة ،
والهدف من هذا الجزء عمل دالة تعيد قيمة من النوع Double تمثل ناتج هذه العملية المتعددة ،
ارجو التركيز جيداً في هذا الجزء من المقال ، لأنني اعتبره اصعب جزء في المقال ، لأنه يرتكز عليه باقي أجزاء المقال .
-تقديم هام :-
في هذا الجزء سنقوم بالتالي :-


  • *فصل مصفوفتي الأعداد والعمليات كما تعودنا سابقاً.
  • *إجراء كل عمية داخل العملية المتعددة على حدة بحسب الترتيب الآتي:-

  1. 1.عملية الرفع للأس "^"
  2. 2.عملية الضرب "*" أو القسمة "/" أيهما جاء أولاً
  3. 3.عملية الجمع "+"
  • *واياً كانت العملية التي يتم حسابها فالروتين الذي سنسير عليه واحد ، وهو :

  1. 1.نسند ترتيب العملية للكائن Index
  2. 2.نقوم باستبدال العدد الأول للعملية التي سيتم تفيذها ؛ بناتج هذه العملية باستخدام الدالة OneSum ( اذا كانت العملية الحالية "5+3" سيتم استبدال الـ "5" بـ "8")
  3. 3.حذف رمز العملية ، وكذلك العدد الثاني للعملية ،
  4. 4.تكرار هذه الخطوات حتي نتأكد من أنه لايوجد عمليات أخرى من هذا النوع .


-لكي تستوعب ماقلته ، إليك هذا المثال :
لو ان العملية المطلوب إيجاد ناتجها "5*4^3+8" سيكون شكل مصفوفة العمليات والأعداد كالتالي :-
[ATTACH=CONFIG]1763[/ATTACH]
سنقوم باجراء العمليات الحسابية حسب ترتيب العمليات ،
فتكون العملية التي سنقوم بها أولاً هي عملية الرفع للأس "^" :
حسب خطواتنا ،
1.اسناد ترتيب الرمز"^" وهو 1 الى المتغير Index ( Index=1 )
2.العملية التي سنقوم يها تتكون من :-
  • *العدد الأول للعملية [ NumArray(Index) ] وهو "5"
  • *رمز العملية [ OpArray(Index) ] وهو "^"
  • *العدد الثاني للعملية [ NumArray(Index+1) ] وهو "4"
3.بعد ان نقوم بحساب ناتج العملية الحالية ، سنقوم بـاستبدال العدد الأول للعملية الحالية من مصفوفة الأعداد بالناتج ليصبح شكل المصفوفة :-
[ATTACH=CONFIG]1764[/ATTACH]
4.بعد ذلك سيتم حدف رمز العملية والعدد الثاني ، لأننا لسنا بحاجة إليهما ليصبح شكل المصفوفة :-
[ATTACH=CONFIG]1765[/ATTACH]
5.لا يوجد عمليات أس أخرى ،
نفس هذه الخطوات ستكرر مع عملية الضرب ليصبح شكل المصفوفة النهائي :
[ATTACH=CONFIG]1766[/ATTACH]
وبعد آخر عملية ( عملية الجمع ) :-
[ATTACH=CONFIG]1767[/ATTACH]
كما لاحظتم ، بعد اجراء جميع العمليات ، تحقق أمران :-
  • *فرغت مصفوفة العمليات ( أصبح عدد عناصرها = 0 )
  • *بقي عنصر واحد في مصفوفة الأعداد ، والذي يمثل ناتج العملية المتعددة


والآن إلى التطبيق :-
نبدأ بسم الله الرحمن الرحيم :-
حمل المشروع إلى أن انتهينا الجزء السابق .
قم بتعديل الدالة OneSum الى الكود التالي :
كود :
Function OneSum(ByVal _1stNum As Double, _
    ByVal _2ndNum As Double, ByVal SumChar As Char) As Double


        Select Case SumChar
            Case "^"c
                Return _1stNum ^ _2ndNum
            Case "*"c
                Return _1stNum * _2ndNum
            Case "/"c
                Return _1stNum / _2ndNum
            Case "+"c
                Return _1stNum + _2ndNum
        End Select


    End Function
قمت بتعديل الكود لتسهيل استخدامه عند ايجاد النواتج فيما بعد ( لإيجاد ناتج "5*3" سنكتب OneSum(5,3,"*"c) )
قم بتعريف دالة جديدة بإسم MultiSums :
كود :
Function MultiSums(ByVal Str As String) As Double


    End Function
كما اعتدنا في المقال السابق سأقوم بتعريف المتغير New_Str لتخرين ناتج تجهيز نص العملية باستخدام الدلة Filter ،
وكذلك المصفوفتان NumArray و OpArray للأعداد ، والعمليات ، وملئهما :-
كود :
Dim NewStr As String = Filter(Str)


        Dim NumArray As New List(Of Double)
        Dim OpArray As New List(Of Char)


        For Each I As String In NewStr.Split("^"c, "*"c, "/"c, "+"c)
            NumArray.Add(I)
        Next




        NewStr = WihtounNums(NewStr)


        OpArray.AddRange(NewStr.ToCharArray)
*ملاحظة : استخدمت الكائن List(Of ) بدلا من المصفوفة لتسهيل الإستخدام .
والآن نعرف المتغير Index لتخزين ترتيب العملية الحالية ،
كود :
Dim Index As Integer
وفائدة هذا المتغير ( كما قلت سابقاً ) هو أننا سنسند له ترتيب العملية الحالية من الكائن OpArray لنستعيد العملية كاملة بعد ذلك ( سيكون NumArray(Index) هو العدد الأول ، و NumArray(Index + 1) العدد الثاني ، و OpArray(Index) هو رمز العملية )
سنفوم الآن بإيجاد ناتج العمليات بالتريب ( أس -> ضرب أو فسمة أيهما جاء أولا -> جمع ):-


أولاً: عملية الرفع للأس :-
سنقوم بنفس الخطوات التي ذكرتها سابقا ،
قم بعمل الحلقة Do Until .. Loop لتكرار التنفيذ إلى أن تنتهي عمليات الرفع للأس من المصفوفة OpArray :-
كود :
Do Until OpArray.IndexOf("^"c) = -1


        Loop
داخل الحلقة قم بإسناد ترتيب الرمز "^"c للمتغير Index :-
كود :
Index = OpArray.IndexOf("^"c)
قم الآن باستبدال العدد الأول للعملية الحالية من مصفوفة الأعداد بناتج هذه العملية عن طريق الدالة OneSum :-
كود :
NumArray(Index) = OneSum(NumArray(Index), NumArray(Index + 1), "^"c)
الآن قم بحذف العدد الثاني لعملية الأس الحالية ، وكذلك رمز العملية الحالية :-
كود :
OpArray.RemoveAt(Index)
            NumArray.RemoveAt(Index + 1)
ثانياً: عملية الضرب والقسمة :-


نفس الخطوات ولكن الاختلاف الوحيد هو تحديد ترتيب رمز العملية ، فهنا رمز العملية لن يكون بين رمز واحد ، وإنما سيكون بين رمزين ايهما جاء قبل الآخر ،
قم بعمل الحلقة Do Until .. Loop لتكرار التنفيذ إلى أن تنتهي عمليات الضرب والقسمة من المصفوفة OpArray :-
كود :
Do Until OpArray.IndexOf("/"c) = -1 _
             And OpArray.IndexOf("*"c) = -1


        Loop
داخل الحلقة قم بإسناد ترتيب الرمز "*"c أو "/"c أيهما جاء قبل الآخر للمتغير Index ، وهنا سيتم عمل جملة شرطية لإختبار :-
*عدم وجود رمز الضرب ، وعندها سيتم اسناد ترتيب اول عملية قسمة للمتغير Index ،
*عدم وجود رمز القسمة وعندها سيتم العكس ، سيتم اسناد ترتيب اول عملية ضرب للمتغير Index ،
*في حالة وجود الرمزين معا ً ، فسيتم اسناد ترتيب اول اعملية ضرب أو قسمة للمتغير Index ( في هذه الحالة سنقوم باختبار ما إذاكان ترتيب أول عملية ضرب اصغر من ترتيب أول قسمة ، وعندها سيتم إسناد ترتيب أول عملية ضرب للمتغير Index ، وإلا سيتم إسناد أول عملية قسمة ، وهذا كله باستخدام الدالة IIf() )،
كود :
If OpArray.IndexOf("*"c) = -1 Then
                Index = OpArray.IndexOf("/"c)
            ElseIf OpArray.IndexOf("/"c) = -1 Then
                Index = OpArray.IndexOf("*"c)
            Else
                Index = IIf(OpArray.IndexOf("*"c) < OpArray.IndexOf("/"c), _
                            OpArray.IndexOf("*"c), OpArray.IndexOf("/"c))
            End If
سنتم باقي خطواتنا عاديا :
قم الآن باستبدال العدد الأول للعملية الحالية من مصفوفة الأعداد بناتج هذه العملية عن طريق الدالة OneSum :-
كود :
NumArray(Index) = OneSum(NumArray(Index), NumArray(Index + 1), OpArray(Index))
الآن قم بحذف العدد الثاني للعملية الحالية ، وكذلك رمز العملية الحالية :-
كود :
OpArray.RemoveAt(Index)
            NumArray.RemoveAt(Index + 1)
ثالثاً : عملية الجمع :-
نفس خطوات عملية الأس تماما ، ( مع مراعاة تغيير الرمز "^"c بـ "+"c ) :-
كود :
Do Until OpArray.IndexOf("+"c) = -1
            Index = OpArray.IndexOf("+"c)
            NumArray(Index) = OneSum(NumArray(Index), NumArray(Index + 1), "+"c)
            OpArray.RemoveAt(Index)
            NumArray.RemoveAt(Index + 1)
        Loop
وأخيراُ ، نعيد العنصر المتبقي في مصفوفة الأعداد "NumArray(0)"، والذي يمثل ناتج العملية :-
كود :
Return NumArray(0)
هذا كود الدالة كاملة :-
كود :
Function MultiSums(ByVal Str As String) As Double


        Dim NewStr As String = Filter(Str)


        Dim NumArray As New List(Of Double)
        Dim OpArray As New List(Of Char)


        For Each I As String In NewStr.Split("^"c, "*"c, "/"c, "+"c)
            NumArray.Add(I)
        Next




        NewStr = WihtounNums(NewStr)


        OpArray.AddRange(NewStr.ToCharArray)


        Dim Index As Integer 'متغير لتخزين ترتيب العملية الحالية
        'عملية الرفع للأس (^) ـ
        Do Until OpArray.IndexOf("^"c) = -1
            Index = OpArray.IndexOf("^"c)
            NumArray(Index) = OneSum(NumArray(Index), NumArray(Index + 1), "^"c)
            OpArray.RemoveAt(Index)
            NumArray.RemoveAt(Index + 1)
        Loop


        ' عملية الضرب والقسمة (* و /)ـ
        Do Until OpArray.IndexOf("/"c) = -1 _
             And OpArray.IndexOf("*"c) = -1


            If OpArray.IndexOf("*"c) = -1 Then
                Index = OpArray.IndexOf("/"c)
            ElseIf OpArray.IndexOf("/"c) = -1 Then
                Index = OpArray.IndexOf("*"c)
            Else
                Index = IIf(OpArray.IndexOf("*"c) < OpArray.IndexOf("/"c), _
                            OpArray.IndexOf("*"c), OpArray.IndexOf("/"c))
            End If


            NumArray(Index) = OneSum(NumArray(Index), NumArray(Index + 1), OpArray(Index))
            OpArray.RemoveAt(Index)
            NumArray.RemoveAt(Index + 1)
        Loop


        'عملية الجمع (+)ـ
        Do Until OpArray.IndexOf("+"c) = -1
            Index = OpArray.IndexOf("+"c)
            NumArray(Index) = OneSum(NumArray(Index), NumArray(Index + 1), "+"c)
            OpArray.RemoveAt(Index)
            NumArray.RemoveAt(Index + 1)
        Loop




        Return NumArray(0)


    End Function


-تجربة الدالة :-
قم بتعديل الكود داخل الحدث KeyDown لـ TextBox1 إلى :-
كود :
If e.KeyData = Keys.Enter Then
            Me.TextBox1.AppendText("=" & MultiSums(Me.TextBox1.Text))
        End If
الآن قم بتجربة المشروع إضغط F5 ،ثم قم بكتابة 5*4^3+8، ثم اضغط الزر Enter ( ما النتيجة ! )


[ATTACH=CONFIG]1768[/ATTACH]
  • [*=right][INDENT]
    أنتظروا باقي الأجزاء تباعاً .
    ==> تحميل المشروع الى ان توقفنا في المرفقات <==
    مرفق أيضا الشرح بصيغة DOC
    أستودعكم الله
    [/INDENT]







الملفات المرفقة صورة/صور
                       

.zip   OneSumProg1.zip (الحجم : 79.89 ك ب / التحميلات : 73)
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  كيف تجعل برنامجك عالميا و يدعم أكثر من لغة silverlight 5 731 15-05-16, 05:03 PM
آخر رد: CLARO
  تحويل الفيديو في برامجك-الجزء الثاني( إصلاح للمشاكل + تعديل للروابط + توضيح للأمر ) RaggiTech 1 712 10-12-14, 06:37 PM
آخر رد: abulayth
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 9 2,071 06-12-14, 10:11 PM
آخر رد: RFEE3 ALSHAN
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 3 907 28-05-13, 01:06 PM
آخر رد: Sajad
  @@@ معالجة العمليات الحسابية من خلال مربع نص وإظهار النتيجة @@@ @@أبورائد@@ 9 1,592 25-05-13, 01:07 PM
آخر رد: shaker.soft
  كيف تجعل الـ Text Box ذكي !! يترجم العمليات الحسابية ويخرج الناتج !! بالداخل المزيد !! أنس محمود 0 1,554 20-02-13, 12:58 AM
آخر رد: أنس محمود
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 365 06-10-12, 12:20 AM
آخر رد: RaggiTech
  الجزء الثاني - تطوير الكونترول Interfaces RaggiTech 0 385 06-10-12, 12:19 AM
آخر رد: RaggiTech
  كيف تجعل كل شئ مستديرا داخل الفورم RaggiTech 0 706 05-10-12, 03:11 PM
آخر رد: RaggiTech
  مقال- Custom EventHandler &amp; Classes - الجزء الثاني RaggiTech 0 356 05-10-12, 11:50 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم