تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
كيف تجعل الـ Text Box ذكي !! يترجم العمليات الحسابية ويخرج الناتج !! بالداخل المزيد !!
#1
السلام عليكم ورحمة الله وبركاته
أول عودة لي بعد اعادة افتتاح المنتدى ( بالسلامة ) !!
والله ليكم وحشة ،،
سبحان الله ودارت الأيام !!!
هذا الموضوع كنت قد طرحته في المنتدى القديم وها أنا أعيد طرحه مرة أخرى على عدة مراحل
باختصار شديد ،، هدف هذه السلسلة من المواضيع أن تتمكن من ترجمه عملية حسابية سطرية من النوع String واخراج الناتج بصورة Double ،،
كم هو شيء ممتع ، RolleyesRolleyes
فمثلا يمكن للمستخدم أن يدخل عملية حسابية معينة في Textbox في البرنامج ويقوم البرنامج باخراج الناتج !!!
في الواقع توجد طرق كثيرة لذلك ولست انا اول من حاول فعل ذلك ، ولكنني أستخدمت هنا طريقتي الخاصة ( البسيطة ) نوعا ما،،
سنتدرج في الشرح الى أن نصل في النهاية الى مايقارب آلة حاسبة متقدمة نوعاً ما ،،
هيا بنا نبدأ
بسم الله الرحمن الرحيم
عنوان المقال : ترجمة العمليات الحسابية في صورة String ، واخراج الناتج ... الكثير .
مستوى المقال : مبتدأ – متوسط .
اللغة المستخدمة : VB.Net .
تقييم المقال : ( متروك للقارئ ) .

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

كود :
Msgbox(5+4) '9

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

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

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

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

وهنا نجد ان عدد الاعداد المدخلة في المصفوفة اكبر من عدد أعداد العملية الأصلية ،
لذلك لن اعتبر عملية الطرح عملية رياضية اصلا ، بل سأستعيض عنها بجمع للمعكوس الجمعي ،
سنقوم الآن بتعريف دالة لهذا الغرض :-
قم بتعريف الدالة التالية باسم Filter :
كود :
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
لاحظ أن وظيفة الدالة Filter هي الآتي :-
*تحويل عمية الطرح إلى جمع للمعكوس الجمعي ( باختصار تحويل الرمز "-" إلى "+-") ، وهذا الأمر يتم عن طريق :
**تحويل جميع الرموز "-" الى الرمز "&" ( كرمز مساعد )
**تحويل الرموز "&" إلى "+-" .
**سينتج من عملية التحويل رموز غير مرغوب فيها ( مثل "4^-2" ستصبح "4^+-2" ) ؛ لذلك سأقوم بتحويل الرموز ( "^+-" و "*+-" و"/+-" و"E+" ) إلى ( "^-" و "*-" و"/-" و"E" ) على الترتيب .
*ازالة العمليات المكررة . ( تحويل الرموز "-+" و "--" و "++" إلى "+-" و "+" و "+" على الترتيب)
*إذا نتج عن ذلك أن بدأ التعبير المدخل بالعلامة "+" يتم حذفها .

الخطوة التالية في تجهيز صيغة العملية هي تعريف دالة تقوم بحذف جميع الأرقام من العملية المدخلة ، لنحصل على قيمة من النوع String تمثل رموز العمليات الموجودة بالقيمة المدخلة ،
قم بتعريف WihtoutNums :
كود :
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

كما تلاحظ ؛ تقوم الدالة باستبدال الأرقام من 0-9 و كذلك علامة "." و "-" و"E" بلا شيء

الخطوة الثانية الأن ؛ تعريف الدالة التي تقوم بايجاد ناتج نص العملية من النوع String ، قم بتعريف الدالة OneSum التي تقوم بهذا الغرض :-
كود :
Function OneSum(ByVal str As String) As Double
        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)
    End Function

*لاحظ ان :-

*قمت بتعريف المتغير 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
الآن قم بتجربة المشروع إضغط F5 ،ثم قم بكتابة 5+4 ، ثم اضغط الزر Enter ( ما النتيجة ! )
[ATTACH=CONFIG]1752[/ATTACH]
عن نفسي اعتبر هذا الجزء تقديم هام لفهم باقي الأجزاء .
أنتظروا باقي الأجزاء تباعاً .
==> تحميل المشروع الى ان توقفنا في المرفقات <==
مرفق أيضا الشرح بصيغة DOC
أستودعكم الله


الملفات المرفقة صورة/صور
   

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


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  كيف تجعل برنامجك عالميا و يدعم أكثر من لغة silverlight 5 741 15-05-16, 05:03 PM
آخر رد: CLARO
  الجزء الثالث من:كيف تجعل الـ 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
آخر رد: أنس محمود
  كيف تجعل كل شئ مستديرا داخل الفورم RaggiTech 0 708 05-10-12, 03:11 PM
آخر رد: RaggiTech
  فصل العمليات الحسابية من النوع 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
  كيفية عمل امتداد خاص بك و جعل برنامجك الافتراضي لهذا الامتداد-ادخل وشوف المزيد بالصور RaggiTech 1 1,215 04-10-12, 12:19 PM
آخر رد: RaggiTech
  هل فكرت في صنع شاشة توقف بالـ v.b.net -- بالداخل المزيـــــــــد RaggiTech 1 429 04-10-12, 11:32 AM
آخر رد: RaggiTech

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


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