یک تابع چیست؟

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

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

در این آموزش، شما یاد خواهید گرفت –

کتابخانه در مقابل توابع تعریف شده توسط کاربر

هر برنامه C دارای حداقل یک تابع است که اصلی تابع است، اما یک برنامه می تواند هر تعداد توابع را داشته باشد. تابع main () نقطه شروع یک برنامه است.

در برنامه ریزی C، توابع به دو نوع تقسیم می شوند:

  1. توابع کتابخانه
  2. توابع تعریف شده توسط کاربر

تفاوت میان کتابخانه و توابع تعریف شده توسط کاربر اینست که ما نیازی به نوشتن یک کد برای عملکرد کتابخانه نداریم. این در حال حاضر در داخل فایل هدر است که ما همیشه در ابتدای یک برنامه قرار داریم. شما فقط باید نام یک تابع را تایپ کنید و از آن به همراه نحو مناسب استفاده کنید. printf، scanf نمونه هایی از تابع کتابخانه هستند.

در حالی که یک تابع تعریف شده توسط کاربر یک نوع تابع است که در آن ما باید یک بدن از یک تابع بنویسیم و هر بار که ما برای انجام عملیات بعضی از عملیات در برنامه خود، تابع را فراخوانی کنیم.

یک تابع تعریف شده توسط کاربر همیشه توسط کاربر نوشته می شود، اما بعدها می تواند بخشی از کتابخانه “C” باشد. این یک مزیت عمده برنامه نویسی C است.

توابع برنامه نویسی ‘C’ به سه فعالیت تقسیم می شوند مانند

  1. اعلام عملکرد
  2. تعریف تابع
  3. تماس عملکرد

اعلامیه عملکرد

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

تابع declarations (prototype نامیده می شود) معمولا در بالای تابع main () انجام می شود و فرم کلی را می گیرد:

 return_data_type function_name (arguments arguments data_type)؛
  • return_data_type : نوع داده ای از تابع ارزش بازگشت به بیانیه تماس است.
  • نام function_ : با پرانتز دنبال می شود
  • نام دلایل با دلخواه نوع داده خود به صورت اختیاری در داخل پرانتز قرار می گیرد.

ما برنامه زیر را در نظر می گیریم که نشان می دهد چگونه یک تابع مکعب را برای محاسبه مقدار مکعب یک متغیر عدد صحیح اعلام کنیم

 #include <stdio.h>
 / * تابع اعلام * /
 int اضافه کنید (int a، b)؛
 / * پایان تابع declare * /
 int main () {

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

به عنوان مثال، declaration function declaration output_message نشان می دهد که تابع یک مقدار را ارسال نمی کند: void output_message ()؛

تعریف تابع

تعریف تابع یعنی فقط نوشتن بدن یک تابع است. یک بدن از یک تابع متشکل از اظهارات است که قرار است برای انجام یک کار خاص. یک بدن تابع شامل تک یا یک بلوک از اظهارات است. این یک بخش اجباری از یک تابع است.

  int int (int a، int b) // بدن تابع	
 {
	 int c؛
	 c = a + b؛
	 بازگشت c؛
 }

تماس عملکرد

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

  نتیجه = اضافه کردن (4،5)؛

اینجا کد کامل است:

 #include <stdio.h>
 int اضافه (int a، int b)؛  // declaration function
 int اصلی ()
 {
	 int a = 10، b = 20؛
	 int c = add (10،20)؛  // call function
	 printf ("افزودن:٪ d \ n"، c)؛
	 Getch ()؛
 }
 int int (int a، int b) // بدن تابع
 {
	 int c؛
	 c = a + b؛
	 بازگشت c؛
 }

خروجی:

  علاوه بر این: 30

پارامترهای عملکرد

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

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

ما برنامه زیر را در نظر می گیریم که نشان دهنده پارامتر های منتقل شده توسط مقدار است:

 int اضافه (int x، int y)؛ 
 int main () {
   int a، b، نتیجه؛
   a = 5؛
   b = 10؛
   result = add (a، b)؛
   printf ("٪ d +٪ d \ =٪ d \ n"، a، b نتیجه)؛
 بازگشت 0؛}
 int اضافه (int x، int y) { 
 x + = y؛
   بازگشت (x)؛} 

خروجی برنامه:

  5 + 10 = 15

به خاطر داشته باشید که مقادیر a و b برای افزودن تابع به تصویب رسیدند، زیرا فقط مقدار آن به پارامتر x منتقل شد.

دامنه متغیر

دامنه متغیر به معنای دید متغیرها در یک کد برنامه است.

در C، متغیرهایی که درون یک تابع اعلام می شوند، محلی به آن کدک هستند و نمی توانند به خارج از تابع اشاره شوند. با این حال، متغیرهایی که در خارج از همه توابع اعلام شده اند، از کل برنامه قابل دسترسی هستند. Constants با #define اعلام شده در بالای یک برنامه از کل برنامه قابل دسترسی است. ما برنامه زیر را در نظر می گیریم که ارزش متغیر جهانی را از هر دو عملکرد اصلی و کاربر تعریف می کند:

 #include <stdio.h>
 int global = 1348؛
 آزمون void ()؛
 int main () {
   printf ("از تابع اصلی: global =٪ d \ n"، جهانی)؛
   تست () ؛
 بازگشت 0؛}

 void test () {
 printf ("از تابع تعریف شده کاربر: global =٪ d \ n"، global)؛}

نتیجه:

 
 از تابع اصلی: جهانی = 1348
 از تابع تعریف شده توسط کاربر: global = 1348

ما درباره جزئیات برنامه بحث می کنیم:

  1. ما یک متغیر عدد صحیح را با 1348 به عنوان مقدار اولیه اعلام می کنیم.
  2. ما تابع test () را تعریف میکنیم و آن را تعریف میکنیم که نه استدلالها را میگیرد و نه ارزش را به ارمغان می آورد. این تابع فقط مقدار متغیر جهانی را چاپ می کند تا نشان دهد که متغیرهای جهانی را می توان در هر نقطه از برنامه مشاهده کرد.
  3. ما متغیر جهانی را درون تابع اصلی چاپ می کنیم.
  4. ما تابع تست را در orde می نامیم تا مقدار متغیر جهانی را چاپ کنیم.

در C زمانی که استدلال ها به پارامترهای عملکرد منتقل می شوند، پارامترها به عنوان متغیرهای محلی عمل می کنند که هنگام خروج از عملکرد تخریب می شوند.

وقتی از متغیرهای جهانی استفاده می کنید، با احتیاط آنها را استفاده کنید زیرا ممکن است به اشتباهات منجر شوند و می توانند در هر برنامه ای تغییر کنند. آنها باید قبل از استفاده از مقدار اولیه تنظیم شوند.

متغیرهای استاتیک

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

برنامه زیر از یک متغیر استاتیک استفاده می کند:

 #include <stdio.h>
 void say_hi ()؛
 int main () {    
   من int؛
   برای (i = 0؛ i <5؛ i ++) {say_hello ()؛}
    بازگشت 0؛}
 void say_hi () {
   استاتیک int calls_number = 1؛
   printf ("Hi number٪ d \ n"، calls_number)؛
   calls_number ++؛  }

برنامه نمایش می دهد:

 سلام شماره 1
 سلام شماره 2
 سلام شماره 3
 سلام شماره 4
 سلام شماره 5

توابع بازگشتی

فاکتوریل شمارش را محاسبه کنید که به صورت زیر محاسبه می شود: 6! = 6 * 5 * 4 * 3 * 2 * 1./

این محاسبه به صورت مکرر محاسبه واقعیت * (واقعیت -1) انجام می شود تا زمانی که واقعیت برابر با 1 باشد.

یک تابع بازگشتی یک تابع است که خودش را می خواند و شامل یک حالت خروج برای تکمیل فراخوانی بازگشتی است. در مورد محاسبه تعداد فاکتوریل، شرایط خروج از حقیقت برابر با 1 است. رکورس با “جمع کردن” تماس ها تا زمانی که شرایط خروج درست باشد.

مثلا:

 #include <stdio.h>
 int factorial (عدد int)؛
 int main () {    
   int x = 6؛
   printf ("فاکتوریل٪ d است٪ d \ n"، x، فاکتوریل (x))؛ 
   بازگشت 0؛}
 int factorial (int number) {
  اگر (شماره == 1) بازگشت (1)؛  / * حالت خروج * /
   چیز دیگری