انتقل إلى المحتوى
Topos Uranos

ملخص

يفتتح هذا الدرس الوحدة الخامسة من الدورة، وهي مخصّصة للدوال. ويشرح الغاية من الوحدة: أن تعلّم تفكيك المسألة إلى أجزاء ذات أسماء، لكلٍّ منها واجهة وعقد، وحلّ بعض المسائل بردّها إلى نسخة أصغر منها، أي بالاستدعاء الذاتي؛ ويقدّم دروسها الأربعة والخيط الذي يجمعها؛ ويذكّر بما تفترض الوحدة أنه معلوم، ولا سيما الحلقات ولامتغيراتها من الوحدة 4؛ ويصوغ المسألة التي تحلّها الوحدة، وهي مسألة برنامج يكرّر الحساب نفسه منسوخًا، فيجيب خطأً بسبب سهوٍ في النسخ دون أن يقول المترجم شيئًا؛ ويقدّم مسبقًا العقد (الشرط المسبق والشرط اللاحق) بوصفه الصيغة التي ستحدّد بها الوحدة مواصفات كل جزء؛ ويبيّن إلى أين تقود، في الوحدات اللاحقة وفي دورة البرمجة بلغة C++ II.

أهداف التعلم

  1. وصف تسلسل محتويات الوحدة وشرح ما يقدّمه كل درس للدرس الذي يليه.
  2. تذكّر خوارزميات الوحدة 4 (تتبّع الحلقة، ولامتغيرها ومتغايرها) ومراجعتها عند الحاجة.
  3. استباق فكرة العقد بمثال: ما يشترطه جزء من البرنامج على من يستعمله، وما يضمنه له في المقابل.
  4. التعرّف على ما يُنتظر إتقانه عند إنهاء الوحدة، وتمييزه ممّا سيُتعلَّم في الوحدات اللاحقة.

تقييم الدخول

قبل اجتياز الوحدة يحسن قياس نقطة البداية. وهذا التقييم تقييم ذاتي: لا تُمنح عليه درجة، وغايته الوحيدة توجيه الدراسة. وتتناول الأسئلة الخمسة الأولى ما تفترض الوحدة أنه معلوم: تتبّع الحلقة، ولامتغيرها، والشرط المسبق لمواصفات ما، ونسخ قيمة عند التهيئة، والبحث داخل برنامج من الوحدة 4 عن حساب له مدخلاته ومخرجاته الخاصة. وتتناول الأسئلة الخمسة التي تليها، بترتيب الدروس، الأفكار المحورية في الوحدة: مكدس الاستدعاءات، وتمرير قيمة إلى الدالة، وفصل الحساب عن العرض، والتعريف التراجعي للمضروب، وتنفيذ دالة تستدعي نفسها. ولا أحد ملزم بالإصابة فيها بعدُ، وفي بعضها يكون «لا أعرف بعدُ» جوابًا صادقًا: فكل جواب، صائبًا كان أو خاطئًا، يشرح المسألة ويسمّي الدرس الذي يعالجها. وتُقاس المهارات نفسها مرة أخرى في النهاية، في درس الخلاصة.

تقييم الدخول

قبل أن تبدأ الوحدة، قِس نقطة انطلاقك. إنه تقييم ذاتي قصير: لا يُمنح عليه درجة، وتُحفظ نتيجته في متصفحك فقط.

  1. السؤال 1من وحدات سابقةماذا يكتب int n{305}; int c{1}; while (n >= 10) { n = n / 10; ++c; } std::println("{}", c);؟

  2. السؤال 2من وحدات سابقةفي الحلقة int total{0}; int k{1}; while (k <= n) { total += k; ++k; }، مع n≥0n \geq 0، ما العلاقة التي تصحّ في كل مرة يُحسب فيها الشرط؟

  3. السؤال 3من وحدات سابقةتقول مواصفات القسمة: «إذا أُعطي عددان صحيحان a≥0a \geq 0 وb>0b > 0، فالمطلوب إيجاد qq وrr بحيث a=b⋅q+ra = b \cdot q + r و0≤r<b0 \leq r < b». ما شرطها المسبق؟

  4. السؤال 4من وحدات سابقةبعد int a{3}; int b{a}; b = 7;، كم تساوي a؟

  5. السؤال 5من وحدات سابقةالبرنامج الذي يكتب الأعداد الأولية الأصغر من 100 في الدرس 4.4 فيه حلقة تمرّ على المرشّحين، وداخلها حلقة أخرى تختبر قواسمهم. أيّ جزء منه حساب له مدخلاته ومخرجاته الخاصة، يحسن أن يُعطى اسمًا؟

  6. السؤال 6يبدأ برنامج في main؛ وتستدعي main دالة g، وتستدعي g دالة أخرى h. ما الاستدعاءات الجارية أثناء تنفيذ h؟

  7. السؤال 7مع الدالة int f(int x) { x = x + 1; return x; }، ماذا يكتب int a{3}; int b{f(a)}; std::println("{} {}", a, b);؟

  8. السؤال 8يقرأ برنامج تاريخًا وعليه أن يكتب يوم الأسبوع الذي يوافقه. أيّ تفكيك يفصل الحساب عن العرض؟

  9. السؤال 9أيّ التعريفات الآتية يعرّف n!n! لكل عدد طبيعي nn؟

  10. السؤال 10مع int f(int n) { if (n == 0) { return 0; } return n + f(n - 1); }، ماذا يكتب std::println("{}", f(3));؟