يُعرف التعداد في لغة C أيضًا بالنوع المذكور. وهو نوع بيانات محدد من قبل المستخدم يتكون من قيم عددية، ويوفر أسماء ذات معنى لهذه القيم. استخدام التعداد في لغة C يجعل البرنامج سهل الفهم والصيانة. يتم تعريف التعداد باستخدام الكلمة الأساسية التعداد.
فيما يلي طريقة تعريف التعداد في لغة C:
enum flag{integer_const1, integer_const2,.....integter_constN};
في الإعلان أعلاه، قمنا بتعريف التعداد المسمى كعلامة تحتوي على ثوابت عددية 'N'. القيمة الافتراضية لـ integer_const1 هي 0، وinteger_const2 هي 1، وهكذا. يمكننا أيضًا تغيير القيمة الافتراضية للثوابت الصحيحة في وقت الإعلان.
على سبيل المثال:
enum fruits{mango, apple, strawberry, papaya};
القيمة الافتراضية للمانجو هي 0، والتفاح هو 1، والفراولة هي 2، والبابايا هي 3. إذا أردنا تغيير هذه القيم الافتراضية، فيمكننا القيام بما هو موضح أدناه:
enum fruits{ mango=2, apple=1, strawberry=5, papaya=7, };
إعلان النوع المعدود
كما نعلم أنه في لغة C، نحتاج إلى الإعلان عن متغير من نوع محدد مسبقًا مثل int، وfloat، وchar، وما إلى ذلك. وبالمثل، يمكننا الإعلان عن متغير من نوع بيانات محدد من قبل المستخدم، مثل enum. دعونا نرى كيف يمكننا أن نعلن عن المتغير من نوع التعداد.
لنفترض أننا أنشأنا تعداد حالة النوع كما هو موضح أدناه:
enum status{false,true};
الآن نقوم بإنشاء متغير نوع الحالة:
enum status s; // creating a variable of the status type.
في البيان أعلاه، قمنا بتعريف المتغير 's' لحالة النوع.
لإنشاء متغير، يمكن كتابة العبارتين أعلاه على النحو التالي:
enum status{false,true} s;
في هذه الحالة، ستكون القيمة الافتراضية لـ false تساوي 0، وقيمة true ستكون 1.
لنقم بإنشاء برنامج بسيط للتعداد.
#include enum weekdays{Sunday=1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; int main() { enum weekdays w; // variable declaration of weekdays type w=Monday; // assigning value of Monday to w. printf('The value of w is %d',w); return 0; }
في الكود أعلاه، قمنا بإنشاء نوع تعداد يسمى أيام الأسبوع، ويحتوي على اسم جميع الأيام السبعة. لقد قمنا بتعيين قيمة واحدة ليوم الأحد، وسيتم إعطاء جميع الأسماء الأخرى قيمة كالقيمة السابقة بالإضافة إلى واحد.
انتاج |
دعونا نعرض مثالا آخر لفهم التعداد بشكل أكثر وضوحا.
#include enum months{jan=1, feb, march, april, may, june, july, august, september, october, november, december}; int main() { // printing the values of months for(int i=jan;i<=december;i++) { printf('%d, ',i); } return 0; < pre> <p>In the above code, we have created a type of enum named as months which consists of all the names of months. We have assigned a '1' value, and all the other months will be given a value as the previous one plus one. Inside the main() method, we have defined a for loop in which we initialize the 'i' variable by jan, and this loop will iterate till December.</p> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-2.webp" alt="Enum in C"> <h3>Why do we use enum?</h3> <p>The enum is used when we want our variable to have only a set of values. For example, we create a direction variable. As we know that four directions exist (North, South, East, West), so this direction variable will have four possible values. But the variable can hold only one value at a time. If we try to provide some different value to this variable, then it will throw the compilation error.</p> <p>The enum is also used in a switch case statement in which we pass the enum variable in a switch parenthesis. It ensures that the value of the case block should be defined in an enum.</p> <p> <strong>Let's see how we can use an enum in a switch case statement.</strong> </p> <pre> #include enum days{sunday=1, monday, tuesday, wednesday, thursday, friday, saturday}; int main() { enum days d; d=monday; switch(d) { case sunday: printf('Today is sunday'); break; case monday: printf('Today is monday'); break; case tuesday: printf('Today is tuesday'); break; case wednesday: printf('Today is wednesday'); break; case thursday: printf('Today is thursday'); break; case friday: printf('Today is friday'); break; case saturday: printf('Today is saturday'); break; } return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-3.webp" alt="Enum in C"> <p> <strong>Some important points related to enum</strong> </p> <ul> <li>The enum names available in an enum type can have the same value. Let's look at the example.</li> </ul> <pre> #include int main(void) { enum fruits{mango = 1, strawberry=0, apple=1}; printf('The value of mango is %d', mango); printf(' The value of apple is %d', apple); return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-4.webp" alt="Enum in C"> <ul> <li>If we do not provide any value to the enum names, then the compiler will automatically assign the default values to the enum names starting from 0.</li> <li>We can also provide the values to the enum name in any order, and the unassigned names will get the default value as the previous one plus one.</li> <li>The values assigned to the enum names must be integral constant, i.e., it should not be of other types such string, float, etc.</li> <li>All the enum names must be unique in their scope, i.e., if we define two enum having same scope, then these two enums should have different enum names otherwise compiler will throw an error.</li> </ul> <p> <strong>Let's understand this scenario through an example.</strong> </p> <pre> #include enum status{success, fail}; enum boolen{fail,pass}; int main(void) { printf('The value of success is %d', success); return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-5.webp" alt="Enum in C"> <ul> <li>In enumeration, we can define an enumerated data type without the name also.</li> </ul> <pre> #include enum {success, fail} status; int main(void) { status=success; printf('The value of status is %d', status); return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-6.webp" alt="Enum in C"> <h3>Enum vs. Macro in C</h3> <ul> <li>Macro can also be used to define the name constants, but in case of an enum, all the name constants can be grouped together in a single statement. <br> For example, <br> # define pass 0; <br> # define success 1; <br> The above two statements can be written in a single statement by using the enum type. <br> enum status{pass, success};</li> <li>The enum type follows the scope rules while macro does not follow the scope rules.</li> <li>In Enum, if we do not assign the values to the enum names, then the compiler will automatically assign the default value to the enum names. But, in the case of macro, the values need to be explicitly assigned.</li> <li>The type of enum in C is an integer, but the type of macro can be of any type.</li> </ul> <hr></=december;i++)>
انتاج |
بعض النقاط المهمة المتعلقة بالتعداد
- يمكن أن يكون لأسماء التعداد المتوفرة في نوع التعداد نفس القيمة. دعونا ننظر إلى المثال.
#include int main(void) { enum fruits{mango = 1, strawberry=0, apple=1}; printf('The value of mango is %d', mango); printf(' The value of apple is %d', apple); return 0; }
انتاج |
- إذا لم نقدم أي قيمة لأسماء التعداد، فسيقوم المترجم تلقائيًا بتعيين القيم الافتراضية لأسماء التعداد بدءًا من 0.
- يمكننا أيضًا توفير القيم لاسم التعداد بأي ترتيب، وستحصل الأسماء غير المعينة على القيمة الافتراضية كالقيمة السابقة زائد واحد.
- يجب أن تكون القيم المخصصة لأسماء التعداد ثابتة لا يتجزأ، أي لا ينبغي أن تكون من أنواع أخرى مثل السلسلة، العائمة، وما إلى ذلك.
- يجب أن تكون جميع أسماء التعدادات فريدة في نطاقها، أي إذا قمنا بتحديد تعدادين لهما نفس النطاق، فيجب أن يكون لهذين التعدادين اسم تعداد مختلف وإلا فسيقوم المترجم بإلقاء خطأ.
دعونا نفهم هذا السيناريو من خلال مثال.
#include enum status{success, fail}; enum boolen{fail,pass}; int main(void) { printf('The value of success is %d', success); return 0; }
انتاج |
- في التعداد، يمكننا تحديد نوع بيانات تعدادية بدون الاسم أيضًا.
#include enum {success, fail} status; int main(void) { status=success; printf('The value of status is %d', status); return 0; }
انتاج |
التعداد مقابل الماكرو في C
- يمكن أيضًا استخدام الماكرو لتحديد ثوابت الاسم، ولكن في حالة التعداد، يمكن تجميع كافة ثوابت الاسم معًا في عبارة واحدة.
على سبيل المثال،
# تحديد التمريرة 0؛
# تعريف النجاح 1؛
يمكن كتابة العبارتين أعلاه في عبارة واحدة باستخدام نوع التعداد.
حالة التعداد {تمرير، نجاح}؛ - يتبع نوع التعداد قواعد النطاق بينما لا يتبع الماكرو قواعد النطاق.
- في Enum، إذا لم نقم بتعيين القيم لأسماء التعداد، فسيقوم المترجم تلقائيًا بتعيين القيمة الافتراضية لأسماء التعداد. ولكن، في حالة الماكرو، يجب تعيين القيم بشكل صريح.
- نوع التعداد في لغة C هو عدد صحيح، ولكن يمكن أن يكون نوع الماكرو من أي نوع.
=december;i++)>