منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184)
+--- الموضوع : الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! (/showthread.php?tid=7785)

الصفحات: 1 2


الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - أنس محمود - 28-02-13

السلام عليكم ورحمة الله وبركاته
ها أنا أعود بالجزء الثالث من موضوعي ،
الأجزاء السابقة
أعتذر عن التأخير ،
لن أضيع وقتك في الكلام ،
قيل أن نبدأ أرجوا منك التركيز بشدة في هذتا الجزء ،
هيا بنا نبدأ ،،
بسم الله الرحمن الرحيم
عنوان المقال : فصل العمليات الحسابية من النوع 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]








الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - @@أبورائد@@ - 01-03-13

السلام عليكم ورحمة الله وبركاته


بارك الله فيك


السلام عليكم ورحمة الله وبركاته



الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - أبو يعقوب - 01-03-13

السلام عليكم

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

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

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

واصل


الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - Sajad - 01-03-13

[COLOR="#800000"]السلام عليكم

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

بالتوفيق ان شاءالله[/COLOR]



الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - محمود رغمان - 03-03-13

بارك الله فيك
اين روابط الجزء الأول والثانى


الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - sooriaty03 - 03-03-13

جزاك الله خيرا وأحسن إليك


الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - أنس محمود - 04-03-13

السلام عليكم ورحمة الله وبركاته
أبو يعقوب كتب :السلام عليكم

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

جربت الكود وأعطيته قوس معقد
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


الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - محمود رغمان - 07-03-13

جزاك الله خير


الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! - Easy4ever - 12-03-13

موضوع جميل
بارك الله فيك

موضوعك يبيله جلسه مع شاي > :d وتركيز على الأخير > راجع له


RE: الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (ال... - RFEE3 ALSHAN - 06-12-14

الف شكر اخي