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

نسخة كاملة : تطبيق العمليات الحسابية بمرونة (فقط تكتب معادلتك) DynamicCalculate
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
كاتب الموضوع : Programmation

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

الأخوة الأعضاء الكرام, كيف حال الجميع؟

أسـأل الله العظيم أن تكونوا فى أفضل حال وأتم عافية.

99 % من المبرمجين قد بدؤا رحلة البرمجة بأحد البرنامجين Hello World أو Calculator , بالنسبة للـ Calculator كنا نقوم برسم الكائنات لتحديد الرقم الاول وأخر للثاني ومن ثم إستخراج النتيجة فى كائن أخر أما الأن فلا لأستخدام الكائنات ولا إستخدام معاملات (+-*/^) داخل سطور أكوادك!!!

سوف تحصل على نتيجة عمليتك الحسابية دون كل ذلك, فلقد قمت بعمل دالة من خلالها يُمكنك إتمام عمليتك الحسابية وكأنك تكتبها بالقلم فقط تكتب المعادلة وتترك الباقي على الدالة.


الدالة(DynamicCalculate):


كود :
[color=#000000][COLOR=#0000bb]    Author[/color][color=#007700]: [/color][color=#0000bb]Programmation[/color][color=#007700]([/color][color=#0000bb]OmarNegm[/color][COLOR=#007700])
    Public Function [/COLOR][color=#0000bb]DynamicCalculate[/color][color=#007700]([/color][color=#0000bb]ByVal strCalculate [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]) As [/color][COLOR=#0000bb]Double
        Dim cPlus [/COLOR][color=#007700]As [/color][color=#0000bb]Char [/color][color=#007700]= [/color][COLOR=#dd0000]"+"
        [/COLOR][color=#0000bb]Dim cMin [/color][color=#007700]As [/color][color=#0000bb]Char [/color][color=#007700]= [/color][COLOR=#dd0000]"-"
        [/COLOR][color=#0000bb]Dim cMax [/color][color=#007700]As [/color][color=#0000bb]Char [/color][color=#007700]= [/color][COLOR=#dd0000]"*"
        [/COLOR][color=#0000bb]Dim cDiv [/color][color=#007700]As [/color][color=#0000bb]Char [/color][color=#007700]= [/color][COLOR=#dd0000]"/"
        [/COLOR][color=#0000bb]Dim cEqu [/color][color=#007700]As [/color][color=#0000bb]Char [/color][color=#007700]= [/color][COLOR=#dd0000]"^"
        [/COLOR][color=#0000bb]Dim strValues [/color][color=#007700]As [/color][color=#0000bb]String [/color][color=#007700]= [/color][COLOR=#dd0000]""
        [/COLOR][color=#0000bb]Dim strOpertors [/color][color=#007700]As [/color][color=#0000bb]String [/color][color=#007700]= [/color][COLOR=#dd0000]""
        [/COLOR][color=#0000bb]Dim LastValue [/color][color=#007700]As [/color][color=#0000bb]Double [/color][color=#007700]= [/color][COLOR=#0000bb]0
        Dim Values[/COLOR][color=#007700]() As [/color][color=#0000bb]String[/color][color=#007700], [/color][color=#0000bb]Operators[/color][color=#007700]() As [/color][COLOR=#0000bb]String
        [/COLOR][COLOR=#007700]Try
            For [/COLOR][color=#0000bb]I [/color][color=#007700]As [/color][color=#0000bb]Integer [/color][color=#007700]= [/color][color=#0000bb]1 To Len[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][COLOR=#007700])
                If [/COLOR][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][color=#007700]) = [/color][color=#0000bb]cPlus [/color][color=#007700]Or [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][color=#007700]) = [/color][color=#0000bb]cMin [/color][color=#007700]Or [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][color=#007700]) = [/color][color=#0000bb]cMax [/color][color=#007700]Or [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][color=#007700]) = [/color][color=#0000bb]cDiv [/color][color=#007700]Or [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][color=#007700]) = [/color][COLOR=#0000bb]cEqu Then
                    [/COLOR][color=#007700]If [/color][color=#0000bb]strOpertors[/color][color=#007700].[/color][color=#0000bb]Trim [/color][color=#007700]= [/color][color=#dd0000]"" [/color][COLOR=#0000bb]Then
                        strOpertors [/COLOR][color=#007700]= [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][COLOR=#007700])
                    Else
                        [/COLOR][color=#0000bb]strOpertors [/color][color=#007700]&= [/color][color=#dd0000]"," [/color][color=#007700]& [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][COLOR=#007700])
                    [/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
                    If [/COLOR][color=#0000bb]Not strValues[/color][color=#007700].[/color][color=#0000bb]Trim [/color][color=#007700]= [/color][color=#dd0000]"" [/color][COLOR=#0000bb]Then
                        strValues [/COLOR][color=#007700]&= [/color][COLOR=#dd0000]","
                    [/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
                Else
                    If [/COLOR][color=#0000bb]Not strValues[/color][color=#007700].[/color][color=#0000bb]Trim [/color][color=#007700]= [/color][color=#dd0000]"" [/color][COLOR=#0000bb]Then
                        strValues [/COLOR][color=#007700]&= [/color][color=#0000bb]CDbl[/color][color=#007700]([/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][COLOR=#007700]))
                    Else
                        [/COLOR][color=#0000bb]strValues [/color][color=#007700]= [/color][color=#0000bb]CDbl[/color][color=#007700]([/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]strCalculate[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][COLOR=#007700]))
                    [/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
                [/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
            [/COLOR][COLOR=#0000bb]Next
            Values [/COLOR][color=#007700]= [/color][color=#0000bb]Split[/color][color=#007700]([/color][color=#0000bb]strValues[/color][color=#007700], [/color][color=#dd0000]","[/color][COLOR=#007700])
            [/COLOR][color=#0000bb]Operators [/color][color=#007700]= [/color][color=#0000bb]Split[/color][color=#007700]([/color][color=#0000bb]strOpertors[/color][color=#007700], [/color][color=#dd0000]","[/color][COLOR=#007700])
            [/COLOR][color=#0000bb]LastValue [/color][color=#007700]= [/color][color=#0000bb]CDbl[/color][color=#007700]([/color][color=#0000bb]Values[/color][color=#007700]([/color][color=#0000bb]0[/color][COLOR=#007700]))
            For [/COLOR][color=#0000bb]I [/color][color=#007700]As [/color][color=#0000bb]Integer [/color][color=#007700]= [/color][color=#0000bb]1 To Values[/color][color=#007700].[/color][color=#0000bb]Count [/color][color=#007700]- [/color][COLOR=#0000bb]1 Step 1
                Select [/COLOR][color=#007700]Case [/color][color=#0000bb]Operators[/color][color=#007700]([/color][color=#0000bb]I [/color][color=#007700]- [/color][color=#0000bb]1[/color][COLOR=#007700])
                    Case [/COLOR][COLOR=#0000bb]cPlus
                        LastValue [/COLOR][color=#007700]= [/color][color=#0000bb]LastValue [/color][color=#007700]+ [/color][color=#0000bb]Values[/color][color=#007700]([/color][color=#0000bb]I[/color][COLOR=#007700])
                    Case [/COLOR][COLOR=#0000bb]cMin
                        LastValue [/COLOR][color=#007700]= [/color][color=#0000bb]LastValue [/color][color=#007700]- [/color][color=#0000bb]Values[/color][color=#007700]([/color][color=#0000bb]I[/color][COLOR=#007700])
                    Case [/COLOR][COLOR=#0000bb]cMax
                        LastValue [/COLOR][color=#007700]= [/color][color=#0000bb]LastValue [/color][color=#007700]* [/color][color=#0000bb]Values[/color][color=#007700]([/color][color=#0000bb]I[/color][COLOR=#007700])
                    Case [/COLOR][COLOR=#0000bb]cDiv
                        LastValue [/COLOR][color=#007700]= [/color][color=#0000bb]LastValue [/color][color=#007700]/ [/color][color=#0000bb]Values[/color][color=#007700]([/color][color=#0000bb]I[/color][COLOR=#007700])
                    Case [/COLOR][COLOR=#0000bb]cEqu
                        LastValue [/COLOR][color=#007700]= [/color][color=#0000bb]LastValue [/color][color=#007700]^ [/color][color=#0000bb]Values[/color][color=#007700]([/color][color=#0000bb]I[/color][COLOR=#007700])
                [/COLOR][COLOR=#0000bb]End Select
            Next
            [/COLOR][color=#007700]Return [/color][COLOR=#0000bb]LastValue
        [/COLOR][color=#007700]Catch [/color][color=#0000bb]ex [/color][color=#007700]As [/color][COLOR=#0000bb]Exception
            [/COLOR][color=#007700]Return [/color][COLOR=#0000bb]0
            MessageBox[/COLOR][color=#007700].[/color][color=#0000bb]Show[/color][color=#007700]([/color][color=#dd0000]"An error has occured:" [/color][color=#007700]& [/color][color=#0000bb]vbNewLine [/color][color=#007700]& [/color][color=#dd0000]"Error Description:" [/color][color=#007700]& [/color][color=#0000bb]ex[/color][color=#007700].[/color][color=#0000bb]ToString[/color][color=#007700], [/color][color=#dd0000]"Dynamic Calculate Error"[/color][color=#007700], [/color][color=#0000bb]MessageBoxButtons[/color][color=#007700].[/color][color=#0000bb]OK[/color][color=#007700], [/color][color=#0000bb]MessageBoxIcon[/color][color=#007700].[/color][color=#0000bb]Exclamation[/color][COLOR=#007700])
        [/COLOR][COLOR=#0000bb]Finally
            cPlus [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
            cMin [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
            cMax [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
            cDiv [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
            cEqu [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
            strValues [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
            strOpertors [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
            LastValue [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
            Values [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
            Operators [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Nothing
        End [/COLOR][COLOR=#007700]Try
    [/COLOR][color=#0000bb]End [/color][COLOR=#007700]Function  
[/COLOR][color=#0000bb][/color][/COLOR]

شرح الدالة:

تحتوي الدالة على معامل واحد فقط من نوع String تضع فيه نص عمليتك الحسابية وليكن 1+1-1 وهي تدعم المعاملات التالية للعمليات الحسابية داخل النص (+),(-),(*),(/),(^).

كيفية إستخدام الدالة:

ضع الدالة داخل وحدة Module أو داخل الـ Form خارج اي أحدث او إجراءات وبعدها يُمكنك إستدعائها بالطريقة التالية:

لنتفترض أننا نُريد تطبيق العملية الحسابية التالية:



كود :
[color=#000000][COLOR=#0000bb]100[/color][color=#007700]^[/color][color=#0000bb]2[/color][color=#007700]+[/color][color=#0000bb]1762[/color][color=#007700]-[/color][color=#0000bb]1000[/color][color=#007700]*[/color][color=#0000bb]4[/color][color=#007700]/[/color][COLOR=#0000bb]4  
[/COLOR][/COLOR]

فيُكفيك السطر التالي بإستخدام الدالة DynamicCalculate :


كود :
[color=#000000][COLOR=#0000bb]TextBox1[/color][color=#007700].[/color][color=#0000bb]Text [/color][color=#007700]= [/color][color=#0000bb]DynamicCalculate[/color][color=#007700]([/color][color=#dd0000]"100^2+1762-1000*4/4"[/color][COLOR=#007700])  
[/COLOR][color=#0000bb][/color][/COLOR]

وبذلك تحصل على ناتج العملية السابقة داخل TextBox1

أتمنى أن تستفيدوا من الدالة , ولا تنسـونا من صالح دعائكم

والســلام عليكم ورحمة الله وبركاته
كاتب المشاركة : Islam Ibrahim

شكرًا لك, ولكن لي بعض التعليقات على الكود :

1 - هناك فقدان لدقة القيم Precision Loose بسبب Implicit Conversions التي يقوم بها VB.net كما أنك لم تراعي ذلك في الكود أنا جربت مثلاً 302,54 + 232 وحصلت على 0 !

2 - أنت لم تأخذ في الحسبان أسبقية العمليات الحسابية Operators Precedence .

3 - ليس هناك حاجة مطلقًا للكود الذي كتبته بداخل Finally Block, المتغيرات من نوع Value Types المُعرفة بداخل الإجراء يتم التخلص منها نهائيًا عند انتهاء تنفيذه.

4 - أفضل في مثل هذه الحالات أن تقوم ببناء Parser من الصفر , يمكنك الاستعانة بأحد المشاريع الجاهزة والبدء بدراسته من هنا

أتمنى لك التوفيق .