الگوریتمستان
برنامهنویسی، طراحی الگوریتم و حل مسئلههای الگوریتمی
منظور از ظرف یا نگهدارنده (Container) ساختمان دادهایست که دستهای از اطلاعات را در خود نگه میدارد. آنچه که این ساختمانها را از هم متمایز میکند، نوع تخصیص حافظه، نوع دسترسی و کارایی درج و حذف عنصر در آنها است که به برخی از آنها کاربریهای ویژه میدهد.
در ادامه با انواع این نوع ساختمان دادهها در زبان برنامهنویسی ++C نسخهی C++11 آشنا میشویم. با توجه به گسترده بودن این بحث، جزئیات بیشتر هر کلاس را در «پیوندها برای مطالعهی بیشتر» بخوانید.
اعداد اعشاری در محاسبات ریاضی - مانند عمل تقسیم یا محاسبهی توابع مثلثاتی و غیره - ممکن است حاوی مقدار بسیار ناچیزی خطا باشند که عموما ناشی از عملیات گرد کردن و قطع کردن نتایج مراحل میانی محاسبات هستند. در چنین حالتی به کار بردن عملگر تساوی لزوما به نتیجهی درست ختم نمیشود. به عنوان مثال:
float f
/* f عملیات محاسباتی روی متغیر */
if(f == 0.0){
/*
توابع دوست کلاسها از جمله موارد بحث برانگیز برنامهنویسی شیءگرا به زبان ++C هستند. چرا که یکی از اصول اساسی شیءگرایی، یعنی پنهانسازی اطلاعات، را نقض میکنند. با این وجود به خاطر کاربردهای متعددی که دارند از حضورشان نمیتوان چشمپوشی کرد.
به زبان ساده، توابع دوست یک کلاس توابعی هستند که عضو کلاس نیستند، اما به تمامی دادهها و توابع خصوصی و محافظت شدهی آن دسترسی دارند.
class myclass {
friend void print_a(myclass);
همانطور که میدانید، شیوهی معرفی اشیاء کلاسهای تعریف شده در ++C همانند متغیرهای عادی هستند. به عنوان مثال اگر کلاسی به نام myclass تعریف کرده باشیم، عبارت زیر یک شیء از این کلاس به نام a تعریف میکند:
myclass a;
اما اشیاء کلاس یک تفاوت اساسی با متغیرهای معمولی (مانند int ،float ،char و ...) دارند و آن عدم پشتیبانی از عملگرها است. در واقع عملگر انتساب (=) تنها عملگر قابل استفاده برای اشیاء کلاس است. اشیاء کلاس به صورت پیشفرض از عملگرهای دیگر (همانند + ، - ، / ، >> ، & و * و ...) پشتیبانی نمیکنند. اگر b ،a و c سه شیء از کلاس myclass باشند، عبارت زیر کامپایل نمیشود:
زبان برنامهنویسی C از دو نوع متغیر پشتیبانی میکند: متغیرهای معمولی و اشارهگرها (متغیرهای حاوی آدرس حافظه). زبان ++C نوع سومی را به این مجموعه اضافه کرده است: متغیرهای مرجع (Reference).
متغیرهای مرجع از روی دو نوع دیگر ساخته میشود و به نوعی میتوان گفت نام مستعار برای متغیر اصلی به حساب میآید. برای تعریف متغیر مرجع از عملگر & استفاده میکنیم:
int a;
زبان برنامهنویسی ++C از کلاسهای حافظهی (Storage Classes) مختلفی برای تعریف متغیرها پشتیبانی میکند.
این کلاس اصلیترین کلاس حافظهی زبان ++C محسوب میشود. متغیرهایی که توسط این کلاس تعریف میشوند، با خروج از محدودهی تعریف به طور خودکار از بین میروند. بنابراین تمامی متغیرهای عادی از این نوع کلاس هستند. یعنی شما برای مشخص کردن کلاس حافظه اتوماتیک نیاز به انجام کار خاصی ندارید. اما برای تاکید بر اتوماتیک بودن کلاس حافظه، میتوانید از کلمهی کلیدی auto استفاده کنید. به عنوان نمونه، دو عبارت زیر هم ارز هستند:
آرایههای دو بعدی کاربردهای بسیاری از جمله جداول و ماتریسها دارند. اهمیت تعریف آرایههای پویای دو بعدی کمتر از آرایههای یک بعدی نیست. آرایههای پویای دو بعدی یک ویژگی جالب در مقایسه با آرایهی ایستا دارند. شما با تعریف پویای آرایههای دو بعدی میتوانید جداول غیرمستطیلی تشکیل دهید. در واقع وقتی آرایههای دو بعدی را به صورت پویا ایجاد میکنید، این اختیار را دارید که تعداد ستونهای هر ردیف را متفاوت انتخاب کنید.
به قطعه کد زیر توجه کنید:
int **table;
یکی از مهمترین مباحث کاربردی هر زبان برنامهنویسی، اشارهگر و مفهوم آن است که کاربرد گستردهای در شاخهی ساختمان دادهها نیز دارد. در این فرصت با مفهوم اشارهگر و همینطور روش تعریف آن در زبان ++C آشنا میشوید. باید توجه داشته باشید که سوای روش تعریف اشارهگر در این زبان، کلیت مفهوم آن در بین تمام زبانها مشترک است.
پیش از شروع بحث دو مطلب مهم را یادآوری میکنم:
1- تک تک بایتهای حافظه برای خود آدرسی دارند که یک عدد صحیح و مثبت است. این آدرس دقیقا مانند کد پستی عمل میکند. یعنی کاملا منحصربفرد بوده و میتوان از آن برای ارجاع به بایت استفاده کرد.
یکی از امکانات جالب و مفید زبان ++C قالبها (Templates) هستند که انعطاف زیادی به کدنویسی میدهند.
فرض کنید در یک برنامه نیاز به تعویض مقادیر دو متغیر هست. یعنی مثلا میخواهیم مقادیر a و b را با هم عوض کنیم. اگر a و b از نوع صحیح باشند، تابع جابجایی میتواند به این صورت باشد:
void swap(int &a, int &b){
زبان ++C همانند اکثر زبانهای برنامهنویسی دیگر، ساختاری به نام آرایه دارد که امکان تعریف مجموعهای از متغیرهای همنوع (اصطلاحا مجموعه عناصر همگن) را فراهم میکند. چنین ساختاری به صورت زیر تعریف میشود:
type name[number of elements];
که در آن type یکی از انواع دادههای استاندارد ++C، ساختمان و یا کلاس است. number of elements هم تعداد اعضا یا عناصر آرایه را مشخص میکند که باید عدد ثابتی باشد. مثلا عبارت زیر یک آرایهی 10 عضوی از اعداد اعشاری به نام arr تعریف میکند: