قالب وردپرس افزونه وردپرس
خانه / دوره آموزش مقدماتی C و ++C / قسمت پانزدهم آموزش C – مقادیری که توابع برمی گردانند

قسمت پانزدهم آموزش C – مقادیری که توابع برمی گردانند

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

توابع در زبان C به دو روش فراخوانی می شوند که عبارتند از :

فراخوانی توسط ارزش (Call by value) :

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

دستور return به دو صورت زیر بکار میرود :

۱ – return

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

در حالت (۲) ضمن اعلام خاتمه اجرای تابع ، مقداری را نیز به تابع فراخواننده برمی گرداند ( به مثال ۱ توجه کنید . )

مثال ۱ :

#include <stdio.h>
#include <conio.h>
int sqr(int x);
void main()
{
int t=10 ;
printf("\n t=%d,square is:",t);
printf("%d",sqr(t));
getch();
}
int sqr(int x)
{
int y ;
y=x*x;
return y;
}

خروجی حاصل از اجرای برنامه مثال ۱ به صورت زیر است : t=10,aqurare is:100

در مثال ۱ تابع sqr برای انجام عمل توان نوشته شده است که پارامتر آن x بوده و از نوع صحیح  است ( به چگونگی تعریف نوع پارامتر دقت شود ). پس از فراخوانی تابع sqr مقدار آرگومان t در پارامتر x کپی می شود و از این لحظه به بعد هیچ کاری با t نیست . در این تابع ، نتیجه عمل در متغیر y قرار می گیرد و سپس توسط دستور return مقدار متغیر y به تابع فراخواننده برگردانده می شود . این مقدار در نام تابع sqr قرار می گیرد .

فراخوانی توسط ارجاع (Call by reference) :

در این روش ، آدرس آرگومان در پارامتر کپی می شود . لذا در داخل تابع فراخوانده شده ، آدرس آرگومان برای دسترسی به آرگومان مورداستفاده قرار میگیرد و این بدان معنی است که درفراخوانی توسط ارجاع ، پارامترها حاوی آدرس های آرگومان ها هستند. لذا در فراخوانی توسط ارجاع باید آدرس آرگومان بجای مقدار آرگومان به تابع فراخواننده منتقل گردد . بحث بیشتر در این مورد را به مطالعه اشاره گرها (pointer) موکول می کنیم .

مثال ۲ : برنامه ای که کاراکترهایی را از ورودی خوانده و تشخیص می دهد آیا کاراکتر وارد شده a ، b و یا غیر از این دو حرف بوده است . ضمنا این برنامه قبل از انجام عمل مقایسه ، با استفاده از یک تابع کاراکترهای خوانده شده را به حروف کوچک تبدیل می کند ( کد اسکی حروف بزرگ درباره ۶۵ و ۹۱ است که اگر به این بازه ۳۲ واحد اضافه شود کد اسکی حروف کوچک حاصل خواهد شد ) .

#include <stdio.h>
#include <conio.h>
char getcha();
void main()
{
char ch ;
printf("\n type a character:");
ch=getcha();
switch(ch)
{
case 'a':
printf("\n you typed the");
printf("character ‘a’");
break ;
case 'b':
printf("\n you typed the");
printf("character ‘b’");
break ;
default:
printf("\n you typed no ‘a’");
printf("and no ‘b’");
getch();
}
}
char getcha()
{
char cl ;
cl=getch();
if(cl>64 && cl<91)
cl+=32 ;
return cl;
}

نمونه ای از خروجی حاصل از اجرای برنامه مثال ۲ :

type a character : s
‘you typed no ‘a’ and no ‘b

تعریف توابع در داخل یکدیگر امکان پذیرنیست ، اما فراخوانی سطوح مختلف تابع ممکن است . این مطلب در مثال ۳ مشاهده می شود .

مثال ۳ :  برنامه ای که با استفاده از چند تابع ، دو عدد را از ورودی خوانده و با محاسبه مجموع مربعات آن دو ، آنها را به خروجی منتقل می کند .

#include <stdio.h>
#include <conio.h>
int sumsqr(int , int);
int sum(int , int);
int sqr(int);
void main()
{
int num1,num2 ;
printf("\n type two number:");
scanf("%d%d",&num1,&num2);
printf("\nsum of square is:");
printf("%d",sumsqr(num1,num2));
getch();
}
int sumsqr(int j,int k)
{
int j ,k ;
return sum(sqr(j),sqr(k));
}
int sqr(int z)
{
int z ;
return(z*z);
}
int sum(int x,int y)
{
int x,y ;
return x+y;
}

نمونه ای از خروجی حاصل از اجرای برنامه مثال ۳ :

type two number : 12 9
sum of square is : 225

در مثال ۳ از۳ تابع به نامهای sumsqr و sqr و sum استفاده شده است . وظیفه تابع sumsqr محاسبه مجموع مربعات دو عدد num1 و num2 است که برای این کار ، دو تابع sum و sqr را فراخوانی می کند . تابع sqr در دو بار فراخوانی ، مربع دو عدد num1 و num2 را محاسبه کرده و تحویل تابع sum می دهد . این تابع مجموع دو پارامتر خود را که همان مربعات دو عدد num1 و num2 هستند ، محاسبه می کند و برمی گرداند .

نقد و بررسی

User Rating: ۴٫۲۹ ( ۴ votes)

درباره ی آریـان پــور

سلام . آریــان پور هستم . از نویسندگان میکروپـدیا .. علاقه مــند به برنامه نویسی و طراحی وب و شبکه ! دیدگاه ها و نظرات شما دوستان بررسی میشه و باعث دلگرمـی برای نوشتن مطالب بهتر و به روزتر . در تماس باشید با : aryanpour [at] micropedia [dot] ir با مـا همراه باشید ..

مطلب پیشنهادی

قسمت بیست و چهارم آموزش C – عملگرهای اشاره گر

این جلسه بسیار ساده و کوتاه خواهد بود. دو عملگر در مورد اشاره گرها مورد …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پاسخ عبارت زیر را وارد کنید: *