0% found this document useful (0 votes)
12 views68 pages

Introducing Small Basic

تقدم الوثيقة مقدمة عن لغة البرمجة Small Basic، التي تهدف إلى تسهيل تعلم البرمجة للمبتدئين. تتضمن الوثيقة شرحًا للبيئة الخاصة بـ Small Basic وكيفية كتابة وتشغيل أول برنامج بسيط. كما تتناول الوثيقة مفاهيم أساسية مثل الأوامر والمتغيرات وكيفية التفاعل مع المستخدم.

Uploaded by

bahaduryaar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
12 views68 pages

Introducing Small Basic

تقدم الوثيقة مقدمة عن لغة البرمجة Small Basic، التي تهدف إلى تسهيل تعلم البرمجة للمبتدئين. تتضمن الوثيقة شرحًا للبيئة الخاصة بـ Small Basic وكيفية كتابة وتشغيل أول برنامج بسيط. كما تتناول الوثيقة مفاهيم أساسية مثل الأوامر والمتغيرات وكيفية التفاعل مع المستخدم.

Uploaded by

bahaduryaar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 68

Microsoft Small Basic

‫مقدمة فى البرمجة‬
‫الفصل ‪1‬‬
‫مقدمــة‬

‫‪ Small Basic‬واىجــرٍجـــــخ‬
‫البرمجة هى عملٌة تكوٌن برنامج باستخدام لغة البرمجة‪ .‬كما نفهم ونتحدث االنجلٌزٌة او االسبانٌة او الفرنسٌة‪ٌ ،‬ستطٌع اكمبٌوتر ان ٌفهم‬
‫البرامج المكتوبة بلغات معٌنة‪ .‬تسمى هذه اللغات لغات البرمجة‪ .‬فى البداٌة كان هناك عدد قلٌل من لغات البرمجة وكان من السهل ان‬
‫تفهم وتتعلم هذه اللغات‪ .‬ولكن مع زٌادة تعقٌد اجهزة الكمبٌوتر والبرامج‪ ،‬تطورت لغات البرمجة بسرعة لتشمل مفاهٌم اكثر تعقٌدا على‬
‫مدار الوقت‪ .‬بالتالى اصبحت غالبٌة لغات البرمجة الحدٌثة والمفاهٌم الخاصة بها صعبة الفهم بالنسبة للمبتدىء‪ .‬وقد بدأت هذه الحقٌقة‬
‫تثبٌط الناس من التعلم أو محاولة برمجة الكمبٌوتر‪.‬‬

‫‪ Small Basic‬هو لغة برمجة مصممة خصٌصا لجعل البرمجة سهلة للغاٌة وممتعة بالنسبة للمبتدبٌن‪ .‬الهدف من ‪ Small Basic‬كسر‬
‫الحاجز وتوفٌر الخطوات االولى الى عالم البرمجة الرابع‪.‬‬

‫اىجيئخ اىخبصخ ثبىـ ‪Small Basic‬‬


‫لنبدأ بمقدمة سرٌعة فى البٌبة الخاصة بـ ‪ .Small Basic‬عندما تبدأ تشغٌل ‪ Small Basic‬سوف ترى اطار مماثل للرسم التوضٌحى‬
‫التالى‪.‬‬
‫‪2‬‬

‫‪1‬‬

‫‪3‬‬
‫الشكل ‪ 1‬البيئة الخاصة بـ ‪Small Basic‬‬

‫هذه هى البٌبة الخاصة بالــ ‪ Small Basic‬التى سوف تقوم فٌها بكتابة وتشغٌل برامج الــ ‪ .Small Basic‬هذه الٌٌبة تشمل العدٌد من‬
‫العناصر التى تم تعرٌفها باالرقام‪.‬‬

‫المحرر‪ ،‬معرف بــ (‪ )1‬هو المكان الذى سنقوم فٌه بكتابة برامج الــ ‪ .Small Basic‬عندما تقوم بفتح نموذج لبرنامج (‪ )Template‬او‬
‫برنامج تم حفظه مسبقا‪ ،‬سوف ٌظهر على هذا المحرر‪ٌ .‬مكنك بعد ذلك تعدٌله وحفظه لالستخدام فٌما بعد‪.‬‬

‫ٌمكنك اٌضا ان تقوم بفتح وتشغٌل اكثر من برنامج فى وقت واحد‪ .‬كل برنامج تقوم بتشغٌله سٌتم عرضه فى محرر منفصل‪ .‬المحرر‬
‫الذى ٌحتوى على البرنامج الذى تقوم بتشغٌله حالٌا ٌسمى بــ المحرر النشط‪.‬‬

‫شرٌط االدوات‪ ،‬المعرف ب (‪ٌ )2‬ستخدم فى اصدار اوامر اما الى المحرر النشط او الى البٌبة‪ .‬سوف نتعلم االوامر المختلفة فى شرٌط‬
‫االدوات الحقا‪.‬‬

‫السطح‪ ،‬المعرف بـ (‪ )3‬هو المكان الذى تظهر فٌه اطارات المحرر‪.‬‬

‫ثرّبٍجْب االوه‬
‫بما انك اصبحت مالوفا بالبٌبة الخاصة بــ ‪ ،Small Basic‬سوف نبدا البرمجة فٌها‪ .‬كما هو موضح اعاله‪ ،‬المحرر هو المكان الذى نكتب‬
‫فٌه برامجنا‪ .‬فهٌا بنا نبدأ بكتابة السطر التالى فى المحرر‪.‬‬

‫)"‪TextWindow.WriteLine("Hello World‬‬

‫هذا هو برنامجنا االول فى الـ ‪ .Small Basic‬ولو قمت بكتابته صحٌحا‪ ،‬سوف ترى شٌبا مماثال للرسم التوضٌحى اسفل‪.‬‬
‫الشكل ‪ - 2‬اول برنامج‬

‫بما اننا قمنا بكتابة برنامجنا الجدٌد‪ ،‬هٌا نقوم بتشغٌله لنرى ماذا سٌحدث‪ٌ .‬مكننا ان نقوم بتشغٌل برنامجنا اما بالنقر على زر التشغٌل‬
‫الموجود على شرٌط االدوات او باستخدام مفتاح االختصار ‪ F5‬الموجود على لوحة المفاتٌح‪ .‬لو كل شىء تم على ما ٌرام‪ ،‬سٌتم تشغٌل‬
‫برنامجنا وستكون النتابج كما هو موضح اسفل‪.‬‬

‫الشكل ‪ – 3‬اول اخراج لبرنامج‬

‫مبروك! لقد قمت بكتابة وتشغٌل اول برنامج ‪ .‬هو برنامج صغٌر جدا وسهل‪ ،‬ولكن فى نفس الوقت خطوة كبٌرة لكى تصبح مبرمج‬
‫حقٌقى! اآلن‪ٌ ،‬جب ان نغطى تفصٌلة واحدة اضافٌة قبل ان نقوم بعمل برامج اكبر‪ٌ .‬جب ان نفهم ماذا حدث – ماذا قلنا لجهاز الكبٌوتر‬
‫وكٌف عرف جهاز الكمبٌوتر ماذا ٌفعل؟ فى الفصل التالى‪ ،‬سنقوم بتحلٌل البرنامج الذى قمنا بكتابته‪ ،‬لكى نفهم ماذا ٌحدث‪.‬‬

‫الشكل ‪Intellisense - 4‬‬


‫دفظ ثرّبٍجْب‬
‫اذا اردت ان تغلق الــ ‪ Small Basic‬وتقوم بتشغٌل البرنامج الذى انتهٌت من كتابته فى وقت الحق‪ٌ ،‬مكنك ان تحفظ البرنامج‪ .‬اٌضا حفظ‬
‫البرامج من ان آلخر عادة مفٌدة حتى ال تفقد المعلومات فى حالة اٌقاف التشغٌل الطارىء او فى حالة انقطاع الطاقة‪ٌ .‬مكنك ان تقوم‬
‫بحفظ برنامجك الحالى بالنقر على رمز "حفظ" الموجود بشرٌط االدوات او باستخدام االختصار ”‪( ”Ctrl+S‬اضغط على مفتاح ‪ S‬مع‬
‫استمرارٌة الضغط على مفتاح ‪.)Ctrl‬‬
‫الفصل ‪2‬‬
‫فهٌ ثرّبٍجْب االوه‬

‫ٍب هى ثرّبٍج اىنَجيىتر؟‬


‫البرنامج هو مجموعة من االوامر الموجهة الى الكمبٌوتر‪ .‬هذه االوامر تحدد للكمبٌوتر ماذا ٌفعل بالتفصٌل‪ ،‬وغالبا ما ٌتبع الكمبٌوتر هذه‬
‫االوامر‪ .‬الكمبٌوتر مثل االشخاص‪ٌ ،‬قوم فقط باتباع االوامر اذا كانت بلغة ٌفهمها‪ .‬تسمى هذه االوامر بلغات البرمجة‪ .‬هتاك العدٌد من‬
‫لغات البرمجة التى ٌفهمها الكمبٌوتر والــ ‪ Small Basic‬واحدة منها‪.‬‬

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

‫ثراٍج اىـ ‪Small Basic‬‬


‫برنامج الـ ‪ Small Basic‬االمثل ٌحتوى على مجموعة من العبارات‪ .‬كل سطر بالبرنامج ٌمثل عبارة وكل عبارة هى امر موجه‬
‫سٌأخذ الكمبٌوتر البرنامج وٌقرأ العبارة االولى‪ٌ .‬فهم ماذا نحاول ان نقول ثم‬ ‫للكمبٌوتر‪ .‬عندما نسال الكمبٌوتر ان ٌقوم بتنفٌذ برنامج‬
‫ٌقوم بتنفٌذ االمر‪ .‬عندما ٌنتهى الكمبٌوتر من تنفٌذ العبارة االولى‪ ،‬سوف ٌعود مرة اخرى الى البرنامج وٌقرأ وٌنفذ السطر التالى‪ .‬تستمر‬
‫هذه العملٌة حتى نهاٌة البرنامج‪.‬‬

‫عىدح اىً ثرّبٍجْب االوه‬


‫هذا هو اول برنامج كتبناه‪.‬‬

‫)"‪TextWindow.WriteLine("Hello World‬‬

‫هذا برنامج بسٌط ٌحتوى على عبارة واحدة‪ .‬هذه العبارة تقول للكمبٌوتر ان ٌكتب سطر واحد من النص ‪ Hello World‬فى اطار النص‪.‬‬
‫‪Write Hello World‬‬

‫قد تكون الحظت ان هذه العبارة ٌمكن ان تقسم الى اجزاء اصغر كما تقسم العبارات الى كلمات‪ .‬العبارة االولى االولى مقسمة الى ‪3‬‬
‫اجزاء‪:‬‬

‫أ) ‪TextWindow‬‬
‫ب) ‪WriteLine‬‬
‫ج) ”‪“Hello World‬‬

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

‫قد تتذكر االطار االسود الذى ظهر عندما قمنا بتشغٌل برنامجنا االول‪ .‬هذا االطار االسود ٌسمى بــ ‪ Text Window‬وفى بعض‬
‫االحٌان ٌسمى بــ ‪ .Console‬هذا هو المكان الذى ٌظهر فٌه نتٌجة البرنامج‪، Text Window.‬فى برنامجنا‪ ،‬تسمى بالكابن‪ .‬هناك العدٌد‬
‫من هذه الكابنات متاحة لنا لكى نستخدمها فى برامجنا‪ٌ .‬مكن ان نقوم بالعدٌد من العملٌات المختلفة على هذه الكابنات‪ .‬لقد استخدمنا بالفعل‬
‫العملٌة ‪ WriteLine‬فى برنامجنا‪ .‬قد تكون الحظت اٌضا ان العملٌة ‪ٌ WriteLine‬لٌها ‪ Hello World‬بٌن عالم اقتباس‪.‬تم تمرٌر هذا‬
‫النص كمدخالت الى العملٌة ‪ ، WriteLine‬الذى ٌتم طباعته للمستخدم‪ٌ .‬سمى هذا بمدخالت العملٌة‪ .‬بعض العملٌات تاخد واحد او اكثر‬
‫من المدخالت بٌنما ال تاخذ العملٌات االخرى اى مدخالت‪.‬‬

‫ثرّبٍجْب اىثبًّ‬
‫بما انك استوعبت برنامجنا االول‪ ،‬هٌا نجعله اجمل عن طرٌق اضافة بعض االلوان‪.‬‬

‫"‪TextWindow.ForegroundColor = "Yellow‬‬
‫)"‪TextWindow.WriteLine("Hello World‬‬
‫الشكل ‪ – 5‬اضافة االلوان‬

‫عندما تقوم بتنفٌذ البرنامج الموضح اعاله‪ ،‬ستالحظ انه ٌتم طباعة نفس النص”‪ “Hello World‬داخل الــ ‪ ،TextWindow‬ولكن هذه‬
‫المرة ٌتم طباعته باللون االصفر بدال من اللون الرمادى مسبقا‪.‬‬

‫الشكل ‪ Hello World - 6‬باللون االصفر‬

‫الحظ العبارة الجدٌدة التى قمنا باضافتها الى البرنامج االصلى‪ٌ .‬ستخدم البرنامج هنا كلمة جدٌدة‪ ForegroundColor ،‬والتى تم‬
‫معادلتها الى القٌمة ”‪ .“Yellow‬هذا ٌعنى اننا قمنا بتعٌٌن ”‪ “Yellow‬الى ‪ . ForegroundColor‬اآلن‪ ،‬الفرق بٌن‬
‫‪ ForegroundColor‬والعملٌة ‪ WriteLine‬هو ان ‪ ForegroundColor‬لم تستخدم اى مدخالت او اى اقواس‪ .‬بدال من ذلك تم اتباعها‬
‫بعالمة ٌساوى ثم كلمة‪ .‬نحن نعرف ‪ ForegroundColor‬بانها خاصٌة لــ ‪ . TextWindow‬هذه قابمة بالقٌم الصالحة لخاصٌة‬
‫‪ .ForegroundColor‬حاول استبدال ”‪ “Yellow‬بواحد من هذه القٌم وراقب النتٌجة – ال تنسى عالمات االقتباس‪ ،‬هى احد عالمات‬
‫الترقٌم المطلوبة‪.‬‬

‫‪Black‬‬
‫‪Blue‬‬
‫‪Cyan‬‬
‫‪Gray‬‬
‫‪Green‬‬
‫‪Magenta‬‬
‫‪Red‬‬
White
Yellow
DarkBlue
DarkCyan
DarkGray
DarkGreen
DarkMagenta
DarkRed
DarkYellow
‫الفصل ‪3‬‬
‫ٍقذٍخ فً اىَتغيراد‬

‫استخذاً اىَتغيراد فً ثرّبٍجْب‬


‫الٌس لطفٌا لو ان برنامجنا ٌستطٌع ان ٌقول ”‪ “Hello‬مقترنا باسم المستخدم بدال من قوله ”‪ “Hello‬بصفة عام‪ .‬حتى ٌمكننا فعل ذلك‬
‫ٌجب ان نسال المستخدم عن اسمه‪/‬اسمها ثم نقوم بحفظه فى مكان ما ثم نقوم بطباعة ”‪ “Hello‬مقترنا باسم المستخدم‪ .‬هٌا نرى كٌف‬
‫نفعل ذلك‪:‬‬

‫)" ‪TextWindow.Write("Enter your Name:‬‬


‫)(‪name = TextWindow.Read‬‬
‫)‪TextWindow.WriteLine("Hello " + name‬‬

‫عندما تقوم بكتابة وتنفٌذ هذا البرنامج‪ ،‬سترى هذا االخراج‪:‬‬

‫الشكل ‪ – 7‬السؤال عن اسم المستخدم‬

‫و عندما تقوم بكتابة اسمك والضغط على زر ‪ ،ENTER‬سترى هذا االخراج‪:‬‬

‫الشكل ‪ - 8‬ترحيب دافئ‬


‫اذا قمت بتشغٌل البرنامج مرة اخرى‪ ،‬سٌوجهلك نفس السؤال مرة اخرى‪ٌ .‬مكنك كتابة اسم مختلف وفى هذه الحالة سٌقول الكمبٌوتر‬
‫‪ Hello‬مقترنا بهذا االسم‪.‬‬

‫تذييو اىجرّبٍج‬
‫فى البرنامج الذى تم تشغٌله‪ ،‬هذا هو السطر الذى قد ٌكون جذب انتباهك‪:‬‬

‫)(‪name = TextWindow.Read‬‬

‫)(‪ Read‬مماثل لــ )(‪ ،WriteLine‬ولكن بدون مدخالت‪ .‬انها العملٌة التى تقول للكمبٌوتر ان ٌنتظر المتسخدم حتى ٌقوم بكتابة شا ما‬
‫والضغط على مفتاح ‪ .Enter‬بمجرد ان ٌقوم المستخدم بالضغط على مفتاح ‪ ،Enter‬تقوم هذه العملٌة باخذ ما كتبه المستخدم واعادته‬
‫للبرنامج‪ .‬النقطة المثٌرة لالنتباه هنا ان اى شىء كتبه المستخدم تم حفظه فى متغٌر ٌسمى ‪ٌ .name‬مكن تعرٌف المتغٌر بانه مكان لحفظ‬
‫القٌم بصورة مؤقتة الستخدامها فٌما بعد‪ .‬فى السطر الموضح اعاله‪ ،‬تم استخدام ‪ name‬لحفظ اسم المستخدم‪.‬‬

‫السطر التالى اٌضا مثٌر لالهتمام‪:‬‬

‫)‪TextWindow.WriteLine("Hello " + name‬‬

‫هذا هو المكان الذى ستقوم فٌه باستخدام القٌمة التى تم حفظها فى المتغٌر ‪ .name‬نأخذ القٌمة الموجودة بــ ‪ name‬ونلحقها بــ ”‪“Hello‬‬
‫ونكتبها فى اطار النص‪.‬‬
‫‪ ،Write‬تماما كما ‪ WriteLine‬هى عملٌة اخرى فى‬
‫بمجرد ان ٌتم تعٌٌن المتغٌر‪ٌ ،‬مكنك استخدامه اى عدد من‬ ‫‪ Write .ConsoleWindow‬تتٌح لك كتابة شا ما الى‬
‫المرات‪ .‬على سبٌل المثال‪ٌ ،‬مكنك عمل التالى‪:‬‬ ‫‪ ConsoleWindow‬ولكنه ٌسمح للنص التالى ان ٌكون‬
‫على نفس سطر النص الحالً‪.‬‬

‫)" ‪TextWindow.Write("Enter your Name:‬‬


‫)(‪name = TextWindow.Read‬‬
‫)" ‪TextWindow.Write("Hello " + name + ".‬‬
‫)"?" ‪TextWindow.WriteLine("How are you doing " + name +‬‬

‫و سترى هذا االخراج‪:‬‬

‫الشكل ‪ - 9‬اعادة استخدام المتغير‬


‫قىاعذ تسَيخ اىَتغيراد‬
‫المتغٌرات لها اسماء مقترنة بها حتى ٌمكنك التعرف علٌهم‪ .‬هناك قواعد معٌنة سهلة وارشادات جٌدة خاصة بتسمٌة المتغٌرات كتالى‪:‬‬

‫االسم ٌجب ان ٌبدأ بحرف وٌجب اال ٌكون أى من الكلمات االساسٌة مثل ‪.if, for, then, etc‬‬ ‫‪.1‬‬
‫االسم ٌمكن ان ٌحتوى من اى مزٌج من الحروف‪ ،‬األرقام والشرط السفلٌة‪.‬‬ ‫‪.2‬‬
‫المتغٌرات ٌمكن أن تكون طوٌلة كما ترٌد ‪ ،‬لذا من المفٌد أن ٌكون اسم المتغٌر ذات معنى معبر‬ ‫‪.3‬‬
‫اسم المتغٌر ٌعبر عن طرٌقة استخدامه‬ ‫‪.4‬‬

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

‫‪number1 = 10‬‬
‫‪number2 = 20‬‬
‫‪number3 = number1 + number2‬‬
‫)‪TextWindow.WriteLine(number3‬‬

‫عندما تقوم بتشغٌل هذا البرنامج ستجد هذا االخراج‪:‬‬

‫الشكل ‪ – 10‬جمع رقمين‬

‫فى السطر االول من البرنامج‪ ،‬ستقوم بتعٌٌن القٌمة ‪ 10‬الى المتغٌر ‪ .number1‬وفى السطر الثانى‪ ،‬ستقوم بتعٌٌن القٌمة ‪ 22‬الى‬
‫المتغٌر ‪ .number2‬فى السطر الثالث‪ ،‬ستقوم بأضافة المتغٌر ‪ number1‬و‪ number2‬وتعٌٌن النتٌجة الى المتغٌر ‪.number3‬‬
‫بالتالى‪ ،‬فى هذه الحالة المتغٌر ‪ number3‬ستكون قٌمته ‪ .32‬وهذا ما تم طباعته فى اطار النص‪.‬‬

‫اآلن‪ ،‬هٌا نقوم بتعدٌل البرنامج قلٌال ومالحظة النتابج‪:‬‬

‫‪number1 = 10‬‬
‫‪number2 = 20‬‬
‫‪number3 = number1 * number2‬‬
‫)‪TextWindow.WriteLine(number3‬‬

‫سٌقوم البرنامج الموضح اعاله بضرب ‪ number1‬فى‬


‫‪ number2‬وحفظ النتٌجة فى ‪ .number3‬وٌمكنك ان ترى‬ ‫الحظ أنه ال ٌوجد عالمات اقتباس حول األرقام‪ .‬وذلك ألن‬
‫نتٌجة هذا البرنامج ادناه‪:‬‬ ‫عالمات االقتباس لٌست ضرورٌة لألرقام‪ .‬تحتاج فقط الى‬
‫عالمات االقتباس عندما تستخدم النص‪.‬‬
‫الشكل ‪ – 11‬ضرب رقمين‬

‫ٌمكنك ان تقوم بطرح او قسمة االرقام بنفس الطرٌقة‪ .‬عملٌة الطرح ستكون كتالى‪:‬‬

‫‪number3 = number1 - number2‬‬

‫و عالمة القسمة هى ’‪ .‘/‬سٌكون البرنامج كالتالى‪:‬‬

‫‪number3 = number1 / number2‬‬

‫و ستكون نتٌجة البرنامج كالتالى‪:‬‬

‫الشكل ‪ – 12‬قسمة رقمين‬

‫ٍذىه ثسيظ ىذرجبد اىذرارح‬


‫فى البرنامج التالى لتحوٌل درجة حرارة فهرنهاٌت الى درجة حرارة مبوٌة‪.‬‬ ‫سنقوم باستخدام الصٌغة‬

‫أوال‪ ،‬سنقوم بالحصول على درجة الحرارة بالفهرنهاٌت من المستخدم وحفظها فى متغٌر‪ .‬هناك عملٌة خاصة تسمح لنا بقراءة االرقام من‬
‫المستخدم وهى ‪.TextWindow.ReadNumber‬‬

‫)" ‪TextWindow.Write("Enter temperature in Fahrenheit:‬‬


‫)(‪fahr = TextWindow.ReadNumber‬‬

‫بمجرد ان ٌتم حفظ درجة الحرارة بالفهرنهاٌت فى متغٌر‪ٌ ،‬مكننا تحوٌلها الى درجة حرارة مؤٌة كالتالى‪:‬‬

‫‪celsius = 5 * (fahr - 32) / 9‬‬

‫االقواس تقول للكمبٌوتر ان ٌقوم بحساب جزء ‪ fahr – 32‬اوال ثم ٌقوم ببقٌة الحسابات‪ .‬ما ٌجب علٌنا فعله اآلن هو طباعة النتٌجة‬
‫للمستخدم‪ .‬بوضع كل ذلك معا‪ٌ ،‬كمننا الحصول على البرنامج التالى‪:‬‬

‫)" ‪TextWindow.Write("Enter temperature in Fahrenheit:‬‬


fahr = TextWindow.ReadNumber()
celsius = 5 * (fahr - 32) / 9
TextWindow.WriteLine("Temperature in Celsius is " + celsius)

:‫و نتٌجة هذا البرنامج ستكون‬

‫ – محول درجة الحرارة‬13 ‫الشكل‬


‫الفصل ‪4‬‬
‫اىشروط واىتفرعبد‬

‫بالرجوع مرة اخرى الى برنامجنا االول‪ ،‬الٌس ظرٌفا لو قلنا ‪ Good Morning World‬او ‪ Good Evening World‬على حسب‬
‫التوقٌت الٌومى بدال من ‪ World Hello‬بصفة عامة؟ فى البرنامج التالى‪ ،‬سنجعل الكمبٌوتر ٌقول ‪ Good Morning World‬اذا كان‬
‫التوقٌت قبل الساعة ‪ 12‬ظهرا و‪ Good Evening‬اذا كان التوقٌت بعد الساعة ‪ 12‬ظهرا‪.‬‬

‫‪If (Clock.Hour < 12) Then‬‬


‫)"‪TextWindow.WriteLine("Good Morning World‬‬
‫‪EndIf‬‬
‫‪If (Clock.Hour >= 12) Then‬‬
‫)"‪TextWindow.WriteLine("Good Evening World‬‬
‫‪EndIf‬‬

‫سترى احدى االخراجٌن على حسب التوقٌت الذى تقوم فٌه بتشغٌل البرنامج‪:‬‬

‫الشكل ‪Good Morning World - 14‬‬


‫الشكل ‪Good Evening World - 15‬‬

‫هٌا بنا نقوم بتحلٌل اول ثالثة سطور من البرنامج‪ .‬هذا السطر ٌقول للكمبٌوتر اذا كانت الساعة اقل من ‪ 12‬ظهرا اذن قم بطباعة‬
‫”‪ .“Good Morning World‬الكلمات ‪ If, Then and Endif‬هى كلمات مخصوصة ٌفهمها الكمبٌوتر عندما ٌتم تشغٌل البرنامج‪.‬‬
‫الكلمة ‪ If‬دابما ٌتبعها شرط الذى ٌعد فى هذه الحالة )‪ .(Clock.Hour < 12‬تذكر ان االقواس مهمة حتى ٌتفهم الكمبٌوتر ماذا ترٌد‪.‬‬
‫الشرط ٌتبعه ‪ then‬والعملٌة المراد تنفٌذها‪ .‬وبعد العملٌة ٌأتى ‪ Endif‬لٌقول للكمبٌوتر ان التنفٌذ المشروط للعملٌة قد انتهى‪.‬‬

‫قد ٌكون هناك اكثر من عملٌة بٌن ‪ then‬و‪ End if‬وسٌقوم الكمبٌوتر بتنفٌذهم جمٌعا اذا كان الشرط صالح‪ .‬على سبٌل المثال‪ٌ ،‬مكنك‬
‫كتابة التالى‪:‬‬

‫‪If (Clock.Hour < 12) Then‬‬


‫)" ‪TextWindow.Write("Good Morning.‬‬
‫)"?‪TextWindow.WriteLine("How was breakfast‬‬
‫‪EndIf‬‬

‫‪Else‬‬
‫قد تكون الحظت ان الشرط مكرر بالبرنامج الموجود فى بداٌة هذا الفصل‪ .‬قٌمة ‪ Clock.Hour‬قد تكون اقل من ‪ 12‬ام ال‪ .‬لم نكن بحاجة‬
‫ألستخدام الشرط الثانى‪ .‬فى هذه الحالة ٌمكنك اختصار العبارتٌن ‪ if..then..endif‬فى عبارة واحدة عن طرٌق استخدام كلمة جدٌدة‬
‫‪ .else‬لو قمنا بأعادة كتابة البرنامج بأستخدام ‪ ،else‬سٌكون كالتالى‪:‬‬

‫‪If (Clock.Hour < 12) Then‬‬


‫)"‪TextWindow.WriteLine("Good Morning World‬‬
‫‪Else‬‬
‫)"‪TextWindow.WriteLine("Good Evening World‬‬
‫‪EndIf‬‬

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

‫“‬
‫اىَسبفخ اىجبدئخ‬
‫فً جمٌع األمثلة ٌمكنك ان تالحظ المسافة البادبة فى البٌانات ‪ If‬و ‪ Else‬و ‪ .EndIf‬هذه السافات البادبة لٌست ضرورٌة‪.‬‬
‫وسٌتمكن الكمبٌوتر من فهم البرنامج على ما ٌرام بدونهم‪ .‬ومع ذلك ‪ ،‬فإنها تساعدنا على رؤٌة وفهم هٌكل البرنامج بطرٌقة‬
‫أسهل‪ .‬ومن ثم‪ ،‬تعتبر اضافة مسافة بادبة للبٌانات هذا القبٌل عادة جٌدة‪.‬‬

‫فردي أً زوجً‬
‫هٌا بنا نقوم بكتابة برنامج ٌبلغنا اذا كان الرقم الذى تم ادخاله فردى ام زوجى‪.‬‬

‫)" ‪TextWindow.Write("Enter a number:‬‬


‫)(‪num = TextWindow.ReadNumber‬‬
‫)‪remainder = Math.Remainder(num, 2‬‬
‫‪If (remainder = 0) Then‬‬
‫)"‪TextWindow.WriteLine("The number is Even‬‬
‫‪Else‬‬
‫)"‪TextWindow.WriteLine("The number is Odd‬‬
‫‪EndIf‬‬

‫و عندما تقوم بتشغٌل البرنامج سترى االخراج التالى‪:‬‬

‫الشكل ‪ - 16‬فردى ام زوجى‬

‫فى هذا البرنامج قدمنا لكم عملٌة اخرى جدٌدة ومفٌدة ‪ .Math.Remainder‬و بالفعل كما قد تكون فهمت بالفعل ستقوم‬
‫‪ Math.Remainder‬بقسمة الرقم االول على الرقم الثانى واعادة البقٌة‪.‬‬

‫اىتفريعبد‬
‫تذكر لقد تعلمت فى الفصل الثانى ان الكمبٌوتر ٌقوم بتنفٌذ كل عبارة بالبرنامج على حدة بالترتٌب من اعلى السفل‪ .‬لكن هناك عبارة‬
‫مخصوصة تجعل الكمبٌوتر ٌنتقل لعبارة اخرى خارج الترتٌب‪ .‬هٌا نلقى نظرة على البرنامج التالى‪:‬‬
‫‪i = 1‬‬
‫‪start:‬‬
‫)‪TextWindow.WriteLine(i‬‬
‫‪i = i + 1‬‬
‫‪If (i < 25) Then‬‬
‫‪Goto start‬‬
‫‪EndIf‬‬

‫الشكل ‪ – 17‬استخدام ‪Goto‬‬

‫فى البرنامج الموضح اعاله تم تعٌٌن القٌمة ‪ 1‬الى المتغٌر‪ . i‬ثم قمنا بأضافة عبارة جدٌدة تنتهى بنقطتان (‪):‬‬

‫‪start:‬‬

‫ٌسمى هذا بــ ‪ .label‬تعد ‪ Labels‬كاالشارات المرجعٌة التى ٌفهمها الكمبٌوتر‪ٌ .‬مكنك ان تسمى االشارة المرجعٌة بأى اسم وان تضٌف‬
‫اى عدد من االشارات المرجعٌة فى برنامجك طالما تم تسمٌتهم باسماء فرٌدة‪as long as they are all uniquely named.‬‬

‫عبارة اخرى مثٌرة لالهتمام هنا هى‪:‬‬

‫‪i = i + 1‬‬

‫هذه العبارة تقول للكمبٌوتر ان ٌقوم بأضافة ‪ 1‬الى المتغٌر ‪ i‬وتعٌٌن النتٌجة الى المتغٌر ‪ .i‬بالتالى لو كانت قٌمة ‪ i‬تساوى ‪ 1‬قبل هذه‬
‫العبارة‪ ،‬ستساوى ‪ 2‬بعد تنفٌذ هذه العبارة‪.‬‬

‫و اخٌرا‬
‫‪If (i < 25) Then‬‬
‫‪Goto start‬‬
‫‪EndIf‬‬

‫هذا الجزء ٌقول للكمبٌوتر اذا كانت قٌمة ‪ i‬اقل من ‪ٌ 25‬جب ان ٌبدأ بتنفٌذ العبارات من االشارة المرجعٌة ‪.start‬‬

‫اىتشغيو اىالّهبئً‬
‫باستخدام عبارة ‪ٌ Goto‬مكن ان ٌقوم الكمبٌوتر باعادة اى شىء اى عدد من المرات‪ .‬على سبٌل المثال ٌمكنك ان تأخذ البرنامج الذى قمنا‬
‫بكتابته البالغنا اذا كان الرقم فردى او زوجى و تعدٌله كما هو موضح ادناه و سٌتم تشغٌل البرنامج الى ما ال نهاٌة‪ٌ .‬مكنك اٌقاف‬
‫البرنامج بالنقر على زر اغالق (‪ )X‬الموجود فى الركن االٌمن العلوى من االطار‪.‬‬

‫‪begin:‬‬
‫)" ‪TextWindow.Write("Enter a number:‬‬
‫)(‪num = TextWindow.ReadNumber‬‬
‫)‪remainder = Math.Remainder(num, 2‬‬
‫‪If (remainder = 0) Then‬‬
‫)"‪TextWindow.WriteLine("The number is Even‬‬
‫‪Else‬‬
‫)"‪TextWindow.WriteLine("The number is Odd‬‬
‫‪EndIf‬‬
‫‪Goto begin‬‬

‫الشكل ‪ – 18‬فردى او زوجى بال نهاية‬


‫الفصل ‪5‬‬
‫اىتنرار اىذيقً‬

‫اىتنرار اىذيقً ‪For‬‬


‫لنأخذ البرنامج الذى قمنا بكتبته فى الفصل السابق‪.‬‬

‫‪i = 1‬‬
‫‪start:‬‬
‫)‪TextWindow.WriteLine(i‬‬
‫‪i = i + 1‬‬
‫‪If (i < 25) Then‬‬
‫‪Goto start‬‬
‫‪EndIf‬‬

‫هذا البرنامج ٌطبع االرقام مرتبة من ‪ 1‬الى ‪ .24‬عملٌة تزاٌد المتغٌر شابعة جدا فً مجال البرمجة لذا تقدم لغات البرمجة عادة طرٌقة‬
‫أسهل للقٌام بذلك‪.‬‬
‫البرنامج باالعلى معادل لهذا البرنامج‪:‬‬

‫‪For i = 1 To 24‬‬
‫)‪TextWindow.WriteLine(i‬‬
‫‪EndFor‬‬
‫واالخراج هو‪:‬‬

‫الشكل ‪ – 19‬استعمال التكرار الحلقى ‪For‬‬

‫الحظ اننا خفضنا عد سطور البرنامج من ‪ 8‬الى ‪ ،4‬ومع ذلك ٌظل االخراج مماثال تماما للبرنامج ذو الـ ‪ 8‬اسطر!‬
‫هل تذكر اننا قلنا سابقا انه توجد عدة طرق للقٌام بنفس الشىء؟ هذا مثال جٌد لذلك‪.‬‬

‫‪ For..EndFor‬فى لغة البرمجة ٌسمى تكرار حلقى حٌث انه ٌسمح باعطاء قٌمة بدء وقٌمة انهاء‪ ،‬ثم جعل الكمبٌوتر ٌزٌد المتغٌر لك‪ .‬كل‬
‫مرة ٌزٌد فٌها الكمبٌوتر قٌمة المتغٌر‪ٌ ،‬قوم اٌضا بتشغٌل البٌانات الموجودة بٌن ‪ For‬و‪.EndFor‬‬

‫ولكن ان اردت ان ٌزاد المتغٌر بـ ‪ 2‬بدال من ‪ ،1‬مثال لطباعة االرقام المفردة من ‪ 1‬الى ‪ ،24‬عندها ٌمكنك استخدام التكرار الحلقى لعمل‬
‫هذا اٌضا‪.‬‬

‫‪For i = 1 To 24 Step 2‬‬


‫)‪TextWindow.WriteLine(i‬‬
‫‪EndFor‬‬

‫الشكل ‪ – 20‬االعداد الفردية فقط‬

‫جزء الـ ‪ Step 2‬من بٌان‪ٌ For‬بلغ الكمبٌوتر بزٌادة قٌمة المتغٌر بـ‪ 2‬بدال من ‪ 1‬كالعادة‪ .‬باستخدام ‪ Step‬بامكانك تحدٌد اى زٌادة‬
‫ترٌدها‪ .‬حتى بامكانك تحدٌد رقم سلبى وجعل عد الكمبٌوتر الى الوراء‪ ،‬كما فى المثال التالى‪:‬‬
‫‪For i = 10 To 1 Step -1‬‬
‫)‪TextWindow.WriteLine(i‬‬
‫‪EndFor‬‬

‫الشكل ‪ – 21‬العد الى الوراء‬

‫اىتنرار اىذيقً ‪While‬‬


‫التكرار الحلقى ‪ While‬هو وسٌلة اخرى للتكرار‪ ،‬وتكون عادة مفٌدة عندما ال ٌعرف عد مرات التكرارمسبقا‪ .‬فً حٌن أن تكرار ‪For‬‬
‫ٌعمل لعدد محدد مسبقا ‪ ،‬التكرار ‪ٌ While‬عمل حتى ٌصبح شرطا معٌنا هو الصحٌح‪ .‬فى المثال التالى‪ ،‬نقوم بقسمة عدد على ‪ 2‬حتى‬
‫ٌصٌر الناتج اصغر من ‪.1‬‬

‫‪number = 100‬‬
‫)‪While (number > 1‬‬
‫)‪TextWindow.WriteLine(number‬‬
‫‪number = number / 2‬‬
‫‪EndWhile‬‬

‫الشكل ‪ – 22‬تكرار القسمة الى النصف‬

‫فى البرنامج باعلى نقوم بتعٌٌن القٌمة ‪ 122‬الى‪ number‬ومن ثم نقوم بتشغٌل التكرار الحلقى ‪ While‬ما دامت قٌمة الرقم اكبر من ‪.1‬‬
‫داخل التكرار الحلقى نقوم بطباع الرقم ثم قسمته على اثنان‪ .‬وكما هو متوقع‪ ،‬احراج البرنامج هو عدة ارقام‪ ،‬كل منها هو نصف ما قبله‪.‬‬

‫ٌكون صعبا كتابة نفس البرنامج باستخدام التكرار الحلقى ‪ For‬الننا ال نعرف كم مرة تتكرر الحلقة‪ .‬باستخدام ‪ٌ While‬كون سهال التحقٌق‬
‫من شرط ما ومن ثم سؤال الكمبٌوتر اما التكملة او التكرار‪.‬‬

‫ٌكون من المثٌر لالهتمام أن نالحظ ان كل تكرار حلقى ‪ While‬من الممكن ترجمته الى بٌان ‪ .If..Then‬على سبٌل المثال ‪ٌ ،‬مكننا‬
‫إعادة كتابة البرنامج أعاله على النحو التالً دون التأثٌر على النتٌجة النهابٌة‪.‬‬
number = 100
startLabel:
TextWindow.WriteLine(number)
number = number / 2

If (number > 1) Then


Goto startLabel
EndIf

‫ كبٌانات‬While ‫داخلٌا الكمبٌوتر ٌعٌد كتابة كل تكرار حلقى‬


.Goto ‫ مع واحد أو أكثر من بٌانات‬If..Then ‫تستخدم‬
‫الفصل ‪6‬‬
‫ثذء اىرسىٍبد‬

‫حتى اآلن استخدمنا ‪ TextWindow‬فى جمٌع امثلتنا لشرح اسس لغة برمجة ‪ . Small Basic‬ولكن لغة ‪ Small Basic‬تحتوى اٌضا‬
‫على مجموعة قوٌة من قدرات التعامل مع الرسومات والتى سٌتم شرحها فى هذا الفصل‪.‬‬

‫تقذيــٌ ‪GraphicsWindow‬‬
‫كما سمح لنا ‪ TextWindow‬بالتعامل مع االرقام والحروف‪ٌ ،‬وفر لنا ‪ Small Basic‬اطار ‪ GraphicsWindow‬والذى بالمكان‬
‫استعماله للرسم‪ .‬لنبدأ باظهار اطار الرسومات ‪. GraphicsWindow‬‬

‫)(‪GraphicsWindow.Show‬‬

‫عندما ٌتم تشغٌل هذا البرنامج‪ ،‬ستالحظ انه بدال من االطار االسود المعتاد‪ ،‬ستحصل هذه المرة على اطار ابٌض اللون كما هو مبٌن فى‬
‫االسفل‪ .‬ال ٌمكن عمل الكثٌر فى هذا االطار اآلن‪ ،‬ولكن هذا هو االطار االساسى الذى سنعمل معه فى هذا الفصل‪ .‬بامكانك اغالق االطار‬
‫عن طرٌق الضغط على عالمة "‪ "X‬فى أعلى الزاوٌة الٌمنى‪.‬‬
‫الشكل ‪ – 23‬اطار رسومات فارغ‬

‫إّشبء اطبر اىرسىٍبد‬


‫اطار الرسومات ٌسمح لك بتخصٌص مظهره‪ٌ .‬مكنك تغٌٌر العنوان‪ ،‬والخلفٌة وحجمها‪ .‬دعونا نمضً قدما وتعدٌله قلٌال‬
‫للتعرف على االطار‪.‬‬

‫"‪GraphicsWindow.BackgroundColor = "SteelBlue‬‬
‫"‪GraphicsWindow.Title = "My Graphics Window‬‬
‫‪GraphicsWindow.Width = 320‬‬
‫‪GraphicsWindow.Height = 200‬‬
‫)(‪GraphicsWindow.Show‬‬

‫ترى باالسفل كٌف ٌبدو االطار المخصص‪ٌ .‬مكنك تغٌٌر لون الخلفٌة إلى واحدة من القٌم المدرجة فً الملحق "ب"‪ .‬جرب هذه‬
‫الخصابص لترى كٌف ٌمكنك تغٌٌر مظهر النافذة‪.‬‬

‫الشكل ‪ - 24‬اطار رسومات مخصص‬


‫رسٌ اىخطىط‬
‫بعدما ٌبدأ ‪ٌ ،GraphicsWindow‬مكننا رسم األشكال والنصوص وحتى الصور علٌه‪ .‬لنبدأ برسم بعض األشكال البسٌطة‪.‬‬
‫وفٌما ٌلً برنامج ٌرسم خطان متقاطعان على اطار الرسومات‪.‬‬

‫‪GraphicsWindow.Width = 200‬‬
‫‪GraphicsWindow.Height = 200‬‬
‫)‪GraphicsWindow.DrawLine(10, 10, 100, 100‬‬
‫)‪GraphicsWindow.DrawLine(10, 100, 100, 10‬‬

‫الشكل ‪ - 25‬تقاطع‬

‫أول سطرٌن من البرنامج ٌقومان باعداد االطار والسطرٌن التالٌٌان ٌرسما الخطوط المتقاطعة‪ .‬اول رقمٌن بعد ‪ٌ DrawLine‬حددا‬
‫احداثٌات ‪ x‬و ‪ y‬للبدء والرقمٌن التالٌٌن ٌحددا احداثٌات نهاٌة الخط ‪.‬والشًء المثٌر لالهتمام مع رسومات الكمبٌوتر هو أن تنسٌق‬
‫(‪ٌ )0 ، 0‬بدأ فً أعلى الزاوٌة الٌسرى من النافذة‪ .‬فعلٌا‪ ،‬احداثٌات االطار فى الربع الثانى‪.‬‬

‫الشكل ‪The co-ordinate map - 26‬‬

‫وإذا عدنا إلى برنامج رسم الخطوط ‪ ،‬فمن المثٌر لالهتمام أن نالحظ أن ‪ٌ Small Basic‬سمح لك تعدٌل خصابص الخط‪،‬‬
‫مثل اللون وسمكه‪ .‬أوال ‪ ،‬دعنا نغٌر لون األسطر كما هو‬
‫موضح فً البرنامج أدناه‪.‬‬ ‫بدال من استخدام اسماء االلوان‪ ،‬باالمكان استخدام الطرٌقة‬
‫المستعملة على الوٌب (‪ .)#RRGGBB‬مثال ‪ #FF0000‬للون‬
‫االسود و‪ٌ #FF0000‬عنى االحمر‪ ،‬و ‪ #FFFF00‬لالصفر‪.‬‬
‫سنتعلم المزٌد عن االلوان فى الملحق "ب"‪.‬‬
GraphicsWindow.Width = 200
GraphicsWindow.Height = 200
GraphicsWindow.PenColor = "Green"
GraphicsWindow.DrawLine(10, 10, 100, 100)
GraphicsWindow.PenColor = "Gold"
GraphicsWindow.DrawLine(10, 100, 100, 10)

Changing Line Color - 27 ‫الشكل‬

.1 ً‫ بدال من العرض االفتراض‬، 10 ‫ سنغٌر عرض الخط إلى‬، ‫ فً البرنامج أدناه‬.‫ لنقوم بتعدٌل حجم الخط اٌضا‬، ‫واآلن‬

GraphicsWindow.Width = 200
GraphicsWindow.Height = 200
GraphicsWindow.PenWidth = 10
GraphicsWindow.PenColor = "Green"
GraphicsWindow.DrawLine(10, 10, 100, 100)
GraphicsWindow.PenColor = "Gold"
GraphicsWindow.DrawLine(10, 100, 100, 10)

Thick Colorful Lines - 28 ‫الشكل‬

‫ وهً ال تؤثر فقط على الخطوط ولكن أٌضا أي‬.‫ معا ٌعدال خصابص القلم الذى ٌرسم هذه الخطوط‬PenColor ‫ و‬PenWidth
.‫شكل ٌتم رسمه بعدها‬
‫"‪GraphicsWindow.BackgroundColor = "Black‬‬
‫‪GraphicsWindow.Width = 200‬‬
‫‪GraphicsWindow.Height = 160‬‬
‫"‪GraphicsWindow.PenColor = "Blue‬‬

‫‪For i = 1 To 10‬‬
‫‪GraphicsWindow.PenWidth = i‬‬
‫)‪GraphicsWindow.DrawLine(20, i * 15, 180, i * 15‬‬
‫‪endfor‬‬

‫الشكل ‪ - 29‬احجام متعددة للقلم‬

‫الجزء المثٌر لالهتمام فى هذا البرنامج هو التكرار الحلقى‪ ،‬فى كل تكرار نقوم بزٌادة ‪( PenWidth‬عرض القلم) وباستخدامه نقوم برسم‬
‫خط جدٌد تحت آخر خط قمنا برسمه‪.‬‬

‫رسٌ وتعجئخ االشنبه‬


‫عندما ٌتعلق األمر برسم األشكال‪ ،‬عادة ٌكون هناك نوعان من العملٌات لكل شكل‪ .‬عملٌة ‪( Draw‬الرسم) وعملٌة ‪( Fill‬التعببة)‪.‬‬
‫عملٌات الرسم تقوم برسم مخطط الشكل باستخدام القلم‪ ،‬وعملٌات التعببة تقوم بطالء الشكل باستخدام فرشاة‪ .‬على سبٌل المثال فً‬
‫البرنامج أدناه ‪ ،‬هناك مستطٌالن‪ ،‬واحد ٌتم رسمه باستخدام القلم األحمر واآلخر ٌتم طالبه باستخدام فرشاة خضراء‪.‬‬

‫‪GraphicsWindow.Width = 400‬‬
‫‪GraphicsWindow.Height = 300‬‬

‫"‪GraphicsWindow.PenColor = "Red‬‬
‫)‪GraphicsWindow.DrawRectangle(20, 20, 300, 60‬‬

‫"‪GraphicsWindow.BrushColor = "Green‬‬
‫)‪GraphicsWindow.FillRectangle(60, 100, 300, 60‬‬
‫الشكل‪ - 30‬الرسم والتعبئة‬

‫لرسم مستطٌل أو لتعببته‪ ،‬تحتاج إلى أربعة أرقام‪ .‬أول رقمٌن ٌمثال االحداثٌات ‪ x‬و ‪ y‬ألعلى الزاوٌة الٌسرى من المستطٌل‪ .‬العدد الثالث ٌحدد عرض‬
‫المستطٌل بٌنما ٌحدد الرابع ارتفاعها‪ .‬فً الواقع ‪ٌ ،‬نطبق الشًء نفسه على رسم وتعببة القطع الناقص كما هو موضح فً البرنامج أدناه‪.‬‬

‫‪GraphicsWindow.Width = 400‬‬
‫‪GraphicsWindow.Height = 300‬‬

‫"‪GraphicsWindow.PenColor = "Red‬‬
‫)‪GraphicsWindow.DrawEllipse(20, 20, 300, 60‬‬

‫"‪GraphicsWindow.BrushColor = "Green‬‬
‫)‪GraphicsWindow.FillEllipse(60, 100, 300, 60‬‬

‫الشكل ‪ - 31‬رسم وتعبئة ‪Ellipses‬‬

‫القطع الناقص هو اٌضا احد الدوابر‪ .‬إذا كنت ترٌد أن ترسم دوابر‪ ،‬سٌكون علٌك تحدٌد نفس العرض واالرتفاع‪.‬‬
GraphicsWindow.Width = 400
GraphicsWindow.Height = 300

GraphicsWindow.PenColor = "Red"
GraphicsWindow.DrawEllipse(20, 20, 100, 100)

GraphicsWindow.BrushColor = "Green"
GraphicsWindow.FillEllipse(100, 100, 100, 100)

‫ دوائر‬- 32 ‫الشكل‬
‫الفصل السابع‬
‫اىَرح ٍع األشنبه‬

‫فى هذا الفصل سنمرح قلٌال باستخدام ما تعلمناه سابقا‪ٌ .‬حتوي هذا الفصل على امثلة تجمع بٌن كل ما تعلمته حتى اآلن إلنشاء بعض‬
‫البرامج الشٌقة‪.‬‬

‫‪Rectangalore‬‬
‫نقوم هنا برسم عدة مستطٌالت فى تكرار حلقى مع تزاٌد الحجم‪.‬‬

‫"‪GraphicsWindow.BackgroundColor = "Black‬‬
‫"‪GraphicsWindow.PenColor = "LightBlue‬‬
‫‪GraphicsWindow.Width = 200‬‬
‫‪GraphicsWindow.Height = 200‬‬

‫‪For i = 1 To 100 Step 5‬‬


‫)‪GraphicsWindow.DrawRectangle(100 - i, 100 - i, i * 2, i * 2‬‬
‫‪EndFor‬‬
Rectangalore - 33 ‫الشكل‬

Circtacular
.‫ ٌقوم برسم دوابر بدال من مربعات‬،‫هذا البرنامج بدٌل للبرنامج السابق‬

GraphicsWindow.BackgroundColor = "Black"
GraphicsWindow.PenColor = "LightGreen"
GraphicsWindow.Width = 200
GraphicsWindow.Height = 200

For i = 1 To 100 Step 5


GraphicsWindow.DrawEllipse(100 - i, 100 - i, i * 2, i * 2)
EndFor

Circtacular - 34 ‫الشكل‬

Randomize
‫ لتعٌٌن الوان عشوابٌة للفرشاة ثم ٌستخدم العملٌة‬GraphicsWindow.GetRandomColor ‫هذا البرنامج ٌستخدم العملٌة‬
‫ ٌمكن دمج هاتٌن العملٌتٌن بطرق شٌقة من اجل خلق برامج‬.‫ الخاص بالدوابر‬y ‫ و‬X ‫ لتعٌٌن االحداثى‬Math.GetRandomNumber
.‫شٌقة تعطى نتابج مختلفة فى كل مرة ٌتم تشغٌلها‬

GraphicsWindow.BackgroundColor = "Black"
‫‪For i = 1 To 1000‬‬
‫)(‪GraphicsWindow.BrushColor = GraphicsWindow.GetRandomColor‬‬
‫)‪x = Math.GetRandomNumber(640‬‬
‫)‪y = Math.GetRandomNumber(480‬‬
‫)‪GraphicsWindow.FillEllipse(x, y, 10, 10‬‬
‫‪EndFor‬‬

‫الشكل ‪Randomize - 35‬‬

‫‪Fractals‬‬
‫ٌقوم البرنامج التالى برسم مثلث ‪ fractal‬مستخدما ارقام عشوابٌة‪.‬الـ ‪ fractal‬هو رسم هندسى ٌمكن تقسٌمه الى عدة اجزاء‪ ،‬كل منها‬
‫ٌمثل الشكل االم بدقة‪ .‬فى هذه الحالة ٌقوم البرنامج برسم مبات المثلثات تمثل كل منها المثلث االم‪ .‬و بما انه ٌتم تشغٌل البرنامج لبضعة‬
‫ثوان ٌمكنك ان ترى المثلثات و هى تتشكل ببطء من مجرد نقاط‪.‬‬

‫المنطق نفسه صعب شرحه سأتركه لك كتمرٌن لالستكشاف‪.‬‬

‫"‪GraphicsWindow.BackgroundColor = "Black‬‬
‫‪x = 100‬‬
‫‪y = 100‬‬

‫‪For i = 1 To 100000‬‬
‫)‪r = Math.GetRandomNumber(3‬‬
‫‪ux = 150‬‬
‫‪uy = 30‬‬
‫‪If (r = 1) then‬‬
‫‪ux = 30‬‬
‫‪uy = 1000‬‬
‫‪EndIf‬‬

‫‪If (r = 2) Then‬‬
‫‪ux = 1000‬‬
‫‪uy = 1000‬‬
‫‪EndIf‬‬

‫‪x = (x + ux) / 2‬‬


‫‪y = (y + uy) / 2‬‬

‫)"‪GraphicsWindow.SetPixel(x, y, "LightGreen‬‬
‫‪EndFor‬‬

‫الشكل ‪Triangle Fractal - 36‬‬

‫ان كنت ترٌد ان ترى النقاط و هى تشكل الـ ‪ fractal‬ببطء ٌمكنك احداث تأخٌر فى التكرار الحلقى بأستخدام العملٌة ‪.Program.Delay‬‬
‫هذه العملٌة تأخذ رقم ٌقوم بتحدٌد مقدار التأخٌر بالمللى ثانٌة‪ .‬هذا هو البرنامج المعدل مع السطر المعدل موضحا بالخط الغامق‪.‬‬

‫"‪GraphicsWindow.BackgroundColor = "Black‬‬
‫‪x = 100‬‬
‫‪y = 100‬‬
For i = 1 To 100000
r = Math.GetRandomNumber(3)
ux = 150
uy = 30
If (r = 1) then
ux = 30
uy = 1000
EndIf

If (r = 2) Then
ux = 1000
uy = 1000
EndIf

x = (x + ux) / 2
y = (y + uy) / 2

GraphicsWindow.SetPixel(x, y, "LightGreen")
Program.Delay(2)
EndFor

.‫ جرب ارقام مختلفة لمعرفة ما هو االفضل لذوقك‬.‫زٌادة التأخٌر سٌجعل البرنامج ابطأ‬

:‫تعدٌل اخر ٌمكنك عمله بالبرنامج هو استبدال السطر التالى‬

GraphicsWindow.SetPixel(x, y, "LightGreen")

:‫بـهذا السطر‬

color = GraphicsWindow.GetRandomColor()
GraphicsWindow.SetPixel(x, y, color)

.‫بهذا التعدٌل سٌقوم البرنامج برسم بكسل من المثلث بأستخدام أرقام عشوابٌة‬
‫الفصل ‪8‬‬
‫‪Turtle Graphics‬‬

‫ىغخ ‪Logo‬‬
‫فى السبعٌنٌات من القرن الماضى كانت هناك لغة برمجة بسٌطة ولكن قوٌة فى نفس الوقت‪ ،‬تسمى بالـ ‪ Logo‬وكانت تستخدم من قبل‬
‫عدد قلٌل من الباحثٌن‪ .‬واستمر استخدامها حتى قام احد االشخاص بأضافة ما ٌسمى ”‪( “Turtle Graphics‬رسومات السلحفاة) الى لغة‬
‫البرمجة و اتاحة ”‪( “Turtle‬سلحفاة) التى كانت مربٌة على الشاشة و استجابت الوامر مثل ‪( Move Forward‬امضى قدما) ‪Turn ،‬‬
‫‪( Right‬استدر ٌمٌنا)‪( Turn Left ،‬استدر ٌسارا)‪ ،‬الخ‪ .‬باستخدام الـ‪ Logo‬استطاع الناس رسم اشكال شٌقة على الشاشة‪ .‬كل ذلك كان‬
‫من شأنه وهذا جعل لغة ‪ Logo‬سهلة على الفور وجذابة للناس من جمٌع األعمار‪ ،‬وكانت مسؤولة الى حد كبٌر عن شعبٌتها الكبٌرة‬
‫الثمانٌنات‪.‬‬

‫‪ Small Basic‬توفر اٌضا كابن ‪( Turtle‬السلحفاة) مع العدٌد من األوامر التً ٌمكن استدعاؤها من ضمن برامج ‪ .Small Basic‬فً‬
‫هذا الفصل ‪ ،‬سوف نستخدم الـ‪ Turtle‬للرسم على الشاشة‪.‬‬

‫مبئِ ‪Turtle‬‬
‫وبادئ ذي بدء ‪ ،‬نحن بحاجة إلى جعل السلحفاة (‪ )Turtle‬مربٌة على الشاشة‪ .‬وٌمكن تحقٌق ذلك من خالل برنامج بسٌط ذو‬
‫سطر واحد‪.‬‬

‫)(‪Turtle.Show‬‬

‫عند تشغٌل هذا البرنامج ستالحظ اطار ابٌض‪ ،‬تماما مثل الذى رأٌناه فً الفصل السابق‪ ،‬باستثناء هذا االطار لدٌه سلحفاة (‪ )Turtle‬فً‬
‫المركز‪ .‬هذه السلحفاة ستقوم باتباع تعلٌماتنا ورسم كل ما نطلبه منها‪.‬‬
‫الشكل ‪ - 37‬السلحفاة ظاهرة فى االطار‬

‫اىرسٌ واىتذريل‬
‫احد من التعلٌمات التى تفهما السلحفاة هو امر‪( Move‬تحرٌك)‪.‬هذه العملٌة تأخذ رقم واحد وهذا الرقم ٌبلغ السلحفاة المسافة التى ستنتقلها‪.‬‬
‫فى المثال التالى سنطلب من السلحفاة ان تتحرك ‪ 122‬بكسل‪.‬‬

‫)‪Turtle.Move(100‬‬

‫عند تشغٌل هذا البرنامج ‪ٌ ،‬مكنك ان ترى فً الواقع السلحفاة تتحرك ببطء ‪ 122‬بكسل صعودا‪ .‬واثناء تحركها ٌترى اٌضا خط ٌُرسم‬
‫ورابها‪ .‬وعندما تتوقف السلحفاة عن الحركة سترى نتٌجة مشابه‬
‫للشكل التالى‪.‬‬ ‫عن داستخدام عملٌات السلحفاة (‪ ،) Turtle‬ال ٌجب‬
‫بالضرورة استدعاء )(‪ The Turtle will .Show‬السلحفاء‬
‫تظهر تلقابٌا عندما تقوم بتنفٌذ احد العملٌات‪.‬‬
‫الشكل ‪ - 38‬تحريك السلحفاة مئة بكسل‬

‫رسٌ ٍرثع‬
‫المربع لدٌه أربع جوانب‪ ،‬وهما اثنان رأسً واثنان أفقً‪ .‬من أجل رسم مربع نحن بحاجة إلى جعل السلحفاة ترسم خطا ‪ ،‬ثم تستدٌر ٌمٌنا‬
‫وترسم خط آخر ‪ ،‬وٌستمر ذلك حتى االنتهاء من جمٌع الجوانب األربعة‪ .‬إذا كان لنا أن ٌترجم هذا إلى برنامج ‪ ،‬سٌكون كالتالى‪.‬‬

‫)‪Turtle.Move(100‬‬
‫)(‪Turtle.TurnRight‬‬
‫)‪Turtle.Move(100‬‬
‫)(‪Turtle.TurnRight‬‬
‫)‪Turtle.Move(100‬‬
‫)(‪Turtle.TurnRight‬‬
‫)‪Turtle.Move(100‬‬
‫)(‪Turtle.TurnRight‬‬

‫عند تشغٌل هذا البرنامج ‪ٌ ،‬مكنك مشاهدة السلحفاة ترسم مربعا‪ ،‬سطر واحد فً كل مرة‪ ،‬والنتٌجة تبدو كالشكل أدناه‪.‬‬
‫الشكل ‪ – 39‬السلحفاة ترسم مربعا‬

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

‫‪For i = 1 To 4‬‬
‫)‪Turtle.Move(100‬‬
‫)(‪Turtle.TurnRight‬‬
‫‪EndFor‬‬

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

‫‪For i = 1 To 4‬‬
‫)(‪GraphicsWindow.PenColor = GraphicsWindow.GetRandomColor‬‬
‫)‪Turtle.Move(100‬‬
‫)(‪Turtle.TurnRight‬‬
‫‪EndFor‬‬
‫الشكل ‪ – 40‬تغيير االلوان‬

‫رسٌ اشنبه امثر تعقيذا‬


‫باالضافة الى عملٌات ‪ TurnRight‬و ‪ ، TurnLeft‬كابن ‪( Turtle‬السلحفاة) لدٌه عملٌة ‪( Turn‬االنعطاف)‪ .‬باستخدام هذه العملٌة‬
‫باالمكان رسم اى شكل مضلع‪ .‬مثال‪ ،‬البرنامج التالى ٌرسم شكل مسدس (شكل ذو ستة جوانب)‪.‬‬

‫‪For i = 1 To 6‬‬
‫)‪Turtle.Move(100‬‬
‫)‪Turtle.Turn(60‬‬
‫‪EndFor‬‬

‫جرب هذا البرنامج ان كان ٌرسم حقا شكال مسدسا‪ .‬نالحظ أنه بما ان الزاوٌة بٌن كل جانب هى ‪ 62‬درجة‪ ،‬لذا نستخدم )‪. Turn(60‬‬
‫هذا المضلع كل جوانبه متساوٌة فى الطول‪ ،‬لذا ٌمكن الحصول بسهولة على الزاوٌة بٌن كل جانب من خالل تقسٌم ‪ 362‬على عدد‬
‫الجوانب‪.‬باستعمال هذه المعلوما وباستخدام المتغٌرات‪ٌ ،‬مكن أن نكتب برنامجا عامة جدا لرسم أي شكل مضلع متساوى الجوانب‪.‬‬

‫‪sides = 12‬‬

‫‪length = 400 / sides‬‬


‫‪angle = 360 / sides‬‬

‫‪For i = 1 To sides‬‬
‫)‪Turtle.Move(length‬‬
‫)‪Turtle.Turn(angle‬‬
‫‪EndFor‬‬

‫باستخدام هذا البرنامج‪ٌ ،‬مكنك رسم أي مضلع فقط عن طرٌق تعدٌل المتغٌر ‪ . sides‬تعٌٌن ‪ 4‬لهذا المتغٌر سٌمكننا من رسم المربع كما‬
‫فى اول مثال‪ .‬اما وضع قٌمة كبٌرة بما فٌه الكفاٌة‪ ،‬مثال ‪ 52‬من شأنه أن ٌجعل الرسم تقرٌبا دابرى تماما‪.‬‬

‫الشكل ‪ – 41‬رسم مضلع ذو ‪ 21‬جانب‬

‫باستخدام هذه التقنٌة ٌمكننا أن نجعل السلحفاة ترسم دوابر متعددة فً كل مرة مع تحول قلٌل مما ٌؤدى إلى نتابج مثٌرة لالهتمام‪.‬‬

‫‪sides = 50‬‬
‫‪length = 400 / sides‬‬
‫‪angle = 360 / sides‬‬

‫‪Turtle.Speed = 9‬‬

‫‪For j = 1 To 20‬‬
‫‪For i = 1 To sides‬‬
‫)‪Turtle.Move(length‬‬
‫)‪Turtle.Turn(angle‬‬
‫‪EndFor‬‬
‫)‪Turtle.Turn(18‬‬
‫‪EndFor‬‬
‫البرنامج السابق ٌنفذ اثنٌن من التكرار الحلقى ‪ .For..EndFor‬واحد داخل اآلخر‪ .‬التكرار الداخلى (‪ )i = 1 to sides‬مشابه لبرنامج‬
‫المضلع وٌقوم برسم دابرة‪ .‬التكرار الخارجى (‪)j = 1 to 20‬‬
‫مسبول عن ادارة السلحفاة قلٌال لرسم كل دابرة‪ .‬وٌبلغ السلحفاة‬ ‫فً البرنامج أعاله‪ ،‬جعلنا السلحفاة ترسم بشكل أسرع من‬
‫برسم ‪ 22‬دابرة‪ .‬عند وضع كل هذا معا‪ ،‬نحصل على نمط مثٌر‬ ‫خالل تحدٌد السرعة إلى ‪ٌ .9‬مكنك تعٌٌن هذه الخاصٌة إلى‬
‫لالهتمام‪ ،‬مثل الشكل التالى‪.‬‬ ‫أي قٌمة بٌن ‪ 1‬و ‪ 10‬لجعل السلحفاة تتحرك بالسرعة التً‬
‫ترٌدها ‪.‬‬

‫الشكل ‪ – 42‬التحرك فى دوائر‬

‫اىتذرك‬
‫باالمكان جعل السلحفاة تتوقف عن الرسم باستخدام العملٌة ‪ . PenUp‬هذا ٌسمح لك بنقل السلحفاة إلى أي مكان على الشاشة من دون‬
‫رسم خط‪ .‬استدعاء ‪ PenDown‬سٌجعل سلحفاة ترسم مرة أخرى‪ .‬وٌمكن استخدام هذا للحصول على بعض المؤثرات المثٌرة لالهتمام ‪،‬‬
‫مثال رسم خطوط المنقطة‪ .‬وفٌما ٌلً برنامج ٌستخدم هذا لرسم المضلع ذى جوانب منقطة‪.‬‬

‫‪sides = 6‬‬

‫‪length = 400 / sides‬‬


‫‪angle = 360 / sides‬‬

‫‪For i = 1 To sides‬‬
‫‪For j = 1 To 6‬‬
‫)‪Turtle.Move(length / 12‬‬
‫)(‪Turtle.PenUp‬‬
‫)‪Turtle.Move(length / 12‬‬
‫)(‪Turtle.PenDown‬‬
‫‪EndFor‬‬
‫)‪Turtle.Turn(angle‬‬
‫‪EndFor‬‬

‫مرة اخرى‪ٌ ،‬حتوى هذا البرنامج على تكرارٌن حلقٌٌن‪ .‬التكرار الداخلى ٌرسم خط منقط واحد‪ ،‬بٌنما ٌقوم التكرار الخارجى بتحدٌد عدد‬
‫الخطوط التتى سٌتم رسمها‪ .‬فى هذا المثال قمنا بتحدٌد قٌمة المتغٌر‪ sides‬بـ ‪ ،6‬لذا قمنا بالحصول على مضلع شكله مسدس كما هو‬
‫مبٌن باالسفل‪.‬‬

‫الشكل ‪ - 43‬استخدام ‪ PenUp‬و ‪PenDown‬‬


‫‪Chapter 9‬‬
‫اىروتيْبد اىفرعيخ‬

‫فً كثٌر من األحٌان أثناء كتابة برامج ستظهر بعض الحاالت التً سٌتعٌن علٌنا فٌها تشغٌل نفس مجموعة من الخطوات ‪ ،‬مرارا‬
‫وتكرارا‪ .‬فً هذه الحاالت ‪ ،‬فإنه قد ال ٌكون له معنى إلعادة كتابة البٌانات نفسها مرات عدة‪ .‬وعند ذلك تكون الروتٌنات الفرعٌة‬
‫(‪ )Subroutines‬مفٌدا‪.‬‬

‫الروتٌن الفرعى هو جزء من التعلٌات البرمجٌة فى برنامج أوسع عادة لفعل شًء محدد جدا ‪ ،‬وٌمكن استدعاؤها من أي مكان فً‬
‫البرنامج‪ٌ .‬تم تحدٌد الروتٌنات الفرعٌة من خالل االسم الذي ٌلً الكلمة الربٌسٌة ‪ Sub‬وٌنتهى بكلمة ‪ .EndSub‬على سبٌل المثال‪،‬‬
‫المقتطف التالً ٌمثل روتٌن اسمه ‪ ، PrintTime‬و وظٌفته طباعة فً الوقت الحالً إلى ‪.TextWindow‬‬

‫‪Sub PrintTime‬‬
‫)‪TextWindow.WriteLine(Clock.Time‬‬
‫‪EndSub‬‬

‫أدناه برنامج ٌتضمن الروتٌن الفرعى وٌقوم باستدعابه من عدة أماكن‪.‬‬

‫)(‪PrintTime‬‬
‫)" ‪TextWindow.Write("Enter your name:‬‬
‫)(‪name = TextWindow.Read‬‬
‫)" ‪TextWindow.Write(name + ", the time now is:‬‬
‫)(‪PrintTime‬‬

‫‪Sub PrintTime‬‬
‫)‪TextWindow.WriteLine(Clock.Time‬‬
‫‪EndSub‬‬
‫الشكل ‪ - 44‬استدعاء روتين فرعى بسيط‬

‫تقوم بتنفٌذ روتٌن فرعى بواسطة استدعاء )(‪ SubroutineName( SubroutineName‬هو اسم الروتٌن الفرعى) وكما جرت العادة‬
‫العالمات "()" ضرورٌة لتعرٌف الكمبٌوترانك ترٌد تنفٌذ روتٌن فرعى‪.‬‬

‫فىائذ استخذاً اىروتيْبد اىفرعيخ‬


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

‫وباإلضافة إلى ذلك‪ ،‬الروتٌنات الفرعٌة ٌمكن أن تساعد على تحلٌل المشاكل المعقدة إلى قطع ابسط‪.‬مثال‪ ،‬ان كان لدٌك معادلة معقدة‬
‫ٌمكنك كتابة عدة روتٌنات فرعٌة لحل قطع صغٌرة من المعادلة المعقدة‪ .‬ومن ثم ٌمكنك وضع النتابج معا للحصول على حل المعادلة‬
‫المعقدة األصلٌة‪.‬‬

‫تساعد الروتٌنات الفرعٌة اٌضا على تحسٌن سهولة قراءة‬


‫البرنامج‪ .‬اذا كان لدٌك اسماء جٌدة للروتٌنات الفرعٌة لالجزاء‬ ‫تذكر‪ٌ ،‬مكنك استدعاء روتٌن‪ SmallBasic‬من داخل‬
‫التى تعمل كثٌرا بالبرنامج‪ ،‬فان البرنامج ٌصٌر سهل القراءة‬ ‫البرنامج نفسه‪ .‬ال ٌمكنك استدعاء روتٌن من ضمن برنامج‬
‫والفهم‪ .‬وٌكون هذا مهما جدا إذا كنت ترٌد أن تفهم برنامج شخص‬ ‫آخر‪.‬‬
‫آخر أو إذا كنت ترٌد برنامجك مفهوما من قبل اآلخرٌن‪ .‬وفً‬
‫بعض األحٌان ٌكون حتى مفٌدا عندما كنت ترٌد قراءة البرنامج‬
‫الخاص بك مثال بعد اسبوع من كتباتك له‪.‬‬

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

‫)" ‪TextWindow.Write("Enter first number:‬‬


‫)(‪num1 = TextWindow.ReadNumber‬‬
‫)" ‪TextWindow.Write("Enter second number:‬‬
‫)(‪num2 = TextWindow.ReadNumber‬‬

‫)(‪FindMax‬‬
‫)‪TextWindow.WriteLine("Maximum number is: " + max‬‬

‫‪Sub FindMax‬‬
‫‪If (num1 > num2) Then‬‬
‫‪max = num1‬‬
‫‪Else‬‬
‫‪max = num2‬‬
EndIf
EndSub

.‫وناتج هذا البرنامج ٌشبه التالى‬

‫ اكبر رقمين باستخدام روتين فرعى‬- 45 ‫الشكل‬

‫ هذه المرة سنقوم باستخدام برنامج رسومات ٌحسب نقاط‬.‫دعونا ننظر فً مثال آخر من شأنه توضٌح كٌفٌة استخدام الروتٌنات الفرعٌة‬
‫ و‬x ‫ المسؤول عن رسم دابرة باستخدام‬DrawCircleUsingCenter ‫ ثم ٌقوم باستدعاء روتٌن‬. y‫ و‬x ‫مختلفة ٌتم تخزٌنها فً متغٌرات‬
.‫ لمركز الدابرة‬y

GraphicsWindow.BackgroundColor = "Black"
GraphicsWindow.PenColor = "LightBlue"
GraphicsWindow.Width = 480
For i = 0 To 6.4 Step 0.17
x = Math.Sin(i) * 100 + 200
y = Math.Cos(i) * 100 + 200

DrawCircleUsingCenter()
EndFor

Sub DrawCircleUsingCenter
startX = x - 40
startY = y - 40

GraphicsWindow.DrawEllipse(startX, startY, 120, 120)


EndSub
‫الشكل ‪ - 46‬مثال للروتينات الفرعية باستخدام الرسومات‬

‫استذعبء روتيِ فرعً ٍِ داخو تنرار دائري‬


‫أحٌانا ٌتم استدعاء روتٌن فرعى من داخل تكرار دابرى‪ ،‬خالل ذلك الوقت ٌقومون بتنفٌذ نفس البٌانات ولكن مع قٌم مختلفة لواحد أو‬
‫أكثر من المتغٌرات‪ .‬على سبٌل المثال‪ ،‬إذا كان لدٌك روتٌن ٌدعى ‪ PrimeCheck‬وهذا الروتٌن ٌحدد ان كان الرقم المعطى عدد أولى ام‬
‫ال‪ٌ .‬مكنك كتابة برنامج ٌتٌح للمستخدم إدخال قٌمة وٌمكن القول بعد ذلك إذا كان عدد اولى ام ال ‪ ،‬وذلك باستخدام هذا الروتٌن‪ .‬البرنامج‬
‫أدناه ٌوضح ذلك‪.‬‬

‫)" ‪TextWindow.Write("Enter a number:‬‬


‫)(‪i = TextWindow.ReadNumber‬‬
‫"‪isPrime = "True‬‬
‫)(‪PrimeCheck‬‬
‫‪If (isPrime = "True") Then‬‬
‫)"‪TextWindow.WriteLine(i + " is a prime number‬‬
‫‪Else‬‬
‫)"‪TextWindow.WriteLine(i + " is not a prime number‬‬
‫‪EndIf‬‬

‫‪Sub PrimeCheck‬‬
‫)‪For j = 2 To Math.SquareRoot(i‬‬
‫‪If (Math.Remainder(i, j) = 0) Then‬‬
‫"‪isPrime = "False‬‬
‫‪Goto EndLoop‬‬
‫‪EndIf‬‬
‫‪Endfor‬‬
‫‪EndLoop:‬‬
‫‪EndSub‬‬

‫روتٌن ‪ٌ PrimeCheck‬أخذ قٌمة ‪ ،i‬وٌحاول ان ٌقسمه على أرقام اصغر‪ .‬إذا قمنا بقسمة ‪ i‬على رقم ولم ٌوجد باقً فـ ‪ i‬لٌس رقم اولى‪.‬‬
‫عند هذه النقطة ٌقوم الروتٌن بتعٌٌن قٌمة ‪ isPrime‬الى"‪( "False‬خطأ) وٌخرج‪ .‬إذا كان الرقم غٌر قابل للقسمة على أعداد أصغر تبقى‬
‫قٌمة ‪ isPrime‬كما هى‪( "True" :‬صحٌح)‪.‬‬

‫الشكل ‪ - 47‬اختبار االرقام االولية‬

‫اآلن بما اننا لدٌنا روتٌن ٌقوم باختبار االرقام االولٌة‪ ،‬باالمكان استخدامه لمعرفة جمٌع االرقام االولٌة مثال االصغر من ‪ٌ .122‬مكننا‬
‫تعدٌل البرنامج السابق بسهولة الستدعاء ‪ PrimeCheck‬داخل تكرار حلقى‪ .‬عندها ٌقوم الروتٌن باستخدام قٌمة مختلفة عند كل تكرار‪.‬‬
‫لترى كٌفٌة عمل ذلك فى المثال التالى‪.‬‬

‫‪For i = 3 To 100‬‬
‫"‪isPrime = "True‬‬
‫)(‪PrimeCheck‬‬
‫‪If (isPrime = "True") Then‬‬
‫)‪TextWindow.WriteLine(i‬‬
‫‪EndIf‬‬
‫‪EndFor‬‬

‫‪Sub PrimeCheck‬‬
‫)‪For j = 2 To Math.SquareRoot(i‬‬
‫‪If (Math.Remainder(i, j) = 0) Then‬‬
‫"‪isPrime = "False‬‬
‫‪Goto EndLoop‬‬
‫‪EndIf‬‬
‫‪Endfor‬‬
‫‪EndLoop:‬‬
‫‪EndSub‬‬

‫فى البرنامج السابق ٌتم تعدٌل قٌمة ‪ i‬مع كل تكرار‪ .‬داخل التكرار الحلقى نقوم باستدعاء الروتٌن الفرعى ‪ٌ .PrimeCheck‬قوم هذا‬
‫الروتٌن بعد ذلك بتحدٌد ان كانت قٌمة ‪ i‬لرقم اولى ام ال‪ .‬بعد ذلك تخ ّزن النتٌجة فى المتغٌر‪ isPrime‬والذى ٌتم الوصول الٌه من خارج‬
‫التكرار الحلقى‪ .‬بعدها ٌتم طباعة قٌمة ‪ i‬ان كانت لرقم اولى‪ .‬وبما ان التكرار ٌتم من ‪ 3‬الى ‪ ،122‬فٌتم الحصول على جمٌع االرقام الولٌم‬
‫من ‪ 3‬الى ‪ 122‬اٌضا‪ .‬باالسفل نتٌجة البرنامج‪.‬‬
‫الشكل ‪ - 48‬االعداد االولية‬
10 ‫الفصل‬
‫اىصفبئف‬

‫ ألٌس كذلك؟‬،‫ بعد ان وصلنا إلى هذا الحد ال بد انك تقضى وقتا طٌبا‬- ‫اآلن ٌجب أن تكون على دراٌة جٌدة باستخدام المتغٌرات‬

:‫دعونا نعٌد النظر فً أول برنامج كتبناه باستخدام المتغٌرات‬

TextWindow.Write("Enter your Name: ")


name = TextWindow.Read()
TextWindow.WriteLine("Hello " + name)

، ‫ اآلن‬.‫" (مرحبا) للمستخدم‬Hello" ‫ فً وقت الحق قلنا‬.name ‫ تلقٌنا اسم المستخدم وتم تخزٌنه فى متغٌر ٌسمى‬،‫فً هذا البرنامج‬
: ً‫ كٌف نقوم بتخزٌن جمٌع أسمابهم؟ احد الطرق للقٌام بذلك ه‬.‫ مستخدمٌن‬5 ‫ مثال‬- ‫دعونا نقول ان هناك أكثر من مستخدم واحد‬

TextWindow.Write("User1, enter name: ")


name1 = TextWindow.Read()
TextWindow.Write("User2, enter name: ")
name2 = TextWindow.Read()
TextWindow.Write("User3, enter name: ")
name3 = TextWindow.Read()
TextWindow.Write("User4, enter name: ")
name4 = TextWindow.Read()
TextWindow.Write("User5, enter name: ")
name5 = TextWindow.Read()

TextWindow.Write("Hello ")
TextWindow.Write(name1 + ", ")
TextWindow.Write(name2 + ", ")
‫)" ‪TextWindow.Write(name3 + ",‬‬
‫)" ‪TextWindow.Write(name4 + ",‬‬
‫)‪TextWindow.WriteLine(name5‬‬

‫عند تشغٌل هذا البرنامج نحصل على التالى‪:‬‬

‫الشكل ‪ - 49‬بدون استخدام الصفائف‬

‫بوضوح ٌجب أن تكون هناك طرٌقة أفضل لكتابة مثل هذا البرنامج البسٌط‪ ،‬ألٌس كذلك؟ وخاصة ان الكمبٌوتر جٌد حقا فً ممارسة‬
‫المهام المتكررة ‪ ،‬لماذا ٌنبغً علٌنا عناء مع كتابة التعلٌمات البرمجٌة نفسها مرارا وتكرارا لكل مستخدم جدٌد؟ الحٌلة هنا هو تخزٌن‬
‫واسترجاع أكثر من اسم مستخدم واحد بستخدام نفس المتغٌر‪ .‬اذا كنا نستطٌع القٌام بذلك فٌمكننا اٌضا استخدام التكرار الحلقى ‪ For‬الذى‬
‫تعلمناه فً الفصول السابقة‪ .‬هذا ما سوف تساعدنا فٌه الصفابف‪.‬‬

‫ٍب هى اىصفيف؟‬
‫الصفٌف هو نوع خاص من المتغٌرات التً ٌمكن أن تحمل أكثر من قٌمة واحدة فً وقت واحد‪ .‬ما نعنٌه هو أنه بدال من االضطرار إلى‬
‫إنشاء ‪ name1‬و ‪ name2‬و ‪ name3‬و ‪ name4‬و ‪ name5‬لتخزٌن أسماء المستخدمٌن الخمسة ‪ ،‬باالمكان استخدام متغٌر‬
‫‪ name‬فقط لتخزٌن اسم اسم كافة المستخدمٌن الخمسة‪ .‬الطرٌقة لتخزٌن قٌم متعددة نقوم باستخدام ما ٌسمى بـ "الفهرس"‪ .‬مثال‪،‬‬
‫]‪ name[1‬و ]‪ name[2‬و ]‪ name[3‬و ]‪ name[4‬و ]‪ name[5‬كل منها تستعمل لتخزٌن قٌمة‪ .‬االرقام ‪ 1‬و‪ 2‬و‪ 3‬و‪ 4‬و ‪ 5‬تسمى‬
‫"فهارس" الصفٌف‪.‬‬
‫مع ان ]‪ name[1‬و ]‪ name[2‬و ]‪ name[3‬و ]‪ name[4‬و ]‪ name[5‬تبدو كلها كأنها تستعمل اكثر من متغٌر‪ ،‬فى الحقٌقة هى‬
‫كلها متغٌر واحد‪ .‬وقد تسأل ما هى الفابدة من ذلك؟ افضل مٌزة لتخزٌن القٌم فى صفٌف هو أنه ٌمكنك تحدٌد فهرس باستخدام متغٌر آخر‬
‫بما ٌسمح لك بالوصول الى الصفابف بسهولة داخل تكرار دابرى‪.‬‬
‫واآلن ‪ ،‬دعونا نرى كٌف ٌمكننا وضع هذه المعلومات الجدٌدة إلعادة كتابة برنامجنا السابق باستخدام المصفوفات‪.‬‬

‫‪For i = 1 To 5‬‬
‫)" ‪TextWindow.Write("User" + i + ", enter name:‬‬
‫)(‪name[i] = TextWindow.Read‬‬
‫‪EndFor‬‬

‫)" ‪TextWindow.Write("Hello‬‬
‫‪For i = 1 To 5‬‬
‫)" ‪TextWindow.Write(name[i] + ",‬‬
‫‪EndFor‬‬
‫)""(‪TextWindow.WriteLine‬‬
‫اسهل كثٌرا‪ ،‬الٌس كذلك؟ الحظ السطرٌن بالخط العرٌض‪ .‬االول ٌخزن القٌمة فى الصفٌف والثانى ٌقرأ القٌمة من الصفٌف‪.‬‬
‫القٌمة التى ٌتم تخزٌنها فى]‪ name[2‬لن تتأثر بتلك المخزنة فى ]‪ .name[1‬لذا فى معظم الحاالت ٌمكنك اعتبار ]‪ name[1‬و‬
‫]‪ name[2‬متغٌران مختلفان ولكن بنفس الهوٌة‪.‬‬

‫الشكل ‪ - 50‬استخدام الصفائف‬

‫البرنامج أعاله ٌعطً النتٌجة نفسها تقرٌبا واحد من دون المصفوفات ‪ ،‬باستثناء الفاصلة فً نهاٌة ‪ . Mantis‬وٌمكننا تصلٌح ذلك من‬
‫خالل اعادة كتابة تكرار الطباعة‪:‬‬

‫)" ‪TextWindow.Write("Hello‬‬
‫‪For i = 1 To 5‬‬
‫)]‪TextWindow.Write(name[i‬‬
‫‪If i < 5 Then‬‬
‫)" ‪TextWindow.Write(",‬‬
‫‪EndIf‬‬
‫‪EndFor‬‬
‫)""(‪TextWindow.WriteLine‬‬

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

‫)" ‪TextWindow.Write("Enter name:‬‬


‫)(‪user["name"] = TextWindow.Read‬‬
‫)" ‪TextWindow.Write("Enter age:‬‬
‫)(‪user["age"] = TextWindow.Read‬‬
‫)" ‪TextWindow.Write("Enter city:‬‬
‫)(‪user["city"] = TextWindow.Read‬‬
‫)" ‪TextWindow.Write("Enter zip:‬‬
‫)(‪user["zip"] = TextWindow.Read‬‬

‫)" ?‪TextWindow.Write("What info do you want‬‬


‫)(‪index = TextWindow.Read‬‬
‫)]‪TextWindow.WriteLine(index + " = " + user[index‬‬

‫الشكل ‪ - 51‬استخدام فهارس غير رقمية‬

‫أمثر ٍِ ثعذ وادذ‬


‫ترٌد تخزٌن اسم ورقم هاتف جمٌع اصدقابك ومن ثم تكون قادر على البحث عن أرقام الهواتف الخاصة بهم كلما كنت فً حاجة ‪ -‬مثل‬
‫دلٌل الهاتف‪ .‬كٌف تكتب مثل هذا البرنامج؟‬

‫فً هذه الحالة ‪ ،‬هناك مجموعتٌن من الفهارس (المعروف أٌضا باسم بعد الصفٌف) المعنٌة‪ .‬نفترض أننا نحدد كل صدٌق عن طرٌق‬
‫اللقب‪ٌ .‬صبح هذا فهرسنا األول فً الصفٌف‪ .‬وبمجرد استخدام الفهرس األول للحصول على متغٌر صدٌقنا ‪ٌ ،‬صبح الفهرس الثانى‬
‫هو ‪ name‬او ‪ phone‬وٌساعدنا على الحصول على االسم الكامل ورقم الهاتف لهذا الصدٌق‪.‬‬

‫طرٌقة تخزٌن هذه البٌانات سٌكون مثل هذا ‪:‬‬

‫"‪friends["Rob"]["Name"] = "Robert‬‬
‫"‪friends["Rob"]["Phone"] = "555-6789‬‬

‫"‪friends["VJ"]["Name"] = "Vijaye‬‬
‫"‪friends["VJ"]["Phone"] = "555-4567‬‬

‫"‪friends["Ash"]["Name"] = "Ashley‬‬
‫"‪friends["Ash"]["Phone"] = "555-2345‬‬

‫ألن هناك فهرسٌن لنفس الصفٌف ‪ٌ ، friends‬سمى هذا الصفٌف‪ :‬صفٌف ثنابى االبعاد‪.‬‬

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

‫"‪friends["Rob"]["Name"] = "Robert‬‬
‫"‪friends["Rob"]["Phone"] = "555-6789‬‬
friends["VJ"]["Name"] = "Vijaye"
friends["VJ"]["Phone"] = "555-4567"

friends["Ash"]["Name"] = "Ashley"
friends["Ash"]["Phone"] = "555-2345"

TextWindow.Write("Enter the nickname: ")


nickname = TextWindow.Read()

TextWindow.WriteLine("Name: " + friends[nickname]["Name"])


TextWindow.WriteLine("Phone: " + friends[nickname]["Phone"])

A simple phone book - 52 ‫الشكل‬

‫استخذاً اىصفبئف ىتَثيو اىشجنبد‬


‫ الجداول لها صفوف واعمدة لذا تناسب صفٌف ثنابى‬.‫احد االستخدانات الشابعة للصفابف المتعددة االبعاد هو تمثٌل الشبكات والجداول‬
:‫ وهنا برنامج بسٌط ٌرتب صنادٌق داخل شبكة‬.‫االبعاد‬

rows = 8
columns = 8
size = 40

For r = 1 To rows
For c = 1 To columns
GraphicsWindow.BrushColor = GraphicsWindow.GetRandomColor()
boxes[r][c] = Shapes.AddRectangle(size, size)
Shapes.Move(boxes[r][c], c * size, r * size)
EndFor
EndFor

‫ فإنه أٌضا ٌقوم ببتخزٌن هذه الصنادٌق‬، ‫ باالضافة الى وضع هذه الصنادٌق‬.8×8 ‫هذا البرنامج ٌضٌف مستطٌالت وٌرتبها لتشكٌل شبكة‬
.‫ وذلك لتسهٌل تتبع هذه الصنادٌق واستخدامها مرة أخرى عند الحاجة إلٌها‬.‫فً صفٌف‬
‫الشكل ‪ - 53‬ترتيب الصناديق فى شبكة‬

‫على سبٌل المثال ‪ ،‬إضافة التعلٌمات البرمجٌة التالٌة لنهاٌة البرنامج السابق من شأنها أن تجعل هذه المربعات تتحرك ألعلى الزاوٌة‬
‫الٌسرى‪.‬‬

‫‪For r = 1 To rows‬‬
‫‪For c = 1 To columns‬‬
‫)‪Shapes.Animate(boxes[r][c], 0, 0, 1000‬‬
‫)‪Program.Delay(300‬‬
‫‪EndFor‬‬
‫‪EndFor‬‬
‫الشكل ‪ - 54‬تتبع المربعات في الشبكة‬
‫الفصل ‪11‬‬
‫األدـذاث واىتفـبعـو‬

‫فً اول فصلٌن ‪ ،‬قدمنا الكابنات التً لدٌها خصابص وعملٌات‪ .‬باإلضافة إلى الخصابص والعملٌات ‪ ،‬بعض الكابنات توفر ما ٌسمى‬
‫باألحداث (‪ .)Events‬األحداث مثل اإلشارات التً رُفعت‪ ،‬على سبٌل المثال ‪ ،‬ردا على إجراءات المستخدم ‪ ،‬مثل تحرٌك الماوس أو‬
‫الضغط علٌه‪ .‬بمعنى ما‪ ،‬األحداث هى عكس العملٌات‪ .‬فً حالة العملٌة‪ ،‬المبرمج هو ٌستدعٌها لجعل الكمبٌوتر القٌام بشًء ‪ ،‬بٌنما فً‬
‫حالة األحداث ‪ ،‬الكمبٌوتر هو الذى ٌعرفك عندما ٌكون هناك شًء لالهتمام‪.‬‬

‫ميف تنىُ األدذاث ٍفيذح؟‬


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

‫أدناه برنامج بسٌط جدا لدٌه بٌان واحد فقط وروتٌن فرعى واحد‪ .‬الروتٌن ٌستخدم عملٌة ‪ ShowMessage‬على ‪GraphicsWindow‬‬
‫لكى ٌعرض مربع رسالة للمستخدم‪.‬‬

‫‪GraphicsWindow.MouseDown = OnMouseDown‬‬

‫‪Sub OnMouseDown‬‬
‫)"‪GraphicsWindow.ShowMessage("You Clicked.", "Hello‬‬
‫‪EndSub‬‬

‫الجزء المثٌر لالهتمام فً البرنامج أعاله هو السطر الذي قمنا فٌه بتعٌٌن اسم روتٌن إلى الحدث ‪ MouseDown‬من كابن‬
‫‪ .GraphicsWindow‬ستالحظ أن ‪ٌ MouseDown‬بدو كثٌرا مثل خاصٌة ‪ -‬إال أنه بدال من تعٌٌن قٌمة ما‪ ،‬قمنا بتعٌٌن روتٌن‬
‫‪ OnMouseDown‬إلٌها‪ .‬هذا ما هو اهم ما فى األحداث ‪ -‬عندما ٌحدث هذا الحدث ‪ٌ ،‬تم استدعاء الروتٌن تلقابٌا‪ .‬فً هذه الحالة ‪ٌ ،‬تم‬
‫استدعاء روتٌن ‪ OnMouseDown‬فً كل مرة ٌنقر المستخدم باستخدام الماوس على ‪ .GraphicsWindow‬اآلن جرب بنفسك تشغٌل‬
‫البرنامج‪ .‬أي وقت تنقر زر الفأرة على ‪ ، GraphicsWindow‬سترى مربع رسالة على غرار هو مبٌن فً الصورة ادناه‪.‬‬
‫الشكل ‪ - 55‬االستجابة لحدث‬

‫هذا الطرٌقة فى التعامل مع االحداث تسمح بانشاء برامج خالقة جدا ومثٌرة لالهتمام‪ .‬البرامج المكتوبة بهذه الطرٌقة غالبا ما تسمى برامج‬
‫مستندة الى احداث (‪.)event-driven programming‬‬
‫بامكانك تعدٌل روتٌن ‪ OnMouseDown‬لفعل أشٌاء أخرى غٌر اظهار مربع رسالة‪ .‬على سبٌل المثال ‪ ،‬كما فً البرنامج أدناه ‪ٌ ،‬مكنك‬
‫رسم نقاط زرقاء كبٌرة فى الموقع الذى ٌقوم فٌه المستخدم بالنقر على الماوس‪.‬‬

‫"‪GraphicsWindow.BrushColor = "Blue‬‬
‫‪GraphicsWindow.MouseDown = OnMouseDown‬‬

‫‪Sub OnMouseDown‬‬
‫‪x = GraphicsWindow.MouseX - 10‬‬
‫‪y = GraphicsWindow.MouseY - 10‬‬
‫)‪GraphicsWindow.FillEllipse(x, y, 20, 20‬‬
‫‪EndSub‬‬

‫الشكل ‪ – 56‬التعامل مع حدث ‪MouseDown‬‬


‫الحظ أنه فً البرنامج أعاله ‪،‬استخدمنا ‪ MouseX‬و ‪ MouseY‬للحصول على احداثٌات الماوس‪ .‬ثم استخدمنا هذه االحداثٌات كمركز‬
‫الدابرة لرسمها‪.‬‬

‫اىتعبٍو ٍع أدذاث ٍتعذدح‬


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

‫"‪GraphicsWindow.BrushColor = "Blue‬‬
‫‪GraphicsWindow.MouseDown = OnMouseDown‬‬
‫‪GraphicsWindow.KeyDown = OnKeyDown‬‬

‫‪Sub OnKeyDown‬‬
‫)(‪GraphicsWindow.BrushColor = GraphicsWindow.GetRandomColor‬‬
‫‪EndSub‬‬

‫‪Sub OnMouseDown‬‬
‫‪x = GraphicsWindow.MouseX - 10‬‬
‫‪y = GraphicsWindow.MouseY - 10‬‬
‫)‪GraphicsWindow.FillEllipse(x, y, 20, 20‬‬
‫‪EndSub‬‬
‫الشكل ‪ - 57‬اىتعبٍو ٍع أدذاث ٍتعذدح‬

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

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

‫‪GraphicsWindow.MouseMove = OnMouseMove‬‬

‫‪Sub OnMouseMove‬‬
‫‪x = GraphicsWindow.MouseX‬‬
‫‪y = GraphicsWindow.MouseY‬‬
‫)‪GraphicsWindow.DrawLine(prevX, prevY, x, y‬‬
‫‪prevX = x‬‬
‫‪prevY = y‬‬
‫‪EndSub‬‬

‫ولكن عند تشغٌل هذا البرنامج ‪ ،‬الخط األول ٌبدأ دابما من الحافة الٌسرى العلٌا من االطار عند االحداثى (‪ٌ .)2 ، 2‬مكننا حل هذه المشكلة‬
‫عن طرٌق التعامل مع الحدث ‪ MouseDown‬والتقاط قٌمة ‪ prevX‬و ‪ prevY‬عندما ٌأتى الحدث‪.‬‬
‫أٌضا‪ ،‬نحن حقا بحاجة فقط لرسم الخط عنما ٌكون زر الماوس مضغوطا باستمرار‪ .‬من أجل الحصول على هذا‪ ،‬سوف نستخدم الخاصٌة‬
‫ إذا كانت هذه القٌمة صحٌحة‬.‫ هذه الخاصٌة تبلغنا ان كان الزر االٌسر للماوس مضغوطا أم ال‬.Mouse ‫ لكابن‬IsLeftButtonDown
.‫ إن لم ٌكن سنقوم بتخطً الخط‬، ‫سنقوم برسم خط‬

GraphicsWindow.MouseMove = OnMouseMove
GraphicsWindow.MouseDown = OnMouseDown

Sub OnMouseDown
prevX = GraphicsWindow.MouseX
prevY = GraphicsWindow.MouseY
EndSub

Sub OnMouseMove
x = GraphicsWindow.MouseX
y = GraphicsWindow.MouseY
If (Mouse.IsLeftButtonDown) Then
GraphicsWindow.DrawLine(prevX, prevY, x, y)
EndIf
prevX = x
prevY = y
EndSub
"‫ملحق "أ‬
‫أٍثيخ ٍردخ‬

‫ اىسيذفبح‬Fractal

fractal ‫ ترسم شجرة‬Turtle - 58 ‫الشكل‬

angle = 30
delta = 10
distance = 60
Turtle.Speed = 9
GraphicsWindow.BackgroundColor = "Black"
GraphicsWindow.PenColor = "LightGreen"
DrawTree()

Sub DrawTree
If (distance > 0) Then
Turtle.Move(distance)
Turtle.Turn(angle)

Stack.PushValue("distance", distance)
distance = distance - delta
DrawTree()
Turtle.Turn(-angle * 2)
DrawTree()
Turtle.Turn(angle)
distance = Stack.PopValue("distance")

Turtle.Move(-distance)
EndIf
EndSub

Flickr ٍِ ‫صىر‬

Flickr ‫ استرداد صور من‬- 59 ‫الشكل‬


GraphicsWindow.BackgroundColor = "Black"
GraphicsWindow.MouseDown = OnMouseDown

Sub OnMouseDown
pic = Flickr.GetRandomPicture("mountains, river")
GraphicsWindow.DrawResizedImage(pic, 0, 0, 640, 480)
EndSub

‫خيفيخ ديْبٍينيخ ىسطخ اىَنتت‬

For i = 1 To 10
pic = Flickr.GetRandomPicture("mountains")
Desktop.SetWallPaper(pic)
Program.Delay(10000)
EndFor

‫ىعجخ اىَضرة‬

‫ لعبة المضرب‬- 60 ‫الشكل‬

GraphicsWindow.BackgroundColor = "DarkBlue"
paddle = Shapes.AddRectangle(120, 12)
ball = Shapes.AddEllipse(16, 16)
GraphicsWindow.MouseMove = OnMouseMove

x = 0
y = 0
deltaX = 1
deltaY = 1

RunLoop:
x = x + deltaX
y = y + deltaY

gw = GraphicsWindow.Width
gh = GraphicsWindow.Height
If (x >= gw - 16 or x <= 0) Then
deltaX = -deltaX
EndIf
If (y <= 0) Then
deltaY = -deltaY
EndIf

padX = Shapes.GetLeft (paddle)


If (y = gh - 28 and x >= padX and x <= padX + 120) Then
deltaY = -deltaY
EndIf

Shapes.Move(ball, x, y)
Program.Delay(5)

If (y < gh) Then


Goto RunLoop
EndIf

GraphicsWindow.ShowMessage("You Lose", "Paddle")

Sub OnMouseMove
paddleX = GraphicsWindow.MouseX
Shapes.Move(paddle, paddleX - 60, GraphicsWindow.Height - 12)
EndSub
"‫ملحق "ب‬
ُ‫األىىا‬

.‫ مصنفة حسب قاعدة اللون‬،Small Basic ‫هذه هى قابمة اسماء األلوان المستخدمة فى‬

‫األىىاُ اىذَراء‬
‫األىىاُ اىجرتقبىيخ‬
IndianRed #CD5C5C
LightSalmon #FFA07A
LightCoral #F08080
Coral #FF7F50
Salmon #FA8072
Tomato #FF6347
DarkSalmon #E9967A
OrangeRed #FF4500
LightSalmon #FFA07A
DarkOrange #FF8C00
Crimson #DC143C
Orange #FFA500
Red #FF0000
FireBrick #B22222 ‫األىىاُ اىصفراء‬
DarkRed #8B0000 Gold #FFD700
Yellow #FFFF00
‫األىىاُ اىىرديخ‬
LightYellow #FFFFE0
Pink #FFC0CB
LemonChiffon #FFFACD
LightPink #FFB6C1
LightGoldenrodYellow #FAFAD2
HotPink #FF69B4
PapayaWhip #FFEFD5
DeepPink #FF1493
Moccasin #FFE4B5
MediumVioletRed #C71585
PeachPuff #FFDAB9
PaleVioletRed #DB7093
PaleGoldenrod #EEE8AA
Khaki #F0E68C SpringGreen #00FF7F
DarkKhaki #BDB76B MediumSeaGreen #3CB371
SeaGreen #2E8B57
‫األىىاُ اىقرٍسيخ‬
ForestGreen #228B22
Lavender #E6E6FA
Green #008000
Thistle #D8BFD8
DarkGreen #006400
Plum #DDA0DD
YellowGreen #9ACD32
Violet #EE82EE
OliveDrab #6B8E23
Orchid #DA70D6
Olive #808000
Fuchsia #FF00FF
DarkOliveGreen #556B2F
Magenta #FF00FF
MediumAquamarine #66CDAA
MediumOrchid #BA55D3
DarkSeaGreen #8FBC8F
MediumPurple #9370DB
LightSeaGreen #20B2AA
BlueViolet #8A2BE2
DarkCyan #008B8B
DarkViolet #9400D3
Teal #008080
DarkOrchid #9932CC
DarkMagenta #8B008B ‫األىىاُ اىسرقبء‬
Purple #800080 Aqua #00FFFF
Indigo #4B0082 Cyan #00FFFF
SlateBlue #6A5ACD LightCyan #E0FFFF
DarkSlateBlue #483D8B PaleTurquoise #AFEEEE
MediumSlateBlue #7B68EE Aquamarine #7FFFD4
Turquoise #40E0D0
‫األىىاُ اىخضراء‬
MediumTurquoise #48D1CC
GreenYellow #ADFF2F
DarkTurquoise #00CED1
Chartreuse #7FFF00
CadetBlue #5F9EA0
LawnGreen #7CFC00
SteelBlue #4682B4
Lime #00FF00
LightSteelBlue #B0C4DE
LimeGreen #32CD32
PowderBlue #B0E0E6
PaleGreen #98FB98
LightBlue #ADD8E6
LightGreen #90EE90
SkyBlue #87CEEB
MediumSpringGreen #00FA9A
LightSkyBlue #87CEFA
DeepSkyBlue #00BFFF ‫األىىاُ اىجيضبء‬
DodgerBlue #1E90FF White #FFFFFF

CornflowerBlue #6495ED Snow #FFFAFA

MediumSlateBlue #7B68EE Honeydew #F0FFF0

RoyalBlue #4169E1 MintCream #F5FFFA

Blue #0000FF Azure #F0FFFF

MediumBlue #0000CD AliceBlue #F0F8FF

DarkBlue #00008B GhostWhite #F8F8FF

Navy #000080 WhiteSmoke #F5F5F5

MidnightBlue #191970 Seashell #FFF5EE


Beige #F5F5DC
‫األىىاُ اىجْيخ‬
OldLace #FDF5E6
Cornsilk #FFF8DC
FloralWhite #FFFAF0
BlanchedAlmond #FFEBCD
Ivory #FFFFF0
Bisque #FFE4C4
AntiqueWhite #FAEBD7
NavajoWhite #FFDEAD
Linen #FAF0E6
Wheat #F5DEB3
LavenderBlush #FFF0F5
BurlyWood #DEB887
MistyRose #FFE4E1
Tan #D2B48C
RosyBrown #BC8F8F ‫األىىاُ اىرٍبديخ‬
SandyBrown #F4A460 Gainsboro #DCDCDC

Goldenrod #DAA520 LightGray #D3D3D3

DarkGoldenrod #B8860B Silver #C0C0C0

Peru #CD853F DarkGray #A9A9A9

Chocolate #D2691E Gray #808080

SaddleBrown #8B4513 DimGray #696969

Sienna #A0522D LightSlateGray #778899

Brown #A52A2A SlateGray #708090

Maroon #800000 DarkSlateGray #2F4F4F


Black #000000

You might also like