ظرف‌ها در ++C

[برو به فهرست نوشته‌ها]
        معرفی انواع ظرف‌ها (نگهدارنده‌ها - containers) در زبان برنامه‌نویسی ++C

منظور از ظرف یا نگهدارنده (Container) ساختمان داده‌ای‌ست که دسته‌ای از اطلاعات را در خود نگه می‌دارد. آنچه که این ساختمان‌ها را از هم متمایز می‌کند، نوع تخصیص حافظه، نوع دسترسی و کارایی درج و حذف عنصر در آنها است که به برخی از آنها کاربری‌های ویژه می‌دهد.

    در ادامه با انواع این نوع ساختمان داده‌ها در زبان برنامه‌نویسی ++C نسخه‌ی C++11 آشنا می‌شویم. با توجه به گسترده بودن این بحث، جزئیات بیشتر هر کلاس را در «پیوندها برای مطالعه‌ی بیشتر» بخوانید.

ادامه ...

فایل سرآیند algorithm

[برو به فهرست نوشته‌ها]
        معرفی فایل سرآیند algorithm از کتابخانه قالب استاندارد زبان برنامه‌نویسی ++C به همراه نمونه کد

فایل سرآیند (هدر فایل) algorithm از جمله فایل‌های سرآیند تعاریف کتابخانه‌ قالب استاندارد (STL) زبان برنامه‌نویسی ++C‌ است که به طور عمده شامل توابعی برای کار با مجموعه‌ای از داده‌ها (آرایه‌ها و لیست‌ها) است. با استفاده از این توابع به راحتی می‌توان با تنها یک خط کد عملیات جستجو، مرتب‌سازی، شمارش و بررسی یک خاصیت در تمامی داده‌های یک بازه‌ی مشخص را انجام داد.

    در استفاده از این توابع باید به این نکته توجه داشت که هر کدام از آنها فرآیندهایی داخلی دارند که اگرچه از مرتبه‌ی زمانی بهینه است، اما لزوما قابل چشم‌پوشی نیست. به عبارت دیگر، دلیل استفاده از این توابع، حذف مرتبه‌ی زمانی برخی الگوریتم‌های مورد نیاز در برنامه نیست؛ بلکه تنها کدنویسی آنها را ساده می‌کند. در ادامه تعریف و عملکرد برخی از این توابع آمده است.

      

ادامه ...

نکات مهم در برنامه‌نویسی به زبان ++C

[برو به فهرست نوشته‌ها]
        پنج نکته‌ی آموزنده در مورد برنامه‌نویسی به زبان برنامه‌نویسی ++C

اجتناب از بررسی تساوی در اعداد اعشاری

    اعداد اعشاری در محاسبات ریاضی - مانند عمل تقسیم یا محاسبه‌ی توابع مثلثاتی و غیره - ممکن است حاوی مقدار بسیار ناچیزی خطا باشند که عموما ناشی از عملیات گرد کردن و قطع کردن نتایج مراحل میانی محاسبات هستند. در چنین حالتی به کار بردن عملگر تساوی لزوما به نتیجه‌ی درست ختم نمی‌شود. به عنوان مثال:

      

float f
/* f عملیات محاسباتی روی متغیر */
if(f == 0.0){
    /*
        عملیات بلاک شرط
    */
}
ادامه ...

توابع دوست کلاس در ++C

[برو به فهرست نوشته‌ها]
        آشنایی با توابع دوست کلاس در زبان برنامه‌نویسی ++C و کاربرد آنها در سربارگذاری عملگرها

توابع دوست کلاس‌ها از‌ جمله موارد بحث برانگیز برنامه‌نویسی شی‌ءگرا به زبان ++C هستند. چرا که یکی از اصول اساسی شیءگرایی، یعنی پنهان‌سازی اطلاعات، را نقض می‌کنند. با این وجود به خاطر کاربردهای متعددی که دارند از حضورشان نمی‌توان چشم‌پوشی کرد.

    به زبان ساده، توابع دوست یک کلاس توابعی هستند که عضو کلاس نیستند، اما به تمامی داده‌ها و توابع خصوصی و محافظت شده‌ی آن دسترسی دارند.

یک مثال ساده

  

class myclass {
    friend void print_a(myclass);
  private:
    unsigned a;
  public:
    myclass(int r) {
      a = r > 0 ? r : - r;
    }
    void print() {
10       cout << a;
11     }
12 };
13   
14 void print_a(myclass ob) {
15   cout << ob.a;
16 }
17 
18 void main() {
19   myclass ob(9);
20   ob.print();
21   cout << "\t";
22   print_a(ob);
23 }

  

    خروجی به این صورت است:

      

9    9
ادامه ...

سربارگذاری عملگرها در ++C

[برو به فهرست نوشته‌ها]
        آشنایی با مفهوم سربارگذاری عملگرها در زبان ++C

همانطور که می‌دانید، شیوه‌ی معرفی اشیاء کلاس‌های تعریف شده در ++C همانند متغیرهای عادی هستند. به عنوان مثال اگر کلاسی به نام myclass تعریف کرده باشیم، عبارت زیر یک شیء از این کلاس به نام a تعریف می‌کند:

  

myclass a;

  

    اما اشیاء کلاس یک تفاوت اساسی با متغیرهای معمولی (مانند int ،float ،char و ...) دارند و آن عدم پشتیبانی از عملگرها است. در واقع عملگر انتساب (=) تنها عملگر قابل استفاده برای اشیاء کلاس است. اشیاء کلاس به صورت پیش‌فرض از عملگرهای دیگر (همانند + ، - ، / ، >> ، & و * و ...) پشتیبانی نمی‌کنند. اگر b ،a‌ و c سه شیء از کلاس myclass باشند، عبارت زیر کامپایل نمی‌شود:

  

ادامه ...

متغیرهای مرجع در ++C

[برو به فهرست نوشته‌ها]
        معرفی متغیرهای مرجع در زبان برنامه‌نویسی ++C و آشنایی با مهمترین کاربردهای آنها

زبان برنامه‌نویسی C از دو نوع متغیر پشتیبانی می‌کند: متغیرهای معمولی و اشاره‌گرها (متغیرهای حاوی آدرس حافظه). زبان ++C نوع سومی را به این مجموعه اضافه کرده است: متغیرهای مرجع (Reference).

    متغیرهای مرجع از روی دو نوع دیگر ساخته می‌شود و به نوعی می‌توان گفت نام مستعار برای متغیر اصلی به حساب می‌آید. برای تعریف متغیر مرجع از عملگر & استفاده می‌کنیم:

      

int a;
int &b = a;

      

    عبارت فوق متغیر b را مرجعی برای a معرفی می‌کند. از این کد به بعد متغیرهای a و b معادل هم هستند. یعنی تغییرات a در b و تغییرات b در a تاثیر می‌گذارد. در واقع a و b از یک محل حافظه استفاده می‌کنند؛ یا اینکه یک خانه‌ی حافظه، دو نام متفاوت دارد.

ادامه ...

کلاس‌های حافظه در ++C

[برو به فهرست نوشته‌ها]
        آشنایی با کلاس‌های حافظه و کاربرد آنها در زبان ++C

زبان برنامه‌نویسی ++C از کلاس‌های حافظه‌ی‌ (Storage Classes) مختلفی برای تعریف متغیرها پشتیبانی می‌کند.

      

کلاس حافظه‌ی اتوماتیک (auto)

این کلاس اصلی‌ترین کلاس حافظه‌ی زبان ++C محسوب می‌شود. متغیرهایی که توسط این کلاس تعریف می‌شوند، با خروج از محدوده‌ی تعریف به طور خودکار از بین می‌روند. بنابراین تمامی متغیرهای عادی از این نوع کلاس هستند. یعنی شما برای مشخص کردن کلاس حافظه اتوماتیک نیاز به انجام کار خاصی ندارید. اما برای تاکید بر اتوماتیک بودن کلاس حافظه، می‌توانید از کلمه‌ی کلیدی auto استفاده کنید. به عنوان نمونه، دو عبارت زیر هم ارز هستند:

      

int n;
auto int n;

      

    توجه: مفهوم کلمه‌ی کلیدی auto در 11++C و بعدتر تغییر یافته و به معنی کلاس حافظه‌ی اتوماتیک نیست.

      

کلاس حافظه‌ی استاتیک (static)

متغیرهای کلاس حافظه‌ی استاتیک تا اتمام برنامه حافظه‌ی اختصاصی خودشان را حفظ می‌کنند؛ حتی اگر کنترل برنامه به خارج ناحیه تعریف آنها منتقل شود. مثال زیر را در نظر بگیرید:

      

void func() {
  static int y = 1;
  cout << y << "\t";
  y *= 2;
}
  
int main() {
  func();
  func();
10   func();
11   return 0;
12 }
ادامه ...

آرایه پویای دو بعدی در ++C

[برو به فهرست نوشته‌ها]
        آموزش استفاده از آرایه‌ی پویای دو بعدی در زبان ++C

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

    به قطعه کد زیر توجه کنید:

  

int **table;
cin >> n;
table = new int*[n];
int i, j;
for (i = 1 ; i <= n ; i++){
  table[i - 1] = new int[i];
  for (j = 1 ; j <= i ; j++)
    table[i - 1][j - 1] = i * j;
}
10 .
11 .
12 .
13 for (i = 0 ; i < n ; i ++)
14   delete[] table[i];
15 delete[] table;
16   

    این کد عدد n را از کاربر گرفته و نیمه‌ی پایینی جدول ضرب n در n را در یک آرایه‌ی پویا ذخیره می‌کند. جدول ضرب اعداد متقارن است و نیازی به ذحیره کردن اعداد همه‌ی خانه‌های جدول نیست. در نتیجه با آرایه‌ی پویای دو بعدی حافظه‌ی مصرفی تقریبا نصف می‌شود.

    متغیر table که به صورت table** تعریف شده است، یک اشاره‌گر به اشاره‌گر است. کامپایلر وقتی با دستور

      

table = new int*[n];
ادامه ...

اشاره‌گرها در زبان ++C

[برو به فهرست نوشته‌ها]
        آشنایی با مفهوم و عملکرد اشاره‌گرها در زبان برنامه‌نویسی ++C و ارائه مثالهایی از کاربرد آن

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

    پیش از شروع بحث دو مطلب مهم را یادآوری می‌کنم:

    1- تک تک بایت‌های حافظه برای خود آدرسی دارند که یک عدد صحیح و مثبت است. این آدرس دقیقا مانند کد پستی عمل می‌کند. یعنی کاملا منحصربفرد بوده و می‌توان از آن برای ارجاع به بایت استفاده کرد.

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

ادامه ...

قالب‌ها در ++C

[برو به فهرست نوشته‌ها]
        آشنایی با قالب‌ها به عنوان یکی از امکانات متمایز ++C از C

یکی از امکانات جالب و مفید زبان ++C قالب‌ها (Templates) هستند که انعطاف زیادی به کدنویسی می‌دهند.

    فرض کنید در یک برنامه نیاز به تعویض مقادیر دو متغیر هست. یعنی مثلا می‌خواهیم مقادیر a و b را با هم عوض کنیم. اگر a و b از نوع صحیح باشند، تابع جابجایی می‌تواند به این صورت باشد:

  

void swap(int &a, int &b){
  int temp;
  temp = a;
  a = b;
  b = temp;
}

  

    حال اگر بخواهیم مقادیر دو تا متغیر اعشاری را عوض کنیم، تابع فوق به کار نمی‌آید و باید تابع جدیدی بنویسیم. اما اگر از قالب استفاده کنیم، همه‌ی مشکلات حل می‌شوند.

    به قطعه کد زیر توجه کنید:

  

template< class T >
void swap(T &a, T &b){
  T Temp;
  Temp = a;
  a = b;
  b = Temp;
}
ادامه ...