Introducing Small Basic
Introducing Small Basic
مقدمة فى البرمجة
الفصل 1
مقدمــة
Small Basicواىجــرٍجـــــخ
البرمجة هى عملٌة تكوٌن برنامج باستخدام لغة البرمجة .كما نفهم ونتحدث االنجلٌزٌة او االسبانٌة او الفرنسٌةٌ ،ستطٌع اكمبٌوتر ان ٌفهم
البرامج المكتوبة بلغات معٌنة .تسمى هذه اللغات لغات البرمجة .فى البداٌة كان هناك عدد قلٌل من لغات البرمجة وكان من السهل ان
تفهم وتتعلم هذه اللغات .ولكن مع زٌادة تعقٌد اجهزة الكمبٌوتر والبرامج ،تطورت لغات البرمجة بسرعة لتشمل مفاهٌم اكثر تعقٌدا على
مدار الوقت .بالتالى اصبحت غالبٌة لغات البرمجة الحدٌثة والمفاهٌم الخاصة بها صعبة الفهم بالنسبة للمبتدىء .وقد بدأت هذه الحقٌقة
تثبٌط الناس من التعلم أو محاولة برمجة الكمبٌوتر.
Small Basicهو لغة برمجة مصممة خصٌصا لجعل البرمجة سهلة للغاٌة وممتعة بالنسبة للمبتدبٌن .الهدف من Small Basicكسر
الحاجز وتوفٌر الخطوات االولى الى عالم البرمجة الرابع.
1
3
الشكل 1البيئة الخاصة بـ Small Basic
هذه هى البٌبة الخاصة بالــ Small Basicالتى سوف تقوم فٌها بكتابة وتشغٌل برامج الــ .Small Basicهذه الٌٌبة تشمل العدٌد من
العناصر التى تم تعرٌفها باالرقام.
المحرر ،معرف بــ ( )1هو المكان الذى سنقوم فٌه بكتابة برامج الــ .Small Basicعندما تقوم بفتح نموذج لبرنامج ( )Templateاو
برنامج تم حفظه مسبقا ،سوف ٌظهر على هذا المحررٌ .مكنك بعد ذلك تعدٌله وحفظه لالستخدام فٌما بعد.
ٌمكنك اٌضا ان تقوم بفتح وتشغٌل اكثر من برنامج فى وقت واحد .كل برنامج تقوم بتشغٌله سٌتم عرضه فى محرر منفصل .المحرر
الذى ٌحتوى على البرنامج الذى تقوم بتشغٌله حالٌا ٌسمى بــ المحرر النشط.
شرٌط االدوات ،المعرف ب (ٌ )2ستخدم فى اصدار اوامر اما الى المحرر النشط او الى البٌبة .سوف نتعلم االوامر المختلفة فى شرٌط
االدوات الحقا.
ثرّبٍجْب االوه
بما انك اصبحت مالوفا بالبٌبة الخاصة بــ ،Small Basicسوف نبدا البرمجة فٌها .كما هو موضح اعاله ،المحرر هو المكان الذى نكتب
فٌه برامجنا .فهٌا بنا نبدأ بكتابة السطر التالى فى المحرر.
)"TextWindow.WriteLine("Hello World
هذا هو برنامجنا االول فى الـ .Small Basicولو قمت بكتابته صحٌحا ،سوف ترى شٌبا مماثال للرسم التوضٌحى اسفل.
الشكل - 2اول برنامج
بما اننا قمنا بكتابة برنامجنا الجدٌد ،هٌا نقوم بتشغٌله لنرى ماذا سٌحدثٌ .مكننا ان نقوم بتشغٌل برنامجنا اما بالنقر على زر التشغٌل
الموجود على شرٌط االدوات او باستخدام مفتاح االختصار F5الموجود على لوحة المفاتٌح .لو كل شىء تم على ما ٌرام ،سٌتم تشغٌل
برنامجنا وستكون النتابج كما هو موضح اسفل.
مبروك! لقد قمت بكتابة وتشغٌل اول برنامج .هو برنامج صغٌر جدا وسهل ،ولكن فى نفس الوقت خطوة كبٌرة لكى تصبح مبرمج
حقٌقى! اآلنٌ ،جب ان نغطى تفصٌلة واحدة اضافٌة قبل ان نقوم بعمل برامج اكبرٌ .جب ان نفهم ماذا حدث – ماذا قلنا لجهاز الكبٌوتر
وكٌف عرف جهاز الكمبٌوتر ماذا ٌفعل؟ فى الفصل التالى ،سنقوم بتحلٌل البرنامج الذى قمنا بكتابته ،لكى نفهم ماذا ٌحدث.
تخٌل مناقشة بٌنك وبٌن صدٌقك .انت واصدقاؤك ستستخدمون كلمات فى هٌبة جمل لنقل المعلومات بٌنكما .اٌضا ،لغات البرمجة تحتوى
على مجموعة من الكلمات التى ٌمكن تنظٌمها فى هٌبة جمل لنقل المعلومات الى الكمبٌوتر .والبرامج فى االساس هى مجموعة من الجمل
( احٌانا تكون قلٌلة واحٌانا اخرى ٌصل عددها الى االف) التى معا تكون ذات معنى للمبرمج والكمبٌوتر فحسب.
)"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ولكن هذه
المرة ٌتم طباعته باللون االصفر بدال من اللون الرمادى مسبقا.
الحظ العبارة الجدٌدة التى قمنا باضافتها الى البرنامج االصلىٌ .ستخدم البرنامج هنا كلمة جدٌدة 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
ٍقذٍخ فً اىَتغيراد
تذييو اىجرّبٍج
فى البرنامج الذى تم تشغٌله ،هذا هو السطر الذى قد ٌكون جذب انتباهك:
)(name = TextWindow.Read
)( Readمماثل لــ )( ،WriteLineولكن بدون مدخالت .انها العملٌة التى تقول للكمبٌوتر ان ٌنتظر المتسخدم حتى ٌقوم بكتابة شا ما
والضغط على مفتاح .Enterبمجرد ان ٌقوم المستخدم بالضغط على مفتاح ،Enterتقوم هذه العملٌة باخذ ما كتبه المستخدم واعادته
للبرنامج .النقطة المثٌرة لالنتباه هنا ان اى شىء كتبه المستخدم تم حفظه فى متغٌر ٌسمى ٌ .nameمكن تعرٌف المتغٌر بانه مكان لحفظ
القٌم بصورة مؤقتة الستخدامها فٌما بعد .فى السطر الموضح اعاله ،تم استخدام nameلحفظ اسم المستخدم.
هذا هو المكان الذى ستقوم فٌه باستخدام القٌمة التى تم حفظها فى المتغٌر .nameنأخذ القٌمة الموجودة بــ nameونلحقها بــ ”“Hello
ونكتبها فى اطار النص.
،Writeتماما كما WriteLineهى عملٌة اخرى فى
بمجرد ان ٌتم تعٌٌن المتغٌرٌ ،مكنك استخدامه اى عدد من Write .ConsoleWindowتتٌح لك كتابة شا ما الى
المرات .على سبٌل المثالٌ ،مكنك عمل التالى: ConsoleWindowولكنه ٌسمح للنص التالى ان ٌكون
على نفس سطر النص الحالً.
االسم ٌجب ان ٌبدأ بحرف وٌجب اال ٌكون أى من الكلمات االساسٌة مثل .if, for, then, etc .1
االسم ٌمكن ان ٌحتوى من اى مزٌج من الحروف ،األرقام والشرط السفلٌة. .2
المتغٌرات ٌمكن أن تكون طوٌلة كما ترٌد ،لذا من المفٌد أن ٌكون اسم المتغٌر ذات معنى معبر .3
اسم المتغٌر ٌعبر عن طرٌقة استخدامه .4
اىيعت ثبالرقبً
لقد رأٌنا كٌف ٌمكنك استخدام المتغٌرات لحفظ اسم المستخدم .فى البرامج القلٌلة القادمة ،سنرى كٌف ٌتم حفظ والتعامل مع االرقام فى
المتغٌرات .هٌا نبدأ ببرنامج بسٌط:
number1 = 10
number2 = 20
number3 = number1 + number2
)TextWindow.WriteLine(number3
فى السطر االول من البرنامج ،ستقوم بتعٌٌن القٌمة 10الى المتغٌر .number1وفى السطر الثانى ،ستقوم بتعٌٌن القٌمة 22الى
المتغٌر .number2فى السطر الثالث ،ستقوم بأضافة المتغٌر number1و number2وتعٌٌن النتٌجة الى المتغٌر .number3
بالتالى ،فى هذه الحالة المتغٌر number3ستكون قٌمته .32وهذا ما تم طباعته فى اطار النص.
number1 = 10
number2 = 20
number3 = number1 * number2
)TextWindow.WriteLine(number3
ٌمكنك ان تقوم بطرح او قسمة االرقام بنفس الطرٌقة .عملٌة الطرح ستكون كتالى:
أوال ،سنقوم بالحصول على درجة الحرارة بالفهرنهاٌت من المستخدم وحفظها فى متغٌر .هناك عملٌة خاصة تسمح لنا بقراءة االرقام من
المستخدم وهى .TextWindow.ReadNumber
بمجرد ان ٌتم حفظ درجة الحرارة بالفهرنهاٌت فى متغٌرٌ ،مكننا تحوٌلها الى درجة حرارة مؤٌة كالتالى:
االقواس تقول للكمبٌوتر ان ٌقوم بحساب جزء fahr – 32اوال ثم ٌقوم ببقٌة الحسابات .ما ٌجب علٌنا فعله اآلن هو طباعة النتٌجة
للمستخدم .بوضع كل ذلك معاٌ ،كمننا الحصول على البرنامج التالى:
بالرجوع مرة اخرى الى برنامجنا االول ،الٌس ظرٌفا لو قلنا Good Morning Worldاو Good Evening Worldعلى حسب
التوقٌت الٌومى بدال من World Helloبصفة عامة؟ فى البرنامج التالى ،سنجعل الكمبٌوتر ٌقول Good Morning Worldاذا كان
التوقٌت قبل الساعة 12ظهرا و Good Eveningاذا كان التوقٌت بعد الساعة 12ظهرا.
سترى احدى االخراجٌن على حسب التوقٌت الذى تقوم فٌه بتشغٌل البرنامج:
هٌا بنا نقوم بتحلٌل اول ثالثة سطور من البرنامج .هذا السطر ٌقول للكمبٌوتر اذا كانت الساعة اقل من 12ظهرا اذن قم بطباعة
” .“Good Morning Worldالكلمات If, Then and Endifهى كلمات مخصوصة ٌفهمها الكمبٌوتر عندما ٌتم تشغٌل البرنامج.
الكلمة Ifدابما ٌتبعها شرط الذى ٌعد فى هذه الحالة ) .(Clock.Hour < 12تذكر ان االقواس مهمة حتى ٌتفهم الكمبٌوتر ماذا ترٌد.
الشرط ٌتبعه thenوالعملٌة المراد تنفٌذها .وبعد العملٌة ٌأتى Endifلٌقول للكمبٌوتر ان التنفٌذ المشروط للعملٌة قد انتهى.
قد ٌكون هناك اكثر من عملٌة بٌن thenو End ifوسٌقوم الكمبٌوتر بتنفٌذهم جمٌعا اذا كان الشرط صالح .على سبٌل المثالٌ ،مكنك
كتابة التالى:
Else
قد تكون الحظت ان الشرط مكرر بالبرنامج الموجود فى بداٌة هذا الفصل .قٌمة Clock.Hourقد تكون اقل من 12ام ال .لم نكن بحاجة
ألستخدام الشرط الثانى .فى هذه الحالة ٌمكنك اختصار العبارتٌن if..then..endifفى عبارة واحدة عن طرٌق استخدام كلمة جدٌدة
.elseلو قمنا بأعادة كتابة البرنامج بأستخدام ،elseسٌكون كالتالى:
هذا البرنامج سٌفعل نفس الشىء الذى ٌفعله البرنامج االخر ،وهو ما ٌقودنا الى درس مهم جدا فى البرمجة:
هناك طرق متعددة لعمل نفس الشىء فى البرمجة .احٌانا قد تكون طرٌقة اكثر منطقٌة من الطرق االخرى .الخٌار متروك
للمبرمج .سوف تتعلم هذه التقنٌات المختلفة ومساوىء وعٌوب كل منها مع كتابة برامج اكثر وزٌادة خبرتك.
“
اىَسبفخ اىجبدئخ
فً جمٌع األمثلة ٌمكنك ان تالحظ المسافة البادبة فى البٌانات Ifو Elseو .EndIfهذه السافات البادبة لٌست ضرورٌة.
وسٌتمكن الكمبٌوتر من فهم البرنامج على ما ٌرام بدونهم .ومع ذلك ،فإنها تساعدنا على رؤٌة وفهم هٌكل البرنامج بطرٌقة
أسهل .ومن ثم ،تعتبر اضافة مسافة بادبة للبٌانات هذا القبٌل عادة جٌدة.
فردي أً زوجً
هٌا بنا نقوم بكتابة برنامج ٌبلغنا اذا كان الرقم الذى تم ادخاله فردى ام زوجى.
فى هذا البرنامج قدمنا لكم عملٌة اخرى جدٌدة ومفٌدة .Math.Remainderو بالفعل كما قد تكون فهمت بالفعل ستقوم
Math.Remainderبقسمة الرقم االول على الرقم الثانى واعادة البقٌة.
اىتفريعبد
تذكر لقد تعلمت فى الفصل الثانى ان الكمبٌوتر ٌقوم بتنفٌذ كل عبارة بالبرنامج على حدة بالترتٌب من اعلى السفل .لكن هناك عبارة
مخصوصة تجعل الكمبٌوتر ٌنتقل لعبارة اخرى خارج الترتٌب .هٌا نلقى نظرة على البرنامج التالى:
i = 1
start:
)TextWindow.WriteLine(i
i = i + 1
If (i < 25) Then
Goto start
EndIf
فى البرنامج الموضح اعاله تم تعٌٌن القٌمة 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
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
واالخراج هو:
الحظ اننا خفضنا عد سطور البرنامج من 8الى ،4ومع ذلك ٌظل االخراج مماثال تماما للبرنامج ذو الـ 8اسطر!
هل تذكر اننا قلنا سابقا انه توجد عدة طرق للقٌام بنفس الشىء؟ هذا مثال جٌد لذلك.
For..EndForفى لغة البرمجة ٌسمى تكرار حلقى حٌث انه ٌسمح باعطاء قٌمة بدء وقٌمة انهاء ،ثم جعل الكمبٌوتر ٌزٌد المتغٌر لك .كل
مرة ٌزٌد فٌها الكمبٌوتر قٌمة المتغٌرٌ ،قوم اٌضا بتشغٌل البٌانات الموجودة بٌن Forو.EndFor
ولكن ان اردت ان ٌزاد المتغٌر بـ 2بدال من ،1مثال لطباعة االرقام المفردة من 1الى ،24عندها ٌمكنك استخدام التكرار الحلقى لعمل
هذا اٌضا.
جزء الـ Step 2من بٌانٌ Forبلغ الكمبٌوتر بزٌادة قٌمة المتغٌر بـ 2بدال من 1كالعادة .باستخدام Stepبامكانك تحدٌد اى زٌادة
ترٌدها .حتى بامكانك تحدٌد رقم سلبى وجعل عد الكمبٌوتر الى الوراء ،كما فى المثال التالى:
For i = 10 To 1 Step -1
)TextWindow.WriteLine(i
EndFor
number = 100
)While (number > 1
)TextWindow.WriteLine(number
number = number / 2
EndWhile
فى البرنامج باعلى نقوم بتعٌٌن القٌمة 122الى numberومن ثم نقوم بتشغٌل التكرار الحلقى Whileما دامت قٌمة الرقم اكبر من .1
داخل التكرار الحلقى نقوم بطباع الرقم ثم قسمته على اثنان .وكما هو متوقع ،احراج البرنامج هو عدة ارقام ،كل منها هو نصف ما قبله.
ٌكون صعبا كتابة نفس البرنامج باستخدام التكرار الحلقى Forالننا ال نعرف كم مرة تتكرر الحلقة .باستخدام ٌ Whileكون سهال التحقٌق
من شرط ما ومن ثم سؤال الكمبٌوتر اما التكملة او التكرار.
ٌكون من المثٌر لالهتمام أن نالحظ ان كل تكرار حلقى Whileمن الممكن ترجمته الى بٌان .If..Thenعلى سبٌل المثال ٌ ،مكننا
إعادة كتابة البرنامج أعاله على النحو التالً دون التأثٌر على النتٌجة النهابٌة.
number = 100
startLabel:
TextWindow.WriteLine(number)
number = number / 2
حتى اآلن استخدمنا 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
ترى باالسفل كٌف ٌبدو االطار المخصصٌ .مكنك تغٌٌر لون الخلفٌة إلى واحدة من القٌم المدرجة فً الملحق "ب" .جرب هذه
الخصابص لترى كٌف ٌمكنك تغٌٌر مظهر النافذة.
GraphicsWindow.Width = 200
GraphicsWindow.Height = 200
)GraphicsWindow.DrawLine(10, 10, 100, 100
)GraphicsWindow.DrawLine(10, 100, 100, 10
الشكل - 25تقاطع
أول سطرٌن من البرنامج ٌقومان باعداد االطار والسطرٌن التالٌٌان ٌرسما الخطوط المتقاطعة .اول رقمٌن بعد ٌ DrawLineحددا
احداثٌات xو yللبدء والرقمٌن التالٌٌن ٌحددا احداثٌات نهاٌة الخط .والشًء المثٌر لالهتمام مع رسومات الكمبٌوتر هو أن تنسٌق
(ٌ )0 ، 0بدأ فً أعلى الزاوٌة الٌسرى من النافذة .فعلٌا ،احداثٌات االطار فى الربع الثانى.
وإذا عدنا إلى برنامج رسم الخطوط ،فمن المثٌر لالهتمام أن نالحظ أن ٌ 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)
.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)
وهً ال تؤثر فقط على الخطوط ولكن أٌضا أي. معا ٌعدال خصابص القلم الذى ٌرسم هذه الخطوط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
الجزء المثٌر لالهتمام فى هذا البرنامج هو التكرار الحلقى ،فى كل تكرار نقوم بزٌادة ( PenWidthعرض القلم) وباستخدامه نقوم برسم
خط جدٌد تحت آخر خط قمنا برسمه.
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
القطع الناقص هو اٌضا احد الدوابر .إذا كنت ترٌد أن ترسم دوابر ،سٌكون علٌك تحدٌد نفس العرض واالرتفاع.
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
Circtacular
. ٌقوم برسم دوابر بدال من مربعات،هذا البرنامج بدٌل للبرنامج السابق
GraphicsWindow.BackgroundColor = "Black"
GraphicsWindow.PenColor = "LightGreen"
GraphicsWindow.Width = 200
GraphicsWindow.Height = 200
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
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
)"GraphicsWindow.SetPixel(x, y, "LightGreen
EndFor
ان كنت ترٌد ان ترى النقاط و هى تشكل الـ 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تغيير االلوان
For i = 1 To 6
)Turtle.Move(100
)Turtle.Turn(60
EndFor
جرب هذا البرنامج ان كان ٌرسم حقا شكال مسدسا .نالحظ أنه بما ان الزاوٌة بٌن كل جانب هى 62درجة ،لذا نستخدم ). Turn(60
هذا المضلع كل جوانبه متساوٌة فى الطول ،لذا ٌمكن الحصول بسهولة على الزاوٌة بٌن كل جانب من خالل تقسٌم 362على عدد
الجوانب.باستعمال هذه المعلوما وباستخدام المتغٌراتٌ ،مكن أن نكتب برنامجا عامة جدا لرسم أي شكل مضلع متساوى الجوانب.
sides = 12
For i = 1 To sides
)Turtle.Move(length
)Turtle.Turn(angle
EndFor
باستخدام هذا البرنامجٌ ،مكنك رسم أي مضلع فقط عن طرٌق تعدٌل المتغٌر . sidesتعٌٌن 4لهذا المتغٌر سٌمكننا من رسم المربع كما
فى اول مثال .اما وضع قٌمة كبٌرة بما فٌه الكفاٌة ،مثال 52من شأنه أن ٌجعل الرسم تقرٌبا دابرى تماما.
باستخدام هذه التقنٌة ٌمكننا أن نجعل السلحفاة ترسم دوابر متعددة فً كل مرة مع تحول قلٌل مما ٌؤدى إلى نتابج مثٌرة لالهتمام.
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لجعل السلحفاة تتحرك بالسرعة التً
ترٌدها .
اىتذرك
باالمكان جعل السلحفاة تتوقف عن الرسم باستخدام العملٌة . PenUpهذا ٌسمح لك بنقل السلحفاة إلى أي مكان على الشاشة من دون
رسم خط .استدعاء PenDownسٌجعل سلحفاة ترسم مرة أخرى .وٌمكن استخدام هذا للحصول على بعض المؤثرات المثٌرة لالهتمام ،
مثال رسم خطوط المنقطة .وفٌما ٌلً برنامج ٌستخدم هذا لرسم المضلع ذى جوانب منقطة.
sides = 6
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لذا قمنا بالحصول على مضلع شكله مسدس كما هو
مبٌن باالسفل.
فً كثٌر من األحٌان أثناء كتابة برامج ستظهر بعض الحاالت التً سٌتعٌن علٌنا فٌها تشغٌل نفس مجموعة من الخطوات ،مرارا
وتكرارا .فً هذه الحاالت ،فإنه قد ال ٌكون له معنى إلعادة كتابة البٌانات نفسها مرات عدة .وعند ذلك تكون الروتٌنات الفرعٌة
( )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هو اسم الروتٌن الفرعى) وكما جرت العادة
العالمات "()" ضرورٌة لتعرٌف الكمبٌوترانك ترٌد تنفٌذ روتٌن فرعى.
وباإلضافة إلى ذلك ،الروتٌنات الفرعٌة ٌمكن أن تساعد على تحلٌل المشاكل المعقدة إلى قطع ابسط.مثال ،ان كان لدٌك معادلة معقدة
ٌمكنك كتابة عدة روتٌنات فرعٌة لحل قطع صغٌرة من المعادلة المعقدة .ومن ثم ٌمكنك وضع النتابج معا للحصول على حل المعادلة
المعقدة األصلٌة.
استخذاً اىَتغيراد
ٌمكنك الوصول إلى واستخدام أي متغٌر لدٌك فً برنامج من ضمن روتٌن فرعى .وكمثال على ذلكٌ ،قبل البرنامج التالً رقمٌن وٌطبع
أكبرهما .الحظ أن المتغٌر ٌ maxستخدم فً داخل وخارج للروتٌن.
)(FindMax
)TextWindow.WriteLine("Maximum number is: " + max
Sub FindMax
If (num1 > num2) Then
max = num1
Else
max = num2
EndIf
EndSub
هذه المرة سنقوم باستخدام برنامج رسومات ٌحسب نقاط.دعونا ننظر فً مثال آخر من شأنه توضٌح كٌفٌة استخدام الروتٌنات الفرعٌة
و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
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" :صحٌح).
اآلن بما اننا لدٌنا روتٌن ٌقوم باختبار االرقام االولٌة ،باالمكان استخدامه لمعرفة جمٌع االرقام االولٌة مثال االصغر من ٌ .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 الفصل
اىصفبئف
ألٌس كذلك؟، بعد ان وصلنا إلى هذا الحد ال بد انك تقضى وقتا طٌبا- اآلن ٌجب أن تكون على دراٌة جٌدة باستخدام المتغٌرات
، اآلن." (مرحبا) للمستخدمHello" فً وقت الحق قلنا.name تلقٌنا اسم المستخدم وتم تخزٌنه فى متغٌر ٌسمى،فً هذا البرنامج
: ً كٌف نقوم بتخزٌن جمٌع أسمابهم؟ احد الطرق للقٌام بذلك ه. مستخدمٌن5 مثال- دعونا نقول ان هناك أكثر من مستخدم واحد
TextWindow.Write("Hello ")
TextWindow.Write(name1 + ", ")
TextWindow.Write(name2 + ", ")
)" TextWindow.Write(name3 + ",
)" TextWindow.Write(name4 + ",
)TextWindow.WriteLine(name5
بوضوح ٌجب أن تكون هناك طرٌقة أفضل لكتابة مثل هذا البرنامج البسٌط ،ألٌس كذلك؟ وخاصة ان الكمبٌوتر جٌد حقا فً ممارسة
المهام المتكررة ،لماذا ٌنبغً علٌنا عناء مع كتابة التعلٌمات البرمجٌة نفسها مرارا وتكرارا لكل مستخدم جدٌد؟ الحٌلة هنا هو تخزٌن
واسترجاع أكثر من اسم مستخدم واحد بستخدام نفس المتغٌر .اذا كنا نستطٌع القٌام بذلك فٌمكننا اٌضا استخدام التكرار الحلقى 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متغٌران مختلفان ولكن بنفس الهوٌة.
البرنامج أعاله ٌعطً النتٌجة نفسها تقرٌبا واحد من دون المصفوفات ،باستثناء الفاصلة فً نهاٌة . Mantisوٌمكننا تصلٌح ذلك من
خالل اعادة كتابة تكرار الطباعة:
)" TextWindow.Write("Hello
For i = 1 To 5
)]TextWindow.Write(name[i
If i < 5 Then
)" TextWindow.Write(",
EndIf
EndFor
)""(TextWindow.WriteLine
فهرسخ صفيف
فً برنامجنا السابق رأٌت كٌف قمنا باستخدام أرقام وفهارس لتخزٌن واسترجاع القٌم من الصفٌف .ولكن ال تقتصر الفهارس على األرقام
فقطٌ .كون مفٌدا جدا استخدام الفهارس النصٌة اٌضا .على سبٌل المثال ،فً البرنامج التالً ،نسأل ونخزن معلومات مختلفة عن
المستخدم وبعد ذلك نقوم بطباعة المعلومات التى ٌطلبها المستخدم.
فً هذه الحالة ،هناك مجموعتٌن من الفهارس (المعروف أٌضا باسم بعد الصفٌف) المعنٌة .نفترض أننا نحدد كل صدٌق عن طرٌق
اللقبٌ .صبح هذا فهرسنا األول فً الصفٌف .وبمجرد استخدام الفهرس األول للحصول على متغٌر صدٌقنا ٌ ،صبح الفهرس الثانى
هو 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"
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
"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
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 ٍِ صىر
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
ىعجخ اىَضرة
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
Shapes.Move(ball, x, y)
Program.Delay(5)
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