تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
فصل العمليات الحسابية ، واخراج الناتج ... الكثير .
#1
[b]بسم الله الرحمن الرحيم
[/b]
عنوان المقال : فصل العمليات الحسابية ، واخراج الناتج ... الكثير .
[b]مستوى المقال : مبتدأ – متوسط .
[b]اللغة المستخدمة : VB.Net .
[b]تقييم المقال : ( متروك للقارئ ) .

[b]-تقديم هام :- كم ناتج 5+4 ؟
قد يتسائل البعض ، ماالغرض من هذا السؤال ، فالإجابة تبدو ببساطة 9 .
كذلك اذا اردنا ان يوجد لنا الـ .Net Framework هذا الناتج ، ببساطة :

[/b][/b]
كود :
Msgbox(5+4) '9
[b][b][b][b]
لكن الأمر لن يكون بهذه البساطة إذا أردت ان تقوم بعمل برنامج لإدخال القيمة الحرفية "5+4" واخراج الناتج ،
ان ما سنتبعه في هذا المقال هو فصل اي عملية حسابية ( في شكل سلسلة حرفية ) الى عدة عمليات لنقوم بكل عملية على حدة ، ثم نخرج الناتج .
مثلا : في مثالنا لايجاد ناتج "5+4" سيقوم البرنامج – إن شاء الله – بفصل "5+4" الى مصفوفتين :
*مصفوفة الأعداد وستكون قيمتها بهذا الشكل {5,4}
*مصفوفة العمليات وستكون قيمتها بهذا الشكل {"+"c}
ثم بعد ذلك نقوم بايجاد ناتج الرقمين في مصفوفة الاعداد عن طريق اختبار رمز العملية في مصفوفة العمليات .
وسأتدرج في المقال من ايجاد ناتج عملية واحدة ("3+2") إلى عمليات متعددة ("4+3/2*3") إلى عمليات الأقواس ("5^(1+2)") الى القيمة المطلقة ، والدوال المثلثية ... إلخ – إن شاء الله – .

[b]أولاُ : دالة ايجاد ناتج عملية واحدة
[b]نبدأ بسم الله الرحمن الرحيم :-

قم بانشاء مشروع جديد من النوع Windows Application ،
ثم اضف أداة مربع النص ( TextBox ) ودعها بإسما كما هي إفتراضيا ( TextBox1 ) ،
[b]الخطوة الأولى
الآن هي جعل صيغة العملية جاهزة للعمل عليها ،
مثلا لو أن العملية المطلوب تنفيذها هي "-3-4" ،
اذا اعتبرنا ان علامة "-" تمثل عملية طرح ، فان حسب ماقله سابقا ستكون قيم :-

*مصفوفة الأعداد بهذا الشكل {0,3,4} ( جرب فصل "-3-4" على حسب الرمز "-" بالدالة Split)
*مصفوفة العمليات بهذا الشكل {"-"c,"-"c}

وهنا نجد ان عدد الاعداد المدخلة في المصفوفة اكبر من عدد أعداد العملية الأصلية ،
لذلك لن اعتبر عملية الطرح عملية رياضية اصلا ، بل سأستعيض عنها بجمع للمعكوس الجمعي ،
سنقوم الآن بتعريف دالة لهذا الغرض :-
قم بتعريف الدالة التالية باسم Filter :


[/b][/b]
كود :
Function Filter(ByVal Str As String) As String
        Dim NewStr As String = Str

        Do While NewStr.Contains("-+")
            NewStr = NewStr.Replace("-+", "+-")
        Loop

        Do While NewStr.Contains("--")
            NewStr = NewStr.Replace("--", "+")
        Loop

        Do While NewStr.Contains("-")
            NewStr = NewStr.Replace("-", "&")
        Loop

        Do While NewStr.Contains("&")
            NewStr = NewStr.Replace("&", "+-")
        Loop

        Do While NewStr.Contains("^+-")
            NewStr = NewStr.Replace("^+-", "^-")
        Loop

        Do While NewStr.Contains("/+-")
            NewStr = NewStr.Replace("/+-", "/-")
        Loop

        Do While NewStr.Contains("*+-")
            NewStr = NewStr.Replace("*+-", "*-")
        Loop

        Do While NewStr.Contains("E+")
            NewStr = NewStr.Replace("E+", "E")
        Loop

        Do While NewStr.Contains("++")
            NewStr = NewStr.Replace("++", "+")
        Loop
        If NewStr.StartsWith("+") Then NewStr = NewStr.Remove(0, 1)
        Return NewStr

    End Function
[b][b][b][b][b][b]
لاحظ أن وظيفة الدالة Filter هي الآتي :-
*تحويل عمية الطرح إلى جمع للمعكوس الجمعي ( باختصار تحويل الرمز "-" إلى "+-") ، وهذا الأمر يتم عن طريق :
**تحويل جميع الرموز "-" الى الرمز "&" ( كرمز مساعد )
**تحويل الرموز "&" إلى "+-" .
**سينتج من عملية التحويل رموز غير مرغوب فيها ( مثل "4^-2" ستصبح "4^+-2" ) ؛ لذلك سأقوم بتحويل الرموز ( "^+-" و "*+-" و"/+-" و"E+" ) إلى ( "^-" و "*-" و"/-" و"E" ) على الترتيب .
*ازالة العمليات المكررة . ( تحويل الرموز "-+" و "--" و "++" إلى "+-" و "+" و "+" على الترتيب)
*إذا نتج عن ذلك أن بدأ التعبير المدخل بالعلامة "+" يتم حذفها .

الخطوة التالية في تجهيز صيغة العملية هي تعريف دالة تقوم بحذف جميع الأرقام من العملية المدخلة ، لنحصل على قيمة من النوع String تمثل رموز العمليات الموجودة بالقيمة المدخلة ،
قم بتعريف WihtoutNums :


[/b][/b]
كود :
Function WihtoutNums(ByVal str As String)        Dim NewStr As String = str
        NewStr = NewStr.Replace("0", "")
        NewStr = NewStr.Replace("1", "")
        NewStr = NewStr.Replace("2", "")
        NewStr = NewStr.Replace("3", "")
        NewStr = NewStr.Replace("4", "")
        NewStr = NewStr.Replace("5", "")
        NewStr = NewStr.Replace("6", "")
        NewStr = NewStr.Replace("7", "")
        NewStr = NewStr.Replace("8", "")
        NewStr = NewStr.Replace("9", "")
        NewStr = NewStr.Replace("-", "")
        NewStr = NewStr.Replace(".", "")
        NewStr = NewStr.Replace("E", "")
        Return NewStr
    End Function
[b][b][b][b][b][b]
كما تلاحظ ؛ تقوم الدالة باستبدال الأرقام من 0-9 و كذلك علامة "." و "-" و"E" بلا شيء

[b]الخطوة الثانية الأن ؛ تعريف الدالة التي تقوم بايجاد ناتج نص العملية من النوع String ، قم بتعريف الدالة OneSum التي تقوم بهذا الغرض :-
كود :
[b][b][b][b][b][b][b][b]  Function OneSum(ByVal str As String) As Double

[/b][/b][/b]
[/b][/b][/b][/b]
كود :
Dim New_Str As String = Filter(str)
        Dim NumArray() As String = New_Str.Split("^"c, "*"c, "/"c, "+"c)
        Dim SumChar As Char = WihtoutNums(New_Str)
        Select Case SumChar
            Case "^"c
                NumArray(0) = NumArray(0) ^ NumArray(1)
            Case "*"c
                NumArray(0) = NumArray(0) * NumArray(1)
            Case "/"c
                NumArray(0) = NumArray(0) / NumArray(1)
            Case "+"c
                NumArray(0) = Val(NumArray(0)) + Val(NumArray(1))
        End Select
        Return NumArray(0)
[FONT=Tahoma][b][b][b][b][b][b][b][b]    End Function

[/b][/b][/b][/b][/b][/b][/b][/b][/FONT]




*قمت بتعريف المتغير New_Str لتخرين ناتج تجهيز نص العملية باستخدام الدلة Filter ،

*قمت بتعريف المصفوفة NumArray() ( كما قلت في التقديم ) لتخزين أعداد العملية , بفصلها عن الأعداد بالدالة Split () .

*قمت بعريف المتغير SumChar لتخزين رمز العملية ، واسندت له الفيمة المخرجة من الدالة WihtounNums ( نص العملية بدون أرقام ) .

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

بعد ذلك قمت باختبار قيمة المتغير SumChar ( اختبار نوع العملية ) عن طريق Select Case ، ثم استبدال قيمة العدد الأول في المصفوفة NumArray بقيمة العملية ،
مثلا ان كانت قيمة SumChar هي "+"c عندها يتم استبدال NumArray(0) بـ NumArray(0) + NumArray(1)

واخيرا يتم ارجاع قيمة NumArray(0) ،

إلى هنا انتهى الجزء الأول من الموضوع ،

بقي تجربة الدالة ،

في حدث KeyDown لـ TextBox1 ضع هذا الكود :-


كود :
If e.KeyData = Keys.Enter Then          
Me.TextBox1.AppendText("=" & OneSum(Me.TextBox1.Text))
        End If
[b][b][b][b][b][b][b][b]
الآن قم بتجربة المشروع إضغط F5 ،ثم قم بكتابة 5+4 ، ثم اضغط الزر Enter ( ما النتيجة ! )



[/b][/b]
[b][b][b][b][b][b][b][b]


عن نفسي اعتبر هذا الجزء تقديم هام لفهم باقي الأجزاء .

==> تحميل المشروع الى ان توقفنا <==
[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]


الملفات المرفقة
.zip   OneSumProg.zip (الحجم : 41.8 ك ب / التحميلات : 63)
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 7,837 19-07-22, 12:15 AM
آخر رد: StartLight4000
  كيف تجعل الـ Text Box ذكي !! يترجم العمليات الحسابية ويخرج الناتج !! بالداخل المزيد !! أنس محمود 1 6,884 11-02-18, 02:37 PM
آخر رد: komar
  انتبه ( لاتنسى الرموز فقد توفر عليك الكثير من العناء ) ali.alfoly 3 3,482 25-05-13, 01:08 PM
آخر رد: shaker.soft
  معالجة العمليات الحسابية من خلال مربع نص وإظهار النتيجة @@أبورائد@@ 9 6,340 25-05-13, 01:07 PM
آخر رد: shaker.soft
  الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! أنس محمود 0 2,820 22-02-13, 12:39 AM
آخر رد: أنس محمود
  فصل العمليات الحسابية من النوع String، ( الجزء الثالث - عمليات الأقواس ) RaggiTech 0 2,620 04-10-12, 01:41 PM
آخر رد: RaggiTech
  فصل العمليات الحسابية من النوع String، ( الجزء الثاني - العمليات المتعددة ) RaggiTech 0 2,668 04-10-12, 01:27 PM
آخر رد: RaggiTech
  تطبيق العمليات الحسابية بمرونة (فقط تكتب معادلتك) DynamicCalculate RaggiTech 1 2,265 03-10-12, 08:55 AM
آخر رد: RaggiTech
  تطبيق العمليات الحسابية بمرونة (Real Dynamic Calculate) -مـا بعد التطوير- RaggiTech 0 1,925 03-10-12, 08:53 AM
آخر رد: RaggiTech
  تحديد زمن تنفيذ العمليات باستخدام الفئة TimeSpan RaggiTech 0 2,157 03-10-12, 07:39 AM
آخر رد: RaggiTech

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


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