الحلقات التكرارية (While Loop): متى تستخدمها وكيف تتجنب الحلقات اللانهائية؟
مرحباً بكم أيها المبرمجون الطموحون! اليوم، سنتعلم عن حلقة While التكرارية، متى تكون الخيار الأمثل، وكيف نتجنب الوقوع في فخ الحلقات اللانهائية.
1. فهم حلقة While Loop الأساسية
حلقة while هي أداة برمجية تسمح لنا بتنفيذ كتلة من التعليمات البرمجية بشكل متكرر طالما أن شرطًا معينًا صحيح (True). على عكس حلقة for التي غالبًا ما تُستخدم عندما نعرف عدد التكرارات مسبقًا، تُفضل while عندما يكون عدد التكرارات غير معروف ويعتمد على تحقق شرط ما.
لنبدأ بمثال بسيط يوضح كيفية عمل حلقة while لطباعة الأرقام من 1 إلى 5:
# تهيئة متغير للعد
counter = 1
# الشرط: استمر في التكرار طالما أن العداد أقل من أو يساوي 5
while counter <= 5:
print(f"العداد الحالي: {counter}") # طباعة قيمة العداد
counter += 1 # زيادة العداد بواحد في كل تكرار (خطوة حاسمة لتجنب الحلقة اللانهائية)
print("انتهت الحلقة.") # رسالة بعد انتهاء الحلقة
في هذا المثال، تبدأ قيمة counter بـ 1. يتم التحقق من الشرط counter <= 5. بما أنه صحيح، تُطبع الرسالة ويزداد counter. تتكرر العملية حتى يصبح counter 6، عندها يصبح الشرط خاطئًا وتتوقف الحلقة.
2. متى نستخدم حلقات While Loop؟
تُعد حلقات while مثالية في السيناريوهات التي لا نعرف فيها مسبقًا عدد المرات التي نحتاج فيها إلى تكرار جزء من الكود. تشمل هذه السيناريوهات:
- التحقق من صحة مدخلات المستخدم.
- قراءة البيانات من ملف حتى الوصول إلى نهايته.
- تكرار عملية حتى يتحقق شرط معين (مثل الوصول إلى هدف في لعبة).
- بناء قوائم انتظار أو أنظمة معالجة مستمرة.
دعونا نرى مثالاً يوضح كيف يمكن استخدام while للتحقق من صحة مدخلات المستخدم، مطالبين المستخدم بإدخال رقم زوجي:
# تهيئة متغير لتخزين مدخلات المستخدم
user_input = 0
# الشرط: استمر في الطلب طالما أن المدخل ليس رقمًا زوجيًا (أو 0 في البداية)
while user_input % 2 != 0:
try:
user_input = int(input("الرجاء إدخال رقم زوجي: ")) # طلب إدخال من المستخدم
if user_input % 2 != 0:
print("هذا ليس رقمًا زوجيًا. حاول مرة أخرى.")
except ValueError:
print("إدخال غير صالح. الرجاء إدخال رقم صحيح.")
user_input = 0 # إعادة تعيين user_input لضمان استمرار الحلقة إذا كان الإدخال غير صحيح
print(f"أحسنت! لقد أدخلت الرقم الزوجي: {user_input}")
هنا، تستمر الحلقة في طلب الإدخال طالما أن الرقم المدخل ليس زوجيًا. بمجرد إدخال رقم زوجي، يصبح الشرط user_input % 2 != 0 خاطئًا، وتتوقف الحلقة.
3. تجنب الحلقات اللانهائية (Infinite Loops)
الحلقة اللانهائية هي أسوأ كابوس للمبرمج المبتدئ (وأحيانًا الخبير!). تحدث عندما لا يصبح شرط الحلقة خاطئًا أبدًا، مما يجعل البرنامج يتكرر إلى ما لا نهاية ويستهلك موارد النظام. لتجنبها، يجب أن تتأكد دائمًا من أن هناك آلية داخل الحلقة تجعل الشرط خاطئًا في نهاية المطاف.
الأسباب الشائعة للحلقات اللانهائية:
- نسيان تحديث المتغير الذي يعتمد عليه الشرط (كما في مثال العداد).
- خطأ منطقي في الشرط نفسه يجعله دائمًا صحيحًا.
لنعدل مثالنا الأول ونرى كيف يمكن أن تحدث حلقة لانهائية إذا نسينا تحديث العداد، ثم نصلحها:
# مثال خاطئ: حلقة لانهائية محتملة (لا تقم بتشغيل هذا الكود إلا إذا كنت تعرف كيفية إيقافه!)
# counter_bad = 1
# while counter_bad <= 5:
# print(f"هذه حلقة لانهائية محتملة! العداد: {counter_bad}")
# # نسينا هنا إضافة counter_bad += 1
# مثال صحيح: تجنب الحلقة اللانهائية
counter_safe = 1
max_iterations = 3
while counter_safe <= max_iterations:
print(f"التكرار الآمن رقم: {counter_safe}")
counter_safe += 1 # تحديث العداد (ضروري!)
print("الحلقة الآمنة انتهت بنجاح.")
ملاحظة تقنية: إذا وجدت نفسك في حلقة لانهائية أثناء تشغيل برنامج Python في الطرفية (Terminal)، يمكنك عادةً إيقافها بالضغط على Ctrl + C.
الكود النهائي الكامل
إليك كود يجمع بين مفاهيم العداد والتحقق من المدخلات، محاكياً لعبة تخمين بسيطة حيث يجب على المستخدم تخمين رقم سري.
import random
# الرقم السري الذي يجب تخمينه
secret_number = random.randint(1, 10)
guess = 0
attempts = 0
print("مرحباً بك في لعبة تخمين الأرقام!")
print("حاول تخمين الرقم السري بين 1 و 10.")
# استمر في الحلقة طالما أن المستخدم لم يخمن الرقم الصحيح
while guess != secret_number:
try:
guess = int(input("ما هو تخمينك؟ ")) # طلب تخمين المستخدم
attempts += 1 # زيادة عدد المحاولات
if guess < secret_number:
print("الرقم السري أكبر من تخمينك.")
elif guess > secret_number:
print("الرقم السري أصغر من تخمينك.")
else:
print(f"تهانينا! لقد خمنت الرقم السري {secret_number} في {attempts} محاولات.")
except ValueError:
print("إدخال غير صالح. الرجاء إدخال رقم صحيح.")
print("انتهت اللعبة.")
النتيجة المتوقعة
عند تشغيل الكود النهائي، سيُطلب منك تخمين رقم بين 1 و 10. ستستمر اللعبة في طلب التخمينات وتقديم تلميحات ("أكبر" أو "أصغر") حتى تخمن الرقم الصحيح. بمجرد التخمين الصحيح، ستطبع رسالة تهنئة وعدد المحاولات التي استغرقتها، ثم ينتهي البرنامج.
مرحباً بك في لعبة تخمين الأرقام! حاول تخمين الرقم السري بين 1 و 10. ما هو تخمينك؟ 5 الرقم السري أكبر من تخمينك. ما هو تخمينك؟ 8 الرقم السري أصغر من تخمينك. ما هو تخمينك؟ 7 تهانينا! لقد خمنت الرقم السري 7 في 3 محاولات. انتهت اللعبة.
نأمل أن يكون هذا الدرس قد ألقى الضوء على قوة ومرونة حلقات while وكيفية استخدامها بذكاء وتجنب الأخطاء الشائعة. تدربوا جيداً!