آموزش توابع بخش سوم – { انواع توابع در زبان C }
مقدمه
با سلام خدمت همه شما دوستان. در این قسمت میخوایم در مورد انواع توابعی که میشه در زبان C ساخت با همدیگه صحبت کنیم. پیشنهاد میکنم قبل از ادامه این بحث ، دو جلسه ای که قبلا در مورد توابع منتشر شده بود رو مطالعه کنید:
انواع توابع:
معمولا توابعی که توسط کاربران ساخته میشه رو میتونیم به 4 دسته کلی تقسیم کنیم:
- توابع بدون آرگومان ( ورودی) و بدون return
- توابع بدون آرگومان و دارای return
- توابع دارای آرگومان و بدون return
- توابع دارای آرگومان و دارای return
ما با استفاده از مثال چک کردن اعداد اول میخوایم هر چهار نوع تابع بالا رو پیاده سازی کنیم. البته ما دیگه کد مربوط به این جلسه رو توضیح نمیدیم چون بسیار ساده هست ولی اگه باز جایی مشکل داشتید بفرمایید تا حل مشکل مشکل کنیم.
مثال 1 : توابع بدون آرگومان و بدون return :
کد زیر رو در نظر بگیرید:
#include <stdio.h> void checkPrimeNumber(); int main() { checkPrimeNumber(); // no argument is passed to prime() return 0; } // return type of the function is void becuase no value is returned from the function void checkPrimeNumber() { int n, i, flag=0; printf("Enter a positive integer: "); scanf("%d",&n); 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); }
در کد بالا با استفاده از تابع checkPrimerNumber میتونیم اول بودن یا اول نبودن یک عدد رو چک کنیم. همونطور که مشاهده میکنید داخل پرانتز مربوط به این تابع چیزی آورده نشده و در واقع این تابع هیچ ورودی ای نداره و در ضمن در prototype تابع که در ابتدا برنامه هم تعریف شده ، مشاهده میکنیم که تابع از نوع void هست که به این معناست که این تابع ، هیچ خروجی هم نخواهد داشت.
مثال 2 : توابع بدون آرگومان و دارای return :
کد زیر رو در نظر بگیرید:
#include <stdio.h> int getInteger(); int main() { int n, i, flag = 0; // no argument is passed to the function // the value returned from the function is assigned to n n = getInteger(); 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; } // getInteger() function returns integer entered by the user int getInteger() { int n; printf("Enter a positive integer: "); scanf("%d",&n); return n; }
در کد بالا از تابع getInteger استفاده شده که این تابع همونطور که مشاهده میکنید در داخل پرانتزهاش چیزی نیومده. پس هیچ ورودی ای دریافت نمیکنه . اما در prototype این تابع که در ابتدا برنامه تعریف شده میبینیم که نوع تابع از نوع int تعریف شده که به این معناست که یک عدد int در خروجی خودش خواهد داشت.
مثال 3: توابع دارای آرگومان و بدون return :
کد زیر رو نگاه کنید:
#include <stdio.h> void checkPrimeAndDisplay(int n); int main() { int n; printf("Enter a positive integer: "); scanf("%d",&n); // n is passed to the function checkPrimeAndDisplay(n); return 0; } // void indicates that no value is returned from the function void checkPrimeAndDisplay(int n) { int i, flag = 0; 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 استفاده شده است که این تابع همونطور که مشاهده میکنیم داخل پرانتزش یک عدد n آورده شده است که به این معناست که این تابع دارای یک ورودی هست. در prototype تابع هم مشخص است که این تابع از نوع void تعریف شده و به همین دلیل هیچ خروجی ندارد.
مثال 4 : تابع دارای آرگومان و دارای return :
به کد زیر نگاه کنید :
#include <stdio.h> int checkPrimeNumber(int n); int main() { int n, flag; printf("Enter a positive integer: "); scanf("%d",&n); // n is passed to the checkPrimeNumber() function // the value returned from the function is assigned to flag variable flag = checkPrimeNumber(n); if(flag==1) printf("%d is not a prime number",n); else printf("%d is a prime number",n); return 0; } // integer is returned from the function int checkPrimeNumber(int n) { /* Integer value is returned from function checkPrimeNumber() */ int i; for(i=2; i <= n/2; ++i) { if(n%i == 0) return 1; } return 0; }
در این کد از تابع ChekcPrimeNumber استفاده شده است و همونطور که مشاهده میکنید ، در داخل پرانتزش یک ورودی داره. پس این تابع دارای آرگومان هست. همچنین با نگاهی به prototype این تابع میبینیم که این تابع دارای یک خروجی از نوع int هم می باشد. پس با این حساب این تابع هم ورودی و هم خروجی داره.
استفاده از کدام یک از نوع توابع بهتر است؟
نمیشه به این سوال پاسخ دقیقی داد. در واقع بسته به نوع مساله شما ، استفاده از هر کدوم از این توابع میتونه ویژگی ها و مشخصه های خاص خودش رو داشته باشه. در مثالی که ما در بالا استفاده کردیم ، شاید استفاده از تابع نوع چهارم مناسب تر باشه.
تابعی که ما در مثال چهارم استفاده کردیم هیچ ورودی ای از کاربر نمیگیره ( ورودی رو ما چند خط قبل در تابع main از کاربرد میگیریم) و هیچ چیزی رو هم در خروجی بهش نمایش نمیده. تنها کاری که میکنه این هست که ، چک میکنه که آیا یک عدد اول هست یا خیر. تنها همین. این کار به ماژولار کردن برنامه و به تبع اون دیباگ آسان تر برنامه کمک بسیاری خواهد کرد.
خوب دوستان. برای این جلسه هم کافی هست. ما در جلسه بعد در مورد توابع بازگشتی صحبت خواهیم کرد. مثل همیشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید:
دیدگاهتان را بنویسید