ما معنى التكرار؟ ولماذا نحتاجه؟ وكيف تعمل for و while؟ مع أمثلة عملية وتمارين وأخطاء شائعة.
ما هي الحلقات ولماذا نحتاجها؟
أحيانًا تحتاج تنفيذ نفس الأمر أكثر من مرة — طباعة الأرقام من 1 إلى 10، أو المرور على قائمة أسماء، أو تكرار سؤال للمستخدم.
يمكنك كتابة الأمر 10 مرات يدويًا، لكن هذا غير منطقي. هنا تظهر أهمية الحلقات (Loops) — تعني: "كرّر تنفيذ هذا الكود عدة مرات".
حلقة for
تستخدمها عندما تعرف عدد مرات التكرار مسبقًا — مثل: كرّر 10 مرات.
حلقة while
تستخدمها عندما لا تعرف العدد مسبقًا — بل تريد التكرار "طالما" شرط صحيح.
حلقة for — عندما تعرف عدد مرات التكرار
حلقة for مناسبة عندما تعرف عدد المرات مسبقًا. إليك بنيتها:
// الصيغة العامة
for ( بداية ; شرط الاستمرار ; خطوة التغيير ) { }
int i = 1 ① البداية — قيمة العداد الأولية
i <= 5 ② الشرط — استمر طالما صحيح
i++ ③ الخطوة — زد i بعد كل دورة
for (int i = 1; i <= 5; i++) { System.out.println("الرقم: " + i); }
الناتج:
الرقم: 1 الرقم: 2 الرقم: 3 الرقم: 4 الرقم: 5
🔍 ماذا يحدث خطوة بخطوة؟
| الدورة | قيمة i | الشرط i <= 5 | ماذا يحدث؟ |
|---|---|---|---|
| 1 | 1 | true ✅ | يطبع "الرقم: 1" |
| 2 | 2 | true ✅ | يطبع "الرقم: 2" |
| ... | ... | ... | ... |
| 6 | 6 | false ❌ | تتوقف الحلقة |
حلقة while — عندما لا تعرف عدد مرات التكرار
حلقة while تعمل "طالما" الشرط صحيح — لا تحتاج لمعرفة العدد مسبقًا.
int i = 1; // ① تعريف العداد خارج الحلقة while (i <= 5) { // ② الشرط System.out.println(i); i++; // ③ زيادة العداد — لا تنساها! }
🔁 for
- ✓العداد مدمج في الحلقة
- ✓مناسبة عندما تعرف العدد مسبقًا
- ✓كود أقصر وأوضح
🔄 while
- ✓العداد يُعرَّف خارج الحلقة
- ✓مناسبة عندما لا تعرف العدد
- ⚠يجب زيادة العداد يدويًا داخلها
الحلقة اللانهائية — أخطر خطأ في while
إذا نسيت i++ داخل الحلقة — لن تتوقف أبدًا وسيتجمد البرنامج!
❌ حلقة لا تنتهي
int i = 1; while (i <= 5) { System.out.println(i); // نسي i++ هنا! } أمثلة واقعية لتثبيت الفكرة
مثال ١ جمع الأرقام من 1 إلى 5
int sum = 0; for (int i = 1; i <= 5; i++) { sum = sum + i; } System.out.println("المجموع: " + sum);
المجموع: 15 مثال ٢ العدّ التنازلي
for (int i = 5; i >= 1; i--) { System.out.println("تبقى: " + i); }
تبقى: 5 تبقى: 4 تبقى: 3 تبقى: 2 تبقى: 1
لاحظ i-- بدل i++ — يُقلّل العداد بدل زيادته.
مثال ٣ الأرقام الزوجية فقط
for (int i = 2; i <= 10; i += 2) { System.out.println(i); }
2 4 6 8 10 i += 2 تعني: زد العداد بمقدار 2 في كل دورة بدل 1.
أخطاء شائعة في الحلقات ⚠️
نسيان زيادة العداد في while ← حلقة لا تنتهي
❌ خطأ — لا تنتهي
int i = 1; while (i <= 5) { println(i); } ✅ صحيح
int i = 1; while (i <= 5) { println(i); i++; } استخدام < بدل <= فيفوتك آخر رقم
❌ يطبع 1 إلى 4 فقط
for (int i=1; i < 5; i++) ✅ يطبع 1 إلى 5
for (int i=1; i <= 5; i++) شرط لا يتحقق أبدًا — الحلقة لن تشتغل
❌ i تبدأ بـ 10 لكن الشرط i <= 5
for (int i = 10; i <= 5; i++) الحلقة لن تنفذ ولو مرة واحدة!
الخلط بين i++ و i--
i++
يزيد i بمقدار 1 — للعد التصاعدي
i--
ينقص i بمقدار 1 — للعد التنازلي
تمرين — جرّب بنفسك! 💪
🎯 حلّ هذه التمارين قبل الدرس القادم
اطبع الأرقام من 10 إلى 1
تلميح: استخدم i-- والبداية من 10
احسب مجموع الأرقام من 1 إلى 100
الإجابة الصحيحة: 5050
اطبع الأرقام الزوجية فقط من 1 إلى 20
تلميح: ابدأ من 2 وزد بمقدار 2
نصيحة من تجربتي: حلقة for-each ستريحك كثيرًا
تعلّمت في هذا الدرس حلقتي for و while، وهما الأساس الذي يجب إتقانه. لكن دعني أخبرك بشيء من واقع عملي اليومي: حين تمرّ على عناصر مصفوفة أو قائمة، هناك صيغة أنظف تُسمّى حلقة for-each.
بدل أن تدير عدّادًا وتتحقّق من الطول وتصل للعنصر بالفهرس، تعطيك for-each كل عنصر مباشرة. وأهم فائدة من خبرتي: لأنها لا تستخدم فهارس، فهي تُنهي تمامًا صنفًا كاملًا من الأخطاء — وأشهرها الخطأ بمقدار واحد (Off-by-one) حين تستخدم <= بدل < فتتجاوز حدود المصفوفة.
قاعدتي العملية: حين أحتاج فهرس العنصر أتعامل به أستخدم for العادية، وحين أريد فقط المرور على كل العناصر أستخدم for-each. أتقِن العادية أولًا، ثم اجعل for-each أداتك المفضّلة للمرور البسيط.
📋 ملخص الدرس
الحلقات تكرّر تنفيذ الكود عدة مرات
for عندما تعرف العدد — while عندما لا تعرفه
i++ للتصاعد، i-- للتنازل
لا تنسَ i++ في while لتجنب الحلقة اللانهائية
⏭️ في الدرس القادم:
سنتعلم الدوال (Methods) — كيف نقسّم الكود إلى أجزاء منظمة قابلة لإعادة الاستخدام.