آگوست 25, 2019 Mostafa بدون دیدگاه

اگر دنبال برنامه نویس برای ساخت افزونه ،قالب،سایت،برنامه ویندوز،اپلیکیشین اندروید،ربات تلگرام و.... هستید ،سفارش برنامه نویسی را مطالعه نمایید.

توجه : درخواست افزونه ،قالب، اسکریپت و نرم افزار و ... و سوالات و مشکلات خود را در انجمن ارسال نمایید

تابع عبارت است از مجموعه ای از دستورات که با هم یک عملیات معین را اجرا می کنند. تمامی برنامه های ++C حداقل یک تابع اصلی در خود دارند که به آن ()main گفته شده و نقطه ی شروع اجرا برنامه می باشد.

شما می توانید کد خود را به چندین تابع تقسیم کنید. اینکه چگونه کد (انجام وظایف مختلف) خود را بین توابع مختلف تقسیم می کنید کاملا به خود شما بستگی دارد. با این حال به صورت منطقی تقسیم گونه ای انجام می شود که هر تابع یک عملیات یا وظیفه ی خاص را انجام می دهد.

خط اعلان تابع/function declaration در واقع اسم تابع، نوع بازگشتی (خروجی) و پارامترهای آن را به کامپایلر اعلان می کند. تعریف تابع/ function definition بدنه ی حقیقی تابع و آن عملیاتی که انجام می دهد را تعیین می کند.

کتابخانه ی استاندارد ++C تعدادی تابع درون ساخته و از پیش تعریف شده فراهم می کند که برنامه ی شما می تواند آن ها را بر اساس نیاز خود فراخوانی نماید. به طور مثال، تابع ()strcat دو رشته را به هم متصل می کند، در حالی که تابع ()memcpy آدرس حافظه را به آدرس دیگری کپی می نماید.

زبان های برنامه نویسی مختلف به توابع با واژه های مختلف اشاره می کنند. برای مثال ممکن است آن را یک متد، subroutine یا procedure نام گذاری کنند.

نحوه ی تعریف تابع

ساختار یا فرم کلی تعریف تابع در زبان ++C به شرح زیر می باشد :

return_type function_name( parameter list ) {
   body of the function
}

تعریف تابع در ++C از یک (خط حاوی اسم تابع و ورودی های آن) function header و (بدنه یا پیاده سازی تابع) function body تشکیل می شود. در زیر بخش های مختلف یک تابع به تفصیل شرح داده شده است:

 

  • Return Type (نوع خروجی یا مقدار بازگشتی): یک تابع می تواند خروجی داشته باشد. این بخش از تابع نشانگر نوع مقداری است که تابع در خروجی برمی گرداند. برخی از توابع عملیاتی را انجام می دهند ولی در خروجی مقداری را برنمی گرداند که در این صورت بایستی در جایگاه return type کلیدواژه ی void را درج نمایید. بدین معنی که تابع مزبور خروجی ندارد.
  • Function Name (اسم تابع): این بخش اسم حقیقی تابع مورد نظر است که عملیاتی را انجام می دهد. اسم تابع و لیست پارامترهای ورودی آن با هم امضا یا signature یک متد را تشکیل می دهند.
  • Parameter list (لیست پارامترها): پارامتر نقش یک مکان نگهدار (placeholder) را ایفا می کند. زمانی که تابعی فراخوانی می شود، شما در واقع مقداری را به تابع ارسال می کنید. از این مقدار تحت عنوان پارامتر یا آرگومان یاد می شود. لیست پارامترها به نوع، ترتیب و تعداد پارامترهای یک تابع اشاره دارد. لازم به ذکر است که پارامتر کاملا اختیاری است، بدین معنی که یک تابع می تواند هیچ پارامتری نداشته باشد.
  • (بدنه حاوی پیاده سازی و دستورات تابع) Function Body: بدنه ی تابع دربردانده ی مجموعه ای از دستورات است که تعیین می کند تابع چه عملیاتی را انجام می دهد.

مثال : در زیر کد یک تابع به نام ()max را مشاهده می کنید. این تابع دو پارامتر به ترتیب به نام های num1 و num2 (به عنوان ورودی) دریافت می کند و مقداری که از دیگری بزرگتر است را به عنوان خروجی برمی گرداند.

// function returning the max between two numbers
int max(int num1, int num2)  {
   // local variable declaration
   int result;
   if (num1 > num2)
      result = num1;
   else
      result = num2;
   return result; 
}

اعلان تابع (function declaration)

اعلان تابع یا function declaration در حقیقت اسم تابع و اینکه چگونه می توان آن را فراخوانی کرد را به کامپایلر اعلان می کند.

بدنه ی تابع را می توان به صورت جداگانه تعریف کرد.

function declaration از بخش های زیر تشکیل می شود :

return_type function_name( parameter list );

اگر تابع max() را به خاطر داشته باشید، ساختار دستوری زیر بخش function declaration (نوع بازگشتی، اسم تابع و پارامترهای ورودی آن) را مشخص می کند :

int max(int num1, int num2);

اسم پارامتر از اهمیت چندانی برخوردار نیست و صرف ذکر نوع پارامتر ورودی کفایت می کند. بنابراین ساختار دستوری زیر نیز مجاز است :

int max(int, int);

با function declaration شما می توانید تابع مورد نیاز خود را در یک فایل از برنامه تعریف کنید و سپس آن را در فایل دیگری از برنامه به راحتی فراخوانی نمایید. در چنین مواردی، توصیه می شود تابع را در بالای فایلی که قرار است آن را فراخوانی کند، اعلان (declare) نمایید.

 

فراخوانی تابع (function call)

به هنگام ایجاد یک تابع در ++C، توسعه دهنده می بایست یک تعریف از عملیاتی که تابع انجام می دهد را ارائه می نماید. به منظور استفاده از تابع و انجام عملیات مد نظر، شما می بایست آن تابع را فراخوانی کنید.

 

زمانی که یک برنامه تابعی را فراخوانی می کند، کنترل و اجرای برنامه به تابع فراخوانی شده انتقال می یابد. تابع عملیاتی که در بدنه ی آن تعریف شده را انجام داده و زمانی که دستور return اجرا می شود یا اجرا به کاراکتر { می رسد، اجرای به برنامه ی اصلی باز می گردد.

 

به منظور فراخوانی یک تابع کافی است اسم تابع (و ()) را درج کرده و پارامترهای مورد نیاز را به آن ارسال نمایید. چنانچه تابع مورد نظر خروجی یا مقدار بازگشتی داشت، می توانید آن را ذخیره نمایید.

مثال :

#include <iostream>
using namespace std;
// function declaration
int max(int num1, int num2);
int main () {
   // local variable declaration:
   int a = 100;
   int b = 200;
   int ret;
   // calling a function to get max value.
   ret = max(a, b);
   cout << "Max value is : " << ret << endl;
   return 0;
} 
// function returning the max between two numbers
int max(int num1, int num2)  {
   // local variable declaration
   int result;
   if (num1 > num2)
      result = num1;
   else
      result = num2;
   return result; 
}
</iostream>

همان طور که در کد بالا مشاهده می کنید، تابع ()max را داخل تابع اصلی اپلیکیشن که همان ()main می باشد، نگه داشته و سپس آن را به زبان ماشین ترجمه کردیم. زمانی که فایل نهایی را اجرا می کنید، نتیجه ی زیر را بدست می دهد:

Max value is : 200

آرگومان های تابع (function arguments)

چنانچه قرار است تابعی آرگومان داشته باشد، در آن صورت تابع مزبور باید متغیرهایی داخل بدنه ی خود اعلان نماید که از مقادیر این آرگومان ها (داخل تابع) استفاده کنند. این متغیرها در اصطلاح تحت عنوان پارامترهای رسمی یا به انگلیسی formal parameters آن تابع شناخته می شوند.

لازم به ذکر است که پارامترهای رسمی عملکردی مشابه سایر متغیرهای محلی /تعریف شده داخل بدنه ی تابع را دارند که به هنگام ورود اجرا به تابع ایجاد شده و به هنگام خروج از آن نیز نابود می شوند.

به هنگام فراخوانی یک تابع، توسعه دهنده می تواند آرگومان ها را به چند روش شرح داده شده در زیر به تابع مورد نظر ارسال کند :

در روش حاضر کپی از مقدار حقیقی یک آرگومان در پارامتر رسمی یک تابع جایگذاری شده و به پارامتر فرستاده می شود. در این روش، تغییراتی که بر روی پارامتر موجود در بدنه ی تابع اعمال می شود، در واقع هیچ تاثیری بر روی مقدار اصلی و اولیه ی آرگومان نخواهد داشت. زمانی بکار می آید که بخواهید تابع یا هیچ خروجی نداشته باشد و یا حداکثر ۱ مقدار را برگرداند.
Call by value
(فراخوانی کپی از مقدار متغیر)
در این روش فراخوانی، کپی آدرس یا نشانی آرگومان در حافظه در جایگاه پارامتر رسمی جایگذاری می شود (به پارامتر انتقال می یابد). داخل بدنه ی تابع، این آدرس جهت دسترسی به مقدار حقیقی آرگومانی که در تابع بکار رفته، مورد استفاده قرار می گیرد. با توجه به آنچه گفته شد، تغییراتی که بر روی پارامتر اعمال می شود، متعاقبا بر روی آرگومان نیز منعکس می گردد و نتیجتا مقدار اصلی آرگومان در حافظه را تغییر می دهد.
Call by pointer
(فراخوانی با اشاره گر)
در این روش فراخوانی، آدرس آرگومان در پارامتر رسمی تابع جایگذاری شده یا به عبارت دیگر آدرس آرگومان ها به پارامتر ارسال می شود. داخل بدنه ی تابع، اشاره گر به منظور دسترسی به مقدار حقیقی آرگومان مورد استفاده قرار می گیرد. در روش حاضر هر تغییری که بر روی پارامتر اعمال می شود نهایتا بر روی اصل آرگومان نیز منعکس می گردد و مقدار نهایی آن را تغییر می دهد. این روش بیشتر زمانی کاربرد دارد که بخواهید بیش از یک مقدار خروجی تابع باشد.
Call by reference
(فراخوانی متغیر با آدرس یا ارجاعی به محل ذخیره ی متغیر در حافظه)

به صورت پیش فرض، ++C از روش Call by value برای ارسال آرگومان ها (مقادیر) به پارامتر استفاده می کند. همان طور که در جدول بالا ذکر شد، در این روش کد موجود در بدنه ی تابع قادر نخواهد بود مقدار اصلی آرگومان ها را تغییر دهد.

 

در مثال فراخوانی تابع ()max نیز از همین روش ارسال آرگومان استفاده شد.

 

مقادیر پیش فرض برای پارامترها

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

#include <iostream>
using namespace std;
int sum(int a, int b=20) {
   int result;
   result = a + b;
   return (result);
}
int main () {
   // local variable declaration:
   int a = 100;
   int b = 200;
   int result;
   // calling a function to add the values.
   result = sum(a, b);
   cout << "Total value is :" << result << endl;
   // calling a function again as follows.
   result = sum(a);
   cout << "Total value is :" << result << endl;
   return 0;
}
</iostream>

خروجی کد فوق به شرح زیر می باشد :

Total value is :300
Total value is :120