دالة الاحتمالات switch case:
إن استخدام الأمر (switch case)هو شبيه بالأمر الشرطي (IF) وتستخدم دالة (switch case) عندما يكون لدينا عدة احتمالات للقيمة المدخلة من المستخدم، وبناءً على كل احتمال نقوم بتنفيذ مهمة معينة. ستتنفذ الأوامر التي وضعناها في هذا الاحتمال فقط. وكل احتمال نضعه يسمى (case).
الشكل الأساسي لدالة switch case:
شرح الشكل الأساسي بالتفصيل كما في الشكل السابق:
تعني اختبار قيمة المتغير الموضوع بين قوسين. | switch |
هنا يقصد بها المتغير الذي نريد إختبار قيمته نوع المتغير الذي يسمح لنا باختباره: (int – byte – short – char – enum). | expression |
تعني حالة. | case |
تعني قيمة. | value |
تعني أوامر. | Statements |
يجب وضع (break) لكي يخرج من الجملة مباشرةً بدل أن ينتقل للـ (case) التالية الموجودة في الجملة (switch). | break |
(default) تعني افتراضياً وهي نفس فكرة الأداة (else)، و يمكننا أن نضع هذه الجملة التي تنفذ فقط في حال لم تنفذ أي (case) موجودة في الجملة (switch) و لذلك نضعها بالآخر ليتم التشييك على جميع ال cases. | default |
ملاحظات:
- في حال كانت قيمة الـ (expression) تساوي القيمة سيقوم البرنامج بتنفيذ الأوامر الموجودة بعد النقطتين.
- الـ (expression) و الـ (value) يجب أن يكونا من نفس (Data Type).
مثال(1):
شرح الكود وفحصه: نلاحظ عند وضع قيمة ال (X) داخل ال (Switch) ثم فحصها بواسطة (case) فإن الاحتمال الأول إذا أدخل المستخدم الرقم 1 يتم طباعة (Hello) ثم الخروج من البرنامج بواسطة الأمر (break) التي تعني أنه تحقق الاحتمال ولن يتم فحص باقي الإحتمالات. أما كلمة (default) فيتم تنفيذها في حالة واحدة فقط وهو أن المستخدم أدخل قيمة غير متوقعة، حيث سوف نقوم بإظهار رسالة له تفيد بأن القيمة المدخلة خاطئة أو غير متوقعة والموجودة في السطر الآخير (Invalid grade).
مثال (2):
public class Main { public static void main(String[] args) { int a = 5; switch( x ) { // x إختبر قيمة المتغير case 1: // في حال كانت تساوي 1 سيتم تنفيذ أمر الطباعة الموضوع فيها System.out.println("a contain 1"); break; case 2: // في حال كانت تساوي 2 سيتم تنفيذ أمر الطباعة الموضوع فيها System.out.println("a contain 2"); break; case 3: // في حال كانت تساوي 3 سيتم تنفيذ أمر الطباعة الموضوع فيها System.out.println("a contain 3"); break; default: // في حال كانت لا تساوي أي قيمة من القيم الموضوعة سيتم تنفيذ أمر الطباعة الموضوع فيها System.out.println("x contain a different value"); } } }
شرح الكود وفحصه: في الكود يوجد عدة الحالات (cases) والآن سوف نقوم بفحص قيمة المتغير (a)الذي من نوع (int).
1- فحص ال (case 1) هل قيمة المتغير a تساوي 1 ؟ فكان الشرط (false) فننتقل إلى الحالة التالية.
2- فحص ال (case 2) هل قيمة المتغير a تساوي 2 ؟ فكان الشرط (false) فننتقل إلى الحالة التالية.
3- فحص ال (case 3) هل قيمة المتغير a تساوي 3؟ فكان الشرط (false) فننتقل إلى الحالة التالية.
ولذلك لم يجد أي حالة تساوت فيها القيمة مع قيمة المتغير الذي يتم فحصة، قام بتنفيذ الأوامر الموجودة في الحالة (default) وسوف يقوم بطباعة (x contain a different value ) وعندما انتهى من تنفيذ الأوامر في الكود خرج من جملة الـ (switch) بأكملها.
مثال (3):
public class Main { public static void main(String[] args) { int c = 3; switch(c ) { // c إختبر قيمة المتغير // في حال كانت تساوي 1 أو 2 أو 3 سيتم تنفيذ أمر الطباعة case1 : case 2: case 3: System.out.println("c contain 1 or 2 or 3"); break; default: // في حال كانت لا تساوي أي قيمة من القيم الموضوعة سيتم تنفيذ أمر الطباعة الموضوع فيها System.out.println("c contain a different value"); } } }
شرح الكود وفحصه: في الكود يوجد عدة حالات (cases) والآن سوف نقوم بفحص قيمة المتغير c الذي من نوع (int).
هل قيمة المتغير c تساوي 1 أو 2 أو 3 ؟ جواب الشرط نعم (true) فسوف يقوم بتنفيذ أمر الطباعة الموجود لهذه الحالات الثلاث وبعدها خرج من جملة الـ (switch) بأكملها بسبب الجملة (break) وسيتم طباعة الجملة الآتية (x contain 1 or 2 or 3).
ملاحظة: كلمة (default و break) هي كلمات محجوزة وعند كتابتها في الكود سوف تظهر باللون الأزرق.
ملاحظة: يمكننا تحويل أي كود (switch case) إلى (if else) والعكس غير صحيح ولكن الأمر سيعطي انطباعاً سيئاً للكود إذا ما كان لدينا الكثير من الـ cases فالـ (switch case) يتميز عن (if else) أنه مقروء أكثر ومرتب ويسهل فهم الكود من خلاله، ولذلك إذا كنا نريد أن نكتب كود ليقوم بتفعيل أمر بناءاً على قيمة معينة فإن تقنية الـ switch هي الحل الأمثل، أما اذا كنا نريد تطبيق الأوامر بناء على قرارات معقدة فعلينا بالاستعانة بـالـ (if else).