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

أهداف الدرس
- يقسّم مهمة الروبوت إلى أجزاء صغيرة.
- يعرّف دالة بالكلمة def ويستدعيها.
- يستخدم الحلقة for مع الدوال لتكرار الأجزاء.
- يبني برنامج متاهة بسيطًا من دوال.
- يتتبع الأخطاء في البرنامج ويصلحها.
المفهوم الأساسي
البرمجة التركيبية تعني تقسيم المهمة الكبيرة إلى أجزاء صغيرة، وكتابة كل جزء في دالة مسماة نستدعيها متى شئنا، فيصبح البرنامج أقصر وأوضح وأسهل في التصحيح.
شرح الدرس
أراد فريق مدرسة أن يرسم الروبوت الافتراضي أربعة مربعات متتالية في ملعب المحاكاة. كتب أحد الطلاب أوامر المربع الأول ثم نسخها أربع مرات، فصار البرنامج طويلًا وأخطأ في أحد الأسطر. الحل الأفضل هو الدوال.
الأوامر قد تختلف قليلًا بين إصدارات المنصة، وكل كتلة روبوت تعمل داخل منصة VEXcode VR.
تقسيم المهمة إلى أجزاء
«لا نحل المشكلة الكبيرة دفعة واحدة، بل نقسمها إلى أجزاء صغيرة ونحل كل جزء على حدة»
لنفرض أن مهمة الروبوت: يقطع المتاهة، ويلتف حول العائق، ثم يتوقف عند الخط الأحمر. نقسمها إلى ثلاثة أجزاء، لكل جزء اسم:
- جزء أول: التقدم حتى الجدار.
- جزء ثانٍ: الدوران حول العائق.
- جزء ثالث: التوقف عند اللون.
تعريف الدالة واستدعاؤها
الدالة (Function) مجموعة أوامر لها اسم. نعرّفها مرة واحدة بالكلمة def، ثم نستدعي اسمها كلما احتجنا إليها.
# نص
def forward_step():
drivetrain.drive_for(FORWARD, 200, MM)
def turn_right():
drivetrain.turn_for(RIGHT, 90, DEGREES)
forward_step()
turn_right()
forward_step()- التعريف: السطر الذي يبدأ بـ def ثم اسم الدالة وقوسان ونقطتان.
- الجسم: الأسطر المزاحة ٤ مسافات تحت التعريف.
- الاستدعاء: كتابة اسم الدالة مع القوسين، فتنفذ أوامرها.
في المثال يتقدم الروبوت ٢٠٠ ملم ثم يدور يمينًا ثم يتقدم ٢٠٠ ملم.
تعريف الدالة لا ينفذها، وإنما يحفظها فقط، وتنفذ عندما نستدعيها.
دالة رسم المربع
المربع أربعة أضلاع متساوية وأربع زوايا قائمة، فنكرر «تقدم ثم دوران» أربع مرات:
# نص
def draw_square():
for i in range(4):
drivetrain.drive_for(FORWARD, 200, MM)
drivetrain.turn_for(RIGHT, 90, DEGREES)
draw_square()الحلقة for i in range(4) تكرر الأمرين المزاحين أربع مرات، فيعود الروبوت إلى نقطة البداية بعد رسم المربع.
لرسم مربعين متتاليين نضيف بعد الاستدعاء الأول أمرًا يحرك الروبوت قليلًا ثم نستدعي الدالة مرة ثانية، ولا نعيد كتابة أسطرها.
الدوران حول عائق
حين يعترض جسم الطريق نلتف حوله بسلسلة حركات نكتبها في دالة:
# نص
def go_around():
drivetrain.turn_for(RIGHT, 90, DEGREES)
drivetrain.drive_for(FORWARD, 200, MM)
drivetrain.turn_for(LEFT, 90, DEGREES)
drivetrain.drive_for(FORWARD, 400, MM)
drivetrain.turn_for(LEFT, 90, DEGREES)
drivetrain.drive_for(FORWARD, 200, MM)
drivetrain.turn_for(RIGHT, 90, DEGREES)يدور الروبوت يمينًا ثم يتقدم، ثم يدور يسارًا مرتين مع التقدم بينهما، وأخيرًا يدور يمينًا فيعود إلى اتجاهه الأول بعد تجاوز العائق. وعند الحاجة نستدعي go_around() في أي مكان فيه عائق.
مشروع متاهة بسيط
نكتب برنامج المتاهة من دوال صغيرة تتعاون معًا:
# نص
def go_to_wall():
drivetrain.drive(FORWARD)
while front_distance.get_distance(MM) > 300:
wait(1, SECONDS)
drivetrain.stop()
def turn_right():
drivetrain.turn_for(RIGHT, 90, DEGREES)
go_to_wall()
turn_right()
go_to_wall()
turn_right()يتقدم الروبوت إلى أول جدار ويدور يمينًا، ثم يتقدم إلى الجدار التالي ويدور يمينًا. ولتطويل المسار نكرر الاستدعاءات داخل for بحسب عدد زوايا المتاهة.
تتبع الأخطاء وإصلاحها
- نسيان القوسين عند الاستدعاء: كتابة turn_right بلا قوسين لا تنفذ الدالة.
- استدعاء دالة قبل تعريفها: تظهر رسالة خطأ لأن البرنامج لا يعرف الاسم بعد.
- خطأ في الإزاحة: أسطر لم تُزح ٤ مسافات لا تدخل في جسم الدالة أو الحلقة.
- خطأ منطقي: يدور الروبوت دورانًا زائدًا، فنجرّب ونعدّل الأرقام.
طريقة التصحيح: شغّل البرنامج، ولاحظ أين يخطئ الروبوت، ثم اختبر كل دالة وحدها قبل جمعها.
نشاط تعليمي
التطبيق الأول
عرّف دالة turn_left تدير الروبوت إلى اليسار بزاوية ٩٠ درجة ثم استدعها.
def turn_left(): وتحتها drivetrain.turn_for(LEFT, 90, DEGREES) ثم السطر turn_left().
أن يعرّف الطالب دالة ويستدعيها.
المسألة الثانية
كم ضلعًا يرسم الروبوت إذا استدعينا draw_square() مرتين متتاليتين؟
ثمانية أضلاع لأن كل استدعاء يرسم أربعة.
أن يتتبع الطالب الاستدعاء المتكرر.
الموقف الثالث
كتب طالب forward_step في آخر البرنامج بلا قوسين ولم يتحرك الروبوت.
ينقصه القوسان، والصواب forward_step().
أن يكتشف الطالب خطأ الاستدعاء.
ملاحظات مهمة
- 1نعرّف الدالة قبل أن نستدعيها.
- 2نختار اسمًا إنجليزيًا يعبر عن عمل الدالة.
- 3جسم الدالة يزاح ٤ مسافات.
- 4نختبر كل دالة وحدها ثم نجمعها.
أخطاء شائعة
- ✗ خطأنسيان النقطتين بعد اسم الدالة.✓ الصواب: نكتب def name(): وننهي السطر بنقطتين.
- ✗ خطأنسخ الأوامر بدل كتابة دالة.✓ الصواب: نجمع الأوامر المكررة في دالة ونستدعيها.
+عرض جميع الأخطاء (3) ←إخفاء الأخطاء الإضافية
- ✗ خطأتعريف الدالة دون استدعائها.✓ الصواب: نضيف سطر الاستدعاء لتعمل.
ملخص الدرس
- نقسم المهمة الكبيرة إلى أجزاء صغيرة.
- نعرّف الدالة بالكلمة def ونستدعيها باسمها وقوسين.
- الحلقة for تكرر الدالة أو الأوامر عددًا محددًا من المرات.
- نبني المتاهة من دوال، ونختبر كل دالة ونصلح الأخطاء.
هل أتقنت الدرس؟اختبر نفسك من خلال اختبار قصير من عدة أسئلة.