تابع های ++C — به زبان ساده
در این مقاله هر آن چه باید در مورد تابع های ++C بدانید را آموزش میدهیم. از جمله این که چه نوع تابعهایی در زبان برنامهنویسی ++C وجود دارند و مثالهایی از شیوه استفاده از آنها ارائه میکنیم. در برنامهنویسی منظور از تابع گزارهای است که کدها را برای اجرای وظیفه خاصی گروهبندی میکند. برای مطالعه بخش قبلی این مجموعه مقالات آموزشی میتوانید به لینک زیر رجوع کنید:
بسته به این که تابع از قبل تعریف شده باشد یا از سوی برنامهنویس ایجاد شود دو نوع تابع وجود دارد:
- تابع کتابخانه
- تابع تعریف شده از سوی کاربر
تابع کتابخانه
تابعهای کتابخانه تابعهای داخلی زبان برنامهنویسی ++C هستند. برنامهنویس میتواند با فراخوانی مستقیم تابع از این تابعهای کتابخانه استفاده کند و نیازی نیست که آنها را خودش بنویسد.
مثال 1
1#include <iostream>
2#include <cmath>
3
4using namespace std;
5
6int main()
7{
8 double number, squareRoot;
9 cout << "Enter a number: ";
10 cin >> number;
11
12 // sqrt() is a library function to calculate square root
13 squareRoot = sqrt(number);
14 cout << "Square root of " << number << " = " << squareRoot;
15 return 0;
16}
خروجی
Enter a number: 26 Square root of 26 = 5.09902
در مثال فوق، تابع کتابخانه ()sqrt برای محاسبه ریشه مربع یک عدد استفاده میشود. به کد <include <cmath# در برنامه فوق توجه کنید. در این کد cmath یک فایل «هدر» (Header) است. تعریف تابع ()sqrt یعنی بدنه تابع در فایل هدر cmath قرار دارد. زمانی که فایل cmath را با استفاده از دستور <include <cmath# در برنامه خود بگنجانید، میتوانید از همه تابعهای تعریف شده در آن استفاده کنید.
تابع تعریف شده از سوی کاربر
++C به برنامهنویس امکان میدهد که تابع خاص خود را تعریف کند. تابع تعریف شده از سوی کاربر به گروهبندی کد میپردازد تا وظیفه خاصی را اجرا کند و این گروه کد یک نام (شناسه) دارد. زمانی که تابع از هر بخش از برنامه فراخوانی شود، کدهای تعریف شده در بدنه تابع را اجرا میکند.
طرز کار تابعهای تعریف شده از سوی کاربر
به تصویر فوق توجه کنید. زمانی که یک برنامه شروع به اجرا میکند، سیستم تابع ()main را فراخوانی میکند، یعنی سیستم شروع به اجرای کد از تابع ()main میکند. زمانی که کنترل برنامه به ()function_name درون ()main برسد، به ()void function_name انتقال مییابد و همه کدهای درون آن را اجرا میکند. سپس کنترل برنامه مجدداً به تابع main بازمیگردد و چنان که در تصویر فوق مشخص است، کد پس از فراخوانی ()function_name اجرا میشود.
مثال 2
برنامه ++C زیر، دو عدد صحیح را با هم جمع میکند. یک تابع به نام ()add ایجاد میکنیم تا اعداد صحیح را با هم جمع کند و مجموع را در تابع ()main نمایش دهد.
1#include <iostream>
2using namespace std;
3
4// Function prototype (declaration)
5int add(int, int);
6
7int main()
8{
9 int num1, num2, sum;
10 cout<<"Enters two numbers to add: ";
11 cin >> num1 >> num2;
12
13 // Function call
14 sum = add(num1, num2);
15 cout << "Sum = " << sum;
16 return 0;
17}
18
19// Function definition
20int add(int a, int b)
21{
22 int add;
23 add = a + b;
24
25 // Return statement
26 return add;
27}
خروجی
Enters two integers: 8 -4 Sum = 4
اعلان پروتوتایپ تابع
اگر یک تابع تعریف شده از سوی کاربر پس از تابع ()main تعریف شود، کامپایلر خطایی نمایش خواهد داد. دلیل این امر آن است که کامپایلر از وجود تابع تعریف شده از سوی کاربر، نوع آرگومانهای ارسالی به تابع و نوع بازگشتی آن ناآگاه است.
پروتوتایپ تابع در ++C یک اعلان از تابع بدون بدنه است که اطلاعاتی را در مورد تابع تعریف شده از سوی کاربر در اختیار کامپایلر قرار میدهد. پروتوتایپ تابع در مثال فوق به صورت زیر است:
int add(int، int);
چنان که ملاحظه میکنید، در پروتوتایپ تابع هیچ بدنهای ندارد. ضمناً تنها نوع بازگشتی آرگومانها ذکر شده و خبری از خود آرگومانها نیست. پروتوتایپ تابع را میتوان به شکل زیر نیز اعلان کرد، اما لزومی به نوشتن آرگومانها وجود ندارد:
int add(int a، int b);
- نکته: اگر بخواهیم تابعی را پس از فراخوانی آن تعریف کنیم، باید حتماً از پروتوتایپ کردن تابع استفاده شود. یعنی قبل از تابع main پروتوتایپ نوشته میشود و به این صورت میتوان در داخل تابع main پیش از تعریف تابع مربوطه، آن را فراخوانی و از آن استفاده کرد.
فراخوانی تابع
برای اجرای کد بدنه تابع، تابع تعریف شده از سوی کاربر باید احضار یا فراخوانی شود. در برنامه فوق دستور زیر:
add(num1, num2);
درون ()main تابع تعریف شده کاربر را فراخوانی میکند. بدین ترتیب تابع یک عدد صحیح بازگشت میدهد که در متغیر add ذخیره میشود.
تعریف تابع
خود تابع به صورت تعریف تابع مورد ارجاع قرار میگیرد. تعریف تابع در برنامه فوق به صورت زیر است:
1// Function definition
2int add(int a,int b)
3{
4 int add;
5 add = a + b;
6 return add;
7}
زمانی که تابعی فراخوانی میشود، کنترل به گزاره اول بدنه تابع انتقال مییابد. سپس گزارههای دیگر در بدنه تابع به ترتیب اجرا میشوند. هنگامی که همه کدهای درون تعریف تابع اجرا شدند، کنترل برنامه به برنامه فراخوانی کننده بازگشت مییابد.
ارسال آرگومان به تابع
پارامتر آرگومان در برنامهنویسی، اشاره به دادههایی دارد که در زمان فراخوانی تابع به آن ارسال میشوند. در مثال فوق، دو متغیر num1 و num2 در طی فراخوانی تابع به آن ارسال میشوند. این آرگومانها به نام آرگومانهای واقعی شناخته میشوند. مقدار num1 و num2 به ترتیب با متغیرهای a و b مقداردهی میشوند. این آرگومانهای a و b به نام آرگومانهای صوری شناخته میشوند.
این وضعیت در شکل زیر نمایش یافته است:
نکاتی در مورد ارسال آرگومانها
- تعداد آرگومانهای واقعی و آرگومانهای صوری باید یکسان باشند. تنها استثنا در زمان Overload کردن تابع است.
- نوع آرگومان واقعی اول باید با نوع آرگومان صوری اول مطابقت داشته باشد. به طور مشابه، نوع آرگومان واقعی دوم باید با نوع آرگومان صوری دوم مطابقت پیدا کند و همین طور تا آخر.
- میتوان تابعی را بدون ارسال آرگومان نیز فراخوانی کرد. تعداد آرگومانهای ارسالی به یک تابع به شیوهای که برنامهنویس برای حل مسئله مربوطه انتخاب کرده است وابستگی دارد.
- در برنامه فوق، هر دو آرگومان از نوع int هستند، اما لزومی نیست که هر دو آرگومان از نوع واحدی باشند.
گزاره بازگشت
هر تابعی میتواند با استفاده از گزاره Return یک مقدار منفرد به برنامه فراخوانی کننده بازگشت دهد. در برنامه فوق، مقدار add از تابع تعریف شده از سوی کاربر با استفاده از گزاره زیر به برنامه فراخوانی کننده بازگشت مییابد:
return add;
تصویر زیر طرز کار گزاره return را نشان میدهد:
در برنامه فوق، مقدار add درون تابع تعریف شده کاربر به تابع فراخوانی کننده بازگشت مییابد. سپس این مقدار در متغیر sum ذخیره میشود. توجه داشته باشید که متغیر بازگشت یافته یعنی add از نوع int و متغیر sum نیز از نوع int است. ضمناً توجه کنید که نوع بازگشتی یک تابع در اعلان تابع تعریف میشود:
int add(int a، int b)
عبارت int در دستور اعلان فوق به این معنی است که این تابع باید مقداری با نوع int بازگشت دهد. اگر هیچ مقداری به تابع فراخوانی کننده بازگشت نیابد، در این صورت باید از نوع void استفاده کنید. بدین ترتیب به پایان این بخش از سری مقالات آموزش ++C میرسیم.
برای مطالعه قسمت بعدی این مجموعه مطلب آموزشی میتوانید روی لینک زیر کلیک کنید:
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامه نویسی C++
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- اشتراک گذاری کد بین اندروید و iOS با ++C — از صفر تا صد
- آموزش ++C — راهنمای شروع یادگیری
- برنامه نویسی شی گرا در C++ — آموزش رایگان، به زبان ساده و جامع
==
سلام
خیلی عالی بود ممنون
سلام لطفا این جمله را اصلاح کنید:
“نکته: در صورتی که تابع تعریف شده کاربر پیش از تابع ()main قرار داشته باشد، اعلان پروتوتایپ ضروری است.”
کلمه “پیش” اشتباه است و به جای آن از کلمه “پس” استفاده شود.
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم.
این مورد اصلاح شد.
برای شما آرزوی سلامتی و موفقیت داریم.
مفید بود
تشکر
سلام
چجوری میشه تابعی نوشت که متغیرای برنامه یا مثلاً فیلدهای استراکچر یا هر چیزی رو دستکاری کنه؟ مثلاً این تابعو تست کردم دیدم کار نمیکنه باید چکارش کنم؟
void lex_ip(char s[15],person* n){
char k[4];
short int l,m=0;
for(int j=0;j==0 or s[j-1] and s[j-1]!=’:’;j++){
if(s[j]!=’.’ and s[j]!=’:’ and s[j]){
k[m]=s[j];
m++;
}
else{
n->ip[l]=atoi(k);
l++;
k[0]=k[1]=k[2]=k[3]=0;
m=0;
}
}
}