الحلقات في C: for و while و do-while
الحاسوب ينفّذ مليارات العمليات في الثانية، لكنك لن تكتب مليار سطر! الحلقات تجعلك تكتب الأمر مرة واحدة وتكرره كما تشاء. وفي C، كما في أغلب اللغات التي جاءت بعدها، هناك ثلاثة أنواع من الحلقات. صيغة for التي ستتعلمها هنا انتقلت كما هي تقريباً إلى Java و JavaScript وغيرهما، لذلك ما تتعلمه هنا ستستخدمه في كل مكان.
حلقة for
Section titled “حلقة for”for (int i = 1; i <= 3; i++) { printf("الدورة %d\n", i);}الدورة 1الدورة 2الدورة 3الأجزاء الثلاثة بين القوسين:
- البداية
int i = 1: تُنفَّذ مرة واحدة. - الشرط
i <= 3: يُفحص قبل كل دورة. - الخطوة
i++: تُنفَّذ بعد كل دورة.
ترتيب التنفيذ: البداية ← الشرط ← الجسم ← الخطوة ← الشرط ← الجسم ← الخطوة… حتى يصبح الشرط خطأ.
والخطوة يمكن أن تكون أي قيمة:
for (int i = 10; i >= 0; i -= 5) { printf("%d ", i);}printf("\n");10 5 0حلقة while
Section titled “حلقة while”عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:
int balance = 100;int days = 0;while (balance > 0) { balance -= 30; days++;}printf("انتهى الرصيد بعد %d أيام\n", days);انتهى الرصيد بعد 4 أيامتخيّل while مثل ملء دلو بالكوب: تستمر في الصب ما دام الدلو لم يمتلئ، ولا تعرف مسبقاً كم كوباً ستحتاج.
حلقة do-while
Section titled “حلقة do-while”تفحص الشرط بعد الدورة، فتُنفَّذ مرة واحدة على الأقل:
int n = 10;do { printf("يُنفذ مرة واحدة على الأقل: %d\n", n); n++;} while (n < 5);يُنفذ مرة واحدة على الأقل: 10لاحظ الفاصلة المنقوطة بعد while (n < 5) في آخرها، فهي مطلوبة هنا فقط.
break و continue
Section titled “break و continue”for (int i = 1; i <= 10; i++) { if (i % 2 == 0) continue; /* تخطَّ الزوجي */ if (i > 7) break; /* توقف بعد 7 */ printf("%d ", i);}printf("\n");1 3 5 7continue: تخطَّ باقي هذه الدورة، وانتقل للتالية.break: اخرج من الحلقة نهائياً.
لاحظ أسلوب التعليقات /* ... */، وهو الأسلوب الأصلي في C. ويمكن أيضاً استخدام // في الإصدارات الحديثة.
الحلقات المتداخلة
Section titled “الحلقات المتداخلة”for (int row = 1; row <= 3; row++) { for (int col = 1; col <= row; col++) { printf("*"); } printf("\n");}******الحلقة الخارجية للصفوف، والداخلية لعدد النجوم في كل صف. في الصف رقم row تطبع الداخلية row نجمة، ثم ننزل سطراً.
أمثلة عملية
Section titled “أمثلة عملية”جدول الضرب:
int num = 7;for (int i = 1; i <= 5; i++) { printf("%d x %d = %d\n", num, i, num * i);}7 x 1 = 77 x 2 = 147 x 3 = 217 x 4 = 287 x 5 = 35مجموع الأعداد من 1 إلى 100:
int sum = 0;for (int i = 1; i <= 100; i++) sum += i;printf("%d\n", sum);5050جرّب بنفسك
Section titled “جرّب بنفسك”- اطبع العد التنازلي من 10 إلى 1، ثم «انطلق!».
- اطبع كل الأعداد الفردية من 1 إلى 19.
- ارسم مربعاً من النجوم 4×4 بحلقتين متداخلتين.
- تحدٍّ: اطبع جدول الضرب كاملاً من 1 إلى 5 (خمسة جداول متتالية) بحلقتين متداخلتين.
أخطاء شائعة
Section titled “أخطاء شائعة”- فاصلة منقوطة بعد for:
for (int i = 0; i < 5; i++);تجعل الحلقة فارغة، والكود بعدها يُنفَّذ مرة واحدة! - الخطأ بواحد:
i < 5تتوقف عند 4. فكّر في آخر قيمة تريدها. - نسيان الفاصلة المنقوطة بعد do-while:
} while (n < 5)بدونها خطأ ترجمة.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما ترتيب تنفيذ أجزاء الحلقة for (البداية; الشرط; الخطوة) بعد أول دورة؟
بعد كل دورة تُنفَّذ الخطوة، ثم يُفحص الشرط، فإن كان صحيحاً يُنفَّذ الجسم من جديد.
سؤال
كم نجمة تطبع الحلقتان: الخارجية من 1 إلى 3، والداخلية من 1 إلى 4؟
الداخلية تكتمل في كل دورة من الخارجية: 3 دورات × 4 نجوم = 12 نجمة.
الخلاصة
Section titled “الخلاصة”forبأجزائها الثلاثة عندما تعرف عدد المرات، وصيغتها انتقلت لأغلب اللغات.whileحسب شرط، وdo-whileتُنفَّذ مرة على الأقل وتنتهي بفاصلة منقوطة.breakللخروج من الحلقة، وcontinueلتخطي الدورة الحالية.- الحلقة الداخلية تكتمل بالكامل في كل دورة من الخارجية.
- تأكد دائماً أن شيئاً داخل الحلقة يقرّبها من التوقف.