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



بسم الله الرحمن الرحيم

عنوان المقال : فصل العمليات الحسابية من النوع 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"}
وأخيرا بايجاد ناتج هذه العملية بالدالة Multisums :-


كود :
Function BracketsSums(ByVal Str As String) As Double
End Function

---------------- والآن إلى التطبيق :-

نبدأ بسم الله الرحمن الرحيم

حمل المشروع إلى أن انتهينا الجزء السابق .
قم بتعريف دالة جديدة بإسم BracketsSums :


كود :
Dim CurBracket As String
Dim NewStr As String = Str
كما قلت سابقا في هذا الجزء ،سأقوم بتعريف المتغير CurBracket لتخزين نص القوس الحالي ،
ثم سأقوم بتعريف المتغير NewStr لتخرين نص العملية:-


كود :
Dim XX_1, XX_2 As Integer
( لا حظ أني لم أقم بفلترة نص العملية بالدالة Filter لأننا سنعتمد أساساً على الدالة MultiSums في استبدال الأقواس بقيمها وفي ايجاد الناتج النهائي ، فلا داعي لفلترة النص ، لأن الدالة MultiSums تقوم بفلترة نص العملية المدخلة اليها)
بعد ذلك سنقوم بتعريف المتغيرين العدديينXX_1 و XX_2 لتخرين ترتيب بداية ونهاية القوس الحالي :-


كود :
Do While NewStr.Contains("(")
Loop
قم بتعريف الحلقة Do While … 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)
والآن نسند نص القوس الحالي للتمغير CurBracket عن طريق استخراجه من نص العملية (NewStr) باستخدام الدالة Substring :-


كود :
NewStr = NewStr.Replace(CurBracket, "&" & MultiSums(CurBracket.Replace("(", "").Replace(")", "")))
[ لاحظ أن :- ( XX_2 - XX_1 + 1 ) هو عدد حروف القوس الحالي حيث XX_2 ترتيب نهاية القوس و XX_1 ترتيب بداية القوس ]
والآن استبدال القوس الحالي (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)
إلى هنا انتهت حلقة التكرار Do While … Loop ،
سنقوم الآن بآخر خطوة وهي إعادة الناتج النهائي بتمرير نص العملية للدالة 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 ( ما النتيجة ! )





إلى اللقاء في الدرس القادم "فصل عمليات الدوال ... "


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


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [مقال] شرح الدالة String.Format sooriaty03 12 5,054 19-06-15, 11:53 PM
آخر رد: اسلام الكبابى
  تحويل الفيديو في برامجك-الجزء الثاني( إصلاح للمشاكل + تعديل للروابط + توضيح للأمر ) RaggiTech 1 714 10-12-14, 06:37 PM
آخر رد: abulayth
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 9 2,080 06-12-14, 10:11 PM
آخر رد: RFEE3 ALSHAN
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 3 909 28-05-13, 01:06 PM
آخر رد: Sajad
  @@@ معالجة العمليات الحسابية من خلال مربع نص وإظهار النتيجة @@@ @@أبورائد@@ 9 1,594 25-05-13, 01:07 PM
آخر رد: shaker.soft
  الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! أنس محمود 0 689 22-02-13, 12:39 AM
آخر رد: أنس محمود
  كيف تجعل الـ Text Box ذكي !! يترجم العمليات الحسابية ويخرج الناتج !! بالداخل المزيد !! أنس محمود 0 1,563 20-02-13, 12:58 AM
آخر رد: أنس محمود
  Byte() <-> String() Converter H111er 1 462 22-11-12, 10:15 PM
آخر رد: H111er
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 365 06-10-12, 12:20 AM
آخر رد: RaggiTech
  الجزء الثاني - تطوير الكونترول Interfaces RaggiTech 0 385 06-10-12, 12:19 AM
آخر رد: RaggiTech

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


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