04-10-12, 01:37 PM
[b]بسم الله الرحمن الرحيم
[/b]عنوان المقال : فصل العمليات الحسابية ، واخراج الناتج ... الكثير .[b]مستوى المقال : مبتدأ – متوسط .
[b]اللغة المستخدمة : VB.Net .
[b]تقييم المقال : ( متروك للقارئ ) .
[b]-تقديم هام :- كم ناتج 5+4 ؟
قد يتسائل البعض ، ماالغرض من هذا السؤال ، فالإجابة تبدو ببساطة 9 .
كذلك اذا اردنا ان يوجد لنا الـ .Net Framework هذا الناتج ، ببساطة :
[/b][/b]
كود :
Msgbox(5+4) '9
لكن الأمر لن يكون بهذه البساطة إذا أردت ان تقوم بعمل برنامج لإدخال القيمة الحرفية "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
لاحظ أن وظيفة الدالة 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
كما تلاحظ ؛ تقوم الدالة باستبدال الأرقام من 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]
كود :
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
الآن قم بتجربة المشروع إضغط 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]