هر برنامه C مجموعه ای از توابع است. همه چیز را در مورد این تکه های مفید قابل استفاده مجدد از کد، از نحوه تعریف آنها تا معنای void بیابید.
ممکن است سینتکس پایه C را با مثالهای ساده پوشش داده باشید، و اکنون متعجب هستید که چگونه برنامههای بزرگتر و واقعی ایجاد کنید. برای شروع، می خواهید کد خود را در بخش های کارآمد، با حداقل تکرار، سازماندهی کنید. در C، مانند بسیاری از زبان ها، پاسخ به مشکلات شما تابع است.
ایجاد و استفاده از توابع در C ساده است و مزایای زیادی به همراه دارد. توابع به شما این امکان را می دهند که برنامه های پیچیده را به قطعات کوچکتر تقسیم کنید. آنها قابلیت استفاده مجدد را هم در برنامه اصلی شما و هم در کتابخانه های مرتبط یا سایر برنامه های جداگانه فراهم می کنند.
برای شروع، باید در مورد اعلانهای تابع، نمونههای اولیه، پارامترها و عبارات بازگشت اطلاعات کسب کنید.
توابع در C چیست؟
در برنامه نویسی C، یک تابع بخشی از کد است که وقتی از آن درخواست می کنید کاری انجام می دهد. این کمک می کند تا کد خود را سازماندهی کنید و به شما امکان می دهد از یک عمل چندین بار بدون تکرار خود استفاده کنید.
ساده ترین مثال نمونه ای است که قبلاً از آن استفاده کرده اید: تابع main(). تابع اصلی به ویژه خاص است زیرا به عنوان نقطه ورودی اصلی برای هر برنامه C عمل می کند. شما همچنین می توانید از توابع کتابخانه استفاده کنید، که آنهایی هستند که شخص دیگری قبلاً نوشته است، یا می توانید توابع تعریف شده توسط کاربر خود را بنویسید.
توابع: اعلام، تعریف و فراخوانی
این سه جنبه برای استفاده از توابع اساسی هستند.
اعلامیه عملکرد
این اطلاعات در مورد نام، نوع بازگشت و پارامترهای یک تابع فراهم می کند و امکان استفاده از آن را قبل از تعریف کامل آن فراهم می کند. به آن نمونه اولیه تابع نیز می گویند. از این نحو ساده پیروی می کند:
return_type function_name(parameters);
جایی که:
- return_type نوع داده مقداری است که تابع برمی گرداند. اگر تابع مقداری را برنگرداند، میتواند هر نوع داده معتبر C باشد یا خالی باشد.
- function_name نامی است که به تابع می دهید. از این برای فراخوانی تابع بعدا استفاده خواهید کرد.
- پارامترها لیستی از پارامترهای ورودی است که تابع می پذیرد، در صورت وجود. هر پارامتر متشکل از یک نوع داده است که به دنبال آن یک نام پارامتر با کاما از هم جدا شده است.
به عنوان مثال، در اینجا یک اعلان تابع ساده وجود دارد:
int add(int a, int b);
تعریف تابع
هنگامی که یک تابع را فراخوانی می کنید، کد مشخص شده در تعریف آن را اجرا می کند. این شامل نام تابع، نوع بازگشت، لیست پارامترها و عباراتی است که رفتار آن را تعریف می کند. در اینجا نحو است:
return_type function_name(parameters) {
// Function body - code that defines what the function does
// Return a value if applicable
return value;
}
بیایید بخش هایی از نحو را تجزیه کنیم:
بدنه تابع: این بلوک کد محصور شده در پرانتزهای مجعد {} است. این شامل دستورالعمل هایی است که مشخص می کند عملکرد هنگام فراخوانی چه کاری انجام می دهد.
عبارت Return: اگر تابع دارای نوع بازگشتی غیر از void باشد، عبارت return مقداری را برای تماس گیرنده ارسال می کند. این مقدار باید با نوع بازگشتی مشخص شده مطابقت داشته باشد.
در اینجا یک مثال ساده از یک تعریف تابع آورده شده است:
int add(int a, int b) {
int sum = a + b;
return sum;
}
فراخوانی تابع
درست مانند آشپزی، ممکن است یک دستور پخت (تعریف عملکرد) و برخی مواد تشکیل دهنده (استدلال) داشته باشید، اما همچنان باید دستورالعمل ها را دنبال کنید تا به نتیجه برسید. فراخوانی تابع تابع را با آرگومان های داده شده اجرا می کند. در اینجا نحو است:
return_type result = function_name(arguments);
آرگومان ها: این ها مقادیر یا عباراتی هستند که به عنوان ورودی به تابع ارسال می کنید. هر آرگومان را با کاما جدا کنید. تعداد، ترتیب و انواع دادههای آرگومانها باید با فهرست پارامترهای تابع مطابقت داشته باشد.
نتیجه: اگر تابع دارای نوع بازگشتی غیر از void باشد، میتوانید مقدار بازگشتی را با استفاده از متغیری از نوع داده مناسب دریافت کنید.
در اینجا نمونه ای از فراخوانی تابع آورده شده است:
#include <stdio.h>
// Function prototype
int add(int a, int b);
int main() {
int x = 5, y = 3;
// Call the function and store the result in 'sum'
int sum = add(x, y);
printf("The sum of %d and %d is %d\n", x, y, sum);
return 0;
}
// Function definition
int add(int a, int b) {
return a + b;
}
با دنبال کردن این سه مرحله – اعلام تابع، ارائه اجرای آن و فراخوانی آن با آرگومان های مناسب – می توانید به طور موثر از توابع برای انجام وظایف مختلف در برنامه خود استفاده کنید.
پارامترهای تابع و مقادیر بازگشتی
پارامترها متغیرهایی هستند که در اعلان یا تعریف تابع اعلام شده اند که به عنوان مکان نگهدار برای مقادیر ارسال شده به تابع هنگام فراخوانی عمل می کنند. آنها به شما این امکان را می دهند که داده ها را به تابع منتقل کنید و آن را قادر می سازند تا با آن داده ها کار کند و دستکاری کند. مقادیر برگشتی مقادیری هستند که یک تابع تولید می کند و به تماس گیرنده ارسال می کند.
دو روش برای انتقال پارامترها وجود دارد.
عبور از ارزش
با این رویکرد، یک فراخوانی تابع مقدار آرگومان واقعی را در پارامتر تابع کپی می کند. تغییراتی که در پارامتر داخل تابع ایجاد می شود، بر آرگومان اصلی تأثیر نمی گذارد.
مثلا:
#include <stdio.h>
int square(int num) {
num = num * num;
return num;
}
int main() {
int x = 5;
int y = square(x);
// Output: x and y after function call: 5 25
printf("x and y after function call: %d %d\n", x, y);
return 0;
}
- تابع مربع یک پارامتر عدد صحیح، num می گیرد.
- تابع مربع مجذور num را محاسبه می کند، مقدار آن را به روز می کند و این مقدار جدید را برمی گرداند.
- تابع main یک متغیر عدد صحیح x را اعلام می کند و مقدار 5 را به آن اختصاص می دهد.
- سپس تابع مربع را فراخوانی می کند و مقدار x را به آن منتقل می کند. نتیجه را به متغیر دوم y اختصاص می دهد.
- پس از فراخوانی تابع، main مقادیر x و y را چاپ می کند. مقدار x ثابت می ماند زیرا تغییر پارامتر num در مربع بر x اصلی تأثیر نمی گذارد.
از مرجع عبور کنید
با استفاده از این روش، آدرس حافظه (نشانگر) یک مقدار را به یک تابع منتقل می کنید. تغییرات ایجاد شده در پارامتر داخل تابع بر مقدار اصلی خارج از آن تأثیر می گذارد.
اشاره گرها، از جمله استفاده از آنها به عنوان پارامتر، یکی از جنبه های C است که آن را از زبانی مانند پایتون متمایز می کند.
#include <stdio.h>
void square(int *num) {
*num = *num * *num;
}
int main() {
int x = 5;
square(&x);
// Output: x after function call: 25
printf("x after function call: %d\n", x);
return 0;
}
- تابع مربع یک پارامتر اشاره گر عدد صحیح (int *)، num می گیرد. مقداری را بر نمی گرداند.
- تابع مربع مجذور مقداری را که num حاوی آن است محاسبه می کند و آن مقدار را با استفاده از عملگر عدم ارجاع اشاره گر * به روز می کند.
- تابع main یک متغیر عدد صحیح x را اعلام می کند و مقدار 5 را به آن اختصاص می دهد.
- سپس تابع مربع را با اشاره گر به x با استفاده از عملگر آدرس-of: &x فراخوانی می کند.
- پس از فراخوانی تابع، main مقدار x را چاپ می کند، که اکنون 25 است زیرا تغییرات به *num در داخل تابع مربع بر x اصلی تأثیر می گذارد.
به طور خلاصه، تفاوت اصلی بین این دو روش این است که چگونه تغییرات پارامتر داخل تابع بر مقدار اصلی خارج از آن تأثیر می گذارد. Pass by value یک کپی ایجاد می کند، در حالی که پاس با مرجع (اشاره گر) امکان دستکاری مستقیم مقدار اصلی را فراهم می کند.
زبانهای دیگر اغلب معادلی از نشانگرهای C دارند، اما معمولاً در سطح بالاتری کار میکنند. یک مثال پشتیبانی سی شارپ از متغیرهای out است.
توابع خالی
توابع خالی در برنامه نویسی C توابعی هستند که مقداری را بر نمی گردند. از آنها برای انجام اقدامات یا وظایف بدون ایجاد نتیجه استفاده کنید. آنها ممکن است پارامترهای خود را با استفاده از pass by reference تغییر دهند، اما مجبور نیستند.
در اینجا مثالی از یک تابع void آورده شده است:
#include <stdio.h>
// Void function with no parameters
void greet() {
printf("Hello, MUO!");
}
int main() {
// Call the void function, output: "Hello, MUO!"
greet();
return 0;
}
توابع Void برای انجام اقدامات، چاپ پیام ها، اصلاح داده ها یا انجام وظایف بدون نیاز به مقدار برگشتی مفید هستند.
کاوش توابع در برنامه نویسی C
تمرین از طریق ایجاد توابع، درک و کاربرد شما را در برنامه نویسی C افزایش می دهد. علاوه بر این، خوانایی کد و سهولت نگهداری را افزایش می دهد. به برنامه های مختلف توابع شیرجه بزنید تا قفل مزایای آنها را باز کنید.
وقتی به اصول توابع C تسلط پیدا کردید و میخواهید خود را به چالش بکشید، به بررسی بازگشتی بپردازید.