04-10-12, 01:41 PM
كاتب الموضوع : أنس محمود
بسم الله الرحمن الرحيم
بسم الله الرحمن الرحيم
عنوان المقال : فصل العمليات الحسابية من النوع String، ( الجزء الثالث : عمليات الأقواس ).
مستوى المقال : مبتدأ - متوسط .
اللغة المستخدمة : VB.Net .
تقييم المقال : ( متروك للقارئ ) .
ثالثاً : دالة ايجاد ناتج عمليات الأقواس :
-------- ماذا أعني بـ "عمليات الأقواس " ؟ :
عمليات الأقواس هي التي يكون بها الرمز "(" و ")" ،
مثلا يمكن اعتبار كلا من "(5+6)/2" و "(5*4)^2+3" عمليات أقواس ،
والهدف من هذا الجزء عمل دالة تعيد قيمة من النوع Double تمثل ناتج هذه العملية ،
-------- تقديم هام :-
ما الفرق بين "5+6/2" و "(5+6)/2" ؟
الفرق ببساطة أن في "5+6/2" سيتم حساب قيمة عملية القسمة "6/2" ثم جمع الناتج مع 5 بحسب الترتيب المنطقي للعمليات المتعددة .
أما في "(5+6)/2" فسيتم حساب ناتج عملية الجمع "5+6" ثم قسمة الناتج على 2 .
وهذة هي فائدة استخدام الأقواس أنها تعطي ما بداخلها الأولوية دائماً .
في هذا الجزء سنقوم بالتالي :-
___& تحديد آخر قوس من الداخل واستبداله بناتج العملية التي يحتويها ، وهذا يكون عن طريق :-
_______1. اسناد النص المحصور بين آخر رمز "(" وأول رمز ")" بعده لمتغير القوس الحالي .
_______2. ايجاد ناتج العملية التي بداخل القوس باستخدام الدالة MultiSums التي قمنا بتعريفها في الجزء السابق ، ثم استبدال قوس بناتج العملية مسبوقا بعلامة الضرب ( لو أن العملية "(4-2)(5-1)" ستكون بهذا الشكل "*2*4" ).
_______3. ازالة علامات الضرب الغير مرغوب فيها ( قد ينتج عن استبدال القوس بعلامة ضرب ثم الناتج ، أن تكون علامة الضرب مسبوقة بعلامة الجمع أو القسمة أو الأس أو تكون علامة الضرب في بداية نص العملية أو في بداية القوس الذي يسبقه ، وفي هذه الخطوة سنقوم بإزالة هذة الرموز ، مثلاً العملية "(5-3)+(3-2)^(1+1)" ستكون بالشكل "*2+*1^*2" وبعد ازالة علامات الضرب الغير مرغوب فيها ستكون بالشكل "2+1^2" ) وسنقوم بتعريف الدالة FilterMultiplies لهذا الغرض .
___& تكرار الخطوات السابقة حتى تخلو العملية من الأقواس ، وتتحول إلى عملية متعددة .
___& ايجاد ناتج العملية المتبقية - والتي أصبحت عملية متعددة - باستخدام الدالة MultiSums ( مثلاً العملية " (6-4)+(5+1)(5-2)" بعد الخطوات السابقة ستكون بالشكل "2+6*3" عند ايجاد الناتج باستخدام الدالة MultiSums سيكون 20 .
--------لكي تستوعب ماقلته ، إليك هذا المثال :
لو ان العملية المطلوب إيجاد ناتجها " (6-4)+(5+1)(5-2)" فإنه حسب ماقلت:-
بفرض أن متغير القوس الحالي هو CurBracket ، وبعد إسناده بآخر قوس في العملية ستكون قيمته :
كود :
{CurBracket = "(5-2)"}
كود :
{"(6-4)+(5+1)*3"}
كود :
{CurBracket = "(5+1)"}
{"(6-4)+*6*3"}
{"(6-4)+6*3"}
كود :
{CurBracket = "(6-4)"}
{"*2+*6*3"}
{"2+6*3"}
كود :
{"20"}
كود :
Function BracketsSums(ByVal Str As String) As Double
End Function
---------------- والآن إلى التطبيق :-
نبدأ بسم الله الرحمن الرحيم
حمل المشروع إلى أن انتهينا الجزء السابق .
قم بتعريف دالة جديدة بإسم BracketsSums :
كود :
Dim CurBracket As String
Dim NewStr As String = Str
ثم سأقوم بتعريف المتغير NewStr لتخرين نص العملية:-
كود :
Dim XX_1, XX_2 As Integer
بعد ذلك سنقوم بتعريف المتغيرين العدديينXX_1 و XX_2 لتخرين ترتيب بداية ونهاية القوس الحالي :-
كود :
Do While NewStr.Contains("(")
Loop
كود :
XX_1 = NewStr.LastIndexOf("(")
XX_2 = NewStr.IndexOf(")", XX_1)
اسناد قيمة ترتيب آخر رمز ")" في نص العملية وترتيب أول رمز "(" بعده للمتغيرين XX_1 و XX_2 على الترتيب :-
كود :
CurBracket = NewStr.Substring(XX_1, XX_2 - XX_1 + 1)
كود :
NewStr = NewStr.Replace(CurBracket, "&" & MultiSums(CurBracket.Replace("(", "").Replace(")", "")))
والآن استبدال القوس الحالي (CurBracket ) في نص العملية ( NewStr ) بناتج العملية التي يحملها القوس الحالي مسبوقا بعلامة & :-
كود :
Function FilterMultiplies(ByVal Str As String) As String
Dim NewStr As String = Str
NewStr = NewStr.Replace("^&", "^")
NewStr = NewStr.Replace("*&", "*")
NewStr = NewStr.Replace("/&", "/")
NewStr = NewStr.Replace("+&", "+")
NewStr = NewStr.Replace("-&", "-")
NewStr = NewStr.Replace("(&", "(")
NewStr = NewStr.Replace("&", "*")
If NewStr.StartsWith("*") Then NewStr = NewStr.Remove(0, 1)
Return NewStr
End Function
_____1. قمت باسباق الناتج بالعلامة "&" كرمز مساعد تمهيدا لإستبدالها برمز عملية الضرب لاحقاً.
_____2. قمت بحذف الرموز ")" و "(" قبل تمرير القوس إلى الدالة MultiSums لإيجاد الناتج .
والآن سنقوم بتعريف الدالة FilterMultiplies والتي تقوم باسبدال الرمز "&" بعلامة الضرب ( كما أوضحت في التقديم ) :-
كود :
NewStr = FilterMultiplies(NewStr)
نعود إلى دالتنا BracketsSums ، الآن نقوم بتمرير نص العملية على الدالة FilterMultiplies لإستبدال العلامات "&" بعلامات الضرب "*" :-
كود :
Return MultiSums(NewStr)
سنقوم الآن بآخر خطوة وهي إعادة الناتج النهائي بتمرير نص العملية للدالة MultiSums :-
كود :
Function BracketsSums(ByVal Str As String) As Double
Dim CurBracket As String
Dim NewStr As String = Str
Dim XX_1, XX_2 As Integer
Do While NewStr.Contains("(")
XX_1 = NewStr.LastIndexOf("(")
XX_2 = NewStr.IndexOf(")", XX_1)
CurBracket = NewStr.Substring(XX_1, XX_2 - XX_1 + 1)
NewStr = NewStr.Replace(CurBracket, "&" & MultiSums(CurBracket.Replace("(", "").Replace(")", "")))
NewStr = FilterMultiplies(NewStr)
Loop
Return MultiSums(NewStr)
End Function
كود :
If e.KeyData = Keys.Enter Then
Me.TextBox1.AppendText("=" & BracketsSums(Me.TextBox1.Text))
End If
---------------- تجربة الدالة :-
قم بتعديل الكود داخل الحدث KeyDown لـ TextBox1 إلى :-
If e.KeyData = Keys.Enter Then Me.TextBox1.AppendText("=" & BracketsSums(Me.TextBox1.Text)) End If
الآن قم بتجربة المشروع إضغط F5 ،ثم قم بكتابة (6-4)+(5+1)(5-2)، ثم اضغط الزر Enter ( ما النتيجة ! )
إلى اللقاء في الدرس القادم "فصل عمليات الدوال ... "