تابع : دستورر یا مجموعه ای از دستورات است که می تواند بصورت پيش فرض و یا بصورت نوشته شده توسط خود کاربر باشند ، که عمليات خاصی را بر روی
متغيری که دریافت می کنند ، انجام می دهند .
همانطور که گفته شد توابع دو گروهند :
-1 توابعی پيش ساخته و از قبل به همراه کمپایلر ++C ارائه شده اند که به آنها توابع کتابخانه ای می گویند . مثل تابع cos
-2 توابعی که کاربر بر حسب ضرورت و نياز آنها را می نویسد و در برنامه ی خود استفاده می کند .
به طور کلی تابع از سه قسمت تشکيل شده است :
-1 مقدار دهی اوليه برای ورود به تابع
-2 مجموعه ای از دستور العمل ها که روی مقدار ورودی انجام می شوند .
-3 مقدار خروجی بعد از انجام عمليات روی مقدار ورودی
با توجه به سه قسمت بالا ، هر تابع را به صورت زیر ، در خارج از تابع ()main تعریف خواهيم کرد :
Return-type function-name ( parameter-type parameter-Name , …)
{
statements;
return value;
}
به این مثال ساده توجه کنيد :
می خواهيم برنامه ای بنویسيم که در آن تابعی را تعریف کنيم که عددی را به عنوان ورودی بگيرد و مربع آن را به ما بازگرداند :
-1 مثل روال گذشته ابتدا می نویسيم :
#include <iostream.h>
-2 برای مثال اسم تابعمان را sqr در نظر می گيریم و کار آن را تعریف می کنيم :
int sqr(int x)
{
return x*x;
}
-3 متن اصلی برنامه :
int main()
{
int a;
cin>>a;
cout << sqr(a) << endl;
return 0;
}
برنامه ی ما حالا کامل است :
#include <iostream.h>
int sqr(int x)
{
return x*x;
}
int main()
{
int a;
cin>>a;
cout << sqr(a) << endl;
return 0;
}
یکبار دیگر به برنامه ی بالا برگردید ! می خواهيم نکات و ریزه کاری های آن را بررسی کنيم ! (پس خوب بخوانيد ! ):
-کامپایلر برنامه را به این صورت می خواند :
… ابتدا در قسمت بالا تابع را شناسایی می کند و به ترتيب به پایين می آید ، تا اینکه به تابع اصلی می رسد و در نهایت آنرا اجرا می کند .
و چون در بالا ، شناخته است که تابعی با نام sqr معرفی کرده ایم ، هر جا که در متن برنامه نام تابع را ببيند ، سریعا برگشته و از روی
دستورات تابع ، عمليات را انجام می دهد . در واقع ساختار استفاده ی ما ، از تابع ، در حالت کلی بدین صورت است :
تابع 1
تابع 2
…
تابع n
بدنه ی اصلی برنامه
اما در صورتی که بخواهيم ، ابتدا تابع اصلی برنامه را بنویسيم و بعد سایر توابع را ، ابتدا باید قبل از تابع ()main یک اشاره ی کوچک به آن
تابع دشته باشيم . بدین صورت :
int ali(int x);
int main()
{
…
}
int ali(int x)
{
…
}
یعنی قبل از اینکه کامپایلر به تابع ()main برسد ، به آن اطلاع می دهيم که تابعی با این نام و مشخصات داریم ، اگر فراخوانی شد ،
دستورات آن در زیر تابع اصلی است . توجه کنيد که هميشه بعد از اشاره به تابعی حتما ; فراموش نشود .
– به ساختار تعریف تابع sqr نگاه کنيد . در اولين قسمت قبل از نام تابع نوع مقدار خروجی نوشته می شود . یعنی اینکه ما که در بالا int
نوشته ایم ، بدین معنا است که مقداری که تابع آن را بازگشت خواهد داد ، یک عدد و از نوع int می باشد. در واقع می توان این قسمت
را بر حسب نياز به مقدار بازگشتی از انواع دیگری مثل long int , char و یا … تعيين کنيد .
– در ادامه خواهيم دید یک نوع از تابع ها هستند که هيچ مقداری را بر نخواهند گرداند . این نوع از تابع ها از نوع void هستند . در صورتی
که تابعی را از نوع void تعریف کنيم دیگر نيازی به نوشتن return نيست . البته می توان آنرا نوشت و جلوی آن را خالی گذاشت :
void ali(int x)
{
Statement;
}
یا :
void ali(int x)
{
Statement;
Return ;
}
در مورد توابعی که هيچ مقداری بر نمی گردانند ، بيشتر بررسی خواهيم کرد .
– در انتخاب نام تابع (مثلاsqr ) سعی کنيد نام تابع با کاری که می کند ، همخوانی داشته باشد . چون در برنامه های چند صد خطی ، دیگر
فرصتی برای اتلاف وقت برای بازخوانی کد ها یا حفظ کردن نام ها و … نخواهيد داشت . همچنين دقت کنيد نامی که در قسمت معرفی تابع
معرفی می کنيم ، در بدنه ی اصلی برنامه ، تابع را با همان نام فراخوانی می کنيم .
– در هنگام معرفی تابع در داخل پرانتز ، نوع و تعداد مقدار هایی که تابع به عنوان ورودی خواهد گرفت را معرفی می کنيم . مثلا در این تابع که
نوشتيم ، تابع یک مقدار عددی از نوع int می گيرد .
– ممکن است در بعضی برنامه ها ، نياز باشد که یک تابع ، چندین مقدار را دریافت کند . در اینصورت به عنوان مثال می توانيم بنویسيم :
int ali(int x, int y , int z)
{
…
}
که در اینصورت در برنامه ی اصلی می توانستيم تابع را به این صورت فراخوانی کنيم :
Cin>>a>>b>>c;
Cout<< ali(a,b,c)<<endl;
– یک نکته ی جالب : (default value) : اگر برای مثال ، من ، در معرفی تابعی بدین صورت بنویسم :
int ali(int x, int y , int z=2)
{
…
}
من در این حالت به z یک مقدار پيش فرض نسبت داده ام . یعنی اینکه ، در صورتی که در هنگام فرخوانی تابع در متن اصلی برنامه ،
مقداری را به عنوان عدد سوم به تابع بفرستم ، که مثل حالت معمولی در z قرار خواهد گرفت . وگرنه اگر هيچ مقداری به آن نفرستم ، مقدار
2 z برابر با خواهد بود . به یاد داشته باشيد که هميشه مقدار اوليه متغير ها در هنگام معرفی آنها هميشه در سمت راست ترین قسمت
نوشته می شوند . یعنی اینکه حالت معرفی زیر اشتباه است :
int ali(int x, , int z=2, int y)
{
…
}
مقدار نتيجه ای که تابع به عنوان خروجی پس خواهد داد ، با استفاده از دستور return باز گردانده می شود . مثلا در مثال قبلی داریم :
return x*x;
یعنی اینکه پس از فراخوانی و اجرای دستورات تابع مقدار 2 توان ی x را به عنوان خروجی بازميگرداند . اگر می خواستيم که خروجی یک تابع
همواره 2 باشد :
return 2;
و یا…