شمارش (Enumeration)

Enumeration یا شمارش راهی برای تعریف داده هایی است که می توانند مقادیر محدودی که شما از قبل تعریف کرده اید را بپذیرند. به عنوان مثال شما می خواهید یک متغیر تعریف کنید که فقط مقادیر جهت (جغرافیایی)مانند east، west، north و south را در خود ذخیره کند. ابتدا یک enumeration تعریف می کنید و برای آن یک اسم انتخاب کرده و بعد از آن تمام مقادیر ممکن که می توانند در داخل بدنه آن قرار بگیرند تعریف می کنید. به نحوه تعریف یک enumeration توجه کنید:

enum enumName
{
   value1,
   value2,
   value3,
   .
   .
   .
   valueN
};

ابتدا کلمه کلیدی enum و سپس نام آن را به کار می بریم. در ++C برای نامگذاری enumeration از روش پاسکال استفاده کنید. در بدنه enum مقادیری وجود دارند که برای هر کدام یک نام در نظر گرفته شده است. به یک مثال توجه کنید :

enum Direction
{
   North,
   East,
   South,
   West
};

در حالت پیشفرض مقادیری که یک enumeration می تواند ذخیره کند از نوع int هستند. به عنوان مثال مقدار پیشفرض north صفر و مقدار بقیه مقادیر یک واحد بیشتر از مقدار قبلی خودشان است. بنابراین مقدار east برابر 1، مقدار south برابر 2 و مقدار west برابر 3 است. می توانید این مقادیر پیشفرض را به دلخواه تغییر دهید، مانند:

enum Direction
{
   North = 3,
   East = 5,
   South = 7,
   West = 9
};

اگر به عنوان مثال هیچ مقداری به یک عنصر اختصاص ندهید آن عنصر به صورت خودکار مقدار می کیرد.

enum Direction
{
   North = 3,
   East = 5,
   South,
   West
};

در مثال بالا مشاهده می کنید که ما هیچ مقداری به south در نظر نگرفته ایم بنابر این به صورت خودکار یک واحد بیشتر از east یعنی 6 و به west یک واحد بیشتر از south یعنی 7 اختصاص داده می شود. همچنین می توان مقادیر یکسانی برای عناصر enumeration در نظر گرفت. مثال :

enum Direction
{
   North = 3,
   East,
   South = North,
   West
};

می توانید مقادیر بالا را حدس بزنید؟ مقادیر north، east، south، west به ترتیب 3، 4، 3، 4 است. وقتی مقدار 3 را به north می دهیم مقدار east برابر 4 می شود. سپس وقتی مقدار southرا برابر 3 قرار دهیم به صورت اتوماتیک مقدار west برابر 4 می شود. به نحوه استفاده از enumeration در یک برنامه ++C توجه کنید :

   1: #include <iostream>
   2: using namespace std;
   3: 
   4: enum Direction
   5: {
   6:     North = 1,
   7:     East,
   8:     South,
   9:     West
  10: };
  11: 
  12: int main()
  13: {
  14:     Direction myDirection; 
  15:     myDirection = Direction::North;
  16: 
  17:     cout << "Direction: " << myDirection;
  18: }
Direction: 1

ابتدا enumeration را در خطوط 10-4 تعریف می کنیم. توجه کنید که enumeration را خارج از کلاس قرار داده ایم. این کار باعث می شود که enumeration در سراسر برنامه در دسترس باشد. می توان enumeration را در داخل کلاس هم تعریف کرد ولی در این صورت فقط در داخل کلاس قابل دسترس است.

enum Direction
{
    //Code omitted
};

int main()
{
    //Code omitted 
}

برنامه را ادامه می دهیم. در داخل بدنه enumeration نام چهار جهت جغرافیایی وجود دارد که هر یک از آنها با 1 تا 4 مقدار دهی شده اند. در خط 15 یک متغیر تعریف شده است که مقدار یک جهت را در خود ذخیره می کند. نحوه تعریف آن به صورت زیر است :

enumType variableName;

در اینجا enumType نوع داده شمارشی (مثلا Direction یا مسیر) می باشد و variableName نیز نامی است که برای آن انتخاب کرده ایم که در مثال قبل myDirection است. سپس یک مقدار به متغیر myDirection اختصاص می دهیم (خط 15). برای اختصاص یک مقدار به صورت زیر عمل می کنیم :

variable = enumType::value;

ابتدا نوع Enumeration سپس علامت دو نقطه (::) و بعد مقدار آن (مثلا North) را می نویسیم. می توان یک متغیر را فورا، به روش زیر مقدار دهی کرد :

Direction myDirection = Direction::North;

حال در خط 17 با استفاده از cout مقدار myDirection را چاپ می کنیم. تصور کنید که اگر enumeration نبود شما مجبور بودید که به جای کلمات اعداد را حفظ کنید چون مقادیر enumeration در واقع اعدادی هستند که با نام مستعار توسط شما یا هر کس دیگر تعریف می شوند.