enum چیست و چه کاربردی دارد؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

enum چیست و چه کاربردی دارد؟

0 امتیاز

با سلام لطفا توضیح بدین که enum اصلا چی هست و به چه دردی میخورد؟ ممنون.

سوال شده اسفند 22, 1392  بوسیله ی daniyaltjm (امتیاز 840)   47 88 103
ویرایش شده اسفند 22, 1392 بوسیله ی daniyaltjm
c# مگه union هم داره ؟
ببخشید منظورم enum بود.

2 پاسخ

+2 امتیاز
 
بهترین پاسخ

سلام.

ما یکسری نوع های داده ای پیش فرض داریم مثل int و string و ... که خیلی جاها ازشون استفاده می کنیم و کارمون رو هم راه میندازه. ولی یه جاهایی برای خوانایی و درک بهتر نیاز به نوع هایی داریم که از قبل تعریف نشده هستن. مثلا فرض کنید می خوایم برای جنسیت افراد ( مرد و زن) یک نوع داده ای تعریف کنیم. یا فرض بگیرید می خوایم فصل های سال (بهار، تابستون، پاییز و زمستون) رو به کاربر نمایش بدیم. یا می تونید برای ماه های سال یک enum تعریف کنید. این enum ها بر پایه ساختار شمارشی ساخته میشن و بصورت پیش فرض ایندکس اولین عضو برابر با 0 خواهد بود و عنصر بعدی 1 و .... مثلا برای ما ه های سال می تونیم یه همچین موردی رو داشته باشیم :

public enum month
        {
            فروردین,
            اردیبهشت,
            خرداد,
            تیر,
            مرداد,
            شهریور,
            مهر,
            آبان,
            آذر,
            دی,
            بهمن,
            اسفند
        }

برای استفاده از اون هم کافیه نام enum رو بنویسید تا به اعضای اون دسترسی داشته باشید :

مثلا    فروردین.month

همچنین برای دسترسی به ایندکس اون عضو هم می تونید از cast کردن استفاده کنید :    فروردین.int)month)

پاسخ داده شده اسفند 22, 1392 بوسیله ی veniz2008 (امتیاز 2,083)   1 5 21
انتخاب شد اسفند 23, 1392 بوسیله ی daniyaltjm
خوب این کا رو با آرایه هم میشه انجام داد!! دقیقا به چه دردی میخوره؟
نوع enum دارای تفاوت هایی هست با نوع آرایه. در آرایه ایندکس ها از 0 شروع میشن درحالیکه بنابر نیازتون می تونید به هر عضو از enum یه شماره خاص اختصاص بدید و این شماره ها می تونن پشت سر هم نباشن.
آرایه ها ایندکس از نوع int دارند ولی enum رو میتونید هر نوع عددی (byte، long و ...) قرار بدید.
یعنی برای شمارندشون میتونیم از هر نوع عددی استفاده کنیم!!!
بله.
شما می تونید از انواع داده ای زیر استفاده کنید :
int، unit, long,ulong, byte, sbyte, short, ushort
بصورت پیش فرض نوع داده ای برابر با int خواهد بود که نوع int برابر با 32 بیت از حافظه برای شما اشغال میکنه که در صورتی که اگر چنین نیازی ندارید می تونید از نوع های با محدوده کوچکتر استفاده کنید (مثلا نوع byte میتونید از 0 تا 255 رو مقداردهی کنید):
public enum month : byte
}
تعریف اعضای مورد نظر //
{
یعنی در واقع مسل همون Struct و یا Dictionary میمونه که این داده ها فیلدهای این ساختمان هستن.
همه این ها از یه جهاتی شبیه به هم و از یه جهاتی با هم متفاوت هستن.
در دیکشنری شما باید حتما دو مقدار وارد کنید (Key و Value) ولی در اینجا چنین اجباری وجود نداره. همچنین دو Key یکسان نمی تونید استفاده کنید ولی در اینجا می تونید به دو عضو متفاوت از enum یک ایندکس یکسان نسبت بدید (برای گروه بندی کردن میتونه مناسب باشه).
0 امتیاز
نوع Enumerated (Enumeration) یک نوع داده تعریف شده توسط کاربر است که می توان مقادیر محدودی را به آن اختصاص داد. این مقادیر در زمان اعلام نوع شمارش شده توسط برنامه نویس تعریف می شوند.
 
اگر مقدار float را در یک مقدار کاراکتر اختصاص دهیم، کامپایلر یک خطا ایجاد می کند. به همین ترتیب اگر بخواهیم مقدار دیگری را به انواع داده های شمارش شده اختصاص دهیم، کامپایلر یک خطا ایجاد می کند. انواع مقادیر شمارشگر به عنوان شمارشگر نیز شناخته می شوند. همچنین با صفر مشابه آرایه اختصاص داده می شود. همچنین می تواند با دستورات سوئیچ استفاده شود.
به عنوان مثال: اگر یک متغیر جنسیت با مقدار مرد یا زن ایجاد شود. اگر مقدار دیگری غیر از نر یا ماده به آن اختصاص داده شود، مناسب نیست. در این شرایط، می توان نوع برشماری شده را که در آن فقط مقادیر مذکر و مؤنث اختصاص داده می شود، اعلام کرد.
enum enumerated-type-name{value1, value2, value3…..valueN};
کلمه کلیدی enum برای اعلان انواع شمارش شده بعد از نوشتن نام نوع شمارش شده استفاده می شود و در زیر براکت ها مقادیر ممکن تعریف می شود. پس از تعریف متغیرهای نوع Enumerated ایجاد می شود. می توان آن را در دو نوع ایجاد کرد:
 
می توان آن را در حین اعلان انواع شمارش شده اعلام کرد، فقط نام متغیر را قبل از نقطه ویرگول اضافه کنید. یا،
علاوه بر این، می توانیم متغیرهای نوع برشماری شده را همانند متغیرهای عادی ایجاد کنیم.
 
به طور پیش فرض، مقدار کد شروع اولین عنصر enum 0 است (مانند مورد آرایه). اما می توان آن را به صراحت تغییر داد.
 
 enum enumerated-type-name{value1=1, value2, value3};

 

مقادیر متوالی enum مجموعه بعدی مقادیر را خواهند داشت.

enum first_enum{value1=1, value2=10, value3};

In this case, 
first_enum e;
e=value3;
cout<<e;

Output:
11

یک مثال دیگر:

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    // Defining enum Gender
    enum Gender { Male, Female };
 
    // Creating Gender type variable
    Gender gender = Male;
 
    switch (gender)
    {
    case Male:
        cout << "Gender is Male";
        break;
    case Female:
        cout << "Gender is Female";
        break;
    default:
        cout << "Value can be Male or Female";
    }
    return 0;
}

اما این نوع از تعریف enum مشکلاتی هم ایجاد می کنه که توجه شما را به مثال های زیر جلب می کنم:

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    // Defining enum1 Gender
    enum Gender { Male,
                  Female };
 
    // Defining enum2 Gender2 with same values
    // This will throw error
    enum Gender2 { Male,
                   Female };
 
    // Creating Gender type variable
    Gender gender = Male;
    Gender2 gender2 = Female;
 
    cout << gender << endl
         << gender2;
 
    return 0;
}

خطای کامپایل :

prog.cpp:13:20: error: redeclaration of 'Male'
     enum Gender2 { Male,
                    ^
prog.cpp:8:19: note: previous declaration 'main()::Gender Male'
     enum Gender { Male,
                   ^
prog.cpp:14:20: error: redeclaration of 'Female'
                    Female };
                    ^
prog.cpp:9:19: note: previous declaration 'main()::Gender Female'
                   Female };
                   ^
prog.cpp:18:23: error: cannot convert 'main()::Gender' 
to 'main()::Gender2' in initialization
     Gender2 gender2 = Female;
                       ^

که برای این مشکل در c++11 اومدن و enum class(که به آن‌ها scoped enumerations نیز گفته می‌شود) را معرفی کردن که مشکلات بالا را نداشته باشیم.

 Class enum اجازه تبدیل ضمنی به int را نمی دهد و همچنین شمارشگرها را از enumerations مختلف مقایسه نمی کند.
برای تعریف کلاس enum از کلمه کلیدی class بعد از کلمه کلیدی enum استفاده می کنیم.
مثال :
#include <iostream>
using namespace std;
 
int main()
{
 
    enum class Color { Red,
                       Green,
                       Blue };
    enum class Color2 { Red,
                        Black,
                        White };
    enum class People { Good,
                        Bad };
 
    // An enum value can now be used
    // to create variables
    int Green = 10;
 
    // Instantiating the Enum Class
    Color x = Color::Green;
 
    // Comparison now is completely type-safe
    if (x == Color::Red)
        cout << "It's Red\n";
    else
        cout << "It's not Red\n";
 
    People p = People::Good;
 
    if (p == People::Bad)
        cout << "Bad people\n";
    else
        cout << "Good people\n";
 
    // gives an error
    // if(x == p)
    // cout<<"red is equal to good";
 
    // won't work as there is no
    // implicit conversion to int
    // cout<< x;
 
    cout << int(x);
 
    return 0;
}

خروجی:

It's not Red
Good people
1

در ضمن enum class می تونن هر نوع داده ی عددی همانند char, short or unsigned int همه داشته باشند.

که به صورت زیر می توان از آن استفاده کرد:
#include <iostream>
using namespace std;
enum rainbow{
    violet,
    indigo,
    blue,
    green,yellow,orange,red
}colors;
enum class eyecolor:char{
    blue,green,brown
}eye;
int main() {
 
    cout<<"size of enum rainbow variable: "<<sizeof(colors)<<endl;
    cout<<"size of enum class eyecolor variable:"<<sizeof(eye)<<endl;
    return 0;
}

خروجی:

size of enum rainbow variable: 4
size of enum class eyecolor variable:1

 

 

پاسخ داده شده شهریور 4, 1401 بوسیله ی copilot (امتیاز 1,549)   1 3 6
ویرایش شده شهریور 4, 1401 بوسیله ی copilot
...