enum للثوابت المسماة
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 55 من 63.
عند كتابة برامج بلغة C، غالباً ما تحتاج إلى التعامل مع مجموعات من القيم الثابتة المرتبطة ببعضها البعض. على سبيل المثال، قد تحتاج إلى تمثيل أيام الأسبوع، أو شهور السنة، أو حالات مختلفة في البرنامج. بدلاً من استخدام أرقام مجردة مثل 0، 1، 2، يمكنك استخدام enum لإنشاء أسماء ذات معنى لهذه الثوابت.
يتيح لك النوع المعدد، أو enum، تعريف مجموعة من الثوابت الصحيحة المسماة. وهذا يجعل الكود الخاص بك أكثر قابلية للقراءة وأسهل في الصيانة. إليك الصيغة الأساسية:
enum DayOfWeek {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};بشكل افتراضي، يحصل الاسم الأول على القيمة 0، ويحصل الثاني على 1، وهكذا. لذا فإن MONDAY تساوي 0، و TUESDAY تساوي 1، و SUNDAY تساوي 6. هذا النهج أوضح بكثير من تذكر أن اليوم 0 يعني الاثنين أو اليوم 6 يعني الأحد.
استخدام enum يجعل الكود الخاص بك ذاتي التوثيق ويساعد في منع الأخطاء التي يمكن أن تحدث عند استخدام الأرقام السحرية (magic numbers) في جميع أنحاء برنامجك.
يمكنك التصريح عن متغيرات من نوع enum وتعيين قيم enum لها:
enum DayOfWeek today;
today = MONDAY; // تعين 0 لـ todayالتحدي
سهلقم بإنشاء برنامج بلغة C يحدد enum لألوان إشارات المرور ويوضح كيفية استخدامه. يجب أن يقوم برنامجك بما يلي:
- تعريف
enumباسمTrafficLightمع الثوابت التالية بهذا الترتيب تماماً:REDYELLOWGREEN
- في الدالة الرئيسية (main function):
- الإعلان عن متغير من نوع
enum TrafficLightباسمcurrentLight - قراءة عدد صحيح من المدخلات يمثل حالة إشارة المرور (0، 1، أو 2)
- تعيين قيمة الـ enum المقابلة لـ
currentLightبناءً على المدخلات:- إذا كانت المدخلات 0، قم بتعيين
RED - إذا كانت المدخلات 1، قم بتعيين
YELLOW - إذا كانت المدخلات 2، قم بتعيين
GREEN
- إذا كانت المدخلات 0، قم بتعيين
- طباعة حالة الضوء الحالية بهذا التنسيق تماماً:
Current light: [enum_name] - طباعة القيمة الرقمية للضوء الحالي بهذا التنسيق تماماً:
Numeric value: [number] - تحديد وطباعة الإجراء بناءً على الضوء الحالي:
- إذا كان
RED: اطبعAction: Stop - إذا كان
YELLOW: اطبعAction: Caution - إذا كان
GREEN: اطبعAction: Go
- إذا كان
- حساب وطباعة الضوء التالي في التسلسل:
- إذا كان الضوء الحالي
RED(0)، فالتالي هوGREEN(2) - إذا كان الضوء الحالي
YELLOW(1)، فالتالي هوRED(0) - إذا كان الضوء الحالي
GREEN(2)، فالتالي هوYELLOW(1)
- إذا كان الضوء الحالي
- طباعة الضوء التالي بهذا التنسيق تماماً:
Next light: [enum_name]
- الإعلان عن متغير من نوع
يوضح هذا التحدي كيف تجعل ثوابت enum الكود أكثر قابلية للقراءة من استخدام الأرقام الخام. بدلاً من تذكر أن 0 يعني الأحمر، و 1 يعني الأصفر، و 2 يعني الأخضر، يمكنك استخدام أسماء ذات معنى مثل RED و YELLOW و GREEN. ستتدرب على تعريف enum، واستخدام ثوابت enum في التعيينات والمقارنات، والوصول إلى قيم الأعداد الصحيحة الأساسية لثوابت enum.
ورقة مرجعية
يسمح لك الـ enum بتعريف مجموعة من الثوابت الصحيحة المسماة، مما يجعل الكود أكثر قابلية للقراءة من استخدام الأرقام الخام:
enum DayOfWeek {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};بشكل افتراضي، يأخذ الاسم الأول القيمة 0، والثاني القيمة 1، وهكذا. لذا فإن MONDAY يساوي 0، و TUESDAY يساوي 1، إلخ.
يمكنك التصريح عن متغيرات من نوع enum وتعيين قيم enum لها:
enum DayOfWeek today;
today = MONDAY; // يسند 0 إلى todayجرّب بنفسك
#include <stdio.h>
// TODO: قم بتعريف التعداد TrafficLight هنا
int main() {
// قراءة المدخلات
int input;
scanf("%d", &input);
// TODO: قم بالتصريح عن المتغير currentLight وتعيين قيمة التعداد بناءً على المدخلات
// TODO: طباعة حالة الضوء الحالية
// TODO: طباعة القيمة الرقمية
// TODO: طباعة الإجراء بناءً على الضوء الحالي
// TODO: حساب وطباعة الضوء التالي
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية