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

الحلقات في Java: for و while و for-each

الدرس 4 من 11 · Java

تخيّل أنك مطلوب منك طباعة شهادات تقدير لـ 500 طالب. لن تكتب أمر الطباعة 500 مرة، بل ستقول: «كرر هذا لكل طالب». هذا بالضبط ما تفعله الحلقات. في هذا الدرس ستتعلم أنواع الحلقات في Java، ومتى تختار كل نوع.

عندما تعرف عدد مرات التكرار:

for (int i = 1; i <= 3; i++) {
System.out.println("الدورة " + i);
}
الناتج
الدورة 1
الدورة 2
الدورة 3

بين القوسين ثلاثة أجزاء يفصلها ;:

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

تخيّلها مثل عدّاد الدورات في مضمار الجري: تبدأ من الدورة 1، وتستمر ما دمت لم تتجاوز 3، وتزيد العدّ بعد كل دورة.

والخطوة يمكن أن تكون أي قيمة، حتى تنازلية:

for (int i = 10; i >= 0; i -= 5) {
System.out.print(i + " ");
}
الناتج
10 5 0

System.out.print تطبع دون النزول لسطر جديد.

للمرور على كل عناصر مصفوفة أو قائمة، دون عدّاد:

String[] fruits = {"تفاح", "موز", "برتقال"};
for (String fruit : fruits) {
System.out.println("- " + fruit);
}
الناتج
- تفاح
- موز
- برتقال

اقرأ النقطتين : كأنها كلمة «في»: «لكل fruit في fruits». هذه الحلقة أوضح وأأمن من for العادية عندما لا تحتاج رقم العنصر، لأنك لن تخطئ في حدود المصفوفة أبداً.

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

int balance = 100;
int days = 0;
while (balance > 0) {
balance -= 30;
days++;
}
System.out.println("انتهى الرصيد بعد " + days + " أيام");
الناتج
انتهى الرصيد بعد 4 أيام

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

int n = 10;
do {
System.out.println("يُنفذ مرة واحدة على الأقل: " + n);
n++;
} while (n < 5);
الناتج
يُنفذ مرة واحدة على الأقل: 10

الشرط n < 5 خطأ من البداية، ومع ذلك نُفذت الحلقة مرة. هذا مفيد مثلاً لعرض قائمة خيارات للمستخدم قبل أن تسأله هل يريد الاستمرار.

  • 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

يمكن وضع حلقة داخل حلقة. الحلقة الداخلية تكتمل بالكامل في كل دورة من الخارجية:

for (int row = 1; row <= 3; row++) {
String line = "";
for (int col = 1; col <= row; col++) {
line += "*";
}
System.out.println(line);
}
الناتج
*
**
***

في الصف الأول تدور الداخلية مرة واحدة، وفي الثاني مرتين، وفي الثالث ثلاث مرات. مثل عقارب الساعة: عقرب الدقائق يكمل دورة كاملة مع كل خطوة لعقرب الساعات.

int num = 7;
for (int i = 1; i <= 5; i++) {
System.out.println(num + " × " + i + " = " + (num * i));
}
الناتج
7 × 1 = 7
7 × 2 = 14
7 × 3 = 21
7 × 4 = 28
7 × 5 = 35

لاحظ الأقواس حول (num * i): بدونها، ستدمج Java النص مع num ثم مع i كنصوص بدلاً من الضرب.

  1. احسب مجموع الأعداد من 1 إلى 100 بحلقة for (الناتج الصحيح: 5050).
  2. اطبع كل عناصر مصفوفة أسماء بحلقة for-each.
  3. اطبع مثلثاً مقلوباً من النجوم: 4 نجوم، ثم 3، ثم 2، ثم 1.
  4. تحدٍّ (FizzBuzz): اطبع الأعداد من 1 إلى 15، لكن «Fizz» بدل مضاعفات 3، و«Buzz» بدل مضاعفات 5، و«FizzBuzz» بدل مضاعفات الاثنين.
  • الخطأ بواحد: i < 5 تتوقف عند 4، و i <= 5 تصل إلى 5. فكّر في آخر قيمة تريدها.
  • فاصلة منقوطة بعد for: for (...); تجعل الحلقة فارغة، وينفّذ الكود التالي مرة واحدة فقط!
  • نسيان الأقواس في الطباعة: "المجموع: " + a + b تدمج الرقمين كنصين. اكتب (a + b).

سؤال

كم مرة تُنفَّذ الحلقة for (int i = 0; i < 4; i++)؟

سؤال

أي حلقة تُنفَّذ مرة واحدة على الأقل حتى لو كان الشرط خطأ من البداية؟

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