تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
فصل العمليات الحسابية من النوع String، ( الجزء الثاني - العمليات المتعددة )
#1
كاتب الموضوع : أنس محمود


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

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

*فصل مصفوفتي الأعداد والعمليات كما تعودنا سابقاً.
*إجراء كل عمية داخل العملية المتعددة على حدة بحسب الترتيب الآتي:-
1.عملية الرفع للأس "^"
2.عملية الضرب "*" أو القسمة "/" أيهما جاء أولاً
3.عملية الجمع "+"
*واياً كانت العملية التي يتم حسابها فالروتين الذي سنسير عليه واحد ، وهو :
1.نسند ترتيب العملية للكائن Index
2.نقوم باستبدال العدد الأول للعملية التي سيتم تفيذها ؛ بناتج هذه العملية باستخدام الدالة OneSum ( اذا كانت العملية الحالية "5+3" سيتم استبدال الـ "5" بـ "8")
3.حذف رمز العملية ، وكذلك العدد الثاني للعملية ،
4.تكرار هذه الخطوات حتي نتأكد من أنه لايوجد عمليات أخرى من هذا النوع .

-لكي تستوعب ماقلته ، إليك هذا المثال :
لو ان العملية المطلوب إيجاد ناتجها "5*4^3+8" سيكون شكل مصفوفة العمليات والأعداد كالتالي :-
سنقوم باجراء العمليات الحسابية حسب ترتيب العمليات ،
فتكون العملية التي سنقوم بها أولاً هي عملية الرفع للأس "^" :
حسب خطواتنا ،
1.اسناد ترتيب الرمز"^" وهو 1 الى المتغير Index ( Index=1 )
2.العملية التي سنقوم يها تتكون من :-
*العدد الأول للعملية [ NumArray(Index) ] وهو "5"
*رمز العملية [ OpArray(Index) ] وهو "^"
*العدد الثاني للعملية [ NumArray(Index+1) ] وهو "4"
3.بعد ان نقوم بحساب ناتج العملية الحالية ، سنقوم بـاستبدال العدد الأول للعملية الحالية من مصفوفة الأعداد بالناتج ليصبح شكل المصفوفة :-
4.بعد ذلك سيتم حدف رمز العملية والعدد الثاني ، لأننا لسنا بحاجة إليهما ليصبح شكل المصفوفة :-
5.لا يوجد عمليات أس أخرى ،
نفس هذه الخطوات ستكرر مع عملية الضرب ليصبح شكل المصفوفة النهائي :
وبعد آخر عملية ( عملية الجمع ) :-
كما لاحظتم ، بعد اجراء جميع العمليات ، تحقق أمران :-
*فرغت مصفوفة العمليات ( أصبح عدد عناصرها = 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))
الآن قم بحذف العدد الثاني للعملية الحالية ، وكذلك رمز العملية الحالية :-

كود :
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
ثالثاً : عملية الجمع :-
نفس خطوات عملية الأس تماما ، ( مع مراعاة تغيير الرمز "^"c بـ "+"c ) :-

كود :
Return NumArray(0)
وأخيراُ ، نعيد العنصر المتبقي في مصفوفة الأعداد "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
هذا كود الدالة كاملة :-

كود :
If e.KeyData = Keys.Enter Then
Me.TextBox1.AppendText("=" & MultiSums(Me.TextBox1.Text))
End If
-تجربة الدالة :-
قم بتعديل الكود داخل الحدث KeyDown لـ TextBox1 إلى :-


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



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


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 7,845 19-07-22, 12:15 AM
آخر رد: StartLight4000
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 4 4,522 23-02-18, 10:44 PM
آخر رد: العواد الصغير
  كيف تجعل الـ Text Box ذكي !! يترجم العمليات الحسابية ويخرج الناتج !! بالداخل المزيد !! أنس محمود 1 6,887 11-02-18, 02:37 PM
آخر رد: komar
  مقدمة إلي إخفاء المعلومات - الجزء الأول silverlight 5 4,158 07-01-17, 10:44 PM
آخر رد: Basil Abdallah
  مقدمة إلي إخفاء المعلومات - الجزء الثاني silverlight 1 3,027 06-01-17, 11:52 AM
آخر رد: silverlight
  [مقال] شرح الدالة String.Format sooriaty03 12 17,831 19-06-15, 11:53 PM
آخر رد: اسلام الكبابى
  تحويل الفيديو في برامجك-الجزء الثاني( إصلاح للمشاكل + تعديل للروابط + توضيح للأمر ) RaggiTech 1 3,283 10-12-14, 06:37 PM
آخر رد: abulayth
  معالجة العمليات الحسابية من خلال مربع نص وإظهار النتيجة @@أبورائد@@ 9 6,347 25-05-13, 01:07 PM
آخر رد: shaker.soft
  الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! أنس محمود 0 2,820 22-02-13, 12:39 AM
آخر رد: أنس محمود
  Byte() &lt;-&gt; String() Converter H111er 1 2,598 22-11-12, 10:15 PM
آخر رد: H111er

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


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