الحلقات في Java: for و while و for-each
تخيّل أنك مطلوب منك طباعة شهادات تقدير لـ 500 طالب. لن تكتب أمر الطباعة 500 مرة، بل ستقول: «كرر هذا لكل طالب». هذا بالضبط ما تفعله الحلقات. في هذا الدرس ستتعلم أنواع الحلقات في Java، ومتى تختار كل نوع.
حلقة for
Section titled “حلقة for”عندما تعرف عدد مرات التكرار:
for (int i = 1; i <= 3; i++) { System.out.println("الدورة " + i);}الدورة 1الدورة 2الدورة 3بين القوسين ثلاثة أجزاء يفصلها ;:
- البداية
int i = 1: تُنفَّذ مرة واحدة قبل كل شيء. - الشرط
i <= 3: يُفحص قبل كل دورة، وإذا صار خطأ تتوقف الحلقة. - الخطوة
i++: تُنفَّذ بعد كل دورة، وi++تعني «زد واحداً».
تخيّلها مثل عدّاد الدورات في مضمار الجري: تبدأ من الدورة 1، وتستمر ما دمت لم تتجاوز 3، وتزيد العدّ بعد كل دورة.
والخطوة يمكن أن تكون أي قيمة، حتى تنازلية:
for (int i = 10; i >= 0; i -= 5) { System.out.print(i + " ");}10 5 0System.out.print تطبع دون النزول لسطر جديد.
حلقة for-each
Section titled “حلقة for-each”للمرور على كل عناصر مصفوفة أو قائمة، دون عدّاد:
String[] fruits = {"تفاح", "موز", "برتقال"};for (String fruit : fruits) { System.out.println("- " + fruit);}- تفاح- موز- برتقالاقرأ النقطتين : كأنها كلمة «في»: «لكل fruit في fruits». هذه الحلقة أوضح وأأمن من for العادية عندما لا تحتاج رقم العنصر، لأنك لن تخطئ في حدود المصفوفة أبداً.
حلقة while
Section titled “حلقة while”عندما لا تعرف عدد المرات، بل تعرف متى تتوقف:
int balance = 100;int days = 0;while (balance > 0) { balance -= 30; days++;}System.out.println("انتهى الرصيد بعد " + days + " أيام");انتهى الرصيد بعد 4 أيامحلقة do-while
Section titled “حلقة do-while”مثل while، لكنها تفحص الشرط بعد الدورة، فتُنفَّذ مرة واحدة على الأقل:
int n = 10;do { System.out.println("يُنفذ مرة واحدة على الأقل: " + n); n++;} while (n < 5);يُنفذ مرة واحدة على الأقل: 10الشرط n < 5 خطأ من البداية، ومع ذلك نُفذت الحلقة مرة. هذا مفيد مثلاً لعرض قائمة خيارات للمستخدم قبل أن تسأله هل يريد الاستمرار.
break و continue
Section titled “break و continue”break: اخرج من الحلقة فوراً.continue: تخطَّ باقي هذه الدورة وانتقل للتالية.
for (int i = 1; i <= 10; i++) { if (i % 2 == 0) continue; // تخطَّ الزوجي if (i > 7) break; // توقف بعد 7 System.out.print(i + " ");}1 3 5 7الحلقات المتداخلة
Section titled “الحلقات المتداخلة”يمكن وضع حلقة داخل حلقة. الحلقة الداخلية تكتمل بالكامل في كل دورة من الخارجية:
for (int row = 1; row <= 3; row++) { String line = ""; for (int col = 1; col <= row; col++) { line += "*"; } System.out.println(line);}******في الصف الأول تدور الداخلية مرة واحدة، وفي الثاني مرتين، وفي الثالث ثلاث مرات. مثل عقارب الساعة: عقرب الدقائق يكمل دورة كاملة مع كل خطوة لعقرب الساعات.
أمثلة عملية
Section titled “أمثلة عملية”int num = 7;for (int i = 1; i <= 5; i++) { System.out.println(num + " × " + i + " = " + (num * i));}7 × 1 = 77 × 2 = 147 × 3 = 217 × 4 = 287 × 5 = 35لاحظ الأقواس حول (num * i): بدونها، ستدمج Java النص مع num ثم مع i كنصوص بدلاً من الضرب.
جرّب بنفسك
Section titled “جرّب بنفسك”- احسب مجموع الأعداد من 1 إلى 100 بحلقة
for(الناتج الصحيح: 5050). - اطبع كل عناصر مصفوفة أسماء بحلقة
for-each. - اطبع مثلثاً مقلوباً من النجوم: 4 نجوم، ثم 3، ثم 2، ثم 1.
- تحدٍّ (FizzBuzz): اطبع الأعداد من 1 إلى 15، لكن «Fizz» بدل مضاعفات 3، و«Buzz» بدل مضاعفات 5، و«FizzBuzz» بدل مضاعفات الاثنين.
أخطاء شائعة
Section titled “أخطاء شائعة”- الخطأ بواحد:
i < 5تتوقف عند 4، وi <= 5تصل إلى 5. فكّر في آخر قيمة تريدها. - فاصلة منقوطة بعد for:
for (...);تجعل الحلقة فارغة، وينفّذ الكود التالي مرة واحدة فقط! - نسيان الأقواس في الطباعة:
"المجموع: " + a + bتدمج الرقمين كنصين. اكتب(a + b).
اختبر نفسك
Section titled “اختبر نفسك”سؤال
كم مرة تُنفَّذ الحلقة for (int i = 0; i < 4; i++)؟
القيم 0 و 1 و 2 و 3، أي 4 مرات. عندما يصبح i يساوي 4 يكون الشرط خطأ.
سؤال
أي حلقة تُنفَّذ مرة واحدة على الأقل حتى لو كان الشرط خطأ من البداية؟
do-while تنفذ جسم الحلقة أولاً ثم تفحص الشرط.
الخلاصة
Section titled “الخلاصة”forبأجزائها الثلاثة عندما تعرف عدد المرات.for-eachبالصيغةfor (Type x : array)للمرور على كل العناصر بأمان.whileحسب شرط، وdo-whileتُنفَّذ مرة على الأقل.breakللخروج، وcontinueلتخطي الدورة الحالية.- الحلقة الداخلية تكتمل في كل دورة من الخارجية.