حتى الآن ينفّذ البرنامج كل سطر مرة واحدة من الأعلى للأسفل. الشروط تجعله يختار أي سطور ينفّذ، والحلقات تجعله يكرّر. وكلاهما يعتمد على تعابير boolean من درس العوامل.
if و else
int age = 16;
if (age >= 18) {
System.out.println("يمكنك التسجيل");
} else {
System.out.println("التسجيل من عمر 18");
}
else if: عدّة احتمالات
int score = 85;
String grade;
if (score >= 90) {
grade = "ممتاز";
} else if (score >= 80) {
grade = "جيد جدًا";
} else if (score >= 65) {
grade = "جيد";
} else {
grade = "يحتاج تحسينًا";
}
System.out.println(grade); // جيد جدًا
تُفحص الشروط بالترتيب ويُنفَّذ أول فرع صحيح فقط، ثم يقفز البرنامج لما بعد السلسلة. لهذا لم نكتب score >= 80 && score < 90: الوصول للفرع الثاني يعني أن الأول كان خاطئًا. ولو بدأت بـ score >= 65، لحصل صاحب 95 على "جيد".
الأقواس دائمًا
int balance = 500;
if (balance < 100)
System.out.println("رصيد منخفض");
System.out.println("أرسلنا تنبيهًا"); // ⚠️ يُنفَّذ دائمًا!
الرصيد 500، ومع ذلك يطبع البرنامج "أرسلنا تنبيهًا". بلا { }، يتبع if السطر الأول فقط، والإزاحة لا تعني شيئًا للمترجم. اكتب الأقواس حتى لسطر واحد، لأن من سيضيف السطر الثاني لاحقًا قد يكون أنت.
switch: اختيار من قيم محدّدة
حين تقارن متغيّرًا واحدًا بقيم ثابتة كثيرة، switch أوضح من سلسلة else if. الصيغة الحديثة بالسهم (منذ Java 14):
int day = 6;
String name = switch (day) {
case 1 -> "الأحد";
case 2 -> "الاثنين";
case 3, 4, 5 -> "منتصف الأسبوع";
case 6, 7 -> "عطلة";
default -> "رقم غير صالح";
};
System.out.println(name); // عطلة
يعمل switch مع int وchar وString والتعدادات، ويمكنه أن يعيد قيمة مباشرة كما هنا.
الصيغة القديمة وفخّ break
ستراها في كود كثير موجود:
int day = 1;
switch (day) {
case 1:
System.out.println("الأحد");
case 2:
System.out.println("الاثنين");
break;
default:
System.out.println("يوم آخر");
}
يطبع الأحد ثم الاثنين. بلا break يكمل التنفيذ في الحالة التالية (fall-through). صيغة السهم لا تعاني هذه المشكلة، لذلك اكتبها في أي كود جديد. وتعابير switch المتقدّمة مع الأنماط في درس switch وتطابق الأنماط.
حلقة for: عدد معروف من المرّات
for (int i = 1; i <= 5; i++) {
System.out.println("الدورة رقم " + i);
}
داخل القوسين ثلاثة أجزاء مفصولة بـ ;:
- البداية
int i = 1: تُنفَّذ مرة واحدة. - الشرط
i <= 5: يُفحص قبل كل دورة؛ إن كانfalseتنتهي الحلقة. - الخطوة
i++: تُنفَّذ بعد كل دورة.
مثال عملي، مجموع الأعداد من 1 إلى 100:
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println(sum); // 5050
حلقات متداخلة
for (int row = 1; row <= 3; row++) {
for (int col = 1; col <= 3; col++) {
System.out.print(row * col + "\t");
}
System.out.println();
}
الحلقة الداخلية تكتمل كاملة في كل دورة من الخارجية، فتطبع جدول ضرب 3×3. انتبه للتكلفة: حلقتان على 1000 عنصر تعني مليون دورة.
while: حتى يتحقّق شرط
حين لا تعرف عدد الدورات مسبقًا:
int balance = 1000;
int months = 0;
while (balance < 2000) {
balance += balance * 10 / 100; // ربح 10% شهريًّا
months++;
}
System.out.println("يتضاعف الرصيد بعد " + months + " شهرًا");
do-while: مرة واحدة على الأقل
int attempts = 0;
do {
attempts++;
System.out.println("محاولة " + attempts);
} while (attempts < 3);
الشرط يُفحص بعد الجسم، فيُنفَّذ مرة حتى لو كان الشرط خاطئًا من البداية. مناسب لقائمة خيارات تُعرض ثم تسأل المستخدم هل يريد المتابعة، كما في درس مدخلات المستخدم.
for-each: المرور على كل عنصر
String[] cities = {"عمّان", "القاهرة", "الرياض"};
for (String city : cities) {
System.out.println(city);
}
اقرأها "لكل city في cities". أبسط من for بالعدّاد حين لا تحتاج رقم الموضع. ستستخدمها كثيرًا مع المصفوفات والمجموعات.
break و continue
int[] numbers = {4, 7, -1, 9, 12};
for (int n : numbers) {
if (n < 0) {
System.out.println("قيمة سالبة، توقّف");
break; // اخرج من الحلقة كلها
}
if (n % 2 != 0) {
continue; // تخطَّ بقية هذه الدورة فقط
}
System.out.println("زوجي: " + n);
}
يطبع زوجي: 4 ثم يتخطّى 7، ثم يتوقّف عند -1 فلا يصل إلى 9 و12 أبدًا.
أخطاء شائعة
- فاصلة منقوطة بعد الشرط:
if (x > 5);أوfor (...);تنهي الجملة، فيُنفَّذ ما بعدها دائمًا أو مرة واحدة. - حلقة لا تنتهي: نسيان
count++فيwhile. إذا علق برنامجك، أوقفه بـCtrl+C. - الخطأ بواحد (Off-by-one):
i <= arr.lengthبدلi < arr.lengthيتجاوز آخر عنصر ويرميArrayIndexOutOfBoundsException. - ترتيب
else ifمن الأوسع للأضيق: الفرع الأول الصحيح يبتلع البقية. switchقديم بلاbreak: تنفيذ حالات لم تقصدها. استخدم صيغة السهم.- مقارنة نصين في
ifبـ==: استخدمequals.
🎯 التالي: الدوال (Methods).