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

۶۴۶ بازدید
آخرین به‌روزرسانی: ۲۹ شهریور ۱۴۰۲
زمان مطالعه: ۴ دقیقه
تابع های تعریف شده توسط کاربر در ++C — راهنمای کاربردی

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

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

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

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

مثال 1

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

1# include <iostream>
2using namespace std;
3void prime();
4int main()
5{
6    // No argument is passed to prime()
7    prime();
8    return 0;
9}
10// Return type of function is void because value is not returned.
11void prime()
12{
13    int num, i, flag = 0;
14    cout << "Enter a positive integer enter to check: ";
15    cin >> num;
16    for(i = 2; i <= num/2; ++i)
17    {
18        if(num % i == 0)
19        {
20            flag = 1; 
21            break;
22        }
23    }
24    if (flag == 1)
25    {
26        cout << num << " is not a prime number.";
27    }
28    else
29    {
30        cout << num << " is a prime number.";
31    }
32}

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

مثال 2

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

1#include <iostream>
2using namespace std;
3int prime();
4int main()
5{
6    int num, i, flag = 0;
7    // No argument is passed to prime()
8    num = prime();
9    for (i = 2; i <= num/2; ++i)
10    {
11        if (num%i == 0)
12        {
13            flag = 1;
14            break;
15        }
16    }
17    if (flag == 1)
18    {
19        cout<<num<<" is not a prime number.";
20    }
21    else
22    {
23        cout<<num<<" is a prime number.";
24    }
25    return 0;
26}
27// Return type of function is int
28int prime()
29{
30    int n;
31    printf("Enter a positive integer to check: ");
32    cin >> n;
33    return n;
34}

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

مثال 3

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

1#include <iostream>
2using namespace std;
3void prime(int n);
4int main()
5{
6    int num;
7    cout << "Enter a positive integer to check: ";
8    cin >> num;
9    
10    // Argument num is passed to the function prime()
11    prime(num);
12    return 0;
13}
14// There is no return value to calling function. Hence, return type of function is void. */
15void prime(int n)
16{
17    int i, flag = 0;
18    for (i = 2; i <= n/2; ++i)
19    {
20        if (n%i == 0)
21        {
22            flag = 1;
23            break;
24        }
25    }
26    if (flag == 1)
27    {
28        cout << n << " is not a prime number.";
29    }
30    else {
31        cout << n << " is a prime number.";
32    }
33}

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

مثال 4

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

1#include <iostream>
2using namespace std;
3int prime(int n);
4int main()
5{
6    int num, flag = 0;
7    cout << "Enter positive integer to check: ";
8    cin >> num;
9    // Argument num is passed to check() function
10    flag = prime(num);
11    if(flag == 1)
12        cout << num << " is not a prime number.";
13    else
14        cout<< num << " is a prime number.";
15    return 0;
16}
17/* This function returns integer value.  */
18int prime(int n)
19{
20    int i;
21    for(i = 2; i <= n/2; ++i)
22    {
23        if(n % i == 0)
24            return 1;
25    }
26    return 0;
27}

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

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

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

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

==

بر اساس رای ۴ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
programiz
۱ دیدگاه برای «تابع های تعریف شده توسط کاربر در ++C — راهنمای کاربردی»

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

نظر شما چیست؟

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