فهرست (نوع داده انتزاعی)

در علوم رایانه، یک فهرست یا لیست یا دنباله، یک نوع دادهٔ انتزاعی است که نمایانگر تعداد شمارش‌پذیری از مقادیر مرتب است، به‌طوری که یک مقدار ممکن است بیش از یک بار مشاهده شود. یک فهرست نمایش کامپیوتری از مفهوم دنباله‌های متناهی در ریاضیات است.Abelson, Harold; Sussman, Gerald Jay (1996). Structure and Interpretation of Computer Programs. MIT Press. مفهوم نامتناهی قابل قیاس با فهرست، جریان (جریان داده) است. فهرست‌ها نمونهٔ ابتدایی از مخزن‌ها (به انگلیسی: Container) به‌شمار می‌رود، به این جهت که دربرگیرندهٔ دیگر مقادیر هستند. اگر مقدار مشخصی در فهرست بیش از یک بار رخ بدهد، هر تکرار به صورت مقدار مجزایی لحاظ می‌شود. عنوان فهرست برای چندین داده ساختار واقعی (غیرانتزاعی) که مفهوم انتزاعیِ فهرست را پیاده‌سازی کره اند، بکار گرفته شده‌است؛ مثلاً یک پیاده‌سازی معروف لیست‌های پیوندی است.

بسیاری از زبان‌های برنامه‌نویسی نوع دادهٔ فهرست را در کتابخانه خود دارند و استفاده از آن قوانین، دستورها و عملگرهای بخصوصی دارند.

در برنامه‌نویسی کامپیوتر یک داده انتزاعی(enumerated type)یک نوع (data type)هست که شامل می‌شود یک مجموعه ای از مقادیر که اعضا یا عناصر یا شمارنده نامیده می‌شوند. اسامی شمارنده ها(enumerators) معمولاً شناسه ای هستند که مثل ثوابت در زبان برنامه‌نویسی عمل می‌کنند. داده انتزاعی می‌تواند به عنوان یک برچسب غیرقابل استفاده در برنامه دیده شوند.

متغیری که به عنوان یک نوع شمرده شده اعلام شده‌است می‌تواند هر یک از شمارشگرها را به عنوان یک مقدار اختصاص بدهد. به عبارت دیگر، یک نوع متغیر شمرده شده دارای مقادیری است که با یکدیگر متفاوت هستند، و قابل مقایسه و اختصاص هستند، اما توسط برنامه‌نویس مشخص نشده‌است که هرگونه نمایش خاص در حافظه کامپیوتر را دارا باشند.

به عنوان مثال، چهار لباس موجود در یک کارت ویزیت ممکن است چهار فهرست کننده به نام‌های Club , Diamond , Heart و Spade باشد که متعلق به یک نوع ذکر شده با نام کت و شلوار است. اگر متغیر V با توجه به نوع داده خود متناسب باشد، می‌توان هریک از آن چهار مقدار را به آن اختصاص داد.

هرچند شمارنده‌های معمولاً مجزا هستند. برخی از زبانها ممکن است اجازه دهند که شمارنده دو بار در اظهارنامه نوع ثبت شود.

نام شمارنده‌ها به هیچ وجه لازم نیست از نظر معنایی کامل یا سازگار باشد. به عنوان مثال، یک نوع (enumerated) به نام color ممکن است تعریف شده باشد که شامل شمارنده‌های red , green , zebra , lost و bacon است.

در برخی از زبانها، اعلامیه از enumerated type نیز به‌طور عمدی ترتیب سفارش اعضای آن را تعریف می‌کند. در بعضی دیگر، ثبت کنندگان بدون هماهنگی هستند. در برخی دیگر، یک سفارش ضمنی از کامپایلر بوجود می‌آید که به‌طور مشخص نمایندگان شمارنده را به عنوان عدد صحیح نشان می‌دهد.

ممکن است برخی از enumerator types در زبان ساخته شود. به عنوان مثال، boolean types اغلب شمارنده ای از پیش تعریف شده‌ای از مقادیر نادرست و درست است. بسیاری از زبان‌ها از جمله c++,C به کاربران این امکان را می‌دهند که انواع جدید از enumerated type را ذکر کنند.

متغیرها و مقادیر از نوع enumerated type معمولاً به عنوان رشته‌های از نوع Bit با طول پابت استفاده می‌شوند. و اغلب در یک قالب و سایز سازگار با integer type هستند. برخی از زبانها، به ویژه سیستم زبانهای برنامه‌نویسی، به کاربر این امکان را می‌دهند که ترکیب بیت را برای هر مترجم تعیین کند.

بنیاد و پایه (Rationale)

برخی از زبانهای برنامه‌نویسی اولیه در ابتدا enumerated type نداشتند. اگر یک برنامه‌نویس می بخواهد یک متغیر، به عنوان مثال myColor، مقدار قرمز داشته باشد، متغیر را قرمز اعلام می‌کند و مقداری دلخواه به آن اختصاص می‌دهد و معمولاً یک integer ثابت هست. سپس متغیر قرمز به myColor اختصاص می‌یابد. سایر تکنیک‌ها مقادیر دلخواه را به رشته‌های حاوی نام شمارنده‌ها (enumerators) اختصاص می‌دهند. این مقادیر دلخواه بعضی اوقات به عنوان اعداد جادویی شناخته می‌شوند زیرا اغلب توضیحی در مورد چگونگی به دست آوردن اعداد یا اینکه آیا ارزشهای واقعی آنها معنی دار است یا خیر، وجود ندارد. از این رو، شماره‌های جادویی می‌توانند (source code) را برای درک و حفظ دیگران سخت‌تر کنند. به عبارت دیگر (enumerated type)کد هارا خود مستندسازی می‌کنند. بسته به زبان، کامپایلر می‌تواند مقادیر پیش فرض را به‌طور خودکار به (enumerators) اختصاص دهد و بدین ترتیب جزئیات غیرضروری از برنامه‌نویس پنهان شود. این مقادیر حتی ممکن است برای برنامه‌نویس قابل مشاهده نباشد. (enumerated types) همچنین می‌توانند از نوشتن یک کد برنامه‌نویسی مانند برنامه‌های ریاضی روی مقادیر شمارنده ها(enumerators) جلوگیری کنند. اگر مقدار متغیری که یک enumerators اختصاص داده می‌شد چاپ شود، برخی از زبان‌های برنامه‌نویسی می‌توانند به جای مقدار عددی نام enumerators را چاپ کنند.

یک مزیت دیگر این است که انواع ذکر شده می‌توانند به کامپایلرها اجازه دهند صحت معنایی را اعمال کنند.

برای مثال: myColor = TRIANGLE ممکن است ممنوع باشد در حالی که: myColor = RED پذیرفته می‌شود، حتی اگر TRIANGLE و RED هر دو از لحاظ داخلی به عنوان ۱ نشان داده شوند. در واقع، a enumerated type شبیه لیست اسامی (کدهای عددی) است، از آنجا که به هر مقدار از نوع ممکن است، یک شماره طبیعی متمایز اختصاص داده شود. از این رو، یک enumerated type داده شده مشخص، اجرای مشخص این مفهوم است. هنگامی که یک order معنی دار است یا برای مقایسه استفاده می‌شود، یک نوع شمارش شده به یک نوع معمولی تبدیل می‌شود.

Conventions: زبانهای برنامه‌نویسی معمولاً چندین مرتبه، سبک‌های برنامه‌نویسی و کنوانسیون‌های نامگذاری خود را دارند. enumerations, معمولاً از یک کنوانسیون PascalCase یا حروف بزرگ پیروی می‌کنند، در حالی که حروف کوچک و دیگران کمتر دیده می‌شوند.

قواعد در سی پلاس پلاس: سی پلاس پلاس انواع enumeration types دارد که مستقیماً از C به ارث برده شده‌اند و عمدتاً مانند آنها کار می‌کنند. به جز اینکه a enumeration یک نوع واقعی در C ++ است و به بررسی زمان کامپایل اضافه می‌شود. همچنین (مانند ساختارها)، کلمه کلیدی enum در سی پلاس پلاس به‌طور خودکار با typedef ترکیب می‌شود، به طوری که به جای نامگذاری نام enum type، فقط آن را نامگذاری کنید. این را می‌توان در C با استفاده از typedef شبیه‌سازی کرد:

مثال:
  ;typedef enum {Value1, Value2} name
سی پلاس پلاس enumeration typer ایمنی از نوع دوم را ارائه می‌دهد که به‌طور ضمنی به یک نوع عدد صحیح تبدیل نمی‌شود. آن اجازه می‌دهد جریان Io برای آن نوع تعریف شود. علاوه بر این که، تعداد ذکر شده نشت نمی‌کند، بنابراین آنها باید با Enumeration استفاده شوند:
  Type::enumeration
این با عبارت "enum class" مشخص شده‌است. به عنوان مثال:
  ;{enum class Color {Red, Green, Blue
نوع زمینه ای یک نوع انتگرال تعریف شده برای اجرای است که به اندازه کافی بزرگ برای نگه داشتن تمام مقادیر شمارش شده‌است (لازم نیست کوچک‌ترین نوع ممکن باشد!). در C ++ می‌توانید نوع زیربنایی را مستقیماً مشخص کنید.
  enum class Color: long {Red, Green, Blue};  // must fit in size and memory layout the type 'long'
enum class Shapes: char;  // forward declaration. If later there are values defined that don't fit in 'char' it is an error.

منابع:

ویکی‌پدیا انگلیسی.

 جستارهای وابسته 
 لیست پیوندی
 آرایه
 صف
 مجموعه
 جریان (داده)

 منابع 

رده:انواع داده ترکیبی
رده:انواع داده
رده:نوع داده انتزاعی
رده:واژگان رایانه