منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !!
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم ورحمة الله وبركاته
ها أنا أعود بالجزء الثالث من موضوعي ،
الأجزاء السابقة
أعتذر عن التأخير ،
لن أضيع وقتك في الكلام ،
قيل أن نبدأ أرجوا منك التركيز بشدة في هذتا الجزء ،
هيا بنا نبدأ ،،
بسم الله الرحمن الرحيم
عنوان المقال : فصل العمليات الحسابية من النوع 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]





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


بارك الله فيك


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

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

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

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

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

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

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

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

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

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