You are on page 1of 47

‫خوارزميات بسيطة‬

‫للمبتدئين‬
‫في فيجوال بيسك ‪6‬‬

‫تأليف‪ :‬العضو في منتديات الفريق العربي للبرمجة‬


‫‪Abboodd‬‬
‫بسم الله الرحمن الرحيم‪ ،‬والحمد لله رب العالمين‪ ،‬والصلة والسلم على‬
‫سيدنا محمد‪ ،‬وعلى آله وصحبه أجمعين‪..‬‬

‫خوارزميات بسفيطة للمبتدئيفن‪ ،‬هفي عبارة عفن دورة بسفيطة أجريفت ففي‬
‫قسم مبرمجي لغة ‪ Visual Basic 6‬وما قبلها من إصدارات‪ ،‬في منتديات‬
‫الفريق العربي للبرمجة‪:‬‬

‫‪/http://www.arabteam2000-forum.com‬‬

‫الهدف الساسي من هذه الدورة‪ ،‬كان رفع مستوى التفكير البرمجي‪ ،‬عن‬
‫طريق طرح بعض الخوارزميات البسيطة ومحاولة حلها‪.‬‬

‫ويجفب التنويفه هنفا إلى أن الخوارزميات التفي سفيتم طرحهفا ليسفت متكاملة‬
‫تماماً‪ ،‬وإنما الهدف منها هو التفكير في حلول المشاكل‪.‬‬

‫قسففمت هذه الدورة إلى ثلث مراحففل‪ ،‬سففتجدون شفراتهففا فففي المجلد‬
‫‪ Source codes‬المرفق مع الكتاب‪.‬‬

‫وأسفأل الله أن أفيفد بهذه الدورة وهذا الكتاب‪ ،‬وإن أصفبت فمفن الله‪ ،‬وإن‬
‫أخطأت فمن نفسي ومن الشيطان‪.‬‬
‫‪Abboodd‬‬
‫ما هي الخوارزمية؟‬
‫فلنقلها ببساطة‪ :‬هي الطريقة المناسبة للقيام بعمل ما أو حل مشكلة معينة‪.‬‬
‫فمثلً‪:‬‬
‫‪Label1.Caption=Text1.Text‬‬

‫هذه خوارزمية! ماذا؟! نعم‪ ،‬هذه خوارزمية تقوم بنقل محتوى ‪ Text1‬وتضعه في ‪ . Label1‬إذا‬
‫ليس من الضروري أن تكون الخوارزمية من النوع‪:‬‬

‫‪X^2+2AB/25Y=2CB‬‬

‫بل يمكن أن تكون شيئًا بسيطاً جداً‪.‬‬


‫المرحلة الولى‬
‫الخوارزمية الولى (هل العدد زوجي أو فردي؟(‬
‫نبدأ بمقدمة عن اللغة العربية‪ ،‬نقول "هل العدد زوجي أو فردي" ول نقول "أم فردي" لن‬
‫استعمال "أم" مقصور على همزة الستفهام‪ .‬مثلً ‪ :‬أذهبت أم لم تذهب؟‬
‫وبعند هذه المقدمنة اللغوينة (المحبطنة)‪ ،‬نعود إلى البرمجنة والخوارزمينة التني بينن يديننا‪ ،‬حاول أن‬
‫تحلها بنفسك مستخدماً المعلومات التالية‪:‬‬
‫المطلوب منك أن تصنع بريمجاً (تصغير برنامج) يقوم بإعطاء المستخدم الفرصة لوضع عدد في‬
‫النن ‪ TextBox‬ثننم يضغننط زر الوامننر ‪ CommandButton‬ليعرف هننل هذا العدد زوجنني أو‬
‫فردي‪ ،‬حيث تظهر له رسالة ‪ MessageBox‬تخبره بذلك‪.‬‬

‫لحل هذه الخوارزمية تحتاج إلى استعمال معامل حساب باقي القسمة ‪ . Mod‬مثال‪:‬‬
‫‪If 9 Mod 3 = 0 Then‬‬
‫"‪MsgBox "Yes‬‬
‫‪Else‬‬
‫"‪MsgBox "No‬‬
‫‪End If‬‬

‫حيث يقوم الكود بتقسيم العدد ‪ 9‬على العدد ‪ ،3‬ثم يختبر باقي القسمة‪ ،‬فإن كان صفراً فإن العدد ‪9‬‬
‫يقبل القسمة على ‪ ،3‬وإن كان غير الصفر فإنه ل يقبل‪.‬‬

‫بدّل الن ن ‪ 9‬والن ن ‪ 3‬بالعداد أو المتغيرات المناسننبة‪ ،‬وحاول قدر المسننتطاع‪ ،‬فإن لم تسننتطع‪ ،‬تعال‬
‫واقرأ الحل‪.‬‬

‫الحننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننل‪:‬‬
‫الحنل بسنيط جداً‪ ،‬وهنو يختنبر ناتنج قسنمة العدد الموجود فني النن ‪ TextBox‬على ‪ ،2‬فإن كاننت‬
‫القيمة صفراً فإن العدد زوجي‪ ،‬وإن كانت غير ذلك فالعدد فردي‪ .‬لحظ الكود التالي‪:‬‬

‫‪Dim Number As Integer‬‬


‫‪Number=Text1.Text‬‬
‫‪If Number Mod 2=0 Then‬‬
‫"العدد زوجي" ‪MsgBox‬‬
‫‪Else‬‬
‫"العدد فردي" ‪MsgBox‬‬
‫‪End If‬‬
‫هل رأيت أسهل من هذا‪ ،‬حاول فهم الكود جيداً وطوّره‪.‬‬
‫وإن كاننت كنبرياؤك ل تسنمح لك بالنزول إلى مسنتوى النن ‪ Visual Basic‬فهذا الكود نفسنه بالنن‬
‫‪: ++C‬‬
‫;‪int Number‬‬
‫;‪cin>>Number‬‬
‫(‪if )Number%2==0‬‬
‫;"العدد زوجي"<<‪cout‬‬
‫‪else‬‬
‫;"العدد فردي"<<‪cout‬‬

‫ويمكنك ملحظة الشبه الكبير بين الكودين إن كان عندك اطّلع على لغة ‪++C.‬‬

‫الخوارزمية الثانية (خوارزمية تحليل الكلمة)‪:‬‬


‫حلل الكلمة التالية‪:‬‬

‫أحمد = أ ‪ +‬ح ‪ +‬م ‪ +‬د‬

‫هذا ما سنصنعه‪ ،‬برنامج يحل واجبات طلب الصف الول ‪ ...‬ولنبدأ‪:‬‬

‫إذا نظرت إلى المثال في المرفقات في المشاركة السابقة‪ ،‬ستجد أن المستخدم يظهر له ‪TextBox‬‬
‫و ‪ CommandButton‬فيكتنب منا يريند فني مربنع الننص‪ ،‬ثنم ينقنر على الزر فتظهنر له رسنائل‬
‫متتالية‪ ،‬كل واحدة منها تحوي حرفاً من الكلمة‪ ،‬فلنأخذ مثالً‪:‬‬
‫كتنب المسنتخدم فني مربنع الننص كلمنة ‪ Abboodd‬وضغنط الزر‪ ،‬سنتظهر له رسنالة ‪MsgBox‬‬
‫فيهننا ‪ A‬ثننم أخرى فيهننا ‪ b‬ثننم أخرى فيهننا ‪ b‬ثننم ‪ o‬ثننم ‪ o‬ثننم ‪ .....‬إلى أن ينهنني الكلمننة كلهننا‪.‬‬
‫سنننحتاج فنني خوارزميتنننا هذه إلى حلقننة ‪ ، For‬ل تخننف‪ ،‬سننتكون حلقننة بسننيطة‪ ،‬كمننا سننتساعدنا‬
‫دالّتان‪:‬‬

‫‪ -1‬الدالة ‪: Mid‬‬

‫وتعطيك مقطعاً محدداً من نص ما‪ ،‬وتستعمل كالتالي‪:‬‬

‫‪)Mid)Text,Start,Length‬‬

‫ولنأخذ مثالً‪:‬‬
‫‪)MsgBox Mid)"Abboodd",4,2‬‬

‫هنا‪ ،‬ستظهر لك رسالة‪ ،‬فيها نص‪ ،‬أول حرف منه هو الحرف الرابع من كلمة ‪ ، Abboodd‬أي‬
‫الحرف ‪ ، o‬وطول النص في الرسالة حرفان اثنان‪ ،‬أي ستكون النتيجة (‪. )oo‬‬
‫جرب بنفسك! غير المثال وتمرن على هذه الدالة‪ ،‬لنها ستكون أساسية في خوارزميتنا هذه بإذن‬
‫ال تعالى‪.‬‬

‫‪ -2‬الدالة ‪: Len‬‬
‫تعيد هذه الدالة طول نص ما‪ ،‬وتستعمل كما يلي‪:‬‬
‫(‪Len)Text‬‬

‫فمثلً‪:‬‬
‫("‪MsgBox Len)"Abboodd‬‬

‫برأيك ماذا سيظهر في الرسالة؟ سيظهر الرقم ‪ ،7‬وهو عدد حروف الكلمة ‪ ، Abboodd‬وجرب‬
‫مثلً‪:‬‬

‫(‪MsgBox Len)Text1.Text‬‬

‫واكتب نصاً في الن ‪ TextBox‬وسيعطيك هذا المر عدد حروفه !‬


‫ستسعمل هذه الدالة في حلقة التكرار‪.‬‬
‫وإليك طرف الخيط‪:‬‬
‫(احزر ماذا)‪For i = 1 To Len‬‬
‫احزر ماذا ‪MsgBox‬‬
‫‪Next‬‬

‫والن‪ ،‬بدل (احزر ماذا) بالتعابيننر المناسننبة‪ ،‬وابدأ العمننل بنفسننك‪ ،‬ول تطلع على الحننل قبننل ألف‬
‫محاولة!‬
‫ويمكنك طلب المساعدة من أخيك إن كان في الصف الول ‪...‬‬

‫الحل‪:‬‬
‫بسيطة‪:‬‬
‫(‪For i = 1 To Len)Text1.Text‬‬
‫(‪MsgBox Mid)Text1.Text, i, 1‬‬
‫‪Next‬‬
‫ثلثة سطور فقط!‬
‫نعننم‪ ،‬وسنننشرح هذا الكود بمثال‪ ،‬حيننث سنننفترض أن المسننتخدم كتننب فنني الن ن ‪ TextBox‬كلمننة‬
‫‪ ،Abboodd‬عندها سيتم تنفيذ التالي في الكود‪:‬‬
‫‪For i = 1 To 7‬‬
‫(‪MsgBox Mid)"Abboodd",i,1‬‬
‫‪Next‬‬

‫ما الذي حدث هنا؟ عندما كتب المستخدم كلمة ‪ Abboodd‬أخذ البرنامج عدد حروف هذه الكلمة‬
‫وهو ‪ ،7‬ووضعها بدل ‪)Len)Text1.Text‬‬
‫وبهذا سننننوف تظهننننر هذه الرسننننالة سننننبع مرات‪ ،‬والن‪ ،‬مننننا الذي يحدث داخننننل الحلقننننة؟‬
‫ألم نقنل إن الدالة ‪ Mid‬تعطينك الحروف التني تريدهنا منن ننص منا؟ إذاً فإن البرنامنج يأخنذ كلمنة‬
‫‪ Abboodd‬ثم ينظر من أي حرف سيبدأ‪ ،‬فيجد أنه سوف يبدأ من ‪ ، i‬وبما أن ‪ i‬يزيد مرة في كل‬
‫دورة فإن البرنامج ‪ ،‬سيأخذ الحرف الول في المرة الولى‪ ،‬ثم الثاني‪ ،‬ثم الثالث‪.....‬‬

‫ولحظ أننا وضعنا الرقم ‪ 1‬هنا‪:‬‬


‫(‪MsgBox Mid)"Abboodd",i,1‬‬

‫وبهذا فإنه سيعطيني حرفاً واحداً في كل مرة‪ ،‬وليس أكثر من ذلك‪.‬‬


‫حاول فهم الكود وتطبيقه‪ ،‬وتغييره وتطويره‪ ،‬ثم يمكنك عرضه في سوق طلب البتدائي‪ ،‬لتجني‬
‫ثروة طائلة بشرط‪ ،‬لي نصف الرباح لني صاحب الفكرة‪...‬‬

‫الخوارزمية الثالثة (خوارزمية رسم دوائر عشوائية) ‪:‬‬


‫ما سنبرمجه اليوم‪ ،‬هو عبارة عما قد يكون نواة صغيرة لبرنامج حافظ الشاشة ‪Screen Saver‬‬
‫ولنبدأ‪:‬‬
‫المطلوب‪:‬‬
‫عندما تظهر النافذة في المشروع في المرفقات‪ ،‬تجد أن البرنامج قد بدأ برسم دوائر تتمتع بصفات‬
‫عشوائية‪ ،‬وهي‪:‬‬
‫‪ -1‬أماكن عشوائية‬
‫‪ -2‬حجوم عشوائية‬
‫‪ -3‬ألوان عشوائية‬
‫وتجد أنه يرسم في كل ربع ثانية دائرة ‪.‬‬
‫والن لدينا نقاط عديدة لنتحدث عنها‪ ،‬ونحتاج إلى القليل من التركيز‪:‬‬
‫أولً‪ :‬كيف نرسم دوائر على النافذة؟‬
‫بالطريقة التالية‪:‬‬
‫‪Circle)X,Y(,Radius,Color‬‬
‫حيث ‪ X,Y‬إحداثيات مركز الدائرة (سيناته وصاداته)‪ ،‬و ‪ Radius‬هو طول نصف قطر الدائرة‪،‬‬
‫و ‪ Color‬هو لونها‪.‬‬
‫يمكنك وضع ما يناسبك‪ ،‬مثلً‪:‬‬

‫‪Circle)500,300(,400,vbRed‬‬

‫عندهننا سننيرسم لك دائرة إحداثياتهننا (‪ )500،300‬وطول نصننف قطرهننا ‪ ،400‬ولونهننا أحمننر‬


‫‪. vbRed‬‬
‫كمننا رأينننا فقنند اسننتعملنا الثابننت ‪ vbRed‬للتعننبير عننن اللون الحمننر‪ ،‬وهناك أيضاً ‪ vbBlue‬و‬
‫‪ vbWhite‬و ‪....... vbBlack‬‬
‫ولكن هذه اللوان قليلة‪ ،‬وغير عملية‪ ،‬لكن هناك طريقة أخرى للحصول على اللوان‪ ،‬وهي‪:‬‬

‫(عدد من ‪ 0‬إلى ‪QBColor)15‬‬

‫جرب مثلً‪:‬‬
‫(‪Form1.BackColor = QBColor)12‬‬

‫هذا سيعطيك اللون الحمر‪ ،‬يمكنك تجريب الرقام الخرى للحصول على ما يناسبك‪ ،‬لكن هذا ل‬
‫يعطيك إل ‪ 16‬لون‪ ،‬لذلك إليك الطريقة المثلى للحصول على اللوان‪:‬‬

‫(‪RGB)Red,Green,Blue‬‬

‫حيث ‪ Red‬هي نسبة اللون الحمر من ‪ 0‬إلى ‪ ،255‬و ‪ Blue‬هي نسبة الزرق‪ ،‬و ‪ Green‬نسبة‬
‫الخضنر‪ ،‬أي أننه سنيأخذ النسنبة التني تحددهنا منن كنل لون‪ ،‬ويمزجهنا ويعطينك اللون الذي تريده‪.‬‬
‫وهذه الطريقنة يمكنهنا أن تعطينك ألوان تصنل إلى ‪ 16777216‬لون ! نعنم عدد فلكني منن اللوان‬
‫تحصل عليه بهذه الطريقة‪ ،‬فيمكنك كتابة‪:‬‬

‫(‪Form1.BackColor = RGB)0,0,0‬‬

‫لتحصل على اللون السود‪ ،‬ويمكنك كتابة ‪:‬‬


‫(‪Form1.BackColor = RGB)255,255,255‬‬

‫لتحصنل على اللون البينض‪ ،‬وبينن هذينن اللونينن (‪ )16777214‬لون آخنر! فكلمنا غيرت درجنة‬
‫من الدرجات الثلث‪ ،‬حصلت على لون جديد‪.‬‬
‫ملحظننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننة‪:‬‬
‫ل تستخدم هذا المر في الحدث ‪ Form_Load‬لسباب ليس هذا مكان ذكرها‪.‬‬

‫ثانياً‪ :‬عشوائية ‪ ...‬كيف؟‬


‫باستخدام المعامل ‪ ، Rnd‬جرب التالي في حدث النقر على زر ما‪:‬‬
‫‪R = Rnd‬‬
‫‪MsgBox R‬‬

‫اضغط الزر أكثر من مرة‪ ،‬ولحظ‪ :‬في كل مرة تحصل على رقم مختلف بطريقة عشوائية‪ ،‬ولكن‬
‫أحيانًا تريند تحديند الرقام التني تريدهنا‪ ،‬يعنني مثلً‪ ،‬أريند رقماً عشوائياً بينن ‪ 0‬و ‪ ،255‬فيمكننك‬
‫كتابة التالي‪:‬‬
‫‪A = Rnd * 255‬‬
‫‪MsgBox A‬‬

‫وبهذا في كل ضغطة سيعطيك رقماً بين ‪ 0‬و ‪. 255‬‬


‫والن ما رأيك بمثال عملي‪ ،‬إليك التالي‪:‬‬

‫‪Dim Red As Integer, Blue As Integer, Green As Integer‬‬


‫‪Red = Rnd * 255‬‬
‫‪Blue = Rnd * 255‬‬
‫‪Green = Rnd * 255‬‬
‫(‪Form1.BackColor = RGB)Red, Blue, Green‬‬

‫هنل رأينت كينف اسنتعملنا المعلومات التني تعلمناهنا‪ ،‬فأصنبح لديننا كود يقوم بتغيينر لون النافذة إلى‬
‫لون عشوائي في كل مرة‪.‬‬
‫بقيت ملحظة على العشوائية‪:‬‬
‫لو لحظنت شيئًا هاماً‪ ،‬إذا جربنت الكود السنابق‪ ،‬ثنم أغلقنت البرنامنج وفتحتنه منن جديند‪ ،‬وجربنت‬
‫العملية‪ ،‬ستجد أنه يعطيك اللوان نفسها في كل مرة‪ ،‬لذلك‪ ،‬ولتحصل على أرقام عشوائية حقيقية‪،‬‬
‫اكتب في الن ‪: Form_Load‬‬

‫‪Randomize‬‬

‫هذا المننننر سننننيجعل اللوان تختلف فنننني كننننل مرة‪ ،‬وبهذا تحصننننل على عشوائيننننة حقيقيننننة‪.‬‬

‫ثالثاً‪ :‬كيف أقوم بالرسم كل ربع ثانية؟‬


‫هناك أداة على شكل ساعة تدعى ‪ ،Timer‬وهذه الداة تمكنك من القيام بمجموعة أوامر كل فترة‬
‫زمنينة محددة‪ ،‬انقنر على السناعة وضعهنا على النن ‪ Form‬ثنم انظنر إلى نافذة الخصنائص‪ ،‬سنتجد‬
‫خاصننية تدعننى ‪ Interval‬اضبطهننا على ‪ ،1000‬ثننم انقننر على الداة مرتيننن لتظهننر لك نافذة‬
‫البرمجة الخاصة بها‪ ،‬واكتب‪:‬‬
‫"‪Print "Hello‬‬

‫ثم شغل البرنامج‪ ،‬ولحظ ما الذي سيحدث‪ ،‬في كل ثانية سيطبع على النافذة كلمة ‪ ، Hello‬حاول‬
‫استنتاج طريقة عمل هذه الداة‪.‬‬
‫والن أصنبح لدينك المعلومات الكاملة لرسنم دوائر عشوائينة على النافذة فني كنل ربنع ثانينة‪ ،‬حاول‬
‫فهم كل نقطة من النقاط السابقة جيداً‪ ،‬ثم اعمل على استخدامها بما يخدم برنامجك‪ ،‬إلى أن أعطيك‬
‫الحل قريباً بإذن ال‪.‬‬

‫الحل‪:‬‬
‫قلّي كم محاولة حاولت‪ ،‬أقل لك من أنت‪ ،‬وإليك الحل التالي‪:‬‬
‫نحنن نريند القيام بالمنر فني كنل ربنع ثانينة‪ ،‬وهذا باسنتخدام الداة ‪ ، Timer‬وبمنا أنننا فني المثال‬
‫السنابق وضعننا ‪ 1000‬فني خاصنية ‪ Interval‬لنعنبر عنن ثانينة واحدة‪ ،‬إذن لنعنبر عنن ربنع ثانينة‬
‫سنضع ‪ ،250‬ثم ننقر مرتين لنفتح نافذة البرمجة الخاصة بالداة‪ ،‬ونكتب‪:‬‬
‫‪Dim Red As Integer, Green As Integer, Blue As Integer‬‬
‫‪Dim X As Integer, Y As Integer‬‬
‫‪Dim Radius As Integer‬‬
‫‪Red = Rnd * 255‬‬
‫‪Green = Rnd * 255‬‬
‫‪Blue = Rnd * 255‬‬
‫‪X = Rnd * Me.Width‬‬
‫‪Y = Rnd * Me.Height‬‬
‫‪Radius = Rnd * 500‬‬
‫(‪Circle )X, Y(, Radius, RGB)Red, Green, Blue‬‬

‫حاول فهم الكود بنفسك‪ ،‬واقرأه أكثر من مرة لتحصل على الفائدة الكبرى من التمرين‪.‬‬
‫كمنا ترى فقند عرفننا ثلثنة متغيرات ‪ ،‬هني نسنبة كنل منن اللون الحمنر والخضنر والزرق فني‬
‫اللون الذي نريده‪ ،‬وعرفننا متغيرينن للحداثيات هني ‪ ، X,Y‬كمنا عرفننا متغيراً هنو طول نصنف‬
‫القطر ‪. Radius‬‬
‫ثنم أعطيننا قيماً عشوائينة لكنل المتغيرات‪ ،‬وجعلننا الحند القصنى لنن ‪ X‬هنو عرض النافذة‪ ،‬لكني ل‬
‫يقوم برسننم الدوائر خارج النافذة‪ ،‬وكذلك المتغيننر ‪ Y‬جعلنننا الحنند القصننى له هننو طول النافذة‪،‬‬
‫للسنبب نفسنه‪ ،‬أمنا المتغينر ‪ Radius‬فجعلننا حده القصنى ‪ ،500‬لكني ل تكون الدائرة كنبيرة جداً‬
‫(ويمكننك تغيينر النن ‪ 500‬إلى منا تريند)‪ ،‬وكذلك جعلننا الحند القصنى لدرجات اللوان هنو ‪،255‬‬
‫للسبب الذي ذكرناه في المشاركة السابقة‪.‬‬
‫وبقي أن نرسم الدائرة ونمرر إليها القيم العشوائية‪.‬‬
‫وبهذا أصنبح عندننا نافذة‪ ،‬يرسنم عليهنا الجهاز فني كنل ربنع ثانينة دائرة تتمتنع بإحداثيات عشوائينة‪،‬‬
‫ومساحة عشوائية‪ ،‬ولون عشوائي‪.‬‬
‫ول تنسى وضع ‪. Randomize‬‬
‫وظيفنننة‪ :‬جرب عمنننل أشكال وتصنننميمات وابتكارات أخرى‪ ،‬أريننند أن أرى وظيفتنننك غداً‪ ،‬وإل‬
‫سيكون هناك خصم للعلمات‪...‬‬

‫الخوارزمية الرابعة (خوارزمية جدول الضرب) ‪:‬‬


‫نظرا ً للنجاح الذي حققه برنامج "تحليل الكلمات" في سوق البتدائي‪ ،‬فقد‬
‫عرض علينفا طلب الصفف الثالث مبلغا ً كفبيرا ً مقابفل برمجفة برنامفج لجدول‬
‫الضرب‪ ،‬وقد تم توقيع العقد ‪...‬‬

‫ولنبدأ‪:‬‬
‫عندمفا نفتفح المشروع‪ ،‬ونختار جدول الضرب‪ ،‬نجفد نافذة فيهفا ‪ TextBox‬و‬
‫‪ ، CommandButton‬نضفففع عددا ً مفففا ففففي الفففف ‪ TextBox‬ونضغفففط الفففف‬
‫‪ CommandButton‬لنحصفففل على جدول الضرب الخاص بالعدد‪ ،‬مفففن ‪0‬‬
‫إلى ‪ ،10‬مطبوعا ً على النافذة‪ ،‬يعني إذا وضعت ‪ ،5‬فإنه سيطبع لك‪:‬‬

‫‪0‬‬
‫‪5‬‬
‫‪10‬‬
‫‪15‬‬
‫‪20‬‬
‫‪25‬‬
‫‪30‬‬
‫‪35‬‬
‫‪40‬‬
‫‪45‬‬
‫‪50‬‬

‫هذه هففي‪ ،‬لن أشرح لك الطريقففة‪ ،‬عليففك أن تكتشفهففا بنفسففك‪ ،‬سففأعطيك‬


‫فقط طرف الخيط‪ ،‬وهو أنك ستستعمل جملة ‪ For‬واحدة‪.‬‬

‫كما أني سأعطيك نصيحة‪ :‬يفضل‪ ...‬إن لم نقل يجب‪ ،‬أن تجرب الحل على‬
‫الورق‪ ،‬قبفففل أن تنقفففل الفكار إلى الحاسفففوب‪ ،‬لن ذلك يسفففاعدك على‬
‫التفكيفر المنطقفي‪ ،‬وعلى تنظيفم أفكارك بطريقفة مناسفبة‪ ،‬ويصفرف ذهنفك‬
‫مففن التفكيففر بطريقففة كتابففة الكود والتعليمات‪ ،‬إلى التفكيففر بطريقففة حففل‬
‫المشكلة الساسية‪ ،‬كما أنه يمكنك أن ترسم و(تشخبر) على الورق ‪ ،‬وهذا‬
‫ما ل تستطيع فعله على الحاسوب‪.‬‬

‫الحل‪:‬‬
‫والن نعود إلى الحل يا أبطال البتدائي ‪ ،‬وهو‪:‬‬
‫‪Dim i As Integer, Num As Integer‬‬
‫(‪Num = Val)Text1.Text‬‬
‫‪For i = 1 To 10‬‬
‫‪Print Num * i‬‬
‫‪Next‬‬

‫كما لحظنا هو حل بسيط‪ ،‬يتم فيه وضع القيمة الموجودة في الن ‪ TextBox‬في المتغير ‪، Num‬‬
‫ثننم نبدأ بن ن ‪ For‬ونضرب المتغيننر ‪ i‬الذي يزينند فنني كننل دورة ‪ ،‬بالعدد الذي هننو ‪ ، Num‬ونطبننع‬
‫النتيجة على النافذة‪.‬‬
‫بالنسبة للدالة ‪ ، Val‬هي دالة بسيطة تقوم بأخذ القيمة العددية لنص ما ‪ ،‬يعني إذا كان عندك (‪)12‬‬
‫فبدون ‪ Val‬سننيتعامل معهننا البرنامننج على أنهننا نننص‪ ،‬ممننا سننيؤدي إلى حدوث مشاكننل‪ ،‬أمننا مننع‬
‫استخدام ‪ Val‬فسيفهم أن ما في الن ‪ TextBox‬هو عدد وليس نصاً (حروفاً(‪ ،‬وسيتعامل معه على‬
‫هذا الساس‪.‬‬

‫الخوارزمية الخامسة (خوارزمية حساب محيط ومساحة دائرة)‪:‬‬


‫هذا آخر تمرين في المرحلة الولى‪ ،‬قبل أن ننتقل إلى المرحلة الثانية‪ ،‬التي ستجدون فيها تمارين‬
‫أجمل وبمستوى أعلى بإذن ال‪.‬‬
‫أمنننا الن فمنننا زلننننا منننع البتدائي ‪ ،‬فلديننننا تمارينننن منننن الصنننف الخامنننس نريننند أن نحلهنننا‪.‬‬
‫لن أشرح كثيراً‪ ،‬فقنط نريند أن يضنع المسنتخدم رقماً منا فني النن ‪ ، TextBox‬وهذا الرقنم سنيكون‬
‫طول نصف قطر الدائرة التي نريد حساب مساحتها‪ ،‬ثم يضغط الزر لتظهر له رسالة تقول‪:‬‬
‫المساحة هي (المساحة(‬
‫ورسالة أخرى‪:‬‬
‫المحيط هو (المحيط(‬
‫ل إذا أدخنل المسنتخدم ‪ ،5‬فإن‬ ‫حينث (المسناحة) و (المحينط) هني النتائج التني توصنلنا إليهنا‪ ،‬فمث ً‬
‫النتيجة ستكون‪:‬‬

‫المساحة هي ‪78.5‬‬

‫المحيط هو ‪31.4‬‬
‫احسننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننبها‬
‫علماً أن قانون المساحة هو‪:‬‬
‫‪Q = R^2 * Pi‬‬

‫حيث ‪ Q‬نقصد بها المساحة‪ ،‬و ‪ R^2‬تعني نصف القطر قوة ‪ ،2‬أما ‪ Pi‬فهو ثابت يساوي ‪3.14‬‬
‫هل تذكرت هذا القانون؟‬
‫أما قانون المحيط فهو‪:‬‬
‫‪A = 2 * R * Pi‬‬
‫تمام؟‬
‫ابدأ الحل‪ ،‬ول تنس استعمال ‪ Val‬التي تحدثنا عنها في التمرين الماضي‪ ،‬لكي يتعامل البرنامج مع‬
‫الرقم الموجود في الن ‪ TextBox‬على أنه رقم ‪ ،‬وليس على أنه حرف‪.‬‬
‫هيا ابدأ‪ ،‬هذا تمرين صف خامس ‪.....‬‬

‫الحفففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففل‪:‬‬
‫إليكم الحل البسيط‪:‬‬
‫‪Dim R As Integer‬‬
‫‪Dim Area As Double, Perimeter As Double‬‬
‫‪Const Pi As Double = 3.14‬‬
‫(‪R = Val)Text1.Text‬‬
‫‪Area = R ^ 2 * Pi‬‬
‫‪Perimeter = 2 * R * Pi‬‬
‫‪ " & Area‬المساحة" ‪MsgBox‬‬
‫‪ " & Perimeter‬المحيط" ‪MsgBox‬‬

‫هل رأيت شيئاً صعباً ؟ حاول فهم الكود بنفسك‪.‬‬


‫وضعنننا القيمننة الموجودة فنني ‪ Text1‬فنني المتغيننر ‪ ، R‬ثننم أجرينننا معادلت المسنناحة والمحيننط‬
‫ووضعنا الناتج في المتغيرين ‪ Area ،‬و ‪ ، Perimeter‬ويمكنك اختيار أي اسم تريده للمتغير‪ ،‬ثم‬
‫وضعنا الناتج في رسالة للمستخدم‪.‬‬
‫لحظ أننا عبرنا عن ‪ R‬قوة ‪ ،2‬بالشكل التالي (‪ )R^2‬إذاً فالشكل ^ يرمز إلى القوة‪.‬‬
‫شغل عقلك‪...‬‬
‫المرحلة الثانية‬
‫الخوارزمية الولى (خوارزمية تحويل الشهور إلى سنوات) ‪:‬‬
‫سنننننننبدأ المرحلة الثانيننننننة بخوارزميننننننة لذيذة‪ ،‬قبننننننل أن ننتقننننننل إلى الخوارزميات الخرى‪.‬‬
‫جاءت فكرة هذه الخوارزمية من سؤال وضعه أحد الخوة في المنتدى‪.‬‬
‫المطلوب الن‪:‬‬
‫لديننك نافذة‪ ،‬عليهننا ‪ TextBox‬يدخننل المسننتخدم فيهننا رقمًا مننا‪ ،‬وهننو عدد الشهور‪ ،‬مثلً ‪ ،30‬ثننم‬
‫يضغط ‪ CommandButton‬فتظهر له رسالة ‪ MessageBox‬تخبره‪:‬‬
‫‪2 years and 6 months‬‬

‫يعني أن ‪ 30‬شهراً يساوي سنتين وستة أشهر ‪ ،‬تمام؟‬


‫والن لنبدأ العمل‪:‬‬
‫هناك معاملن هامان في البرنامج الذي سنصنعه‪ ،‬الول‪:‬‬
‫المعامل \ ‪:‬‬
‫ل انتظر ‪ ،‬هذا ليس معامل القسمة العادية‪ ،‬بل هو معامل القسمة من دون باقي‪ ،‬يعني لو كتبنا‪:‬‬
‫‪MsgBox 15/4‬‬

‫هنا استخدمنا معامل القسمة العادي‪ ،‬وستكون النتيجة هي ‪ ، 3.75‬أما لو كتبنا‪:‬‬


‫‪MsgBox 15\4‬‬

‫فستكون النتيجة هي ‪ ،3‬أي أنه أخذ العدد صحيحاً ودون باقي‪ ،‬تمام؟ سنستعمل هذا المعامل‪.‬‬

‫أما المعامل الثاني فهو‪:‬‬


‫المعامل ‪:Mod‬‬
‫وقد تحدثنا عليه من قبل‪ ،‬فهو يقوم بحساب باقي قسمة عدد على عدد‪ ،‬يعني مثلً‪:‬‬

‫‪MsgBox 14 Mod 4‬‬

‫سيعطيك ‪ ،2‬أي أن باقي قسمة ‪ 14‬على ‪ 4‬هو ‪ ،2‬تذكرنا؟؟؟‬

‫ستقوم بإذن ال بتوظيف هاتين الدالتين لصنع هذا البرنامج‪ ،‬ماذا ؟؟ تريد مساعدة أكثر‪ ......‬آسف‬
‫شغل مخك‪.‬‬

‫وسننيكون ممتازًا أيضاً إذا اكتشفننت الحنل بطريقنة أخرى‪ ،‬كلمننا علينك هنو أن تمسننك قلماً وورقنة‬
‫وتحاول‪ ،‬وأنا بانتظارك‪.‬‬
‫الحل‪:‬‬
‫قد تظنون أني تركتكم بدون مساعدة‪ ،‬لكن السبب الساسي لقلل‬
‫الشرح هو أن تفكر أنت به بنفسك‪ ،‬والن إليك الكود‪:‬‬
‫‪Dim intTotalMonths As Integer, intMonths As Integer, intYears As Integer‬‬

‫)‪intTotalMonths = Val)Text1.Text‬‬

‫‪intYears = intTotalMonths \ 12‬‬

‫‪intMonths = intTotalMonths Mod 12‬‬

‫"‪MsgBox intYears & " years and " & intMonths & " months‬‬

‫إذا ً هنفا جعلنفا العدد الجمالي للشهور هفو العدد الموجود ففي الفف ‪، TextBox‬‬
‫ثم كانت السنوات هي عدد الشهور الجمالي مقسوما ً على ‪ 12‬دون باقي‪،‬‬
‫والشهور هففو باقففي قسففمة عدد الشهور الجمالي على ‪ ،12‬فمثل ً لو كان‬
‫عندنففا ‪ 47‬شهراً‪ ،‬قسففمناها على ‪ 12‬فكانففت النتيجففة ‪ 3‬والباقففي ‪ ،11‬إذاً‬
‫ستكون النتيجة ‪:‬‬

‫‪Years and 11 months 3‬‬

‫فكّر بها‪...‬‬

‫الخوارزمية الثانية (خوارزمية ترتيب العداد( ‪:‬‬


‫ل تبدأ بمحاولة التفكينر فني هذه الخوارزمينة‪ ،‬قبنل أن يكون أمامنك كأس أو فنجان‪ ،‬منن الشاي أو‬
‫القهوة‪ ،‬بالضافة إلى اطلع على المصفوفات ‪ Arrays‬وحلقات التكرار ‪. For‬‬
‫سننستعمل فني خوارزميتننا هذه مصنفوفة واحدة وأربنع حلقات تكرار‪ ،‬إلينك طريقنة الحنل‪ ،‬وكنل منا‬
‫عليك أن تفكر‪:‬‬
‫كمنننا فننني المشروع فننني المرفقات‪ ،‬تجننند أن هذه الخوارزمينننة تعتمننند على ضغنننط زر أوامنننر‬
‫‪ ،CommandButton‬فيظهننر لك مربننع حوار يطلب منننك إدخال عدد‪ ،‬وهذا المربننع مننن النوع‬
‫‪ ،InputBox‬سنيظهر لك هذا المربنع عشنر مرات‪ ،‬فني كنل مرة تدخنل عدداً منا‪ ،‬فإذا أتممنت عشنر‬
‫المرات‪ ،‬ستطبع هذه العداد على النافذة بالترتيب من الصغر إلى الكبر‪.‬‬
‫والن العمل هنا أربع خطوات‪:‬‬
‫‪ -1‬عليك بتعريف مصفوفة تحوي عشرة عناصر‪.‬‬
‫‪-2‬عندما يضغط المستخدم الزر‪ ،‬يظهر له مربع الحوارفيضع فيه عدداً ما‪ ،‬ثم يضغط ‪ Ok‬فتحفظ‬
‫قيمة العدد في المتغير الول من المصفوفة‪ ،‬ثم يظهر مرة أخرى ويضع المستخدم العدد‪ ،‬وتحفظ‬
‫القيمة في المتغير الثاني من المصفوفة‪ ،،‬وهكذا‪ ،‬حتى تظهر المربعات عشر مرات‪ ،‬وهذه العملية‬
‫تتم باستخدام جملة ‪ For‬الولى‪.‬‬

‫‪-3‬الن ترتيننب العداد‪ ،‬عليننك أن تركننز معنني جيداً‪ ،‬وإن كنننت أنهيننت كأس أو فنجان‪ ،‬الشاي أو‬
‫القهوة‪ ،‬فعليك بأخرى أو آخر‪.‬‬
‫ل أن المستخدم اختار العداد التالية‪ ،‬ونطبق المثال عليها‪:‬‬ ‫سنفرض جد ً‬

‫‪3-7-10-8-1-9-5-2-4-6‬‬

‫ل بمقارنننة العدد الول بكننل عدد مننن العداد الخرى‪ ،‬فإن كان العدد المقارَن بننه‬
‫سننوف نقوم أو ً‬
‫أصغر من العدد الول‪ ،‬نبدل مكانيهما‪ ،‬انظر معي‪:‬‬

‫هنا تتم مقارنة العدد ‪ 3‬بالن ‪ ،7‬وبما أن ‪ 3‬أصغر من ‪ ،7‬فل يحدث شيء ويكمل المقارنة‪ ،‬ثم يقارن‬
‫بالن ‪ 10‬و الن ‪ ،8‬إلى أن يصل إلى الن ‪ ،1‬وبما أن ‪ 3‬أكبر من ‪ ،1‬فإن البرنامج يبدل مكاني العددين‬
‫ليصبح الترتيب كما يلي‪:‬‬
‫ثم يكمل المقارنة‪ ،‬فيقارن العدد الول الذي أصبح الن ‪ ،1‬بالعداد الباقية‪ ،‬فيجد أن ‪ 1‬في مثالنا هذا‬
‫أصغر من كل العداد الخرى ‪ ،‬لذلك سيكمل المقارنة دون أن يبدل شيئاً إلى أن يصل إلى الن ‪،6‬‬
‫فيكون عندهننا قنند أنهننى مقارنننة العدد الول بالعداد الخرى‪ ،‬ثننم ينتقننل إلى العدد الثاننني‪ ،‬ويبدأ‬
‫المقارنة‪:‬‬

‫وما إن يصل إلى الن ‪ 3‬حتى يبدل بين العددين‪ ،‬لن ‪ 7‬أكبر من ‪ ،3‬وتستمر الحلقة هكذا حتى يصل‬
‫إلى العدد الخير‪.‬‬
‫تحتاج هذه الخطوة إلى حلقتننني ‪ For‬متداخلتينننن‪ ،‬الولى تقارن العدد المختار بكنننل عدد آخنننر‪،‬‬
‫والثانينة تنتقنل بنك منن العدد الول بعند أن تمنت مقارنتنه بالعداد الخرى إلى العدد الثانني‪ ،‬وتبدأ‬
‫المقارنة‪ ،‬ثم الثالث‪....‬‬
‫وبعند أن تنتهني الحلقنة سنتجد أن العداد أصنبحت مرتبنة منن الصنغر إلى الكنبر‪ ،‬وإن لم تصندق‪،‬‬
‫فجرب ذلك على الورق لتجد النتيجة صحيحة‪.‬‬

‫‪ -4‬الخطوة الرابعننة هنني طباعننة الرقام على النافذة بعنند أن تننم ترتيبهننا‪ ،‬وتحتاج إلى حلقننة ‪For‬‬
‫الرابعنة‪ ،‬لتقوم فيهنا بطباعنة الرقام المحفوظنة فني متغيرات المصنفوفة واحداً تلو الخنر‪ ،‬ليتفاجاً‬
‫المستخدم أن العداد أصبحت مرتبة‪.‬‬

‫الن حاول‪ ،‬معك ألف محاولة‪ ،‬فإن لم تستطع فتعال واقرأ الحل‪.‬‬

‫الحنننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننل‪:‬‬
‫ل سننعرف المصنفوفة‪ ،‬ونعرف متغيراً آخنر سنتعرف فائدتنه بعند قلينل‪ ،‬بالضافنة إلى متغيرات‬ ‫أو ً‬
‫العد في جمل ‪: For‬‬

‫‪Dim Numbers)10( As Integer, i As Integer, j As Integer, B As Integer‬‬

‫الن‪ ،‬عندما يضغط المستخدم الزر‪ ،‬تظهر له عشرة مربعات الواحد تلو الخر‪ ،‬وهنا نستخدم‬
‫حلقة ‪ For‬الولى‪:‬‬
‫‪For i = 0 To 9‬‬
‫("‪Numbers)i( = InputBox)"Enter the number please‬‬
‫‪Next‬‬

‫أما الن فترتيب العداد‪ ،‬أين كأس الشاي؟!‬


‫كما قلنا‪ ،‬سنستخدم حلقتي ‪ For‬متداخلتين‪ ،‬انظر معي الن‪:‬‬
‫‪For i = 0 To 9‬‬
‫‪For j = i To 9‬‬
‫‪If Numbers)i( > Numbers)j( Then‬‬
‫(‪B = Numbers)i‬‬
‫(‪Numbers)i( = Numbers)j‬‬
‫‪Numbers)j( = B‬‬
‫‪End If‬‬
‫‪Next‬‬
‫‪Next‬‬

‫في الكود السابق بدأنا الحلقة الكبيرة التي عدادها هو المتغير ‪ ،i‬وهو يمثل العدد الذي سنقارن به‬
‫العداد الخرى‪ ،‬ثم تبدأ الحلقة الثانية‪ ،‬ونلحظ أننا قلنا له أن يجعل البداية التي يبدأ العد فيها هي‬
‫نفسنها المكان الذي وصنل إلينه المتغينر ‪ i‬لكني ل تتنم المقارننة بالعداد التني قبنل العدد الذي نريده‪،‬‬
‫ل في العمل‪( ،‬جرب ولحظ الخلل(‪.‬‬ ‫مما سيحدث خل ً‬
‫وثنم نأخنذ العداد التني سننقارن بهنا واحداً واحداً‪ ،‬فإن كان أحدهنا أصنغر منن العدد الذي نقارن بنه‪،‬‬
‫تنم التبدينل‪ ،‬وإن لم يكنن يكمنل المقارننة‪ ،‬فإذا تمنت مقارننة كنل العداد يهذا العدد‪ ،‬انتهنت المقارننة‬
‫وخرج منن الحلقنة الصنغيرة‪ ،‬وعندهنا سنتزيد قيمنة المتغينر ‪ i‬مرة واحدة‪ ،‬أي إننه سنينتقل إلى العدد‬
‫الثاني ويبدأ المقارنة من جديد بالرقام التي تليه‪ ،‬ويكرر هذه العملية حتى يصل المتغير ‪ i‬إلى ‪،9‬‬
‫وعندها سيكون الترتيب قد تم‪ ،‬ويبقى طباعة الرقام على النافذة‪.‬‬
‫حاول إكتشاف فائدة المتغير ‪. B‬‬

‫أما الحلقة الخيرة فتقوم بطباعة الرقام على النافذة‪:‬‬


‫‪For i = 0 To 9‬‬
‫(‪Print Numbers)i‬‬
‫‪Next‬‬

‫حاول فهننم الكود جيداً وقراءتننه عدة مرات‪ ،‬أعلم أنننه قنند يكون معقدًا قليلً عليننك كمبتدئ‪ ،‬ولكننن‬
‫يجب أن تحاول فهمه وتجريب عمله أكثر من مرة‪ ،‬ثم حاول أن تطوره‪.‬‬

‫ماذا؟ تريده بالن ‪ ++C‬إليك الكود التالي مع اختلفات بسيطة‪:‬‬

‫;‪int A[10],B‬‬
‫(‪for )int y=0;y<10;y++‬‬
‫{‬
‫;"‪cout<<"Write the numbers before sorting\t‬‬
‫;]‪cin>>A[y‬‬
‫}‬
‫(‪for )int i=0;i<10;i++‬‬
‫{‬
‫(‪for )int j=i;j<10;j++‬‬
‫{‬
‫(]‪if )A[j]<A[i‬‬
‫{‬
‫;]‪B=A[i‬‬
‫;]‪A[i]=A[j‬‬
‫;‪A[j]=B‬‬
‫}‬
‫}‬
‫;‪cout<<endl<<"Here are the numbers after sorted\t"<<A[i]<<endl‬‬
‫}‬

‫هذا إن كنت تعرف استخدام ‪ ++C‬أما إن كنت ل تعرف فأغمض عينيك ول تنظر‪.‬‬

‫الخوارزميفة الثالثفة (خوارزميفة جدول الضرب (باسفتخدام‬


‫العودية( ‪:‬‬
‫قفد تقولون إننفا قفد قمنفا بعمفل جدول الضرب مفن قبفل‪ ،‬أقول نعفم‪ ...‬لكننفا‬
‫اليوم سنأخذ لمحة عن العودية ونحاول تطبيقها‪.‬‬

‫ما هي العودية؟‬

‫إذا كنففت قففد تدربففت جيدا ً على الجراءات فيمكننففي عندهففا أن أخففبرك أن‬
‫العودية هي إجراء يقوم باستدعاء نفسه‪ ...‬ما معنى هذا ؟‬

‫فلنفنرض جدل ً أنففك قلت لشخففص مففا أنففا أعرفففك‪ ،‬فقال أنففا أعرف أنففك‬
‫تعرفنففي‪ ،‬فقلت أنففا أعرف أنففك تعرف أنففي أعرفففك‪ ،‬فقال أنففا أعرف أنففك‬
‫تعرف أني أعرف أنك تعرفني‪ ........‬إلخ‬
‫حسنا ً هذا كان مثال ً تقريبيا ً فاشل ً‬

‫ولكن الن‪ ،‬فلنرجع إلى البرمجة‪ ،‬تخيل أنك عرفت الجراء التالي‪:‬‬

‫()‪Private Sub MySub‬‬

‫مثلً‪:‬‬ ‫ما الذي سيحدث عندما نستدعي الجراء‪ ،‬في حدث النقر على زر ما‬
‫‪MySub‬‬

‫‪End NOT‬‬
‫‪'DO‬‬ ‫‪Sub TRY THIS AT HOME‬‬

‫()‪Private Sub Command1_Click‬‬

‫‪MySub‬‬

‫‪End Sub‬‬

‫‪Dim A As Integer‬‬

‫فيقوم‬‫والذي سف‬
‫‪Private‬‬ ‫مففا الذي سففيحدث؟ سففنستدعي الجراء المسففمى ‪MySub‬‬
‫()‪Sub MySub‬‬
‫وهكذا‬ ‫باسفتدعاء نفسفه مرة أخرى‪ ،‬ثفم يقوم باسفتدعاء نفسفه مرة أخرى‪،‬‬
‫"‪Print "Hello‬‬
‫إلى ما ل نهاية ‪.....‬‬
‫‪If A = 5 Then‬‬
‫والن لنتطور في استعماله‪ ،‬انظر المثال التالي‪:‬‬
‫‪Exit Sub‬‬

‫‪Else‬‬

‫‪A=A+1‬‬

‫‪End If‬‬

‫‪End Sub‬‬

‫()‪Private Sub Command1_Click‬‬

‫‪A=1‬‬

‫‪MySub‬‬

‫‪End Sub‬‬
‫ على‬Hello ‫ سفيتم طباعفة كلمفة‬، ‫مفا الذي سفيحدث عنفد النقفر على الزر‬
. ‫ فكر بها‬،‫النافذة خمس مرات‬

: ‫ ما رأيك بهذه ؟‬،‫ولنتطور أكثر الن‬


Private Function MyFunction)X As Integer, Y As Integer( As Integer

Static Num As Integer

If Num = X * Y Then

Exit Function

Else

Num = X + Num

MyFunction X, Y

End If

MyFunction = Num

End Function

Private Sub Command1_Click)(

MsgBox MyFunction)5 , 3(

End Sub
‫جربهفا وحاول اسفتنتاج مفا الذي حدث وتفسفيره‪ ،‬وتمرن قليل ً على العوديفة‬
‫بنفسك‬

‫أمففا الن‪ ......‬فالذي نريففد فعله هففو طباعففة جدول الضرب لعدد مففا على‬
‫النافذة‪ ،‬باسفتخدام العوديفة‪ ،‬فلو وضفع المسفتخدم ففي ‪ TextBox‬الرقفم ‪5‬‬
‫مثلً‪ ،‬ثم ضغط على زر التنفيذ‪ ،‬سيطبع التالي على الشاشة‪:‬‬
‫‪0‬‬
‫‪5‬‬
‫‪10‬‬
‫‪15‬‬
‫‪20‬‬
‫‪25‬‬
‫‪30‬‬
‫‪35‬‬
‫‪40‬‬
‫‪45‬‬
‫‪50‬‬

‫تمام؟ هيا حاول بنفسك‪ ،‬إذا فعلتها أنا‪ ،‬فسوف تفعلها أنت بإذن الله‪.‬‬

‫الحل‪:‬‬
‫ها هو ذا الحل‪:‬‬
‫(‪Private Sub Multiply)intNum As Integer‬‬

‫‪Static A As Integer‬‬

‫‪If A <= 10 Then‬‬

‫‪Print A * intNum‬‬

‫‪A = A +1‬‬

‫(‪Call Multiply)intNum‬‬

‫‪Else‬‬

‫‪A=0‬‬

‫‪End If‬‬

‫‪End Sub‬‬

‫ما الذي حدث هنا؟‬


‫عرفنا المتغير ‪ A‬ثم قمنا بالنظر‪ ،‬هل وصلت قيمته إلى ‪10‬؟ فإن لم تصل‬
‫فإنفه ينففذ عمليفة الضرب ويضرب العدد الذي يختاره المسفتخدم بالعدد ‪، A‬‬
‫ثم يزيد ‪ A‬ويعود ليكرر الجراء مرة أخرى‪ ،‬وهكذا‪ ،‬إلى أن يصل ‪ A‬إلى ‪10‬‬
‫فإنه عندها يجعل قيمة ‪ A‬هي الصفر (ربما يريد المستخدم القيام بالعملية‬
‫مرة أخرى) ‪ ،‬ثم يخرج من الجراء‪.‬‬

‫والن لنستدع الجراء‪:‬‬

‫()‪Private Sub Command1_Click‬‬

‫‪Cls‬‬

‫(‪Multiply Val)Text1.Text‬‬

‫‪End Sub‬‬

‫هنفا اسفتدعيناه ومررنفا له القيمفة الموجودة ففي الفف ‪ TextBox‬وهذا بعفد أن‬
‫قمنا بمسح ما كتب على النافذة بالمر ‪ Cls‬تمام؟؟؟؟؟‬

‫الخوارزمية الرابعة (خوارزمية رسم مستطيل بحرف ما) ‪:‬‬


‫خوارزميتنا اليوم ستكون جميلة بإذن ال‪ ،‬ما الذي سنفعله فيها؟‬

‫ل فني النن ‪ TextBox‬الول‪ ،‬ورقنم ثانني فني النن‬


‫كمنا ترى فني المشروع‪ ،‬عنند وضنع رقنم منا ‪ 7‬مث ً‬
‫‪ TextBox‬الثاني ‪ ،‬ووضع حرف @ مثلً في الن ‪ TextBox‬الثالث‪ ،‬ثم تنفذ ستجد أنه تم رسم‬
‫مستطيل قريب من هذا في الن ‪ TextBox‬الرابع‪:‬‬

‫@@@@@@@‬
‫@@@@@@@‬
‫@@@@@@@‬
‫@@@@@@@‬
‫@@@@@@@‬
‫@@@@@@@‬
‫@@@@@@@‬

‫فكيف سنقوم بهذا؟‬

‫ل ل بند منن ضبنط خاصنية ‪ MultiLine‬لمربنع الننص الرابنع إلى ‪ True‬لكني يقبنل الننص كتابنة‬ ‫أو ً‬
‫أكثر من سطر فيه‪ ،‬ثم نقوم بالذي نريده‪.‬‬
‫فلنفرض أن عندنننننا ثلثننننة متغيرات‪ ،‬هنننني الطول‪ ،‬العرض‪ ،‬والحرف الذي نرينننند أن نكتبننننه‬
‫علينننا أن نسننتخدم حلقتنني ‪ For‬متداخلتيننن لنحقننق مننا نريده‪ ،‬الذي سنننفعله هننو أننننا سنننبدأ بكتابننة‬
‫الحروف على السطر الول‪ ،‬مرة‪ ،‬مرتين‪ ،‬ثلثة ‪ ...‬إلى أن نصل إلى العرض الذي حددناه وليكن‬
‫‪ 7‬مثلً‪ ،‬عندما يصبح عدد الجروف التي كتبناها في هذا السطر هو ‪ ،7‬عندها يمكننا أن ننتقل إلى‬
‫السطر الثاني‪ ،‬لتنتقل إلى السطر الثاني يمكنك أن تكتب‪:‬‬
‫‪Text4.Text = Text4.Text + vbNewLine‬‬

‫أو ‪:‬‬
‫‪Text4.Text = Text4.Text + vbCrLf‬‬

‫أو ‪:‬‬
‫(‪Text4.Text = Text4.Text + Chr)13‬‬

‫كنننل الطرق السنننابقة سنننتجعلك تبدأ بالكتابنننة فننني سنننطر جديننند‪ ،‬طبعاً ل تننننس ضبنننط خاصنننية‬
‫‪ MultiLine‬إلى ‪ True‬وإل‪...‬‬

‫والن عندمننا ننتقننل إلى السننطر التالي نقوم بتكرار العمليننة ذاتهننا‪ ،‬ثننم ننتقننل إلى السننطر التالي‬
‫ونكررها حتى نصل إلى الرقم الذي حددناه في الطول‪ ،‬تمام؟‬

‫بقي عليك التفكير ومحاولة الفهم‪ ،‬قد يكون هناك طريقة أخرى لذلك ل تحصر دماغك في طريقة‬
‫واحدة‪ ،‬ما دام دماغك قادراً على إبداع مئات الطرق‪.‬‬

‫الحل‪:‬‬
‫هذا كود رسم المربع‪:‬‬
‫‪Dim TriangleWidth As Integer, TriangleHeight As Integer, Letter As‬‬
‫‪String, i As Integer, j As Integer‬‬

‫‪TriangleWidth = Text2.Text‬‬

‫‪TriangleHeight = Text1.Text‬‬

‫‪Letter = Text3.Text‬‬

‫"" = ‪Text4.Text‬‬

‫‪For i = 1 To TriangleHeight‬‬

‫‪For j = 1 To TriangleWidth‬‬

‫‪Text4.Text = Text4.Text & Letter‬‬

‫‪If j = TriangleWidth Then Text4.Text = Text4.Text & vbNewLine‬‬

‫‪Next‬‬

‫‪Next‬‬
‫ممممم‪ ،‬ما الذي حدث هنا؟؟؟‬
‫فلنسر مع الكود خطوة خطوة‪:‬‬
‫‪Dim RectangleWidth As Integer, RectangleHeight As Integer, Letter As‬‬
‫‪String, i As Integer, j As Integer‬‬

‫تعريف متغيرات هي‪ :‬العرض‪ ،‬الطول‪ ،‬الحرف الذي سنكتب به‪ ،‬ومتغيران‬
‫لحلقتي ‪: For‬‬
‫‪RegtangleWidth = Text2.Text‬‬
‫‪RectangleHeight = Text1.Text‬‬
‫‪Letter = Text3.Text‬‬
‫"" = ‪Text4.Text‬‬

‫وهنفا قمنفا بجعفل العرض هفو العدد المكتوب ففي ‪ Text2‬والطول هفو العدد‬
‫المكتوب فففي ‪ Text1‬والحرف هففو الحرف المكتوب فففي ‪ ،Text3‬ثففم قمنففا‬
‫بمسفح محتويات ‪ Text4‬الذي سفوف يتفم الرسفم فيفه‪ ،‬وذلك لننفا إذا أردنفا‬
‫الرسففم أكثففر مففن مرة‪ ،‬فسففوف نحتاج لن نمسففح المكتوب فففي المرة‬
‫‪For i = 1 To RectangleHeight‬‬
‫السابقة ليظهر ما نريد‪ ،‬تمام؟؟‬
‫‪For j = 1 To RectangleWidth‬‬

‫وتبدأ الحلقتان‪ ،‬يمكنفك أن تلحفظ أننفا قمنفا باسفتدعاء إحدى الحلقتيفن مفن‬
‫داخفل الثانيفة‪ ،‬لماذا؟ هنفا فلنفترض أن المتغيفر ‪ RectangleHeight‬قيمتفه‬
‫‪ ،3‬والمتغير ‪ RectangleWidth‬قيمته ‪ ،5‬عندما يدخل البرنامج أثناء سيره‬
‫إلى الحلقففة الولى‪ ،‬سففيجد الحلقففة الثانيففة مففن داخلهففا‪ ،‬ويقوم بتنفيذهففا ‪5‬‬
‫مرات‪ ،‬في كل مرة يقوم بالتالي‪:‬‬
‫‪Text4.Text = Text4.Text & Letter‬‬
‫أي أنففه فففي كففل مرة سففيضيف الحرف المحدد فففي المتغيففر ‪ Letter‬إلى‬
‫النفص المكتوب‪ ،‬فإذا وجفد أنفه قفد وصفل إلى العدد الذي حددناه ففي متغيفر‬
‫هكذا‪:‬‬
‫‪If j = RectangleWidth Then Text4.Text‬‬ ‫السطر الثاني‬
‫‪= Text4.Text‬‬ ‫العرض‪ ،‬انتقل إلى‬
‫‪& vbNewLine‬‬

‫هنا سوف يتحقق هل وصل المتغير في حلقة ‪ For‬إلى ‪ 5‬في حالتنا هذه؟‬
‫إن كان فعل ً قد وصل فإنه يضيف سطرا ً جديدا ً ‪ vbNewLine‬ثم يخرج من‬
‫الحلقة الصغيرة‪ ،‬ويجد عندها ‪ Next‬الخاصة بالحلقة الكبيرة‪ ،‬عندها سيزيد‬
‫‪ i‬مرة واحدة‪ ،‬ويعود لينففذ الحلقفة مفن جديفد‪ ،‬ويكرر العمليفة ‪ 3‬مرات ففي‬
‫مثالنا هذا لنحصل على الشكل التالي‪:‬‬

‫@@@@@‬
‫@@@@@‬
‫@@@@@‬

‫المثال‪.‬‬ ‫أرجو أن أكون قد وفقت في شرح هذا‬

‫الخوارزمية الخامسة (خوارزمية رسم مثلث قائم بحرف ما) ‪:‬‬

‫خوارزميتنا اليوم شبيهة بسابقتها‪ ،‬كما رأيتم في المثال في المرفقات السابقة‪ ،‬عند تحديد رقم معين‬
‫كطول لضلع المثلث القائم‪ ،‬وحرف معينن ليرسنم بنه‪ ،‬مثلً الطول ‪ 7‬والحرف @ فسنتكون النتيجنة‬
‫بعد ضغط الزر كالتالي‪:‬‬

‫@‬
‫@@‬
‫@@@‬
‫@@@@‬
‫@@@@@‬
‫@@@@@@‬
‫@@@@@@@‬

‫فكيف سنقوم بذلك؟‬


‫أنت أخبرني‪ .......‬لني لن أشرح هذه المرة‪ ،‬أنت من سيفكر ويحسب ويستنتج‪ ،‬طبعًا ل تنسَ‬
‫الستعانة بحلقات ‪ For‬التكرارية وطرق النتقال من سطر إلى آخر ‪vbNewLine‬‬
‫وأهم شيء ضبط خاصية ‪ MultiLine‬إلى ‪.True‬‬
‫نعم يا عزيزي‪ ....‬أنت من سيفكر ويحل‪ ،‬لنك إذا لم تملك الرادة للتعلم‪ ،‬فل أحد يستطيع تعليمك‪.‬‬

‫الحل‪:‬‬
‫ستضحك من نفسك بعد هذا الحل‪:‬‬
‫‪Dim Letter As String‬‬

‫‪Dim TriangleLength As Integer‬‬

‫‪Dim i As Integer, j As Integer‬‬

‫‪Letter = Text2.Text‬‬

‫‪TriangleLength = Text1.Text‬‬

‫"" = ‪Text3.Text‬‬

‫‪For i = 1 To TriangleLength‬‬

‫‪For j = 1 To i‬‬

‫‪Text3.Text = Text3.Text + Letter‬‬

‫‪If j = i Then Text3.Text = Text3.Text + vbNewLine‬‬

‫‪Next‬‬
‫ولنشرحه‪:‬‬
‫‪Next‬‬
‫‪Dim Letter As String‬‬
‫‪Dim TriangleLength As Integer‬‬
‫‪Dim i As Integer, j As Integer‬‬

‫عرفنفا ثلثفة متغيرات‪ :‬متغيفر الحرف الذي سفيرسم المثلث بفه‪ ،‬متغيفر طول‬
‫ضلع المثلث‪ ،‬ومتغيران لحلقتي ‪.For‬‬

‫ثفففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففم‪:‬‬
‫‪Letter = Text2.Text‬‬
‫‪TriangleLength = Text1.Text‬‬
‫"" = ‪Text3.Text‬‬

‫نجعل متغير الحرف هو ما يطبعه المتسخدم في ‪ Text2‬ومتغير الطول ما‬


‫يطبعه في ‪ Text1‬ونقوم بتفريغ مربع النص الذي سنكتب فيه‪.‬‬

‫ثفففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففم‪:‬‬
‫‪For i = 1 To TriangleLength‬‬
‫‪For j = 1 To i‬‬
‫‪Text3.Text = Text3.Text + Letter‬‬
‫‪If j = i Then Text3.Text = Text3.Text + vbNewLine‬‬
‫‪Next‬‬
‫‪Next‬‬
‫نجعل المتغير ‪ i‬يمشي من ‪ 1‬إلى الطول وليكن ‪7‬‬

‫ثففم نجعففل المتغيففر ‪ j‬يمشففي مففن ‪ 1‬أيضا ً إلى القيمففة التففي وصففل إليهففا ‪i‬‬
‫وستعرفون لماذا‪..‬‬

‫ولنتابفع سفير البرنامفج بافتراض أن متغيفر الطول يسفاوي ‪ 7‬ومتغيفر الحرف‬


‫هففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففو @‬
‫سفيدخل البرنامفج إلى الحلقفة الكفبيرة التفي متغيرهفا هفو ‪ i‬ومنهفا يدخفل إلى‬
‫الصغيرة التي متغيرها ‪ ،j‬وبما أننا كتبنا‪:‬‬
‫‪For j = 1 To i‬‬

‫فإنففه سففينظر إلى قيمففة ‪ i‬وسففيجدها واحدا ً بمفا أننففا فففي المرة الولى مففن‬
‫الحلقة‪ ،‬فيقوم بتنفيذ الوامر مرة واحدة‪ ،‬ويضيف الحرف @ إلى النص ثم‬
‫يتحقق هل أصبح المتغير ‪ j‬يساوي المتغير ‪ ، i‬وبما أن ‪ j=i=1‬فإنه سينتقل‬
‫إلى سطر جديد ويخرج من الحلقة‪..‬‬

‫ثفم يعود مفن جديفد ويزيفد قيمفة ‪ i‬مرة واحدة ويعود ليكرر العمليفة مفن جديفد‬
‫وهذه المرة سيكررها مرتين‪ ،‬لن قيمة ‪ i‬أصبحت ‪ ،2‬ثم يطبع سطرا ً جديداً‬
‫ويعود ليزيفد قيمفة ‪ i‬مرة واحدة وهكذا حتفى تصفل قيمفة ‪ i‬إلى ‪ 7‬ويكون قفد‬
‫طبع الشكل التالي في مربع النص‪:‬‬

‫@‬
‫@@‬
‫@@@‬
‫@@@@‬
‫@@@@@‬
‫@@@@@@‬
‫@@@@@@@‬

‫حاول أن تركز وتفهمها جيدا ً ‪....‬‬


‫المرحلة الثالثة‬

‫الخوارزميفة الولى (خوارزميننة رسننم مثلث متسنناوي السنناقين بحرف‬


‫ما) ‪:‬‬
‫على غرار سننابقتيها‪ ،‬هذه خوارزميننة رسننم بالحروف‪ ،‬اكتننب رقمًا مننا فنني مربننع طول الضلع‪،‬‬
‫واختر حرفاً في مربع الحرف‪ ،‬واضغط الزر لترى النتيجة‪ ،‬فلنأخذ مثلً الطول ‪ 7‬والحرف ‪: #‬‬

‫‪------#‬‬
‫‪-----###‬‬
‫‪----#####‬‬
‫‪---#######‬‬
‫‪--#########‬‬
‫‪-###########‬‬
‫‪#############‬‬

‫إذا اعتبرننا أن الخنط ‪ -‬هنو مسنافة فارغنة‪ ،‬فهذا يعنني أننك فني السنطر الول سنتضع ‪ 6‬مسنافات‬
‫فارغنة‪ ،‬وحرفاً واحداً‪ ،‬فني السنطر الثانني سنيقل عدد المسنافات واحداً ويزداد عدد الحروف اثنينن‪،‬‬
‫وهكذا حتى يصل عدد المسافات في السطر السابع إلى الصفر‪.‬‬
‫‪.‬هذه المرة لن أكتب لك كوداً‪ ،‬أنت اكتشفها بنفسك (على الورقة والقلم)‪ ،‬إذا أردت أن تعرف كيف‬
‫تضيف فراغات فأسهل طريقة هي هذه‪:‬‬
‫" " ‪Text1.Text=Text1.Text +‬‬

‫بسيطة ‪....‬‬
‫طبعًا ل تنس ما تعلمناه‪ ،‬من ‪ vbNewLine‬و خاصية ‪.... MultiLine‬‬

‫الحل‪:‬‬
‫هذا هو الكود في الصفحة التالية‪:‬‬

‫‪Dim TriangleLength As Integer‬‬

‫‪Dim Letter As String‬‬

‫‪Dim A As Integer‬‬

‫‪Dim i As Integer, j As Integer, y As Integer‬‬

‫‪TriangleLength = Text1.Text‬‬

‫‪Letter = Text2.Text‬‬

‫"" = ‪Text3.Text‬‬

‫‪A=0‬‬

‫‪For i = 1 To TriangleLength‬‬

‫‪For j = 1 To TriangleLength - i‬‬

‫" ‪Text3.Text = Text3.Text +‬‬ ‫"‬

‫‪Next‬‬

‫‪For y = 0 To A‬‬

‫‪Text3.Text = Text3.Text + Letter‬‬

‫‪Next‬‬

‫‪Text3.Text = Text3.Text + vbNewLine‬‬

‫‪A=A+2‬‬

‫‪Next‬‬
‫فلنحلل الكود‪ ،‬أولً ‪:‬‬
‫‪Dim‬‬ ‫‪TriangleLength As Integer‬‬
‫‪Dim‬‬ ‫‪Letter As String‬‬
‫‪Dim‬‬ ‫‪A As Integer‬‬
‫‪Dim‬‬ ‫‪i As Integer, j As Integer, y As Integer‬‬

‫تعريف متغير الطول‪ ،‬الحرف المستخدم في الكتابة‪ ،‬ومتغير لعدد الحروف‬


‫الذي سنكتبها في كل سطر‪ ،‬وثلثة متغيرات لجمل ‪. For‬‬

‫ثم‪:‬‬

‫‪TriangleLength = Text1.Text‬‬
‫‪Letter = Text2.Text‬‬
‫"" = ‪Text3.Text‬‬
‫‪A=0‬‬

‫نعبئ المتغيرات بالقيم الموجودة في النصوص‪ ،‬ونفرغ النص الذي سنكتب‬


‫فيفه كمفا أننفا نجعفل قيمفة المتغيفر ‪ A‬مسفاوية للصففر‪ ،‬فقفد نحتاج إلى القيام‬
‫بالعملية أكثر من مرة‪.‬‬

‫ثفففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففم‪:‬‬
‫‪For i = 1 To TriangleLength‬‬
‫‪For j = 1 To TriangleLength - i‬‬
‫" ‪Text3.Text = Text3.Text +‬‬ ‫"‬
‫‪Next‬‬
‫وهنفا ندخفل إلى الحلقفة الكفبيرة التفي متغيرهفا ‪ i‬وندخفل منهفا إلى الصفغيرة‬
‫التفي متغيرهفا ‪ j‬والتفي سفتحدث ففي المرة الولى سفت مرات ففي حال كان‬
‫طول المثلث ‪ ،،7‬وفي كل مرة تتم إضافة مسافات فارغة‪ ،‬هنا أنا وضعتها‬
‫أربع فراغات‪ ،‬يمكنك أن تضع أي عدد يناسبك من الفراغات‪.‬‬

‫ثم تأتي الحلقة الثانية‪:‬‬


‫‪For y = 0 To A‬‬
‫‪Text3.Text = Text3.Text + Letter‬‬
‫‪Next‬‬
‫‪Text3.Text = Text3.Text + vbNewLine‬‬
‫‪A=A+2‬‬
‫‪Next‬‬

‫هنا نضيف الحرف‪ ،‬يمكننا ملحظة أن المتغير ‪ A‬يزيد مرتين في كل حلقة‬


‫كبيرة‪ ،‬يعني‪ ،‬لنحلل الكود إذا كان طول الضلع ‪.7‬‬

‫الحلقفة الكفبيرة سفتحدث ‪ 7‬مرات‪ ،‬مفن واحفد إلى ‪ ،7‬ثفم ندخفل منهفا إلى‬
‫الصغيرة الولى‪ ،‬ستتكرر ‪ 6‬مرات لننا نطرح قيمة ‪ i‬من طول الضلع‪ ،‬وفي‬
‫المرة الولى سفتكون قيمفة ‪ i‬هفي واحفد‪ ،‬لذلك سفتحدث الحلقفة الصفغيرة‬
‫سفت مرات‪ ،‬وتطبفع الفراغات سفت مرات‪ ،‬ثفم تنتقفل إلى الحلقفة الثانيفة‪،‬‬
‫ستتكرر في البداية مرة واحدة‪ ،‬لننا نمشي من الصفر إلى ‪ A‬الذي قيمته‬
‫صفففر‪ ،‬ونطبففع الحرف مرة واحدة‪ ،‬ثففم نخرج مففن الحلقففة‪ ،‬نضيففف سففطراً‬
‫‪ vbNewLine‬ونزيففد قيمففة ‪ A‬مرتيففن‪ ،‬ثففم نعود إلى أول الحلقففة الكففبيرة‪،‬‬
‫وتصبح قيمة ‪ i‬هي ‪ ،2‬وتتكرر المور‪ ،‬لحظ هذه المرة أن الحلقة الصغيرة‬
‫الولى ستتكرر ‪ 5‬مرات‪ ،‬بينما تتكرر الحلقة الثانية ‪ 3‬مرات‪.‬‬

‫أرجو أن أكون قد وفقت في الشرح‪.‬‬

‫الخوارزمية الثانية (خوارزمية إيجاد قواسم عدد) ‪:‬‬


‫عدنفا إلى البتدائي‪ ...‬إذا نظرت إلى الخوارزميفة التاليفة ففي مرحلتنفا هذه‪،‬‬
‫وكتبت عددا ً ما في مربع النص‪ ،‬ثم ضغطت الزر الموجود‪ ،‬فسوف يعطيك‬
‫قواسفم العدد‪ ،‬كفل قاسفم ففي رسفالة ‪ ، MsgBox‬فمثل ً قواسفم العدد ‪18‬‬
‫هي‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪6‬‬
‫‪9‬‬
‫‪18‬‬

‫فهو يقبل القسمة على هذه العداد‪.‬‬


‫بدءا ً من خوارزميتنا هذه‪ ،‬سنقوم باستخدام الجراءات للقيام بالعمليات‬
‫التي نريدها‪ ، ،‬سنصمم إجراءً تعطيه الرقم فيعطيك مصفوفة عناصرها‬
‫قواسمه‪ ،‬من الممكن أن يكون شكل الجراء كالتالي‪:‬‬
‫(‪Private Sub FindDeviders)ByVal Num As Long, ByRef Result)( As Long‬‬

‫لحففظ الوسففيط ‪ ، )(Result‬القوسففان الفارغان يدلن على أنهففا مصفففوفة‬


‫ديناميكيففة‪ ،‬إذا لم تكففن بعففد قففد فهمففت المصفففوفات جيداً‪ ،‬وخصففوصاً‬
‫الديناميكية منها‪ ،‬فسارع إلى ذلك‪...‬‬

‫سوف أعطيك طريقة عمل هذا الجراء‪:‬‬

‫هناك بعففض الشياء التففي يجففب أن نراعيهففا عنففد حلنففا لهذه الخوارزميففة‪:‬‬
‫‪ -1‬ما هي قواسم العدد المحدد؟‬

‫‪ -2‬ما عددها؟‬

‫‪ -3‬كيف نحصل عليها؟‬

‫‪ -4‬كيف نعرض النتائج؟‬

‫سفوف نسفتعمل بالتأكيفد حلقفة ‪ For‬تكراريفة‪ ،‬تمشفي مفن الواحفد إلى العدد‬
‫الذي حددناه فففي الوسففيط ‪ ، Num‬وكلمففا وجدنففا عددا ً قاسففما ً لعددنففا هذا‬
‫باستخدام المعامل ‪ ،Mod‬أضفناه إلى مصفوفة النتائج‪ ،‬وزدنا عدد القواسم‬
‫واحداً‪ ،‬يمكنك الستفادة من جملة‪:‬‬
‫(‪ReDim Preserve Deviders)Times‬‬
‫حيففففث ‪ Deviders‬هففففي مصفففففوفة النتائج‪ ،‬و ‪ Times‬هففففو العدد الحالي‬
‫للقواسففم‪ ،‬تذكففر أنففه يجففب أن تدرس المصفففوفات جيدا ً قبففل البدء بهذه‬
‫الخوارزميفة‪ ،‬وففي النهايفة‪ ،‬تسفند القيفم التفي تجمعفت عندك ففي المصففوفة‬
‫‪ Deviders‬إلى المصفوفة ‪ Result‬كالتالي‪:‬‬
‫()‪Result)( = Deviders‬‬

‫ما رأيك بالمزيد من المساعدة؟؟؟ هذا كود الزر ‪: Command1‬‬

‫()‪Private Sub Command1_Click‬‬

‫‪Dim MyArray)( As Long‬‬

‫‪Dim Counter As Long‬‬

‫())‪Call FindDeviders)Val)Text1.Text(, MyArray‬‬

‫(‪For Counter = 0 To UBound)MyArray‬‬

‫)‪MsgBox MyArray)Counter‬‬

‫‪Next‬‬

‫‪End Sub‬‬

‫كما ترى‪ ،‬عرفنا المصفوفة الديناميكية ‪ MyArray‬وأسندنا إليها القواسم‪.‬‬

‫ثفم نعرض كفل عنصفر منهفا ففي ‪ MsgBox‬يمكنفك ملحظفة الدالة ‪UBound‬‬
‫والتفي تعيفد لك رقفم آخفر عنصفر ففي المصففوفة‪ ،‬إذا أردت الحصفول على‬
‫رقففم أول عنصففر فيهففا‪ ،‬يمكنففك اسففتخدام الدالة ‪ LBound‬أي إذا كانففت‬
‫المصفوفة فيها ‪ 9‬عناصر من ‪ 0‬إلى ‪ 8‬مثلً‪ ،‬فإن ‪ UBound‬تعطيك رقم ‪،8‬‬
‫و ‪ LBound‬تعطيك صفر‪.‬‬

‫لكننففا لن نحتاج إل إلى ‪ UBound‬فففي خوارزميتنففا هذه‪ ،‬فبدايتهففا معروفففة‬


‫بالنسفففففففففففففففبة لنفففففففففففففففا‪ ،‬على عكفففففففففففففففس نهايتهفففففففففففففففا‪.‬‬
‫حاول قراءة هذا الشرح وفهمفه جيداً‪ ،‬واستيعاب كل كلمفة منفه‪ ،‬بقي عليفك‬
‫كتابففة الجراء ‪ FindDeviders‬حاول قدر المسففتطاع‪ ،‬وفكففر على الورقففة‬
‫والقلم‪.‬‬
‫الحل‪:‬‬
‫أظفن أن هذه الخوارزميفة كانفت جديدة بعفض الشيفء عليكفم‪ ،‬لكفن ل بأس‪،‬‬
‫إن كنففت قففد حاولت ونجحففت‪ ،‬فهذا ممتاز‪ ،‬وإن كنففت قففد حاولت وفشلت‪،‬‬
‫فهذا أيضا ً ممتاز‪ ،‬أمفا إن فكرت خمفس دقائق ثفم ذهبفت‪ ،‬فهذا يعنفي أن هذا‬
‫الموضوع كله ل فائدة منه‪ ،‬فالهدف الساسي هنا‪ ،‬هو أن تتعلم كيف تفكر‬
‫في حل مشاكلك ‪.‬‬

‫وإليكم شفرة الحل ‪:‬‬

‫)‪Private Sub FindDeviders)ByVal Num As Long, ByRef Result)( As Long‬‬

‫‪Dim Times As Long‬‬

‫‪Dim Deviders)( As Long‬‬

‫‪Dim Counter As Long‬‬

‫‪For Counter = 1 To Num‬‬

‫‪If Num Mod Counter = 0 Then‬‬

‫(‪ReDim Preserve Deviders)Times‬‬

‫‪Deviders)Times( = Counter‬‬

‫‪Times = Times + 1‬‬

‫‪End If‬‬

‫‪Next‬‬

‫()‪Result)( = Deviders‬‬

‫‪End Sub‬‬

‫ما الذي فعلناه هنا؟؟‬


‫أول ً عرفنا مصفوفة ستحمل القواسم‪ ،‬ومتغيرا ً هو عدد القواسم‪ ،‬ومتغيراً‬

‫‪Dim Times As Long‬‬


‫‪Dim Deviders)( As Long‬‬
‫‪Dim Counter As Long‬‬
‫ثالثا ً لحلقة ‪: For‬‬

‫ثفم بدأنفا بحلقفة‪ ،‬تمشفي مفن الواحفد إلى العدد ‪ Num‬فإذا كان ‪ Num‬يقبفل‬
‫القسفمة على العدد الذي وصفلنا إليفه‪ ،‬أعدنفا تعريفف المصففوفة ‪Deviders‬‬
‫مففع الحتفاظ بالعناصففر التففي كانففت فيهففا ثففم نضيففف العدد ‪ Counter‬إلى‬
‫المصفوفة‪ ،‬ونزيد عدد القواسم مرة واحدة‪.‬‬

‫وبالمثال تتضفح الفكرة‪ ،‬لو اعتبرنفا أن العدد ‪ Num‬هفو ‪ ،15‬فلنبدأ بالحلقفة‬


‫‪For Counter = 1 To 15‬‬
‫التي ستصبح هكذا‪:‬‬
‫‪If 15 Mod Counter = 0 Then‬‬
‫(‪ReDim Preserve Deviders)Times‬‬
‫‪Deviders)Times( = Counter‬‬
‫‪Times = Times + 1‬‬
‫القسفمة‬
‫لحفظ أننفا وضعنفا ‪ 15‬بدل ‪ ،Num‬ثفم تبدأ الحلقفة‪ ،‬هفل ‪ 15‬تقبفل‪End If‬‬
‫على ‪ 1‬بدون باقي؟ ن عم‪ ،‬إذا ً أعد تعريف المصفوفة ‪ Deviders‬وضع في‬
‫‪Next‬ها‬
‫عنصفرا ً واحدا ً سفيكون رقمفه ‪ ،0‬لن قيمفة ‪ Times‬ل زالت صففر‪ ،‬ثفم اجعفل‬
‫قيمة هذا العنصر‪:‬‬

‫‪Deviders)0(=1‬‬

‫وزد قيمة ‪ Times‬مرة واحدة‪ ،‬ثم أكمل الحلقة‪ ،‬هل تقبل ‪ 15‬القسمة على‬
‫‪2‬؟ ل‪ ،‬إذا ً أكمففل‪ ،‬هففل تقبففل الثلثففة؟ نعففم‪ ،‬إذا ً أعففد تعريففف المصفففوفة‬
‫‪ Deviders‬ولكففن هذه المرة بعنصففرين‪ ،‬العنصففر الول (‪ )0‬كانففت قيمتففه‬
‫واحفد‪ ،‬أمفا العنصفر الثانفي (‪ )1‬سفتصبح قيمتفه ‪ ،3‬ونزيفد ‪ Times‬مرة واحدة‬
‫ونكمففل‪ ....‬إلى أن ننهففي العداد كلهففا‪ ،‬ثففم نضففع كففل عناصففر المصفففوفة‬
‫‪ Deviders‬في المصفوفة ‪. Result‬‬

‫حاول قراءة الشرح جيداً‪ ،‬والتفكير بطرق أخرى لحل هذه الخوارزمية‪.‬‬

‫الخوارزمية الثالثة (خوارزمية كتابة العداد غير الولية( ‪:‬‬


‫ل فني‬
‫مممممممممممممنم‪ ...‬إذا جربنت خوارزميتننا الثالثنة فني هذه المرحلة‪ ،‬وكتبنت العدد ‪ 15‬مث ً‬
‫مربع النص‪ ،‬ثم ضغطت الزر‪ ،‬فسوف تظهر لك رسائل ‪ MessageBoxes‬تحوي هذه العداد‪:‬‬
‫‪1‬‬
‫‪4‬‬
‫‪6‬‬
‫‪8‬‬
‫‪9‬‬
‫‪10‬‬
‫‪12‬‬
‫‪14‬‬
‫‪15‬‬

‫يمكننك ملحظنة أن هذه العداد هني العداد غينر الولينة المحصنورة بينن الواحند والنن ‪ ،15‬فهنو‬
‫يعطيك رسالة بكل عدد غير أولي حتى يصل إلى العدد الذي حددته‪.‬‬
‫سوف نناقش هنا بعض المفاهيم‪:‬‬
‫ما هو العدد الولي؟‬
‫هو كل عدد صحيح طبيعي أكبر تماماً من الواحد‪ ،‬ول يقبل القسمة إل على نفسه أو على الواحد‪.‬‬
‫وأظن هذا معروفاً ولكن للتذكرة‪ ،‬وللتأكيد على أن العدد واحد ل يعتبر عدداً أولياً‪.‬‬
‫في تمريننا هذا سنستعمل دالة وإجراء‪ ،‬الدالة هي‪:‬‬
‫‪Private Function IsPrimary)ByVal Number As Long( As Boolean‬‬

‫وسنننوف نسنننتعملها لنعرف هنننل العدد ‪ Number‬أولي أو ل‪ ،‬فإذا كان العدد أوليًا تعيننند لك الدالة‬
‫‪ True‬وإذا لم يكن تعيد ‪. False‬‬
‫فني هذه الدالة يمكنننا فني البداينة أن نختنبر العدد‪ ،‬هنل هنو الواحند؟ فإن كان فهنو غينر أولي حسنب‬
‫التعريف‪ ،‬فنعيد ‪ False‬ونخرج من الدالة عن طريق ‪. Exit Function‬‬
‫ثم نكمل الدالة إن لم يكن واحداً ونبدأ حلقة تكرارية من العدد ‪ Number-1‬إلى ‪( 2‬حاول أن تفكر‬
‫لماذا( ونجرب قسمة العدد ‪ Number‬على كل عدد في هذه الحلقة‪ ،‬فإن قبل القسمة على أي منها‬
‫أسنندنا قيمنة ‪ False‬إلى الدالة وخرجننا منهنا‪ ،‬وإل فنكمنل‪ ،‬وفني النهاينة إن أنهنى الحلقنة ولم يخرج‬
‫بعد من الدالة فهذا يعني أننا جربنا القسمة على كل العداد ولم ننجح‪ ،‬وعندها نسند ‪. True‬‬
‫أما الجراء الذي سنستعمله فهو‪:‬‬
‫‪Private Sub WriteUnPrimaryNumbers)ByVal Number As Long, ByRef Result)( As‬‬
‫(‪Long‬‬

‫وفني هذا الجراء سننمشي فني حلقنة منن الواحند إلى ‪ Number‬ونتحقنق‪ ،‬هنل العدد أولي بواسنطة‬
‫الدالة ‪ IsPrimary‬هكذا مثلً‪:‬‬
‫‪If IsPrimary)Number( Then‬‬

‫أو‪:‬‬
‫‪If Not IsPrimary)Number( Then‬‬
‫فإذا وجدننننا العدد غينننر أولي أضفناه إلى مصنننفوفة العداد ‪ )(Result‬بالطريقنننة نفسنننها فننني‬
‫خوارزميتنا السابقة‪.‬‬

‫وفي النهاية‪ ،‬نضع شفرة ‪ ، Command1_Click‬حاول أن تفكر بها‪ ،‬هي شبيهة جدًا بسابقتها‪.‬‬

‫فكر بالحل ‪...‬‬

‫الحل‪:‬‬
‫يبدو أن المور قد بدأت تتعقد ‪ ..‬هذه هي الدالة ‪: IsPrimary‬‬
‫‪Private Function IsPrimary)ByVal Number As Long( As Boolean‬‬

‫‪Dim Counter As Long‬‬

‫نتحقق‪ If،‬هل‬
‫‪Number‬‬ ‫‪= 1 Then‬‬
‫البداية‬ ‫يساوي الواحد؟ فإذا كان فالواحد عدد ‪ Number‬في‬
‫‪IsPrimary‬ونسند‬
‫‪=False‬غير أولي‪،‬‬
‫‪False‬‬

‫‪Exit Function‬‬

‫‪End If‬‬

‫‪For Counter = Number - 1 To 2 Step -1‬‬

‫‪If Number Mod Counter = 0 Then‬‬

‫‪IsPrimary = False‬‬

‫‪Exit Function‬‬

‫‪End If‬‬

‫‪Next‬‬

‫‪IsPrimary = True‬‬

‫‪End Function‬‬

‫ونخرج من الدالة‪ ،‬وإن لم يكن نكمل‪..‬‬

‫ثففم نتحقففق مففن قسففمة العدد ‪ Number‬على كففل العداد الصففحيحة بيففن‬
‫‪ Number-1‬و ‪ ،2‬فإن قبل القسمة فهو غير أولي‪ ،‬وخرجنا من الدالة‪ ،‬وإل‬
‫أكملنفا‪ ،‬وعندمفا تنتهفي الحلقفة دون أن نخرج مفن الدالة فهذا يعنفي أن العدد‬
‫أولي‪ ،‬ونسند ‪. True‬‬
Private Sub WriteUnPrimaryNumbers)ByVal Number As Long, ByRef
Result)( As Long)

Dim Counter As Long


: WriteUnPrimaryNumbers ‫والن الجراء‬

Dim Numbers As Long

For Counter = 1 To Number

If Not IsPrimary)Counter( Then

‫استعملنا دالتنا‬
ReDim‫كيف‬ ‫لحظ‬Result)Numbers(
Preserve ،‫إنه شبيه بإجرائنا في خوارزميتنا السابقة‬
IsPrimary Result)Numbers( = Counter

Numbers = Numbers + 1

End If

Next

End Sub

‫ فإن كان غيففر أولي أعدنففا تعريففف‬،‫لنعرف هففل العدد أولي أو غيففر أولي‬
.‫ إنها كمثالنا السابق‬،‫ فكر بها‬،‫ وأضفناه لها‬Result ‫المصفوفة‬

:‫ يأتي في النهاية‬Command1_Click ‫والحدث‬


Private Sub Command1_Click)(

Dim MyArray)( As Long

Dim Counter As Long

WriteUnPrimaryNumbers Val)Text1.Text(, MyArray)(

For Counter = LBound)MyArray( To UBound)MyArray(

MsgBox MyArray)Counter(

Next

End Sub

‫ للتعففبير عففن بدايففة المصفففوفة‬LBound ‫ لحففظ اسففتعمال‬،‫أيضا ً كالسففابق‬


.‫ للتعبير عن نهايتها‬UBound ‫ و‬MyArray

‫أليست كذلك؟؟؟‬... ‫جميلة ولذيذة‬


‫الخوارزمية الرابعة (خوارزمية ‪: ) Fibonacci‬‬
‫اسم غريب على بعضنا‪ ،‬صحيح ؟؟‬
‫لكن ل تقلقوا‪ ،‬فهي سهلة بإذن ال‪.‬‬
‫هذه الخوارزمية تقدم سلسلة أعداد كالتالي‪:‬‬
‫‪.......21___13___8___5___3___2___1___1___0‬‬

‫منا الممينز فني هذه العداد؟ فني البداينة نبدأ بالصنفر‪ ،‬ثنم الواحند‪ ،‬ثنم يكون كنل رقنم هنو مجموع‬
‫الرقمين السابقين له‪ ،‬انظر معي‪:‬‬
‫‪1=1+0‬‬
‫‪2=1+1‬‬
‫‪3=2+1‬‬
‫‪5=3+2‬‬
‫‪8=5+3‬‬
‫‪13 = 8 + 5‬‬
‫‪21 = 13 + 8‬‬
‫‪...‬‬
‫‪...‬‬

‫حاول استنتاج العداد التي بعدها‪...‬‬


‫سوف نستعمل في خوارزميتنا هذه إجراء ندعوه ‪ Fibonacci‬هذا الجراء شكله كالتالي‪:‬‬

‫(‪Private Sub Fibonacci)Numbers As Long, Result)( As Long‬‬

‫تأخنذ الدالة وسنيطتين‪ ،‬الولى ‪ Numbers‬وتمثنل عدد الرقام التني نريدهنا‪ ،‬والثانينة ‪)(Result‬‬
‫وهي تعيد مصفوفة النتائج‪.‬‬
‫يمكنك في بداية هذه الدالة إعادة تعريف المصفوفة ‪ )(Result‬كالتالي‪:‬‬
‫‪ReDim Result)Numbers - 1( As Long‬‬

‫وبهذا‪ ،‬إن رغنب المسنتخدم بعرض خمسنة أعداد منن هذه السنلسلة مثلً‪ ،‬فإننه سنوف يمرر العدد ‪5‬‬
‫إلى السلسلة‪ ،‬وسوف يحدث التالي في البرنامج‪:‬‬

‫‪ReDim Result)4( As Long‬‬


:‫ فهذا يعني أن عندنا خمسة عناصر هي كالتالي‬،‫وبما أن عناصر المصفوفة تبدأ من الصفر‬
Result)0( = 0
Result)1( = 1
Result)2( = 1
Result)3( = 2
Result)4( = 3

:‫ في خوارزميتنا هذه‬،ً‫إذا‬

..‫العنصر (صفر) قيمته تساوي الصفر‬

..‫العنصر (واحد) قيمته تساوي الواحد‬

.‫باقي العناصر قيمتها مجموع الرقمين الذين يسبقانها‬

...‫ على الورق‬...‫ وكالعادة‬،‫ بل سأتركك لتفكر وتستنتج‬،‫لن أشرح كثيراً في مثالنا هذا‬

:‫الحل‬
:‫وهذا حل خوارزميتنا الخيرة‬
Private Sub Fibonacci)Numbers As Long, Result)( As Long)

Dim Counter As Integer

ReDim Result)Numbers - 1( As Long

Select Case Numbers

Case 1

Result)0( = 0

Case 2

Result)0( = 0

Result)1( = 1

Case Is > 2

Result)0( = 0

Result)1( = 1

For Counter = 2 To UBound)Result(

Result)Counter( = Result)Counter - 1( + Result)Counter - 2(

Next

End Select

End Sub
: Number -1 ‫ بالعدد‬Result ‫ نعيد تعريف المصفوفة‬،ً‫أول‬

ReDim Result)Numbers - 1( As Long

ً‫ فهذا يعنفي أن فيفه عنصفرا‬1 ‫ فإن كانفت قيمتفه‬Numbers ‫ثفم نختفبر العدد‬
‫ فهذا يعنفففي أن فيفففه‬،2 ‫ وإن كانفففت قيمتفففه‬،‫ نضبطفففه إلى الصففففر‬،ً‫واحدا‬
،‫ وإن كانفت أكفبر مفن الثنيفن‬،ً‫ نجعفل الول صففرا ً والثانفي واحدا‬،‫عنصفرين‬
‫ وما بقي من العداد يكون‬،ً‫ والثاني واحدا‬،ً‫نجعل قيمة العنصر الول صفرا‬
:‫مجموعا ً للعددين الذين قبله‬
Select Case Numbers
Case 1
Result)0( = 0
Case 2
Result)0( = 0
Result)1( = 1
Case Is > 2
Result)0( = 0
Result)1( = 1
For Counter = 2 To UBound)Result(
Result)Counter( = Result)Counter - 1( + Result)Counter - 2(
Next
End Select

:‫ فهو كالتالي‬Command1_Click ‫أما الجراء‬


Private Sub Command1_Click)(

Dim MyArray)( As Long


Dim Counter As Integer

Fibonacci Val)Text1.Text(, MyArray)(

For Counter = LBound)MyArray( To UBound)MyArray(


MsgBox MyArray)Counter(
Next

End Sub
‫وقد طرقنا بابه في خوارزميتينا السابقتين‪.‬‬

‫حاول فهم الكود جيداً‪ ،‬وتطبيقه ‪...‬‬


‫وبهذا‪ ،‬فقد أنهينا دورتنا‪ ،‬وأرجو الله أن أكون قد أفدت بهذه السلسلة‪.‬‬

‫إن كانفففففففففففت هناك أيفففففففففففة تعليقات‪ ،‬انتقادات‪ ،‬ملحظات‪ ،‬اقتراحات‪،‬‬


‫استفسارات‪.....‬‬

‫فأرجو أن ل تبخلوا علي بها‪ ،‬وترسلوها لي على البريد اللكتروني‪:‬‬

‫‪Abboodd_dude@hotmail.com‬‬

‫أخوكم‪:‬‬

‫عبد الرحمن عدنان الحملي‬

You might also like