![]() |
|
الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184) +--- الموضوع : الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! (/showthread.php?tid=7706) |
الجزء الثاني من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج ( العمليات المتعددة)! - أنس محمود - 22-02-13 السلام عليكم ورحمة الله وبركاته ، هاقد عدت من جديد في الجزء الثاني من الموضوع الذي كنت قد طرحته منذ ايام
كما كنت قد قلت في الجزء الاول من الموضوع انه بنهاية هذه الأجزاء سيكون بإمكانك عمل آلة حاسبة احترافية نوعاً ما ،، أعتبر هذه الأجزاء مجرد شرارة لك ، ودعنا نرى ابداعاتك !! اعود وأكرر قد أكون لست أول من فكر في شيء مثل هذا ، ولكنني استخدمت اسلوبي الخاص !! هيا بنا نبدأ بسم الله الرحمن الرحيم
عنوان المقال : فصل العمليات الحسابية من النوع String، ( الجزء الثاني : العمليات المتعددة ).مستوى المقال : مبتدأ – متوسط . اللغة المستخدمة : VB.Net . تقييم المقال : ( متروك للقارئ ) . ثانياً : دالة ايجاد ناتج عمليات متعددة : - ماذا أعني بـ "عمليات متعددة " ؟ : العملية المتعددة هي التي يكون بها اكثر من رمز عملية ، وأكثر من عدديين ، مثلا يمكن اعتبار كلا من "5+6/2" و "5*4^2+3" عمليات متعددة ، والهدف من هذا الجزء عمل دالة تعيد قيمة من النوع Double تمثل ناتج هذه العملية المتعددة ، ارجو التركيز جيداً في هذا الجزء من المقال ، لأنني اعتبره اصعب جزء في المقال ، لأنه يرتكز عليه باقي أجزاء المقال . -تقديم هام :- في هذا الجزء سنقوم بالتالي :-
-لكي تستوعب ماقلته ، إليك هذا المثال : لو ان العملية المطلوب إيجاد ناتجها "5*4^3+8" سيكون شكل مصفوفة العمليات والأعداد كالتالي :- [ATTACH=CONFIG]1763[/ATTACH]
سنقوم باجراء العمليات الحسابية حسب ترتيب العمليات ،فتكون العملية التي سنقوم بها أولاً هي عملية الرفع للأس "^" : حسب خطواتنا ، 1.اسناد ترتيب الرمز"^" وهو 1 الى المتغير Index ( Index=1 ) 2.العملية التي سنقوم يها تتكون من :-
[ATTACH=CONFIG]1764[/ATTACH]
4.بعد ذلك سيتم حدف رمز العملية والعدد الثاني ، لأننا لسنا بحاجة إليهما ليصبح شكل المصفوفة :-[ATTACH=CONFIG]1765[/ATTACH]
5.لا يوجد عمليات أس أخرى ،نفس هذه الخطوات ستكرر مع عملية الضرب ليصبح شكل المصفوفة النهائي : [ATTACH=CONFIG]1766[/ATTACH]
وبعد آخر عملية ( عملية الجمع ) :-[ATTACH=CONFIG]1767[/ATTACH]
كما لاحظتم ، بعد اجراء جميع العمليات ، تحقق أمران :-
والآن إلى التطبيق :- نبدأ بسم الله الرحمن الرحيم :-
حمل المشروع إلى أن انتهينا الجزء السابق .قم بتعديل الدالة 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))كود : OpArray.RemoveAt(Index)نفس خطوات عملية الأس تماما ، ( مع مراعاة تغيير الرمز "^"c بـ "+"c ) :- كود : Do Until OpArray.IndexOf("+"c) = -1كود : Return NumArray(0)كود : Function MultiSums(ByVal Str As String) As Double-تجربة الدالة :- قم بتعديل الكود داخل الحدث KeyDown لـ TextBox1 إلى :- كود : If e.KeyData = Keys.Enter Then[ATTACH=CONFIG]1768[/ATTACH]
|