فصل ۵: توابع (Functions) در C++

""

🎯 هدف یادگیری

در این فصل یاد می‌گیرید:

  1. تابع چیست و چرا لازم داریم.
  2. ساختار و نحوه تعریف توابع در C++.
  3. نحوه ارسال پارامترها و دریافت مقادیر بازگشتی.
  4. انواع تابع (بدون مقدار بازگشتی، با مقدار بازگشتی، بدون پارامتر، با پارامتر).
  5. مفهوم توابع بازگشتی (Recursion).
  6. قواعد نام‌گذاری و محدوده متغیرها در توابع.
  7. Overloading توابع.
  8. نکات و اشتباهات رایج در استفاده از توابع.

۱. تابع چیست؟

تابع یک بخش مستقل از کد است که یک کار خاص را انجام می‌دهد و می‌تواند چند بار در برنامه فراخوانی شود.
هدف:

  • جلوگیری از تکرار کد
  • بهبود خوانایی
  • استفاده مجدد
  • تقسیم پروژه به قطعات کوچک‌تر

مثال ساده بدون تابع:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, Ali!" << endl;
    cout << "Hello, Sara!" << endl;
    cout << "Hello, Reza!" << endl;
}

اگر بخوایم این کار رو با تابع انجام بدیم:

نسخه با تابع:

#include <iostream>
using namespace std;

void sayHello(string name) {
    cout << "Hello, " << name << "!" << endl;
}

int main() {
    sayHello("Ali");
    sayHello("Sara");
    sayHello("Reza");
}

📌 مزیت → کوتاه‌تر، قابل تغییر و بدون تکرار.


۲. ساختار تعریف تابع

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

نوع_برگشتی نام_تابع(لیست_پارامترها) {
    // بدنه تابع
    return مقدار; // فقط اگر نوع تابع void نیست
}

مثال:

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

۳. قسمت‌های یک تابع

  1. نوع بازگشتی (Return type): نوع داده‌ای که تابع برمی‌گرداند (int, double, string, void و غیره).
  2. نام تابع: باید معنادار و طبق قوانین نام‌گذاری متغیرها باشد.
  3. پارامترها: متغیرهایی که به تابع ارسال می‌کنیم.
  4. بدنه تابع: دستورات اجرایی تابع.
  5. return: مقدار خروجی تابع (اگر نوع تابع void نباشد).

۴. انواع تابع

۴.۱ بدون مقدار بازگشتی (void)

void greet() {
    cout << "Hello!" << endl;
}

۴.۲ با مقدار بازگشتی

double square(double x) {
    return x * x;
}

۴.۳ با پارامتر، بدون پارامتر

  • بدون پارامتر:
void info() {
    cout << "C++ course" << endl;
}
  • با پارامتر:
int sum(int a, int b) {
    return a + b;
}

۵. فراخوانی تابع (Function Call)

وقتی تابع تعریف شد، برای اجرای آن باید فراخوانی کنیم:

int result = sum(4, 5);
cout << result;

۶. ترتیب تعریف یا Prototype

در C++ می‌توانیم:

  • تابع را قبل از main() تعریف کنیم.
  • یا اول اعلان (Prototype) کنیم، بعد از main() بدنه را بنویسیم.

مثال:

int sum(int, int); // اعلان (prototype)

int main() {
    cout << sum(2, 3);
}

int sum(int a, int b) { // تعریف
    return a + b;
}

۷. ارسال پارامترها (Pass by Value)

پیش‌فرض: کپی مقدار پارامتر به تابع ارسال می‌شود و تغییرات روی نسخه اصلی در بیرون اثر ندارد.

void changeValue(int x) {
    x = 10;
}

int main() {
    int a = 5;
    changeValue(a);
    cout << a; // همچنان 5
}

📌 در آینده (فصل اشاره‌گرها) Pass by Reference رو یاد می‌گیریم.


۸. توابع بازگشتی (Recursion)

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

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

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

⚠ دقت کنید که باید شرط پایان داشته باشید، وگرنه حلقه بی‌پایان می‌شود.


۹. متغیرهای محلی و سراسری در توابع

  • متغیرهای تعریف‌شده داخل تابع محلی هستند.
  • متغیرهای سراسری خارج از تمامی توابع تعریف می‌شوند.

۱۰. Overloading توابع

تعریف چند تابع با یک نام اما پارامترهای متفاوت:

int sum(int a, int b) { return a + b; }
double sum(double a, double b) { return a + b; }

۱۱. نکات و هشدارها

⚠ همیشه نوع بازگشتی را مشخص کنید، حتی اگر void باشد.
⚠ مراقب Recursion بدون شرط پایان باشید.
⚠ پارامتر اضافی باعث خطای کامپایل می‌شود مگر Overload تعریف کرده باشید.


۱۲. اشتباهات رایج

❌ تعریف تابع بعد از main بدون prototype.
❌ فراموش کردن return در توابع غیر void.
❌ اشتباه نوع پارامتر باعث ناسازگاری در فراخوانی.


۱۳. تمرین‌ها

تمرین ۱

تابعی بنویسید که دو عدد را گرفته و حاصل ضرب آن‌ها را برگرداند.

تمرین ۲

تابعی بنویسید که شعاع دایره را گرفته و محیط و مساحت را چاپ کند.

تمرین ۳

تابع بازگشتی برای جمع اعداد از ۱ تا n بنویسید.

تمرین ۴ (چالش)

Overload تابع برای محاسبه توان عدد (power) بنویسید، یک نسخه برای int و یک نسخه برای double.


۱۴. جمع‌بندی

  • تابع یک بلوک کد مستقل است که می‌توان آن را بارها اجرا کرد.
  • انواع توابع: با مقدار بازگشتی، بدون مقدار بازگشتی، بازگشتی.
  • پارامترها به‌صورت کپی (Pass by value) ارسال می‌شوند مگر روش دیگری تعیین شود.
  • Overloading یکی از قابلیت‌های مهم C++ است.
محمد وب‌سایت

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *