20-02-13, 12:58 AM
السلام عليكم ورحمة الله وبركاته
أول عودة لي بعد اعادة افتتاح المنتدى ( بالسلامة ) !!
والله ليكم وحشة ،،
سبحان الله ودارت الأيام !!!
هذا الموضوع كنت قد طرحته في المنتدى القديم وها أنا أعيد طرحه مرة أخرى على عدة مراحل
باختصار شديد ،، هدف هذه السلسلة من المواضيع أن تتمكن من ترجمه عملية حسابية سطرية من النوع String واخراج الناتج بصورة Double ،،
كم هو شيء ممتع ،
فمثلا يمكن للمستخدم أن يدخل عملية حسابية معينة في Textbox في البرنامج ويقوم البرنامج باخراج الناتج !!!
في الواقع توجد طرق كثيرة لذلك ولست انا اول من حاول فعل ذلك ، ولكنني أستخدمت هنا طريقتي الخاصة ( البسيطة ) نوعا ما،،
سنتدرج في الشرح الى أن نصل في النهاية الى مايقارب آلة حاسبة متقدمة نوعاً ما ،،
هيا بنا نبدأ
مستوى المقال : مبتدأ – متوسط .
اللغة المستخدمة : VB.Net .
تقييم المقال : ( متروك للقارئ ) .
-تقديم هام :- كم ناتج 5+4 ؟
قد يتسائل البعض ، ماالغرض من هذا السؤال ، فالإجابة تبدو ببساطة 9 .
كذلك اذا اردنا ان يوجد لنا الـ .Net Framework هذا الناتج ، ببساطة :
لكن الأمر لن يكون بهذه البساطة إذا أردت ان تقوم بعمل برنامج لإدخال القيمة الحرفية "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 :
لاحظ أن وظيفة الدالة Filter هي الآتي :-
*تحويل عمية الطرح إلى جمع للمعكوس الجمعي ( باختصار تحويل الرمز "-" إلى "+-") ، وهذا الأمر يتم عن طريق :
**تحويل جميع الرموز "-" الى الرمز "&" ( كرمز مساعد )
**تحويل الرموز "&" إلى "+-" .
**سينتج من عملية التحويل رموز غير مرغوب فيها ( مثل "4^-2" ستصبح "4^+-2" ) ؛ لذلك سأقوم بتحويل الرموز ( "^+-" و "*+-" و"/+-" و"E+" ) إلى ( "^-" و "*-" و"/-" و"E" ) على الترتيب .
*ازالة العمليات المكررة . ( تحويل الرموز "-+" و "--" و "++" إلى "+-" و "+" و "+" على الترتيب)
*إذا نتج عن ذلك أن بدأ التعبير المدخل بالعلامة "+" يتم حذفها .
الخطوة التالية في تجهيز صيغة العملية هي تعريف دالة تقوم بحذف جميع الأرقام من العملية المدخلة ، لنحصل على قيمة من النوع String تمثل رموز العمليات الموجودة بالقيمة المدخلة ،
قم بتعريف WihtoutNums :
كما تلاحظ ؛ تقوم الدالة باستبدال الأرقام من 0-9 و كذلك علامة "." و "-" و"E" بلا شيء
الخطوة الثانية الأن ؛ تعريف الدالة التي تقوم بايجاد ناتج نص العملية من النوع String ، قم بتعريف الدالة OneSum التي تقوم بهذا الغرض :-
*لاحظ ان :-
*قمت بتعريف المتغير New_Str لتخرين ناتج تجهيز نص العملية باستخدام الدلة Filter ،
*قمت بتعريف المصفوفة NumArray() ( كما قلت في التقديم ) لتخزين أعداد العملية , بفصلها عن الأعداد بالدالة Split () .
*قمت بعريف المتغير SumChar لتخزين رمز العملية ، واسندت له الفيمة المخرجة من الدالة WihtounNums ( نص العملية بدون أرقام ) .
*في هذة الدالة لم استخدم مصفوفة لتخزين رموز العمليات الأساسية داخل نص العملية ، لأن هذه الدالة تعود بناتج نص عملية واحدة فقط ، فلن نكون بحاجة إلى المصفوفة .
بعد ذلك قمت باختبار قيمة المتغير SumChar ( اختبار نوع العملية ) عن طريق Select Case ، ثم استبدال قيمة العدد الأول في المصفوفة NumArray بقيمة العملية ،
مثلا ان كانت قيمة SumChar هي "+"c عندها يتم استبدال NumArray(0) بـ NumArray(0) + NumArray(1)
واخيرا يتم ارجاع قيمة NumArray(0) ،
إلى هنا انتهى الجزء الأول من الموضوع ،
بقي تجربة الدالة ،
في حدث KeyDown لـ TextBox1 ضع هذا الكود :-
الآن قم بتجربة المشروع إضغط F5 ،ثم قم بكتابة 5+4 ، ثم اضغط الزر Enter ( ما النتيجة ! )
أول عودة لي بعد اعادة افتتاح المنتدى ( بالسلامة ) !!
والله ليكم وحشة ،،
سبحان الله ودارت الأيام !!!
هذا الموضوع كنت قد طرحته في المنتدى القديم وها أنا أعيد طرحه مرة أخرى على عدة مراحل
باختصار شديد ،، هدف هذه السلسلة من المواضيع أن تتمكن من ترجمه عملية حسابية سطرية من النوع String واخراج الناتج بصورة Double ،،
كم هو شيء ممتع ،
فمثلا يمكن للمستخدم أن يدخل عملية حسابية معينة في 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
*تحويل عمية الطرح إلى جمع للمعكوس الجمعي ( باختصار تحويل الرمز "-" إلى "+-") ، وهذا الأمر يتم عن طريق :
**تحويل جميع الرموز "-" الى الرمز "&" ( كرمز مساعد )
**تحويل الرموز "&" إلى "+-" .
**سينتج من عملية التحويل رموز غير مرغوب فيها ( مثل "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
[ATTACH=CONFIG]1752[/ATTACH]
عن نفسي اعتبر هذا الجزء تقديم هام لفهم باقي الأجزاء .أنتظروا باقي الأجزاء تباعاً .
==> تحميل المشروع الى ان توقفنا في المرفقات <==
مرفق أيضا الشرح بصيغة DOC
==> تحميل المشروع الى ان توقفنا في المرفقات <==
مرفق أيضا الشرح بصيغة DOC
أستودعكم الله