التبديل...الحالة في C (بيان التبديل في C) مع الأمثلة
⚡ ملخص ذكي
تقوم عبارة التبديل في لغة C بمقارنة تعبير واحد مع عدة تسميات حالة وتشغيل كتلة المطابقة، مما يوفر بديلاً أنظف لسلاسل if-else الطويلة عندما يتعين على البرنامج الاختيار من بين العديد من القيم الثابتة من الأعداد الصحيحة أو الأحرف.

ما هو بيان التبديل في لغة C؟
تختبر عبارة switch في لغة C قيمة متغير وتقارنها بحالات متعددة. بمجرد العثور على تطابق في الحالة، يتم تنفيذ مجموعة من التعليمات البرمجية المرتبطة بتلك الحالة.
كل حالة في كتلة المحول لها اسم/رقم مختلف يشار إليه كمعرف. تتم مقارنة القيمة المقدمة من قبل المستخدم بجميع الحالات الموجودة داخل كتلة التبديل حتى يتم العثور على التطابق.
إذا لم يتم العثور على تطابق حالة، فسيتم تنفيذ البيان الافتراضي، ويخرج عنصر التحكم من كتلة التبديل.
تبديل بناء جملة الحالة
بناء الجملة العام لكيفية تنفيذ حالة التبديل في برنامج "C" هو كما يلي:
switch( expression ) { case value-1: Block-1; Break; case value-2: Block-2; Break; case value-n: Block-n; Break; default: Block-1; Break; } Statement-x;
- يمكن أن يكون التعبير تعبيرًا صحيحًا أو تعبيرًا حرفيًا.
- القيمة-1، 2، n هي تسميات حالة تُستخدم لتحديد كل حالة على حدة. تذكر أن تسميات الحالة يجب ألا تكون نفسها لأنها قد تسبب مشكلة أثناء تنفيذ البرنامج. لنفترض أن لدينا حالتين تحملان نفس التصنيف "1". ثم أثناء تنفيذ البرنامج سيتم تنفيذ الحالة التي تظهر أولاً بالرغم من أنك تريد أن يقوم البرنامج بتنفيذ حالة ثانية. وهذا يخلق مشاكل في البرنامج ولا يوفر المخرجات المطلوبة.
- تنتهي تسميات الحالة دائمًا بنقطتين (:). ترتبط كل حالة من هذه الحالات بكتلة.
- الكتلة ليست سوى عبارات متعددة يتم تجميعها لحالة معينة.
- عند تنفيذ المحول، تتم مقارنة قيمة تعبير الاختبار مع جميع الحالات التي حددناها داخل المحول. لنفترض أن تعبير الاختبار يحتوي على القيمة 4. تتم مقارنة هذه القيمة بجميع الحالات حتى الحالة التي تم العثور على تسميتها الرابعة في البرنامج. بمجرد العثور على حالة، يتم تنفيذ كتلة البيانات المرتبطة بهذه الحالة المحددة ويخرج التحكم من المفتاح.
- تشير الكلمة الأساسية "break" في كل حالة إلى نهاية حالة معينة. إذا لم نضع الفاصل في كل حالة، فبالرغم من تنفيذ الحالة المحددة، سيستمر المحول في لغة C في تنفيذ جميع الحالات حتى الوصول إلى النهاية. لا ينبغي أن يحدث هذا؛ ومن ثم يتعين علينا دائمًا وضع الكلمة الأساسية في كل حالة. سيؤدي الكسر إلى إنهاء الحالة بمجرد تنفيذها وسيسقط عنصر التحكم من المفتاح.
- الحالة الافتراضية هي حالة اختيارية. متى لم تتطابق قيمة تعبير الاختبار مع أي من الحالات داخل المفتاح، فسيتم تنفيذ الحالة الافتراضية. وإلا، فليس من الضروري كتابة الحالة الافتراضية في المفتاح.
- بمجرد تنفيذ المفتاح، سينتقل عنصر التحكم إلى العبارة x، وسيستمر تنفيذ البرنامج.
مخطط انسيابي لبيان التبديل
يوضح الرسم التخطيطي التالي كيفية تحديد الحالة في حالة التبديل:
كيف يعمل التبديل
تبديل مثال الحالة في C
يوضح البرنامج التالي استخدام المفتاح:
#include <stdio.h> int main() { int num = 8; switch (num) { case 7: printf("Value is 7"); break; case 8: printf("Value is 8"); break; case 9: printf("Value is 9"); break; default: printf("Out of range"); break; } return 0; }
الإخراج:
Value is 8
- في البرنامج المعطى قمنا بتهيئة متغير رقم بقيمة 8
- يتم استخدام بنية التبديل لمقارنة القيمة المخزنة في المتغير num وتنفيذ كتلة البيانات المرتبطة بالحالة المطابقة.
- في هذا البرنامج، نظرًا لأن القيمة المخزنة في المتغير num هي ثمانية، فسيقوم المحول بتنفيذ الحالة التي تكون تسمية الحالة الخاصة بها هي 8. بعد تنفيذ الحالة، سيسقط عنصر التحكم من المحول وسيتم إنهاء البرنامج بالنتيجة الناجحة بواسطة طباعة القيمة على شاشة الإخراج.
حاول تغيير قيمة المتغير num ولاحظ التغيير في الإخراج.
على سبيل المثال، نأخذ في الاعتبار البرنامج التالي الذي يكون افتراضيًا:
#include <stdio.h> int main() { int language = 10; switch (language) { case 1: printf("C#\n"); break; case 2: printf("C\n"); break; case 3: printf("C++\n"); break; default: printf("Other programming language\n");}}
الإخراج:
Other programming language
عند العمل مع حالة التبديل في لغة C، يمكنك تجميع حالات متعددة بتسميات فريدة. تحتاج إلى تقديم بيان فاصل في كل حالة للتفرع في نهاية بيان التبديل.
يتم تشغيل الحالة الافتراضية الاختيارية عند عدم إجراء أي تطابقات أخرى.
نحن نأخذ بعين الاعتبار بيان التبديل التالي:
#include <stdio.h> int main() { int number=5; switch (number) { case 1: case 2: case 3: printf("One, Two, or Three.\n"); break; case 4: case 5: case 6: printf("Four, Five, or Six.\n"); break; default: printf("Greater than Six.\n");}}
الإخراج:
Four, Five, or Six.
التبديل المتداخل في C
In C، يمكن أن يكون لدينا مفتاح داخلي مضمن في مفتاح خارجي. كما أن ثوابت الحالة للمفتاح الداخلي والخارجي قد يكون لها قيم مشتركة وبدون أي تعارض.
لنفترض البرنامج التالي الذي يطلب من المستخدم إدخال رقمه التعريفي. إذا كان الرقم التعريفي صحيحًا، فسيطلب منه إدخال كلمة المرور؛ إذا كانت كلمة المرور صحيحة، فسيطبع البرنامج اسم المستخدم، وإلا فسيطبع "كلمة مرور خاطئة"؛ وإذا كان الرقم التعريفي غير موجود، فسيطبع البرنامج "رقم تعريف خاطئ".
#include <stdio.h> int main() { int ID = 500; int password = 000; printf("Plese Enter Your ID:\n "); scanf("%d", & ID); switch (ID) { case 500: printf("Enter your password:\n "); scanf("%d", & password); switch (password) { case 000: printf("Welcome Dear Programmer\n"); break; default: printf("incorrect password"); break; } break; default: printf("incorrect ID"); break; } }
الإخراج:
Plese Enter Your ID: 500 Enter your password: 000 Welcome Dear Programmer
- في البرنامج المعطى قمنا بتهيئة متغيرين: المعرف وكلمة المرور.
- يتم استخدام بنية التبديل الخارجية لمقارنة القيمة المدخلة في المتغير ID. وتقوم بتنفيذ كتلة التعليمات المرتبطة بالحالة المطابقة (عندما يكون ID==500).
- إذا تم تنفيذ عبارة الكتلة مع الحالة المطابقة، فسيتم استخدام مفتاح داخلي لمقارنة القيم المدخلة في متغير كلمة المرور وتنفيذ العبارات المرتبطة بالحالة المطابقة (عندما تكون كلمة المرور == 000).
- بخلاف ذلك، فإن حالة التبديل سوف تؤدي إلى تشغيل الحالة الافتراضية وطباعة النص المناسب فيما يتعلق بمخطط البرنامج.
لماذا نحتاج إلى حالة التبديل؟
هناك مشكلة واحدة محتملة مع بيان if-else وهذا يعني أن تعقيد البرنامج يزداد كلما زاد عدد المسارات البديلة. وإذا استخدمت عدة هياكل if-else في البرنامج، فقد يصبح من الصعب قراءة البرنامج وفهمه. وفي بعض الأحيان قد يربك ذلك المطور الذي كتب البرنامج بنفسه.
الحل لهذه المشكلة هو بيان التبديل.
قواعد بيان التبديل
اتبع هذه القواعد عند كتابة عبارة switch في لغة C:
- يجب أن يتم تنفيذ التعبير دائمًا إلى نتيجة.
- يجب أن تكون تسميات الحالة ثابتة وفريدة من نوعها.
- يجب أن تنتهي تسميات الحالة بنقطتين (:).
- يجب أن تكون الكلمة الأساسية فاصل موجودة في كل حالة.
- يمكن أن يكون هناك تسمية افتراضية واحدة فقط.
- يمكننا دمج بيانات التبديل المتعددة.



