برنامه نویسی ۱۵۲۸ بازدید

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

برای اینکه درک بهتری از آرگومان‌ها و مقادیر بازگشتی در تابع‌ها داشته باشید، باید اشاره کنیم که تابع‌های تعریف شده توسط کاربر را می‌توان به صورت زیر دسته‌بندی کرد:

  • تابع بدون آرگومان و بدون مقدار بازگشتی
  • تابع بدون آرگومان ولی با مقدار بازگشتی
  • تابع با آرگومان ولی بدون مقدار بازگشتی
  • تابع با آرگومان و با مقدار بازگشتی

موقعیتی را تصور کنید که باید اول بودن عددی را بررسی کنید. این مسئله در ادامه با تعریف توابع توسط کاربر به ۴ روشی که در بالا اشاره شد، حل شده است.

مثال 1

هیچ آرگومانی ارسال نمی‌شود و مقداری نیز بازگشت نمی‌یابد:

# include <iostream>
using namespace std;
void prime();
int main()
{
    // No argument is passed to prime()
    prime();
    return 0;
}
// Return type of function is void because value is not returned.
void prime()
{
    int num, i, flag = 0;
    cout << "Enter a positive integer enter to check: ";
    cin >> num;
    for(i = 2; i <= num/2; ++i)
    {
        if(num % i == 0)
        {
            flag = 1; 
            break;
        }
    }
    if (flag == 1)
    {
        cout << num << " is not a prime number.";
    }
    else
    {
        cout << num << " is a prime number.";
    }
}

در برنامه فوق، ()prime از ()main و بدون هیچ آرگومانی فراخوانی می‌شود. ()Prime عدد صحیحی را از کاربر می‌گیرد و بررسی می‌کند که آیا عدد اول است یا خیر. از آنجا که نوع مقدار بازگشتی از ()prime به صورت void است، هیچ مقداری از تابع بازگشت نخواهد یافت.

مثال 2

هیچ آرگومانی ارسال نمی‌شود، اما مقداری بازگشت می‌یابد:

#include <iostream>
using namespace std;
int prime();
int main()
{
    int num, i, flag = 0;
    // No argument is passed to prime()
    num = prime();
    for (i = 2; i <= num/2; ++i)
    {
        if (num%i == 0)
        {
            flag = 1;
            break;
        }
    }
    if (flag == 1)
    {
        cout<<num<<" is not a prime number.";
    }
    else
    {
        cout<<num<<" is a prime number.";
    }
    return 0;
}
// Return type of function is int
int prime()
{
    int n;
    printf("Enter a positive integer to check: ");
    cin >> n;
    return n;
}

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

مثال 3

آرگومان‌هایی ارسال می‌شوند، اما مقداری بازگشت نمی‌یابد:

#include <iostream>
using namespace std;
void prime(int n);
int main()
{
    int num;
    cout << "Enter a positive integer to check: ";
    cin >> num;
    
    // Argument num is passed to the function prime()
    prime(num);
    return 0;
}
// There is no return value to calling function. Hence, return type of function is void. */
void prime(int n)
{
    int i, flag = 0;
    for (i = 2; i <= n/2; ++i)
    {
        if (n%i == 0)
        {
            flag = 1;
            break;
        }
    }
    if (flag == 1)
    {
        cout << n << " is not a prime number.";
    }
    else {
        cout << n << " is a prime number.";
    }
}

در برنامه فوق، عدد صحیح در ابتدای امر از کاربر پرسیده و در متغیر num ذخیره می‌شود. سپس num به تابع ()prime ارسال می‌شود که در آنجا اول بودن آن بررسی شده و پرینت می‌شود. از آنجا که نوع بازگشتی ()prime به صورت void است، هیچ مقداری از تابع بازگشت نمی‌یابد.

مثال 4

آرگومان‌هایی ارسال می‌شوند و مقداری بازگشت می‌یابد:

#include <iostream>
using namespace std;
int prime(int n);
int main()
{
    int num, flag = 0;
    cout << "Enter positive integer to check: ";
    cin >> num;
    // Argument num is passed to check() function
    flag = prime(num);
    if(flag == 1)
        cout << num << " is not a prime number.";
    else
        cout<< num << " is a prime number.";
    return 0;
}
/* This function returns integer value.  */
int prime(int n)
{
    int i;
    for(i = 2; i <= n/2; ++i)
    {
        if(n % i == 0)
            return 1;
    }
    return 0;
}

در برنامه فوق یک عدد صحیح از کاربر پرسید می‌شود و در متغیر num ذخیره می‌شود. سپس num به تابع ()prime ارسال می‌شود که در آنجا اول بودن آن بررسی می‌شود. از آنجا که نوع بازگشتی ()prime به صورت int است، بسته به اول بودن یا نبودن عدد ورودی مقدار 1 یا 0 به تابع فراخوانی‌کننده ()main بازگشت می‌یابد. بدین ترتیب اگر عدد مربوطه اول باشد، مقدار بازگشتی 1 و در غیر این صورت صفر خواهد بود. اگر به تابع ()main بازگردیم، مقدار بازگشتی 1 یا 0 در متغیر flag ذخیره می‌شود و متن متناظر روی صفحه نمایش می‌یابد.

کدام روش بهتر است؟

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

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

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

یک نظر ثبت شده در “تابع های تعریف شده توسط کاربر در ++C — راهنمای کاربردی

  • مهرشاد ولیزادۀ ارجمند — says: ۲ مهر، ۱۳۹۹ در ۱۲:۱۹ ب٫ظ

    سلام
    به نظر من تو این مثال روش چهارم بهتره چون سلیقۀ من اینطوریه که ورودی و خروجی رو main انجام بده و کارای محاسباتی و… رو بقیۀ توابع انجام بدن

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.

مشاهده بیشتر