تابع های تعریف شده توسط کاربر در ++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 ذخیره میشود و متن متناظر روی صفحه نمایش مییابد.
کدام روش بهتر است؟
هر چهار برنامه فوق خروجی یکسانی عرضه میکنند و همگی آنها از نظر فنی صحیح هستند. هیچ قاعده سریع یا قاطعی در مورد این که کدام روش باید انتخاب شود وجود ندارد. روش خاصی که انتخاب میشود به موقعیت مربوطه و شیوه حل مسئله وابسته است. برای مطالعه بخش بعدی این مطلب به لینک زیر مراجعه کنید:
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامه نویسی C++
- مجموعه آموزشهای ابزارهای مهندسی کامپیوتر
- گزاره های شرطی ساده و تودرتو در ++C — به زبان ساده
- مبانی ++C برای یادگیری ساختمان داده — به زبان ساده
==
سلام
به نظر من تو این مثال روش چهارم بهتره چون سلیقۀ من اینطوریه که ورودی و خروجی رو main انجام بده و کارای محاسباتی و… رو بقیۀ توابع انجام بدن