22-02-13, 12:39 AM
السلام عليكم ورحمة الله وبركاته ،
هاقد عدت من جديد في الجزء الثاني من الموضوع الذي كنت قد طرحته منذ ايام
كما كنت قد قلت في الجزء الاول من الموضوع انه بنهاية هذه الأجزاء سيكون بإمكانك عمل آلة حاسبة احترافية نوعاً ما ،،
أعتبر هذه الأجزاء مجرد شرارة لك ، ودعنا نرى ابداعاتك !!
اعود وأكرر قد أكون لست أول من فكر في شيء مثل هذا ، ولكنني استخدمت اسلوبي الخاص !!
هيا بنا نبدأ
مستوى المقال : مبتدأ – متوسط .
اللغة المستخدمة : VB.Net .
تقييم المقال : ( متروك للقارئ ) .
ثانياً : دالة ايجاد ناتج عمليات متعددة :
- ماذا أعني بـ "عمليات متعددة " ؟ :
العملية المتعددة هي التي يكون بها اكثر من رمز عملية ، وأكثر من عدديين ،
مثلا يمكن اعتبار كلا من "5+6/2" و "5*4^2+3" عمليات متعددة ،
والهدف من هذا الجزء عمل دالة تعيد قيمة من النوع Double تمثل ناتج هذه العملية المتعددة ،
ارجو التركيز جيداً في هذا الجزء من المقال ، لأنني اعتبره اصعب جزء في المقال ، لأنه يرتكز عليه باقي أجزاء المقال .
-تقديم هام :-
في هذا الجزء سنقوم بالتالي :-
-لكي تستوعب ماقلته ، إليك هذا المثال :
لو ان العملية المطلوب إيجاد ناتجها "5*4^3+8" سيكون شكل مصفوفة العمليات والأعداد كالتالي :-
فتكون العملية التي سنقوم بها أولاً هي عملية الرفع للأس "^" :
حسب خطواتنا ،
1.اسناد ترتيب الرمز"^" وهو 1 الى المتغير Index ( Index=1 )
2.العملية التي سنقوم يها تتكون من :-
نفس هذه الخطوات ستكرر مع عملية الضرب ليصبح شكل المصفوفة النهائي :
والآن إلى التطبيق :-
قم بتعديل الدالة OneSum الى الكود التالي :
قمت بتعديل الكود لتسهيل استخدامه عند ايجاد النواتج فيما بعد ( لإيجاد ناتج "5*3" سنكتب OneSum(5,3,"*"c) )
قم بتعريف دالة جديدة بإسم MultiSums :
كما اعتدنا في المقال السابق سأقوم بتعريف المتغير New_Str لتخرين ناتج تجهيز نص العملية باستخدام الدلة Filter ،
وكذلك المصفوفتان NumArray و OpArray للأعداد ، والعمليات ، وملئهما :-
*ملاحظة : استخدمت الكائن List(Of ) بدلا من المصفوفة لتسهيل الإستخدام .
والآن نعرف المتغير Index لتخزين ترتيب العملية الحالية ،
وفائدة هذا المتغير ( كما قلت سابقاً ) هو أننا سنسند له ترتيب العملية الحالية من الكائن OpArray لنستعيد العملية كاملة بعد ذلك ( سيكون NumArray(Index) هو العدد الأول ، و NumArray(Index + 1) العدد الثاني ، و OpArray(Index) هو رمز العملية )
سنفوم الآن بإيجاد ناتج العمليات بالتريب ( أس -> ضرب أو فسمة أيهما جاء أولا -> جمع ):-
أولاً: عملية الرفع للأس :-
سنقوم بنفس الخطوات التي ذكرتها سابقا ،
قم بعمل الحلقة Do Until .. Loop لتكرار التنفيذ إلى أن تنتهي عمليات الرفع للأس من المصفوفة OpArray :-
داخل الحلقة قم بإسناد ترتيب الرمز "^"c للمتغير Index :-
قم الآن باستبدال العدد الأول للعملية الحالية من مصفوفة الأعداد بناتج هذه العملية عن طريق الدالة OneSum :-
الآن قم بحذف العدد الثاني لعملية الأس الحالية ، وكذلك رمز العملية الحالية :-
ثانياً: عملية الضرب والقسمة :-
نفس الخطوات ولكن الاختلاف الوحيد هو تحديد ترتيب رمز العملية ، فهنا رمز العملية لن يكون بين رمز واحد ، وإنما سيكون بين رمزين ايهما جاء قبل الآخر ،
قم بعمل الحلقة Do Until .. Loop لتكرار التنفيذ إلى أن تنتهي عمليات الضرب والقسمة من المصفوفة OpArray :-
داخل الحلقة قم بإسناد ترتيب الرمز "*"c أو "/"c أيهما جاء قبل الآخر للمتغير Index ، وهنا سيتم عمل جملة شرطية لإختبار :-
*عدم وجود رمز الضرب ، وعندها سيتم اسناد ترتيب اول عملية قسمة للمتغير Index ،
*عدم وجود رمز القسمة وعندها سيتم العكس ، سيتم اسناد ترتيب اول عملية ضرب للمتغير Index ،
*في حالة وجود الرمزين معا ً ، فسيتم اسناد ترتيب اول اعملية ضرب أو قسمة للمتغير Index ( في هذه الحالة سنقوم باختبار ما إذاكان ترتيب أول عملية ضرب اصغر من ترتيب أول قسمة ، وعندها سيتم إسناد ترتيب أول عملية ضرب للمتغير Index ، وإلا سيتم إسناد أول عملية قسمة ، وهذا كله باستخدام الدالة IIf() )،
سنتم باقي خطواتنا عاديا :
قم الآن باستبدال العدد الأول للعملية الحالية من مصفوفة الأعداد بناتج هذه العملية عن طريق الدالة OneSum :-
الآن قم بحذف العدد الثاني للعملية الحالية ، وكذلك رمز العملية الحالية :-
ثالثاً : عملية الجمع :-
نفس خطوات عملية الأس تماما ، ( مع مراعاة تغيير الرمز "^"c بـ "+"c ) :-
وأخيراُ ، نعيد العنصر المتبقي في مصفوفة الأعداد "NumArray(0)"، والذي يمثل ناتج العملية :-
هذا كود الدالة كاملة :-
-تجربة الدالة :-
قم بتعديل الكود داخل الحدث KeyDown لـ TextBox1 إلى :-
الآن قم بتجربة المشروع إضغط F5 ،ثم قم بكتابة 5*4^3+8، ثم اضغط الزر Enter ( ما النتيجة ! )
هاقد عدت من جديد في الجزء الثاني من الموضوع الذي كنت قد طرحته منذ ايام
- [*=right][h=3]كيف تجعل الـ Text Box ذكي !! يترجم العمليات الحسابية ويخرج الناتج !! بالداخل المزيد !![/h]
كما كنت قد قلت في الجزء الاول من الموضوع انه بنهاية هذه الأجزاء سيكون بإمكانك عمل آلة حاسبة احترافية نوعاً ما ،،
أعتبر هذه الأجزاء مجرد شرارة لك ، ودعنا نرى ابداعاتك !!
اعود وأكرر قد أكون لست أول من فكر في شيء مثل هذا ، ولكنني استخدمت اسلوبي الخاص !!
هيا بنا نبدأ
بسم الله الرحمن الرحيم
عنوان المقال : فصل العمليات الحسابية من النوع 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" سيكون شكل مصفوفة العمليات والأعداد كالتالي :-
[ATTACH=CONFIG]1763[/ATTACH]
سنقوم باجراء العمليات الحسابية حسب ترتيب العمليات ،فتكون العملية التي سنقوم بها أولاً هي عملية الرفع للأس "^" :
حسب خطواتنا ،
1.اسناد ترتيب الرمز"^" وهو 1 الى المتغير Index ( Index=1 )
2.العملية التي سنقوم يها تتكون من :-
- *العدد الأول للعملية [ NumArray(Index) ] وهو "5"
- *رمز العملية [ OpArray(Index) ] وهو "^"
- *العدد الثاني للعملية [ NumArray(Index+1) ] وهو "4"
[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
قم بتعريف دالة جديدة بإسم 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))
كود :
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
كود :
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
[ATTACH=CONFIG]1768[/ATTACH]
- [*=right][INDENT]أنتظروا باقي الأجزاء تباعاً .
==> تحميل المشروع الى ان توقفنا في المرفقات <==
مرفق أيضا الشرح بصيغة DOCأستودعكم الله[/INDENT]