Java / الأساسي / الدرس 3
الشروط والحلقات والثوابت المنطقية
حوّل القرارات والعمل المتكرر إلى تدفق تحكم تستطيع تفسير حدوده وانتهائه قبل التنفيذ.
في هذه الصفحة
أهداف الدرس
- اختيار if وswitch وfor وwhile وفق المشكلة.
- تتبع ثابت الحلقة ومقياس انتهائها.
- اختبار الحالات الفارغة والحدية.
صغ القرار بلغة المجال
ابدأ بقواعد مفهومة: الدرجة غير السالبة دون50 تعني إعادة، ومن50 إلى100 نجاح، وغير ذلك غير صالح. تحقق من المجال قبل التصنيف. ينبغي أن توضح سلسلة if/else كل حالة مقبولة وحدها. ليست else الأخيرة خطأ تلقائياً؛ بل تشمل كل ما لم يطابق سابقاً.
استخدم الأقواس المعقوفة للفروع القصيرة كيلا تغير إضافة لاحقة النطاق عرضياً. سمّ الشرط المنطقي عندما يوضح القصد أكثر من تعبير كثيف. تختصر && و
التقييم من اليسار فتحمي فحص null أو تتجنب عملاً مكلفاً. أوضح التجميع بالأقواس بدلاً من الاعتماد على حفظ الأسبقية.
امنح حلقة العد مجالاً دقيقاً
تظهر for التهيئة وشرط الاستمرار والتقدم معاً. للمجال الشامل1 إلى4 ابدأ بـ1 واستمر ما دام i <= 4 ثم زد بعد الجسم. يبدأ المجمع بصفر لأنه محايد الجمع. بعد كل تكرار مكتمل يساوي مجموع ما عولج؛ وهذا ثابت الحلقة.
يطبع المثال10 لأنه يضيف1 و2 و3 و4 مرة واحدة. تتبع العداد والمجموع قبل الجسم وبعده بجدول صغير. ينبغي أن ينتج المجال الفارغ القيمة المحايدة إذا كان ذلك العقد المقصود. لا تبدأ المجمع بأول عنصر دون معالجة الفراغ مستقلاً.
public class Main {
public static void main(String[] args) throws Exception {
int total = 0;
for (int i = 1; i <= 4; i++) { total += i; }
System.out.println(total);
}
}
10
تحافظ الإضافات الأربع على أن total مجموع القيم المعالجة فقط.
أثبت التقدم في حلقة while
استخدم while عندما يعتمد التكرار على الحالة لا عدد ثابت واضح. حدد ما يقترب من النهاية في كل مرة، كالمحاولات المتبقية أو الجزء غير المفحوص من بحث. ينشئ شرط لا يتغير حلقة لا نهائية منطقياً رغم صحة الترجمة.
تنفذ do/while الجسم مرة على الأقل، فلا تناسب اشتراط صفر تكرارات إلا بعقد يراعيه. تخرج break من أقرب حلقة أو switch، وتنتقل continue للتكرار التالي وقد تتجاوز تحديث التقدم الضروري في while. فضّل تقدماً بسيطاً ظاهراً قبل إضافة الاختصارات.
استخدم تعبير switch دون سقوط بين الفروع
يدعم Java17 تعبيرات switch المعيارية ذات الأسهم. يجب أن ينتج التعبير قيمة لكل مسار مقبول، وتعالج default غيره ما لم تتحقق الشمولية بقواعد اللغة. يربط المثال حالة معروفة بوصف تسليم. لا تسقط الأسهم إلى الفرع التالي كما قد يحدث مع مجموعات النقطتين التقليدية.
يناسب switch ربطاً محدوداً بينما تناسب if المتباينات والشروط المركبة. لا تمثل مجالاً مفتوحاً بمئات الحالات. قد يوضح enum حالات العمل المحدودة أكثر من أعداد اعتباطية، لكن يبقى الإدخال الخارجي غير المعروف بحاجة إلى تحقق قبل تحويله.
public class Main {
public static void main(String[] args) throws Exception {
String state = "READY";
String label = switch (state) {
case "READY" -> "dispatch";
case "WAITING" -> "hold";
default -> "review";
};
System.out.println(label);
}
}
dispatch
تختار READY فرعاً واحداً ينتج dispatch دون تنفيذ الفرع التالي.
راجع التدفق بأمثلة مضادة
اختر لكل فرع قيماً قبل الحد وعنده وبعده، واختبر للحلقة صفراً وواحداً وعدة تكرارات مع الحالة النهائية للعداد. غالباً يفسر اختلاف شمول الطرف خطأ الواحد، لا لغز حسابي. استخدم مجالاً نصف مفتوح للفهرسة لأن المواقع من صفر إلى ما قبل length.
يشرح التتبع الصحيح الجواب وسبب غياب العمل الزائد. افصل آلية الحلقة عن عملية جسمها وصغّر الآثار الجانبية. وعند قراءة إدخال متكرر ميّز نهاية الإدخال وغير الصالح والقيمة الرمزية المشروعة، وإلا تحول الرفض إلى تكرار أبدي أو حساب مقبول خطأ.
الأخطاء الشائعة وإصلاحها
ArrayIndexOutOfBoundsException
- لماذا يحدث؟
- استخدمت الحلقة <= length للفهرسة الصفرية.
- كيف تصلحه؟
- استخدم i < length وتحقق من الفهرس الخارجي.
- كيف تتجنب تكراره؟
- اختبر المصفوفة الفارغة وذات العنصر الواحد.
Loop never terminates
- لماذا يحدث؟
- لا يحقق الجسم تقدماً يجعل الشرط خاطئاً.
- كيف تصلحه؟
- حدد مقياس انتهاء وحدثه في كل مسار.
- كيف تتجنب تكراره؟
- تتبع continue وفروع الخطأ.
A boundary score is misclassified
- لماذا يحدث؟
- تختلف الفروع في شمول الطرف أو تهمل التحقق.
- كيف تصلحه؟
- حدد المجالات وتحقق أولاً.
- كيف تتجنب تكراره؟
- اختبر القيم المحيطة بكل حد.
اختبر فهمك
1. كم مرة تنفذ for (int i=0; i<3; i++)؟
اعرض الحل المشروح
ثلاثاً بالقيم0 و1 و2 داخل الجسم. بعد الزيادة الأخيرة يصبح i=3 فيفشل الشرط. تضيف <= تكراراً عند3 غير صالح لمصفوفة طولها ثلاثة.
2. صمّم عداداً يسمح بثلاث محاولات تشمل الأولى.
اعرض الحل المشروح
ابدأ بصفر واشترط attempts < 3 وزد مرة لكل محاولة حتى المرفوضة وتوقف عند النجاح. اختبر النجاح الأول والثالث وثلاثة إخفاقات، ولا تخلط ثلاث إعادات بثلاث محاولات كلية.
أهم ما تعلمته
- حدد المجالات قبل الفروع.
- تحتاج الحلقة ثابتاً وتقدماً نحو النهاية.
- اختبر الأطراف وغياب العمل صراحة.