تخطَّ إلى المحتوى

الحلقات في C: for و while و do-while

الدرس 4 من 10 · C

الحاسوب ينفّذ مليارات العمليات في الثانية، لكنك لن تكتب مليار سطر! الحلقات تجعلك تكتب الأمر مرة واحدة وتكرره كما تشاء. وفي C، كما في أغلب اللغات التي جاءت بعدها، هناك ثلاثة أنواع من الحلقات. صيغة for التي ستتعلمها هنا انتقلت كما هي تقريباً إلى Java و JavaScript وغيرهما، لذلك ما تتعلمه هنا ستستخدمه في كل مكان.

for (int i = 1; i <= 3; i++) {
printf("الدورة %d\n", i);
}
الناتج
الدورة 1
الدورة 2
الدورة 3

الأجزاء الثلاثة بين القوسين:

  1. البداية int i = 1: تُنفَّذ مرة واحدة.
  2. الشرط i <= 3: يُفحص قبل كل دورة.
  3. الخطوة i++: تُنفَّذ بعد كل دورة.

ترتيب التنفيذ: البداية ← الشرط ← الجسم ← الخطوة ← الشرط ← الجسم ← الخطوة… حتى يصبح الشرط خطأ.

والخطوة يمكن أن تكون أي قيمة:

for (int i = 10; i >= 0; i -= 5) {
printf("%d ", i);
}
printf("\n");
الناتج
10 5 0

عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:

int balance = 100;
int days = 0;
while (balance > 0) {
balance -= 30;
days++;
}
printf("انتهى الرصيد بعد %d أيام\n", days);
الناتج
انتهى الرصيد بعد 4 أيام

تخيّل while مثل ملء دلو بالكوب: تستمر في الصب ما دام الدلو لم يمتلئ، ولا تعرف مسبقاً كم كوباً ستحتاج.

تفحص الشرط بعد الدورة، فتُنفَّذ مرة واحدة على الأقل:

int n = 10;
do {
printf("يُنفذ مرة واحدة على الأقل: %d\n", n);
n++;
} while (n < 5);
الناتج
يُنفذ مرة واحدة على الأقل: 10

لاحظ الفاصلة المنقوطة بعد while (n < 5) في آخرها، فهي مطلوبة هنا فقط.

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 7
  • continue: تخطَّ باقي هذه الدورة، وانتقل للتالية.
  • break: اخرج من الحلقة نهائياً.

لاحظ أسلوب التعليقات /* ... */، وهو الأسلوب الأصلي في C. ويمكن أيضاً استخدام // في الإصدارات الحديثة.

for (int row = 1; row <= 3; row++) {
for (int col = 1; col <= row; col++) {
printf("*");
}
printf("\n");
}
الناتج
*
**
***

الحلقة الخارجية للصفوف، والداخلية لعدد النجوم في كل صف. في الصف رقم row تطبع الداخلية row نجمة، ثم ننزل سطراً.

جدول الضرب:

int num = 7;
for (int i = 1; i <= 5; i++) {
printf("%d x %d = %d\n", num, i, num * i);
}
الناتج
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35

مجموع الأعداد من 1 إلى 100:

int sum = 0;
for (int i = 1; i <= 100; i++) sum += i;
printf("%d\n", sum);
الناتج
5050
  1. اطبع العد التنازلي من 10 إلى 1، ثم «انطلق!».
  2. اطبع كل الأعداد الفردية من 1 إلى 19.
  3. ارسم مربعاً من النجوم 4×4 بحلقتين متداخلتين.
  4. تحدٍّ: اطبع جدول الضرب كاملاً من 1 إلى 5 (خمسة جداول متتالية) بحلقتين متداخلتين.
  • فاصلة منقوطة بعد for: for (int i = 0; i < 5; i++); تجعل الحلقة فارغة، والكود بعدها يُنفَّذ مرة واحدة!
  • الخطأ بواحد: i < 5 تتوقف عند 4. فكّر في آخر قيمة تريدها.
  • نسيان الفاصلة المنقوطة بعد do-while: } while (n < 5) بدونها خطأ ترجمة.

سؤال

ما ترتيب تنفيذ أجزاء الحلقة for (البداية; الشرط; الخطوة) بعد أول دورة؟

سؤال

كم نجمة تطبع الحلقتان: الخارجية من 1 إلى 3، والداخلية من 1 إلى 4؟

  • for بأجزائها الثلاثة عندما تعرف عدد المرات، وصيغتها انتقلت لأغلب اللغات.
  • while حسب شرط، و do-while تُنفَّذ مرة على الأقل وتنتهي بفاصلة منقوطة.
  • break للخروج من الحلقة، و continue لتخطي الدورة الحالية.
  • الحلقة الداخلية تكتمل بالكامل في كل دورة من الخارجية.
  • تأكد دائماً أن شيئاً داخل الحلقة يقرّبها من التوقف.