28-02-13, 11:14 PM
(آخر تعديل لهذه المشاركة : 04-03-13, 09:53 PM {2} بواسطة dvb-dz haker.)
السلام عليكم ورحمة الله وبركاته
ها أنا أعود بالجزء الثالث من موضوعي ،
الأجزاء السابقة
أعتذر عن التأخير ،
لن أضيع وقتك في الكلام ،
قيل أن نبدأ أرجوا منك التركيز بشدة في هذتا الجزء ،
هيا بنا نبدأ ،،
مستوى المقال : مبتدأ - متوسط .
اللغة المستخدمة : VB.Net .
تقييم المقال : ( متروك للقارئ ) .
ثالثاً : دالة ايجاد ناتج عمليات الأقواس :
-------- ماذا أعني بـ "عمليات الأقواس " ؟ :
عمليات الأقواس هي التي يكون بها الرمز "(" و ")" ،
مثلا يمكن اعتبار كلا من "(5+6)/2" و "(5*4)^2+3" عمليات أقواس ،
والهدف من هذا الجزء عمل دالة تعيد قيمة من النوع Double تمثل ناتج هذه العملية ،
[/HR]
-------- تقديم هام :-
ما الفرق بين "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"}
وبعد تنقية نص العملية من عمليات الضرب الغير مرغوب فيها :-
{"(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"}
---------------- والآن إلى التطبيق :-
[/HR]
قم بتعريف دالة جديدة بإسم BracketsSums :
كما قلت سابقا في هذا الجزء ،سأقوم بتعريف المتغير CurBracket لتخزين نص القوس الحالي ،
ثم سأقوم بتعريف المتغير NewStr لتخرين نص العملية:-
( لا حظ أني لم أقم بفلترة نص العملية بالدالة Filter لأننا سنعتمد أساساً على الدالة MultiSums في استبدال الأقواس بقيمها وفي ايجاد الناتج النهائي ، فلا داعي لفلترة النص ، لأن الدالة MultiSums تقوم بفلترة نص العملية المدخلة اليها)
بعد ذلك سنقوم بتعريف المتغيرين العدديينXX_1 و XX_2 لتخرين ترتيب بداية ونهاية القوس الحالي :-
قم بتعريف الحلقة Do While … Loop والتي تكرر الخطوات التالية طالما نص العملية يحتوي على أقواس ( يحتوي على الرمز ")" )
دلخل الحلقة سنقوم بالتالي :-
اسناد قيمة ترتيب آخر رمز ")" في نص العملية وترتيب أول رمز "(" بعده للمتغيرين XX_1 و XX_2 على الترتيب :-
والآن نسند نص القوس الحالي للتمغير CurBracket عن طريق استخراجه من نص العملية (NewStr) باستخدام الدالة Substring :-
[ لاحظ أن :- ( XX_2 - XX_1 + 1 ) هو عدد حروف القوس الحالي حيث XX_2 ترتيب نهاية القوس و XX_1 ترتيب بداية القوس ]
والآن استبدال القوس الحالي (CurBracket ) في نص العملية ( NewStr ) بناتج العملية التي يحملها القوس الحالي مسبوقا بعلامة & :-
- لدي بعض الملاحظات :-
_____1. قمت باسباق الناتج بالعلامة "&" كرمز مساعد تمهيدا لإستبدالها برمز عملية الضرب لاحقاً.
_____2. قمت بحذف الرموز ")" و "(" قبل تمرير القوس إلى الدالة MultiSums لإيجاد الناتج .
والآن سنقوم بتعريف الدالة FilterMultiplies والتي تقوم باسبدال الرمز "&" بعلامة الضرب ( كما أوضحت في التقديم ) :-
لاحظ أن الدالة تقوم باستبدال الرموز [ "^&","*&","/&","+&","-&","&(" بـ "^","*","/","+","-","("] على التريب للتخلص من علامات الضرب الغير مرغوب فيها ، ثم تقوم باستبدال جميع العلامات "&" بعلامة الضرب "*" ثم اختبار وجود علامة الضرب في البداية ، وإذا وجدت يتم حذفها .
نعود إلى دالتنا BracketsSums ، الآن نقوم بتمرير نص العملية على الدالة FilterMultiplies لإستبدال العلامات "&" بعلامات الضرب "*" :-
إلى هنا انتهت حلقة التكرار Do While … Loop ،
سنقوم الآن بآخر خطوة وهي إعادة الناتج النهائي بتمرير نص العملية للدالة MultiSums :-
هذا كود الدالة كاملة :-
[/HR]
---------------- تجربة الدالة :-
قم بتعديل الكود داخل الحدث KeyDown لـ TextBox1 إلى :-
الآن قم بتجربة المشروع إضغط F5 ،ثم قم بكتابة (6-4)+(5+1)(5-2)، ثم اضغط الزر Enter ( ما النتيجة ! )
ها أنا أعود بالجزء الثالث من موضوعي ،
الأجزاء السابقة
أعتذر عن التأخير ،
لن أضيع وقتك في الكلام ،
قيل أن نبدأ أرجوا منك التركيز بشدة في هذتا الجزء ،
هيا بنا نبدأ ،،
بسم الله الرحمن الرحيم
عنوان المقال : فصل العمليات الحسابية من النوع String، ( الجزء الثالث : عمليات الأقواس ).مستوى المقال : مبتدأ - متوسط .
اللغة المستخدمة : VB.Net .
تقييم المقال : ( متروك للقارئ ) .
ثالثاً : دالة ايجاد ناتج عمليات الأقواس :
-------- ماذا أعني بـ "عمليات الأقواس " ؟ :
عمليات الأقواس هي التي يكون بها الرمز "(" و ")" ،
مثلا يمكن اعتبار كلا من "(5+6)/2" و "(5*4)^2+3" عمليات أقواس ،
والهدف من هذا الجزء عمل دالة تعيد قيمة من النوع Double تمثل ناتج هذه العملية ،
[/HR]
-------- تقديم هام :-
ما الفرق بين "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"}
وبعد تنقية نص العملية من عمليات الضرب الغير مرغوب فيها :-
{"(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"}
---------------- والآن إلى التطبيق :-
[/HR]
نبدأ بسم الله الرحمن الرحيم
حمل المشروع إلى أن انتهينا الجزء السابق .قم بتعريف دالة جديدة بإسم BracketsSums :
كود :
Function BracketsSums(ByVal Str As String) As Double
End Function
ثم سأقوم بتعريف المتغير NewStr لتخرين نص العملية:-
كود :
Dim CurBracket As String
Dim NewStr As String = Str
بعد ذلك سنقوم بتعريف المتغيرين العدديينXX_1 و XX_2 لتخرين ترتيب بداية ونهاية القوس الحالي :-
كود :
Dim XX_1, XX_2 As Integer
كود :
Do While NewStr.Contains("(")
Loop
اسناد قيمة ترتيب آخر رمز ")" في نص العملية وترتيب أول رمز "(" بعده للمتغيرين XX_1 و XX_2 على الترتيب :-
كود :
XX_1 = NewStr.LastIndexOf("(")
XX_2 = NewStr.IndexOf(")", XX_1)
كود :
CurBracket = NewStr.Substring(XX_1, XX_2 - XX_1 + 1)
[ لاحظ أن :- ( XX_2 - XX_1 + 1 ) هو عدد حروف القوس الحالي حيث XX_2 ترتيب نهاية القوس و XX_1 ترتيب بداية القوس ]
والآن استبدال القوس الحالي (CurBracket ) في نص العملية ( NewStr ) بناتج العملية التي يحملها القوس الحالي مسبوقا بعلامة & :-
كود :
NewStr = NewStr.Replace(CurBracket, "&" & MultiSums(CurBracket.Replace("(", "").Replace(")", "")))
_____1. قمت باسباق الناتج بالعلامة "&" كرمز مساعد تمهيدا لإستبدالها برمز عملية الضرب لاحقاً.
_____2. قمت بحذف الرموز ")" و "(" قبل تمرير القوس إلى الدالة MultiSums لإيجاد الناتج .
والآن سنقوم بتعريف الدالة FilterMultiplies والتي تقوم باسبدال الرمز "&" بعلامة الضرب ( كما أوضحت في التقديم ) :-
كود :
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
نعود إلى دالتنا BracketsSums ، الآن نقوم بتمرير نص العملية على الدالة FilterMultiplies لإستبدال العلامات "&" بعلامات الضرب "*" :-
كود :
NewStr = FilterMultiplies(NewStr)
سنقوم الآن بآخر خطوة وهي إعادة الناتج النهائي بتمرير نص العملية للدالة MultiSums :-
كود :
Return MultiSums(NewStr)
هذا كود الدالة كاملة :-
كود :
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
[/HR]
---------------- تجربة الدالة :-
قم بتعديل الكود داخل الحدث 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 ( ما النتيجة ! )
[ATTACH=CONFIG]1834[/ATTACH]
- [*=right][INDENT]أنتظروا باقي الأجزاء تباعاً .
==> تحميل المشروع الى ان توقفنا في المرفقات <==
مرفق أيضا الشرح بصيغة DOCأستودعكم الله[/INDENT]