04-10-12, 01:27 PM
كاتب الموضوع : أنس محمود
بسم الله الرحمن الرحيم
عنوان المقال : فصل العمليات الحسابية من النوع 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.بعد ان نقوم بحساب ناتج العملية الحالية ، سنقوم بـاستبدال العدد الأول للعملية الحالية من مصفوفة الأعداد بالناتج ليصبح شكل المصفوفة :-
نفس هذه الخطوات ستكرر مع عملية الضرب ليصبح شكل المصفوفة النهائي :
*فرغت مصفوفة العمليات ( أصبح عدد عناصرها = 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
قم بتعريف دالة جديدة بإسم MultiSums :
كود :
Function MultiSums(ByVal Str As String) As Double
End Function
وكذلك المصفوفتان 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)
والآن نعرف المتغير Index لتخزين ترتيب العملية الحالية ،
كود :
Dim Index As Integer
سنفوم الآن بإيجاد ناتج العمليات بالتريب ( أس -> ضرب أو فسمة أيهما جاء أولا -> جمع ):-
أولاً: عملية الرفع للأس :-
سنقوم بنفس الخطوات التي ذكرتها سابقا ،
قم بعمل الحلقة Do Until .. Loop لتكرار التنفيذ إلى أن تنتهي عمليات الرفع للأس من المصفوفة OpArray :-
كود :
Do Until OpArray.IndexOf("^"c) = -1
Loop
كود :
Index = OpArray.IndexOf("^"c)
كود :
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
*عدم وجود رمز الضرب ، وعندها سيتم اسناد ترتيب اول عملية قسمة للمتغير 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)
كود :
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 ( ما النتيجة ! )