انواع تابع در برنامه نویسی C
در این آموزش با روش های مختلف برای حل یک مسئله با استفاده از تابع در برنامه نویسی سی آشنا خواهید شد.
در اینجا این ۴ برنامه بررسی می کنند که آیا عدد ورودی توسط کاربر عدد اول است یا خیر.
خروجی همه این برنامه ها یکسان است و در هر مثال یک تابع تعریف شده است. با این حال رویکرد هر مثال متفاوت است.
نکته: در این برنامه ها فرض شده عدد ورودی توسط کاربر یک عدد مثبت است چراکه عدد اول یک عدد طبیعی بزرگتر از یک است که به غیر از خودش و عدد ۱ مقسوم علیه ای دیگری نداشته باشد. البته شرط عدم برابری با ۱ در برنامه ها بررسی شده است.
مثال ۱: بدون آرگومان ارسالی و بدون مقدار بازگشتی
#include <stdio.h>
void checkPrimeNumber();
int main()
{
checkPrimeNumber(); // بدون آرگومان ارسالی
return 0;
}
// نشان می دهد که این تابع هیچ مقدار بازگشتی ندارد void
void checkPrimeNumber()
{
int n, i, flag = 0;
printf(“Enter a positive integer: “);
scanf(“%d”,&n);
if(n == 1){
flag = 1;
}
else{
for(i=2; i <= n/2; ++i)
{
if(n%i == 0)
{
flag = 1;
}
}
}
if (flag == 1)
printf(“%d is not a prime number.”, n);
else
printf(“%d is a prime number.”, n);
}
در تابع ()checkPrimeNumber ورودی از کاربر گرفته می شود سپس بررسی می کند آیا عدد اول است یا نه، در نهایت یک پیام روی صفحه نمایش می دهد.
پرانتزهای خالی در فراخوانی تابع ;()checkPrimeNumber در تابع ()main نشان می دهد که هیچ آرگومانی به تابع ارسال نمیشود.
نوع بازگشتی از تابع نیز void است. یعنی این تابع هیچ مقداری را بر نمی گرداند.
مثال ۲: بدون آرگومان ارسالی اما با مقدار بازگشتی
#include <stdio.h>
int getInteger();
int main()
{
int n, i, flag = 0;
// بدون آرگومان ارسالی
n = getInteger();
if(n == 1){
flag = 1;
}
else{
for(i=2; i<=n/2; ++i)
{
if(n%i==0){
flag = 1;
break;
}
}
}
if (flag == 1)
printf(“%d is not a prime number.”, n);
else
printf(“%d is a prime number.”, n);
return 0;
}
// عدد صحیح ورودی را برمی گرداند
int getInteger()
{
int n;
printf(“Enter a positive integer: “);
scanf(“%d”,&n);
return n;
}
پرانتزهای خالی در فراخوانی تابع
n = getInteger();
نشان می دهد که هیچ آرگومانی به تابع ارسال نمی شود. مقدار بازگشتی از تابع در متغیر n ذخیره می شود.
در اینجا تابع ()getInteger یک عدد از کاربر می گیرد و همان را برمی گرداند. در تابع ()main بررسی می شود که آیا عدد اول است یا نه.
مثال ۳: با آرگومان ارسالی اما بدون مقدار بازگشتی
#include <stdio.h>
void checkPrimeAndDisplay(int n);
int main()
{
int n;
printf(“Enter a positive integer: “);
scanf(“%d”,&n);
// به عنوان آرگومان به تابع ارسال می شود nمقدار
checkPrimeAndDisplay(n);
return 0;
}
// نشان می دهد که این تابع هیچ مقدار بازگشتی ندارد void
void checkPrimeAndDisplay(int n)
{
int i, flag = 0;
if(n == 1){
flag = 1;
}
else{
for(i=2; i <= n/2; ++i)
{
if(n%i == 0){
flag = 1;
break;
}
}
}
if(flag == 1)
printf(“%d is not a prime number.”,n);
else
printf(“%d is a prime number.”, n);
}
مقدار صحیح ورودی توسط کاربر به تابع ()checkPrimeAndDisplay ارسال می شود.
در اینجا تابع ()checkPrimeAndDisplay بررسی می کند آیا آرگومان ارسالی یک عدد اول است یا خیر و در انتها نیز یک پیام نمایش می دهد.
مثال ۴: با آرگومان ارسالی و با مقدار بازگشتی
#include <stdio.h>
int checkPrimeNumber(int n);
int main()
{
int n, flag;
printf(“Enter a positive integer: “);
scanf(“%d”,&n);
// به عنوام آرگومان به تابع ارسال می شود nمقدار
// ذخیره می شود flag مقدار بازگشتی از تابع در متغیر
flag = checkPrimeNumber(n);
if(flag == 1)
printf(“%d is not a prime number”,n);
else
printf(“%d is a prime number”,n);
return 0;
}
// از تابع برگشت داده می شود int نوع داده
int checkPrimeNumber(int n)
{
int i;
if(n == 1)
return 1;
for(i=2; i <= n/2; ++i)
{
if(n%i == 0)
return 1;
}
return 0;
}
عدد ورودی از کاربر به تابع ()checkPrimeNumber ارسال می شود. این تابع بررسی می کند آیا آرگومان ارسال شده عدد اول است یا خیر. اگر عدد اول باشد، تابع ۰ برمی گرداند در غیر اینصورت ۱ برمی گرداند. مقدار بازگشتی از تابع در متغیر flag ذخیره می شود. براساس ۰ یا ۱ بودن مقدار متغیر flag ، یک پیام مناسب در تابع ()main چاپ می شود.
کدام روش بهتر است؟
این به مسئله بستگی دارد. در این مسئله، ارسال آرگومان و بازگشت مقدار از تابع (مثال ۴) بهتر است.
هر تابع باید یک کار خاصی انجام دهد. تابع ()checkPrimeNumber ورودی را از کاربر نمی گیرد و یا یک پیام نمایش نمی دهد. بلکه این تابع فقط بررسی می کند که آیا عدد اول است یا خیر.