تقييم الموضوع :
  • 3 أصوات - بمعدل 3.67
  • 1
  • 2
  • 3
  • 4
  • 5
الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !!
#1
السلام عليكم ورحمة الله وبركاته
ها أنا أعود بالجزء الثالث من موضوعي ،
الأجزاء السابقة
أعتذر عن التأخير ،
لن أضيع وقتك في الكلام ،
قيل أن نبدأ أرجوا منك التركيز بشدة في هذتا الجزء ،
هيا بنا نبدأ ،،
بسم الله الرحمن الرحيم
عنوان المقال : فصل العمليات الحسابية من النوع 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
كما قلت سابقا في هذا الجزء ،سأقوم بتعريف المتغير CurBracket لتخزين نص القوس الحالي ،
ثم سأقوم بتعريف المتغير NewStr لتخرين نص العملية:-
كود :
Dim CurBracket As String
        Dim NewStr As String = Str
( لا حظ أني لم أقم بفلترة نص العملية بالدالة Filter لأننا سنعتمد أساساً على الدالة MultiSums في استبدال الأقواس بقيمها وفي ايجاد الناتج النهائي ، فلا داعي لفلترة النص ، لأن الدالة MultiSums تقوم بفلترة نص العملية المدخلة اليها)
بعد ذلك سنقوم بتعريف المتغيرين العدديينXX_1 و XX_2 لتخرين ترتيب بداية ونهاية القوس الحالي :-
كود :
Dim XX_1, XX_2 As Integer
قم بتعريف الحلقة Do While … Loop والتي تكرر الخطوات التالية طالما نص العملية يحتوي على أقواس ( يحتوي على الرمز ")" )

كود :
Do While NewStr.Contains("(")
  Loop
دلخل الحلقة سنقوم بالتالي :-
اسناد قيمة ترتيب آخر رمز ")" في نص العملية وترتيب أول رمز "(" بعده للمتغيرين XX_1 و XX_2 على الترتيب :-
كود :
XX_1 = NewStr.LastIndexOf("(")
            XX_2 = NewStr.IndexOf(")", XX_1)
والآن نسند نص القوس الحالي للتمغير CurBracket عن طريق استخراجه من نص العملية (NewStr) باستخدام الدالة Substring :-
كود :
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)
إلى هنا انتهت حلقة التكرار Do While … Loop ،
سنقوم الآن بآخر خطوة وهي إعادة الناتج النهائي بتمرير نص العملية للدالة 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]







الملفات المرفقة صورة/صور
   

.zip   OneSumProg2.zip (الحجم : 46.85 ك ب / التحميلات : 193)
الرد }}}}
تم الشكر بواسطة: gree2020
#2
السلام عليكم ورحمة الله وبركاته


بارك الله فيك


السلام عليكم ورحمة الله وبركاته
الرد }}}}
تم الشكر بواسطة: gree2020
#3
السلام عليكم

أول أمنية لي في بداية تعلمي للبرمج كانت تحليل العمليات كنت أحلم ببناء برنامج يحل المسائل الرياضية !

جربت الكود وأعطيته قوس معقد
1+2*(2+5)+(5*5+6*(2+4+6*(1+22+(9+6+(10*6)))))=3604

والناتج مضبوط

واصل
الرد }}}}
تم الشكر بواسطة: gree2020
#4
[COLOR="#800000"]السلام عليكم

بارك الله فيك فكرة رائعة

بالتوفيق ان شاءالله[/COLOR]
الرد }}}}
تم الشكر بواسطة: gree2020
#5
بارك الله فيك
اين روابط الجزء الأول والثانى
الرد }}}}
تم الشكر بواسطة: gree2020
#6
جزاك الله خيرا وأحسن إليك
الرد }}}}
تم الشكر بواسطة: gree2020
#7
السلام عليكم ورحمة الله وبركاته
أبو يعقوب كتب :السلام عليكم

أول أمنية لي في بداية تعلمي للبرمج كانت تحليل العمليات كنت أحلم ببناء برنامج يحل المسائل الرياضية !

جربت الكود وأعطيته قوس معقد
1+2*(2+5)+(5*5+6*(2+4+6*(1+22+(9+6+(10*6)))))=3604

والناتج مضبوط

واصل


حمداً لله على السلامة ،، حققت لك أمنية !!


محمود رغمان كتب :بارك الله فيك
اين روابط الجزء الأول والثانى

تمام تم أضافتهم ، أعذرني فقط نسيت
http://vb4arb.com/vb/tags.php?tag=calculator
الرد }}}}
تم الشكر بواسطة: gree2020
#8
جزاك الله خير
الرد }}}}
تم الشكر بواسطة: gree2020
#9
موضوع جميل
بارك الله فيك

موضوعك يبيله جلسه مع شاي > :d وتركيز على الأخير > راجع له
الرد }}}}
تم الشكر بواسطة: gree2020
#10
الف شكر اخي
الرد }}}}
تم الشكر بواسطة: gree2020


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  كيف تجعل برنامجك عالميا و يدعم أكثر من لغة silverlight 5 735 15-05-16, 05:03 PM
آخر رد: CLARO
  تحويل الفيديو في برامجك-الجزء الثاني( إصلاح للمشاكل + تعديل للروابط + توضيح للأمر ) RaggiTech 1 713 10-12-14, 06:37 PM
آخر رد: abulayth
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 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,556 20-02-13, 12:58 AM
آخر رد: أنس محمود
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 365 06-10-12, 12:20 AM
آخر رد: RaggiTech
  الجزء الثاني - تطوير الكونترول Interfaces RaggiTech 0 385 06-10-12, 12:19 AM
آخر رد: RaggiTech
  كيف تجعل كل شئ مستديرا داخل الفورم RaggiTech 0 708 05-10-12, 03:11 PM
آخر رد: RaggiTech
  مقال- Custom EventHandler &amp; Classes - الجزء الثاني RaggiTech 0 357 05-10-12, 11:50 AM
آخر رد: RaggiTech

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


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