التبديل...الحالة في C (بيان التبديل في C) مع الأمثلة

⚡ ملخص ذكي

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

  • 🔀 التفرع متعدد الاتجاهات: يقوم مفتاح التبديل باختبار تعبير واحد ثم ينتقل إلى تسمية الحالة المطابقة.
  • 🏷️ ملصقات العلبة: تستخدم كل حالة رمزًا فريدًا ثابتًا من نوع عدد صحيح أو حرف ينتهي بنقطتين رأسيتين.
  • ⛔ كسر الكلمة المفتاحية: تُنهي عبارة break حالةً ما؛ وبدونها، يفشل التنفيذ.
  • 🧩 الحالة الافتراضية: يتم تشغيل الكتلة الافتراضية الاختيارية عندما لا تتطابق أي تسمية حالة مع التعبير.
  • 📋 قواعد التبديل: تظل تسميات الحالات ثابتة وفريدة، مع السماح بتسمية افتراضية واحدة فقط.

عبارة التبديل في لغة C

ما هو بيان التبديل في لغة 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

تبديل مثال الحالة في C

  1. في البرنامج المعطى قمنا بتهيئة متغير رقم بقيمة 8
  2. يتم استخدام بنية التبديل لمقارنة القيمة المخزنة في المتغير num وتنفيذ كتلة البيانات المرتبطة بالحالة المطابقة.
  3. في هذا البرنامج، نظرًا لأن القيمة المخزنة في المتغير 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

التبديل المتداخل في C

  1. في البرنامج المعطى قمنا بتهيئة متغيرين: المعرف وكلمة المرور.
  2. يتم استخدام بنية التبديل الخارجية لمقارنة القيمة المدخلة في المتغير ID. وتقوم بتنفيذ كتلة التعليمات المرتبطة بالحالة المطابقة (عندما يكون ID==500).
  3. إذا تم تنفيذ عبارة الكتلة مع الحالة المطابقة، فسيتم استخدام مفتاح داخلي لمقارنة القيم المدخلة في متغير كلمة المرور وتنفيذ العبارات المرتبطة بالحالة المطابقة (عندما تكون كلمة المرور == 000).
  4. بخلاف ذلك، فإن حالة التبديل سوف تؤدي إلى تشغيل الحالة الافتراضية وطباعة النص المناسب فيما يتعلق بمخطط البرنامج.

لماذا نحتاج إلى حالة التبديل؟

هناك مشكلة واحدة محتملة مع بيان if-else وهذا يعني أن تعقيد البرنامج يزداد كلما زاد عدد المسارات البديلة. وإذا استخدمت عدة هياكل if-else في البرنامج، فقد يصبح من الصعب قراءة البرنامج وفهمه. وفي بعض الأحيان قد يربك ذلك المطور الذي كتب البرنامج بنفسه.

الحل لهذه المشكلة هو بيان التبديل.

قواعد بيان التبديل

اتبع هذه القواعد عند كتابة عبارة switch في لغة C:

  • يجب أن يتم تنفيذ التعبير دائمًا إلى نتيجة.
  • يجب أن تكون تسميات الحالة ثابتة وفريدة من نوعها.
  • يجب أن تنتهي تسميات الحالة بنقطتين (:).
  • يجب أن تكون الكلمة الأساسية فاصل موجودة في كل حالة.
  • يمكن أن يكون هناك تسمية افتراضية واحدة فقط.
  • يمكننا دمج بيانات التبديل المتعددة.

الأسئلة الشائعة

يقبل مفتاح التيار المتردد قيم int و char و enum فقط - ولا يقبل أبدًا قيم float أو strings، حيث يجب أن يكون كل تصنيف عددًا صحيحًا ثابتًا.

بدون توقف، يفشل التحكم ويتم تشغيل كل حالة لاحقة أيضًا - أحيانًا يكون ذلك مقصودًا، ولكنه عادةً ما يكون خطأً غير مقصود.

لا، لا يمكن استخدام دالة switch في لغة C مع السلاسل النصية؛ يجب أن تكون القيم المُعرِّفة أعدادًا صحيحة ثابتة. بدلاً من ذلك، قارن النص باستخدام strcmp داخل عبارة if-else.

يمنع معيار C النطاقات، على الرغم من أن GCC يسمح بامتداد غير قابل للنقل 1 … 5: وهو امتداد يجب على التعليمات البرمجية القابلة للنقل تجنبه.

لا. يمكن أن يكون الوضع الافتراضي في أي مكان؛ فهو يُنفذ فقط عندما لا تتطابق أي تسمية. أما الوضع الأخير فهو مجرد اصطلاح.

نعم، ولكن ضع جسم الحالة بين قوسين معقوفين؛ وإلا فإن الإعلان بعد التسمية يمكن أن يتسبب في حدوث أخطاء في المترجم.

نعم. تقوم برامج الذكاء الاصطناعي المساعدة في البرمجة بصياغة كتل التبديل، وإضافة كل فاصل، وتحديد حالات الانتقال غير المقصودة. راجع دائمًا المنطق المُولّد.

مساعد الطيار جيثب يقوم بإكمال تسميات الحالات تلقائيًا، وإدراج عبارات break، وتحويل سلاسل if-else الطويلة إلى عبارة switch من تعليق.

تلخيص هذه التدوينة بـ: