فصل العمليات الحسابية من النوع String، ( الجزء الثاني - العمليات المتعددة ) - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184) +--- الموضوع : فصل العمليات الحسابية من النوع String، ( الجزء الثاني - العمليات المتعددة ) (/showthread.php?tid=5075) |
فصل العمليات الحسابية من النوع String، ( الجزء الثاني - العمليات المتعددة ) - RaggiTech - 04-10-12 كاتب الموضوع : أنس محمود
عنوان المقال : فصل العمليات الحسابية من النوع String، ( الجزء الثاني : العمليات المتعددة ).بسم الله الرحمن الرحيم مستوى المقال : مبتدأ – متوسط . اللغة المستخدمة : VB.Net . تقييم المقال : ( متروك للقارئ ) . ثانياً : دالة ايجاد ناتج عمليات متعددة : - ماذا أعني بـ "عمليات متعددة " ؟ : العملية المتعددة هي التي يكون بها اكثر من رمز عملية ، وأكثر من عدديين ، مثلا يمكن اعتبار كلا من "5+6/2" و "5*4^2+3" عمليات متعددة ، والهدف من هذا الجزء عمل دالة تعيد قيمة من النوع Double تمثل ناتج هذه العملية المتعددة ، ارجو التركيز جيداً في هذا الجزء من المقال ، لأنني اعتبره اصعب جزء في المقال ، لأنه يرتكز عليه باقي أجزاء المقال . -تقديم هام :- في هذا الجزء سنقوم بالتالي :- *فصل مصفوفتي الأعداد والعمليات كما تعودنا سابقاً. *إجراء كل عمية داخل العملية المتعددة على حدة بحسب الترتيب الآتي:- 1.عملية الرفع للأس "^" 2.عملية الضرب "*" أو القسمة "/" أيهما جاء أولاً 3.عملية الجمع "+" *واياً كانت العملية التي يتم حسابها فالروتين الذي سنسير عليه واحد ، وهو : 1.نسند ترتيب العملية للكائن Index 2.نقوم باستبدال العدد الأول للعملية التي سيتم تفيذها ؛ بناتج هذه العملية باستخدام الدالة OneSum ( اذا كانت العملية الحالية "5+3" سيتم استبدال الـ "5" بـ "8") 3.حذف رمز العملية ، وكذلك العدد الثاني للعملية ، 4.تكرار هذه الخطوات حتي نتأكد من أنه لايوجد عمليات أخرى من هذا النوع . -لكي تستوعب ماقلته ، إليك هذا المثال : لو ان العملية المطلوب إيجاد ناتجها "5*4^3+8" سيكون شكل مصفوفة العمليات والأعداد كالتالي :- فتكون العملية التي سنقوم بها أولاً هي عملية الرفع للأس "^" : حسب خطواتنا ، 1.اسناد ترتيب الرمز"^" وهو 1 الى المتغير Index ( Index=1 ) 2.العملية التي سنقوم يها تتكون من :- *العدد الأول للعملية [ NumArray(Index) ] وهو "5" *رمز العملية [ OpArray(Index) ] وهو "^" *العدد الثاني للعملية [ NumArray(Index+1) ] وهو "4" 3.بعد ان نقوم بحساب ناتج العملية الحالية ، سنقوم بـاستبدال العدد الأول للعملية الحالية من مصفوفة الأعداد بالناتج ليصبح شكل المصفوفة :- نفس هذه الخطوات ستكرر مع عملية الضرب ليصبح شكل المصفوفة النهائي : *فرغت مصفوفة العمليات ( أصبح عدد عناصرها = 0 ) *بقي عنصر واحد في مصفوفة الأعداد ، والذي يمثل ناتج العملية المتعددة والآن إلى التطبيق :- نبدأ بسم الله الرحمن الرحيم :-
حمل المشروع إلى أن انتهينا الجزء السابق .قم بتعديل الدالة OneSum الى الكود التالي : كود : Function OneSum(ByVal _1stNum As Double, _ قم بتعريف دالة جديدة بإسم MultiSums : كود : Function MultiSums(ByVal Str As String) As Double وكذلك المصفوفتان NumArray و OpArray للأعداد ، والعمليات ، وملئهما :- كود : Dim NewStr As String = Filter(Str) والآن نعرف المتغير Index لتخزين ترتيب العملية الحالية ، كود : Dim Index As Integer سنفوم الآن بإيجاد ناتج العمليات بالتريب ( أس -> ضرب أو فسمة أيهما جاء أولا -> جمع ):- أولاً: عملية الرفع للأس :- سنقوم بنفس الخطوات التي ذكرتها سابقا ، قم بعمل الحلقة Do Until .. Loop لتكرار التنفيذ إلى أن تنتهي عمليات الرفع للأس من المصفوفة OpArray :- كود : Do Until OpArray.IndexOf("^"c) = -1 كود : Index = OpArray.IndexOf("^"c) كود : NumArray(Index) = OneSum(NumArray(Index), NumArray(Index + 1), "^"c) كود : OpArray.RemoveAt(Index) نفس الخطوات ولكن الاختلاف الوحيد هو تحديد ترتيب رمز العملية ، فهنا رمز العملية لن يكون بين رمز واحد ، وإنما سيكون بين رمزين ايهما جاء قبل الآخر ، قم بعمل الحلقة Do Until .. Loop لتكرار التنفيذ إلى أن تنتهي عمليات الضرب والقسمة من المصفوفة OpArray :- كود : Do Until OpArray.IndexOf("/"c) = -1 _ *عدم وجود رمز الضرب ، وعندها سيتم اسناد ترتيب اول عملية قسمة للمتغير Index ، *عدم وجود رمز القسمة وعندها سيتم العكس ، سيتم اسناد ترتيب اول عملية ضرب للمتغير Index ، *في حالة وجود الرمزين معا ً ، فسيتم اسناد ترتيب اول اعملية ضرب أو قسمة للمتغير Index ( في هذه الحالة سنقوم باختبار ما إذاكان ترتيب أول عملية ضرب اصغر من ترتيب أول قسمة ، وعندها سيتم إسناد ترتيب أول عملية ضرب للمتغير Index ، وإلا سيتم إسناد أول عملية قسمة ، وهذا كله باستخدام الدالة IIf() )، كود : If OpArray.IndexOf("*"c) = -1 Then قم الآن باستبدال العدد الأول للعملية الحالية من مصفوفة الأعداد بناتج هذه العملية عن طريق الدالة OneSum :- كود : NumArray(Index) = OneSum(NumArray(Index), NumArray(Index + 1), OpArray(Index)) كود : Do Until OpArray.IndexOf("+"c) = -1 نفس خطوات عملية الأس تماما ، ( مع مراعاة تغيير الرمز "^"c بـ "+"c ) :- كود : Return NumArray(0) كود : Function MultiSums(ByVal Str As String) As Double كود : If e.KeyData = Keys.Enter Then قم بتعديل الكود داخل الحدث KeyDown لـ TextBox1 إلى :- If e.KeyData = Keys.Enter Then Me.TextBox1.AppendText("=" & MultiSums(Me.TextBox1.Text)) End If الآن قم بتجربة المشروع إضغط F5 ،ثم قم بكتابة 5*4^3+8، ثم اضغط الزر Enter ( ما النتيجة ! ) |