استخدام 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).
التحدي
سهلقم بإنشاء برنامج بلغة C يستخدم التعداد (enum) مع جملة switch لبناء نظام استشاري بسيط للطقس. يجب أن يقوم برنامجك بما يلي:
- تعريف
enumباسمWeatherConditionمع الثوابت التالية بهذا الترتيب الدقيق:SUNNYCLOUDYRAINYSTORMYSNOWY
- كتابة دالة باسم
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.
- لحالة
- تستقبل معاملًا من نوع
- كتابة دالة باسم
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
- لحالة
- تستقبل معاملًا من نوع
- في الدالة الرئيسية (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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف7الهياكل (structs)
ما هو الـ Struct؟الإعلان عن Structإنشاء متغيرات Structالوصول إلى أعضاء الـ Structتهيئة الـ Structsمراجعة: Struct بيانات الطالب10Enums و Typedef
enum للثوابت المسماةالتصريح عن Enums واستخدامهااستخدام Enums في جمل Switchاستخدام typedef لأسماء مستعارة للأنواعاستخدام typedef مع Structsمراجعة: تمارين على Typedef و Enum2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية