تعلم عبارات الشرط في لغة C: شرح switch-case و if-else مع أمثلة عملية

目次

1. المقدمة: ما هي عبارات الشرط في لغة C؟

أهمية ودور عبارات الشرط

في البرمجة، تلعب عبارات الشرط دورًا أساسيًا. من خلال تنفيذ تعليمات مختلفة بناءً على شروط معينة، يمكن تحسين مرونة وكفاءة البرنامج.

الأساسيات في لغة C

في لغة C، هناك طريقتان رئيسيتان لاستخدام عبارات الشرط:

  1. if-else
  2. switch-case

من بين هذه، تُعتبر switch-case فعّالة بشكل خاص عند وجود خيارات واضحة لأنها تسمح بالتعامل مع عدة حالات بكفاءة.

دور واستخدام switch-case

تُستخدم switch-case للتحكم في تدفق البرنامج بناءً على قيمة متغير معين. وتكون مفيدة في سيناريوهات مثل:

  • برامج اختيار القائمة
  • تصنيف التقييم بالأرقام أو الأحرف
  • إدارة الحالات البسيطة

مثال على الاستخدام

على سبيل المثال، يمكن إنشاء تطبيق ينفذ أوامر مختلفة حسب رقم القائمة. إذا اختار المستخدم “1” يعني “ابدأ”، وإذا اختار “2” يعني “إنهاء”.

مزايا تعلم switch-case

  • رمز بسيط وسهل القراءة
  • تقليل الأخطاء من خلال تنظيم الشروط بوضوح
  • تحسين كفاءة البرنامج

في هذا المقال، سنشرح بالتفصيل من الأساسيات إلى الأمثلة المتقدمة ونقاط الانتباه الخاصة بعبارة switch-case. استغل هذه الفرصة لفهم أعمق لأسلوب الشرط في لغة C واكتساب مهارات عملية.

2. البنية الأساسية لـ switch-case وطريقة استخدامها

البنية الأساسية

إليك الصياغة الأساسية لعبارة switch-case:

switch (التعبير) {
    case ثابت1:
        // المعالجة 1
        break;
    case ثابت2:
        // المعالجة 2
        break;
    default:
        // المعالجة الافتراضية
}

مثال برمجي: برنامج تحديد اليوم

#include <stdio.h>

int main() {
    int day;
    printf("أدخل اليوم كرقم (1〜7): ");
    scanf("%d", &day);

    switch (day) {
        case 1:
            printf("الاثنين\n");
            break;
        case 2:
            printf("الثلاثاء\n");
            break;
        case 3:
            printf("الأربعاء\n");
            break;
        case 4:
            printf("الخميس\n");
            break;
        case 5:
            printf("الجمعة\n");
            break;
        case 6:
            printf("السبت\n");
            break;
        case 7:
            printf("الأحد\n");
            break;
        default:
            printf("إدخال غير صالح\n");
    }

    return 0;
}

النقاط المهمة في هذا المثال

  • استخدام break بعد كل حالة للتحكم في تدفق التنفيذ.
  • استخدام default للتعامل مع الإدخالات غير الصحيحة.

3. مميزات واحتياطات استخدام switch-case

الميزة 1: بساطة وسهولة القراءة

تتيح switch-case كتابة فروع شرطية متعددة بشكل مختصر، مما يحسن قابلية قراءة الكود.

الميزة 2: مخصصة للأعداد الصحيحة والأحرف

تم تصميم switch-case خصيصًا للتعامل مع قيم من النوع الصحيح (int) أو الأحرف (char).

نصائح عند الاستخدام

1. عدم نسيان عبارة break

int num = 1;

switch (num) {
    case 1:
        printf("One\n");
    case 2:
        printf("Two\n");
    default:
        printf("Other\n");
}

النتيجة:

One  
Two  
Other

الحل:

int num = 1;

switch (num) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    default:
        printf("Other\n");
}

2. استخدام الثوابت فقط

int x = 10;
switch (x) {
    case x:  // خطأ
        printf("خطأ\n");
        break;
}

الإصدار الصحيح:

#define VALUE 10
switch (x) {
    case VALUE:
        printf("نجاح\n");
        break;
}

الخلاصة

  • لا تنسَ break – لتجنب السقوط غير المقصود في الحالات التالية.
  • استخدم الثوابت فقط – لا يمكن استخدام المتغيرات أو التعابير.
  • نظّم البنية المتداخلة – باستخدام التعليقات والمسافات للحفاظ على وضوح الكود.

4. مقارنة بين if-else و switch-case: أيهما تختار؟

الاختلافات الأساسية

1. طريقة تقييم الشرط

  • if-else تقيم التعابير المنطقية (مثل المقارنات أو شروط متعددة).
  • switch-case تتحقق من تطابق قيمة معينة (ثابت أو حرف).

جدول المقارنة

عنصر المقارنةif-elseswitch-case
شرطيدعم التعابير المنطقية ونطاقات القيميقتصر على القيم الصحيحة أو الأحرف
قابلية القراءةتصبح معقدة عند زيادة الشروطواضحة عند التعامل مع عدة حالات
السرعةقد تكون أبطأيمكن للمترجم تحسينها للعمل بسرعة أكبر
المرونةمرنة لإضافة شروط جديدةمحدودة بالقيم الثابتة
الاستخداممناسب للشروط المعقدة أو النطاقاتمثالي للاختيارات الواضحة (مثل القوائم)

أمثلة عملية

مثال if-else:

int score = 85;

if (score >= 90) {
    printf("ممتاز\n");
} else if (score >= 70) {
    printf("جيد\n");
} else {
    printf("مقبول\n");
}

مثال switch-case:

int grade = 2;

switch (grade) {
    case 1:
        printf("ممتاز\n");
        break;
    case 2:
        printf("جيد\n");
        break;
    case 3:
        printf("مقبول\n");
        break;
    default:
        printf("راسب\n");
}

5. أمثلة متقدمة: استخدام switch-case بطرق ذكية

1. دمج عدة حالات

char grade = 'A';

switch (grade) {
    case 'A':
    case 'B':
        printf("ناجح\n");
        break;
    case 'C':
        printf("إعادة اختبار\n");
        break;
    default:
        printf("راسب\n");
}

2. الاستفادة من السقوط (fall-through)

int score = 85;

switch (score / 10) {
    case 10:
    case 9:
        printf("ممتاز\n");
        break;
    case 8:
    case 7:
        printf("جيد\n");
        break;
    default:
        printf("ضعيف\n");
}

3. switch-case متداخل

int menu = 1;
int subMenu = 2;

switch (menu) {
    case 1:
        switch (subMenu) {
            case 1:
                printf("قائمة فرعية 1-1\n");
                break;
            case 2:
                printf("قائمة فرعية 1-2\n");
                break;
        }
        break;
    case 2:
        printf("القائمة 2\n");
        break;
}

6. الأخطاء الشائعة وحلولها

1. نسيان عبارة break

int num = 1;

switch (num) {
    case 1:
        printf("One\n");
    case 2:
        printf("Two\n");
    default:
        printf("Other\n");
}

الحل:

int num = 1;

switch (num) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    default:
        printf("Other\n");
}

2. استخدام المتغيرات في case

int x = 10;
switch (x) {
    case x:  // خطأ
        printf("القيمة هي 10\n");
        break;
}

الإصدار الصحيح:

#define VALUE 10
switch (x) {
    case VALUE:
        printf("نجاح\n");
        break;
}

3. إهمال عبارة default

int num = 5;

switch (num) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
}

الحل:

switch (num) {
    case 1:
        printf("One\n");
        break;
    case 2:
        printf("Two\n");
        break;
    default:
        printf("Other\n");
}

7. الخلاصة والخطوات التالية

1. ملخص النقاط الرئيسية

  1. البنية الأساسية وطريقة الاستخدام
  • switch-case هي صيغة تحكم مفيدة لتقسيم التنفيذ بناءً على قيم معينة.
  • بسيطة وسهلة القراءة، ومناسبة للمعالجات الواضحة لكل قيمة.
  1. الخصائص والاحتياطات
  • switch-case تقبل الثوابت فقط من الأنواع الصحيحة أو الأحرف.
  • نسيان break يؤدي إلى تنفيذ غير مقصود، لذا من المهم الالتزام بالقواعد الصحيحة.
  1. مقارنة مع if-else
  • if-else مناسبة للشروط المعقدة أو النطاقات، بينما switch-case مثالية للخيارات المحددة.
  • الاختيار الصحيح بينهما يزيد من كفاءة الكود.
  1. الأمثلة المتقدمة والتقنيات
  • دمج الحالات، استخدام fall-through، والتداخل مع دوال أو هياكل بيانات يعزز مرونة الكود.
  1. الأخطاء الشائعة والحلول
  • مثل نسيان break، استخدام متغيرات في case، أو إهمال default.

2. الخطوات التالية

1. إنشاء برامج عملية
باستخدام ما تعلمته، جرّب كتابة برامج مثل:

  • آلة حاسبة: معالجة العمليات باستخدام switch-case.
  • تطبيق قوائم: بناء قوائم متعددة المستويات.
  • نظام إدارة الدرجات: تصنيف النتائج تلقائيًا.

2. تعلم مواضيع مرتبطة
لتعزيز مهارتك مع switch-case، استكشف:

  • تطبيقات if-else لتعلم المزيد من تقنيات الشروط.
  • الحلقات (for, while) للجمع بين التكرار والشروط.
  • الدوال والهياكل لإدارة البرامج الكبيرة بكفاءة.

3. تحسين الكود وإزالة الأخطاء

  • استخدام أدوات التصحيح (Debugging) لتحديد الأخطاء بسرعة.
  • مراجعة الكود مع الآخرين للحصول على تعليقات بنّاءة.

3. الخاتمة

تُعتبر switch-case أداة قوية لتبسيط الشروط في لغة C. من خلال فهم أساسياتها وتطبيقاتها المتقدمة، يمكنك تحسين وضوح وكفاءة برامجك.

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

年収訴求