Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

استخدام Enums في جمل Switch

جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 57 من 63.

واحدة من أقوى المجموعات في برمجة C هي استخدام قيم enum مع جمل switch. ينشئ هذا الاقتران منطقاً للتحكم في التدفق سهل القراءة والصيانة بشكل استثنائي، مما يعبر بوضوح عن عملية اتخاذ القرار في برنامجك.

عندما تستخدم ثوابت التعداد (enum constants) كحالات (cases) في جملة switch، يصبح الكود ذاتي التوثيق. فبدلاً من رؤية أرقام غامضة مثل case 0: أو case 5:، سترى أسماءً ذات معنى توضح الغرض منها على الفور:

switch (day) {
    case MONDAY:
    case TUESDAY:
    case WEDNESDAY:
    case THURSDAY:
    case FRIDAY:
        printf("It's a weekday\n");
        break;
    case SATURDAY:
    case SUNDAY:
        printf("It's a weekend\n");
        break;
}

هذا النهج يجعل الكود الخاص بك أسهل بكثير في الفهم والتعديل. أي شخص يقرأ هذا الكود سيعرف على الفور ما تمثله كل حالة، كما أن إضافة حالات جديدة أو تغيير المنطق يصبح أمراً بسيطاً. يساعد المترجم (compiler) أيضاً في اكتشاف الأخطاء - فإذا أخطأت في كتابة ثابت enum، فستحصل على خطأ في الترجمة (compilation error) بدلاً من خطأ خفي (silent bug).

challenge icon

التحدي

سهل

قم بإنشاء برنامج بلغة C يستخدم التعداد (enum) مع جملة switch لبناء نظام استشاري بسيط للطقس. يجب أن يقوم برنامجك بما يلي:

  1. تعريف enum باسم WeatherCondition مع الثوابت التالية بهذا الترتيب الدقيق:
    • SUNNY
    • CLOUDY
    • RAINY
    • STORMY
    • SNOWY
  2. كتابة دالة باسم getWeatherAdvice تقوم بما يلي:
    • تستقبل معاملًا من نوع enum WeatherCondition باسم weather
    • لا تعيد أي قيمة (void)
    • تستخدم جملة switch لطباعة نصيحة خاصة بالطقس بناءً على الحالة:
      • لحالة SUNNY: اطبع Perfect day for outdoor activities!
      • لحالة CLOUDY: اطبع Good day for a walk, no sun protection needed.
      • لحالة RAINY: اطبع Don't forget your umbrella!
      • لحالة STORMY: اطبع Stay indoors and avoid travel.
      • لحالة SNOWY: اطبع Drive carefully and dress warmly.
  3. كتابة دالة باسم getActivitySuggestion تقوم بما يلي:
    • تستقبل معاملًا من نوع enum WeatherCondition باسم weather
    • لا تعيد أي قيمة (void)
    • تستخدم جملة switch لاقتراح أنشطة بناءً على الطقس:
      • لحالة SUNNY: اطبع Suggested activity: Beach or hiking
      • لحالة CLOUDY: اطبع Suggested activity: Photography or gardening
      • لحالة RAINY: اطبع Suggested activity: Reading or indoor games
      • لحالة STORMY: اطبع Suggested activity: Movie marathon
      • لحالة SNOWY: اطبع Suggested activity: Skiing or hot cocoa
  4. في الدالة الرئيسية (main):
    • الإعلان عن متغير من نوع enum WeatherCondition باسم currentWeather
    • قراءة عدد صحيح من المدخلات يمثل حالة الطقس (0، 1، 2، 3، أو 4)
    • تعيين قيمة التعداد المقابلة لـ currentWeather بناءً على المدخلات
    • طباعة حالة الطقس الحالية بهذا التنسيق الدقيق: Current weather: [numeric_value]
    • استدعاء الدالة getWeatherAdvice مع currentWeather
    • استدعاء الدالة getActivitySuggestion مع currentWeather

يوضح هذا التحدي قوة الجمع بين التعدادات (enums) وجمل switch لإنشاء كود مقروء وسهل الصيانة. بدلاً من استخدام حالات رقمية محيرة في جمل switch الخاصة بك، ستستخدم ثوابت تعداد ذات معنى تعبر بوضوح عن منطق البرنامج. تصبح جملة switch توثيقًا ذاتيًا، مما يسهل فهم ما تمثله كل حالة وتعديل السلوك حسب الحاجة.

ورقة مرجعية

استخدام قيم enum مع جمل switch ينشئ منطق تدفق تحكم قابل للقراءة والصيانة:

switch (day) {
    case MONDAY:
    case TUESDAY:
    case WEDNESDAY:
    case THURSDAY:
    case FRIDAY:
        printf("It's a weekday\n");
        break;
    case SATURDAY:
    case SUNDAY:
        printf("It's a weekend\n");
        break;
}

هذا النهج يجعل الكود يوثق نفسه بنفسه باستخدام أسماء ذات معنى بدلاً من الأرقام الغامضة مثل case 0: أو case 5:. يساعد المترجم (compiler) في اكتشاف الأخطاء من خلال إنشاء أخطاء ترجمة لثوابت enum المكتوبة بشكل خاطئ بدلاً من الأخطاء البرمجية الصامتة.

جرّب بنفسك

#include <stdio.h>

// TODO: قم بتعريف التعداد WeatherCondition هنا

// TODO: قم بتنفيذ الدالة getWeatherAdvice هنا

// TODO: قم بتنفيذ الدالة getActivitySuggestion هنا

int main() {
    // قراءة المدخلات
    int weatherInput;
    scanf("%d", &weatherInput);
    
    // TODO: قم بالتصريح عن المتغير currentWeather وتعيين قيمة التعداد بناءً على المدخلات
    
    // TODO: طباعة حالة الطقس الحالية بالتنسيق "Current weather: [numeric_value]"
    
    // TODO: استدعاء الدالة getWeatherAdvice
    
    // TODO: استدعاء الدالة getActivitySuggestion
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow