حلقتا while و do-while
حلقتا while و do-while
تُعدّ حلقة for مثاليةً حين تعرف مسبقًا عدد التكرارات المطلوبة. لكن ماذا لو لم تعرف هذا العدد؟ ماذا لو أردت أن تستمر في طلب إدخال من المستخدم حتى يكتب رقمًا صالحًا، أو تواصل قراءة السجلات حتى تنتهي البيانات؟ هنا يبرز دور حلقتَي while وdo-while.
حلقة while — مضبوطة من البداية
تتحقق حلقة while من شرطها قبل كل تكرار. إذا كان الشرط false منذ البداية، فلن ينفّذ الجسم أبدًا.
للبنية ثلاثة أجزاء عليك إدارتها بنفسك:
- التهيئة: تهيئة المتغير قبل الحلقة (
int count = 1). - الفحص: اختبار الشرط في بداية كل تكرار.
- التحديث: تعديل المتغير داخل الجسم حتى يصبح الشرط
falseفي نهاية المطاف.
count++ من المثال أعلاه، لظلّ الشرط count <= 5 صحيحًا إلى الأبد ويتجمّد البرنامج. تأكد دائمًا أن جسم الحلقة يتقدّم نحو شرط الخروج.
قيم الحارس (Sentinel Values)
قيمة الحارس هي مدخلة خاصة يكتبها المستخدم (أو قيمة بيانات خاصة يصادفها البرنامج) تُشير إلى "أوقف الحلقة". يُعدّ هذا من أكثر استخدامات while عملية.
while المضبوطة بحارس.
حلقة do-while — مضبوطة من النهاية
تضع حلقة do-while الشرط بعد الجسم. يضمن هذا تنفيذ الجسم مرةً واحدة على الأقل، حتى لو كان الشرط خاطئًا فورًا.
بدون do-while ستضطر إما لتكرار عبارة الطلب قبل الحلقة أو اللجوء إلى حلٍّ بديل. التصميم المضبوط من النهاية مناسب طبيعيًا حين يجب أن يعمل الجسم مرةً واحدة لإنتاج القيمة التي يفحصها الشرط.
while مقابل do-while — متى تستخدم كلًّا منهما؟
- استخدم
whileحين قد لا تحتاج الحلقة إلى التنفيذ أصلًا (مثل معالجة ملف قد يكون فارغًا). - استخدم
do-whileحين يجب أن ينفّذ جسم الحلقة مرةً واحدة على الأقل (مثل عرض قائمة قبل فحص اختيار المستخدم).
تجنّب الحلقات اللانهائية
كل حلقة تحتاج مسار خروج مضمون. اسأل نفسك ثلاثة أسئلة قبل كتابة أي حلقة while:
- ما المتغير أو الشرط الذي يتحكم بالحلقة؟
- هل يُعدَّل ذلك المتغير داخل الجسم؟
- هل سيجعل ذلك التعديل الشرط
falseفي النهاية؟
الخلاصة
حلقة while مضبوطة من البداية: يُفحص الشرط أولًا وقد لا ينفّذ الجسم أبدًا. أما حلقة do-while فهي مضبوطة من النهاية: ينفّذ الجسم دائمًا مرةً واحدة على الأقل. تمنح قيم الحارس حلقات while شرط خروج نظيفًا مدفوعًا بالمستخدم. تأكد دائمًا أن جسم الحلقة يتقدم نحو شرط الخروج لتفادي الحلقات اللانهائية.