تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تطبيق العمليات الحسابية بمرونة (فقط تكتب معادلتك) DynamicCalculate
#1
كاتب الموضوع : 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

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

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

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

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

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

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

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

أتمنى لك التوفيق .
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 9 2,082 06-12-14, 10:11 PM
آخر رد: RFEE3 ALSHAN
  @@@ معالجة العمليات الحسابية من خلال مربع نص وإظهار النتيجة @@@ @@أبورائد@@ 9 1,595 25-05-13, 01:07 PM
آخر رد: shaker.soft
  الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! أنس محمود 0 689 22-02-13, 12:39 AM
آخر رد: أنس محمود
  كيف تجعل الـ Text Box ذكي !! يترجم العمليات الحسابية ويخرج الناتج !! بالداخل المزيد !! أنس محمود 0 1,571 20-02-13, 12:58 AM
آخر رد: أنس محمود
  فصل العمليات الحسابية من النوع String، ( الجزء الثالث - عمليات الأقواس ) RaggiTech 0 526 04-10-12, 01:41 PM
آخر رد: RaggiTech
  فصل العمليات الحسابية ، واخراج الناتج ... الكثير . RaggiTech 0 484 04-10-12, 01:37 PM
آخر رد: RaggiTech
  فصل العمليات الحسابية من النوع String، ( الجزء الثاني - العمليات المتعددة ) RaggiTech 0 509 04-10-12, 01:27 PM
آخر رد: RaggiTech
  درس - كيف تصنع تطبيق Plug-Ins في في .Net RaggiTech 0 441 03-10-12, 01:59 PM
آخر رد: RaggiTech
  تطبيق تأثير الزجاج على الفيستا RaggiTech 0 294 03-10-12, 08:59 AM
آخر رد: RaggiTech
  تطبيق العمليات الحسابية بمرونة (Real Dynamic Calculate) -مـا بعد التطوير- RaggiTech 0 211 03-10-12, 08:53 AM
آخر رد: RaggiTech

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


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