الگوریتم اول

لطفا صبر کنید...

توابع در ++C

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

۱. ساختار یک تابع

ساختار کلی یک تابع در ++C به صورت زیر است:

return_type function_name(parameters) {
    // کدهایی که تابع انجام می‌دهد
    return value; // برای توابعی که مقداری برمی‌گردانند
}
  • return_type: نوع داده‌ای که تابع باید بازگرداند (مثلاً int، double، void و غیره).
  • function_name: نام تابع.
  • parameters: لیستی از پارامترها که تابع از آن‌ها استفاده می‌کند. می‌توانند خالی هم باشند.
  • return value: مقداری که تابع برمی‌گرداند. این قسمت فقط برای توابعی که مقداری دارند لازم است.

۲. تابع بدون بازگشت مقدار (void)

این توابع هیچ مقداری را به فراخوانی‌کننده برنمی‌گردانند.

مثال:

#include <iostream>
using namespace std;

void printHello() {
    cout << "سلام دنیا!" << endl;
}

int main() {
    printHello();  // فراخوانی تابع
    return 0;
}

در این مثال، تابع printHello هیچ مقداری برنمی‌گرداند و تنها متن را چاپ می‌کند.

۳. تابع با بازگشت مقدار

این توابع مقداری از نوع مشخص‌شده به فراخوانی‌کننده بازمی‌گردانند.

مثال:

#include <iostream>
using namespace std;

int add(int a, int b) {
    return a + b;
}

int main() {
    int result = add(3, 4);  // فراخوانی تابع و ذخیره نتیجه
    cout << "نتیجه: " << result << endl;
    return 0;
}

در این مثال، تابع add دو عدد را می‌گیرد و مجموع آن‌ها را باز می‌گرداند.

۴. توابع با پارامترها (Parameters)

توابع می‌توانند پارامترهایی را دریافت کنند که مقادیر مورد نیاز برای انجام عملیات‌های مختلف را به آن‌ها می‌دهیم.

مثال:

#include <iostream>
using namespace std;

void printSum(int a, int b) {
    cout << "مجموع: " << a + b << endl;
}

int main() {
    printSum(5, 7);  // فراخوانی تابع با پارامترها
    return 0;
}

در این مثال، تابع printSum دو پارامتر از نوع int می‌گیرد و مجموع آن‌ها را چاپ می‌کند.

۵. توابع بازگشتی (Recursive Functions)

توابعی که خود را فراخوانی می‌کنند را توابع بازگشتی می‌نامند. این نوع توابع برای حل مسائل تکراری مانند محاسبه فاکتوریل یا حل مسائل درختی استفاده می‌شوند.

مثال: محاسبه فاکتوریل

#include <iostream>
using namespace std;

int factorial(int n) {
    if (n <= 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

int main() {
    cout << "فاکتوریل 5: " << factorial(5) << endl;
    return 0;
}

در این مثال، تابع factorial خود را فراخوانی می‌کند تا فاکتوریل یک عدد را محاسبه کند.

۶. توابع با پارامترهای پیش‌فرض (Default Parameters)

در ++C می‌توانیم به توابع پارامترهای پیش‌فرض بدهیم، به این معنا که اگر در هنگام فراخوانی تابع مقداری برای آن پارامترها ارسال نشود، مقدار پیش‌فرض استفاده خواهد شد.

مثال:

#include <iostream>
using namespace std;

void greet(string name = "مهمان") {
    cout << "سلام " << name << "!" << endl;
}

int main() {
    greet();          // استفاده از پارامتر پیش‌فرض
    greet("علی");     // ارسال پارامتر به تابع
    return 0;
}

در این مثال، اگر هیچ نامی به تابع ارسال نشود، مقدار پیش‌فرض "مهمان" استفاده می‌شود.

۷. توابع inline

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

مثال:

#include <iostream>
using namespace std;

inline int square(int x) {
    return x * x;
}

int main() {
    cout << "مربع 5: " << square(5) << endl;
    return 0;
}

۸. توابع با تعداد پارامترهای متغیر (Varadic Functions)

در ++C می‌توان توابعی تعریف کرد که تعداد متغیر و نامشخصی از پارامترها را بپذیرند. این نوع توابع بیشتر با استفاده از ویژگی‌هایی مانند va_list یا الگوهای ... در ++C11 و نسخه‌های بعدی پیاده‌سازی می‌شوند.

مثال:

#include <iostream>
#include <cstdarg>  // برای استفاده از va_list
using namespace std;

int sum(int count, ...) {
    va_list args;
    va_start(args, count);
    int total = 0;
    for (int i = 0; i < count; i++) {
        total += va_arg(args, int);
    }
    va_end(args);
    return total;
}

int main() {
    cout << "جمع: " << sum(4, 1, 2, 3, 4) << endl;
    return 0;
}

در این مثال، تابع sum می‌تواند تعداد متغیری از پارامترها را بپذیرد.

 

نتیجه‌گیری:

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