ملخص
ميّز الدرس من المسألة إلى الخوارزمية ثلاث طرائق لتركيب الخطوات: التسلسل والقرار والتكرار. وللطريقتين الأوليين كتابتهما في C++ بالفعل؛ وهذا الدرس يعطي الثالثة كتابتها. فهو يدرس صور الحلقة الثلاث: while، التي تحسب شرطها قبل كل جولة وقد لا تنفّذ جسمها أبدًا؛ وdo، التي تحسبه بعدها وتنفّذ الجسم مرة واحدة على الأقل؛ وfor، التي تجمع في سطر واحد التهيئة والشرط وتقدّم المتغير الذي يحكم التكرار. ويبيّن أن الصور الثلاث تعبّر عن آلية واحدة، بحيث تتحوّل كل صورة إلى الأخريين، ويعلّم اختيار أوضحها؛ ويقدّم break وcontinue، اللتين تغيّران مسار الجولة؛ ويختم بالحلقات المتداخلة، التي يُنفَّذ جسمها الداخلي عددًا من المرات يُحسب بمجموع. والأداة التي ترافق الدرس كله هي جدول التتبع: فتتبّع الحلقة يدويًّا، جولةً جولةً، هو السبيل إلى التنبؤ بعدد مرات تنفيذ جسمها وبما تتركه عند الخروج.
أهداف التعلم
- كتابة حلقة
whileأوdoأوforلتكرار معطى، مع اختيار الصورة الأوضح. - تتبّع حلقة يدويًّا بجدول التتبع الخاص بها والتنبؤ بعدد مرات تنفيذ الجسم.
- تحويل حلقة من صورة إلى أخرى مع الحفاظ على دلالتها.
- كتابة حلقات متداخلة وحساب عدد مرات تنفيذ الجسم الداخلي.
while
صورة الحلقة while
تُكتب الحلقة while هكذا:
while (الشرط) { الجسم}ويُصاغ معناها في ثلاث خطوات: يُحسب الشرط؛ فإن كان خطأً، انتهت الحلقة واستمر التنفيذ بعد القوس المعقوص الذي يغلقها؛ وإن كان صوابًا، نُفِّذ الجسم وعاد التنفيذ إلى الخطوة الأولى. ويُسمّى كل تنفيذ للجسم جولة (أو تكرارة). والشرط تعبير منطقي كالتي عرضها الدرس العلاقات والمنطق، والجسم كتلة؛ وقاعدة الأقواس المعقوصة التي أرساها الدرس القرارات تسري هنا أيضًا: يحمل جسم الحلقة الأقواس المعقوصة دائمًا، ولو احتوى تعليمة واحدة.
وتلزم عن التعريف نتيجتان. الأولى: يُحسب الشرط قبل كل جولة، فإن كان خطأً منذ البداية لم يُنفَّذ الجسم ولا مرة. والثانية: لكي تنتهي الحلقة، يجب أن يغيّر الجسم شيئًا مما يقرؤه الشرط؛ فإن لم يتغيّر شيء، ظل الشرط الذي كان صوابًا مرة صوابًا دائمًا. غير أن التغيير لا يكفي: فقد بيّن الدرس من المسألة إلى الخوارزمية أنه لا بد من كمية طبيعية تتناقص في كل جولة، هي المتغاير، وسيجعل منها الدرس تصميم حلقات صحيحة منهجًا.
القسمة بالطرح المتتالي
كانت أول خوارزمية فيها تكرار في هذه الدورة القسمة بالطرح المتتالي: ما دام الباقي لا يقل عن القاسم، يُطرح منه القاسم ويُضاف واحد إلى خارج القسمة. وحين تُكتب بلغة C++، تنتقل الخوارزمية كلمةً بكلمة تقريبًا.
#include <iostream>#include <print>int main(){ int a{}; int b{}; std::cin >> a >> b; int q{0}; int r{a}; while (r >= b) { r -= b; ++q; } std::println("{} = {} · {} + {}", a, b, q, r);}23 723 = 7 · 3 + 2يعطي السطران 9 و10 المتغيرين قيمتيهما الابتدائيتين: لم يُطرح شيء بعد، فخارج القسمة 0 والباقي هو المقسوم كله. والسطر 11 هو شرط الخطوة 2 من الخوارزمية؛ والسطران 12 و13 هما الجسم. ويفترض البرنامج، كما تفترض الخوارزمية، أن وأن : فمع لن يغيّر السطر 12 قيمة r ولن تنتهي الحلقة.
جدول التتبع
تتبّع الحلقة يدويًّا هو ملء جدول: صفّ لكل جولة، وعمود لكل متغير وعمود للشرط، يُحسب عند بداية الجولة. ويسجّل الصف 0 الحالة قبل الحساب الأول؛ ويسجّل الصف الأخير الحساب الذي يخرج خطأً فينهي الحلقة.
البرهان
قبل الحلقة يُنفَّذ السطران 9 و10: و. وهذا هو الصف 0؛ ولم يُحسب الشرط بعد.
الجولة الأولى. الشرط صواب، فيُنفَّذ الجسم: تصير مساوية 16 وتصير مساوية 1. ثم يعود التنفيذ إلى السطر 11.
الجولة الثانية. صواب: تصير مساوية 9 وتصير مساوية 2.
الجولة الثالثة. صواب: تصير مساوية 2 وتصير مساوية 3.
الحساب الرابع، ، خطأ: لا يُنفَّذ الجسم، وتنتهي الحلقة، ويكتب السطر 15 العبارة .
يعلّم التتبع العدّ. فقد نُفِّذ الجسم ثلاث مرات، بقدر خارج القسمة، وحُسب الشرط أربع مرات: مرة لكل جولة ومرة أخرى، هي التي تخفق. وتصح هذه العلاقة لكل while تنتهي بشرطها: إذا نُفِّذ الجسم مرة، حُسب الشرط مرة. والحالة القصوى تؤكد ذلك: مع المدخلات 5 7 يكون الحساب الأول، ، خطأً من الأصل، ويُنفَّذ الجسم صفر مرة، ويكتب البرنامج ، وهو صحيح. فالحلقة while المكتوبة كتابة سليمة تعالج، دون شيفرة إضافية، الحالة التي لا يكون فيها ما يُكرَّر.
جارٍ تحميل المحتوى…