صفحه 1:
« توایع»
صفحه 2:
آنچه در اين جلسه می خوانید
6- توابع کتابخانهاي 6++ استاندارد
توابع ساخت کاربر
9- برنامة آزمون
- اعلانها و تعاریف تابع
©- كاميايل جداكانة توابع
3- متغيرهاي محليء توابع محلي <<<
صفحه 3:
Void تابع -
۸ - توابع بولى
)۱/0( توابع ورودی /خروجی -٩
ارسال به طریق ارجاع (آدرس) -۰
ارسال از طریق ارجاع ثابت -۱
۲ (-توابع بیواسطه
>>>
صفحه 4:
۳- چندشکلی توابع
۴- تابع Qmain
۵- آر گومانهای پیشفرض
صفحه 5:
هدفهاي رفتاري:
انتظار ميرود پس از پایان ايزنهدفسه wis
- اهمیت توابع و مقنایش اسفغادای ازمزلن هادیراز بیارن wai
- «اعلان» و «تعریف» تابع را بدانید و خودتان توابعي را ایجاد
- «برنامة آزمون» را تعریف کرده و دلیل استفاده از آن را بیان
نمایید.
- مفهوم «آرگومان» را بدانید.
- تفاوت ارسال به طریق «ارجاع» و ارسال به طريق «مقدار»
و ارسال به طریق «ارجاع ثابت» را بیان کنید و شکل استفاده از
هر يك را بدانید.
>>>
صفحه 6:
- «تابع بيواسطه» را شناخته و نحوة معرفي آن را
بدانید.
- چندشكلي توابع را تعریف کنید و شیوة آن را
بدانيد.
- طريقة بمكاركيري آركومانهاي بيشفرض را
بدانيد.
- فرق بين تابع 70101 با ساير توابع را بدانيد.
صفحه 7:
١-مقدمه
برنامههاي واقعي و تجاري بسيار بزركتر از
برنامههايي هستند كه تاكنون بررسي كرديم. براي
اين كه برنامههاي بزرك قابل مديريت باشند»
برنامهنويسان اين برنامهها را به زيربرنامههايي
بخشبندي ميكنند. اين زيربرنامهها «تابع» ناميده
ميشوند. توابع را ميتوان به طور جداگانه کامپایل
و آزمایش نمود و در برنامههاي مختلف دوباره از
آنها استفاده کرد.
صفحه 8:
۳- توابع کتابخانهای )++ استانداره
«کتابخانة 6++ استاندارد» مجموعهاي است که
شامل توابع از پیش تعریف شده و سایر عناصر
برنامه است. این توابع و عناصر از طریق
«سرفایلها» قابل دستيابياند.
قبلا برخي از آنها را استفاده کردهايم: ثابت
6 ۱۵/۲ که در oad ay 23 <climits> »
تابع (50۲0 که در Cas ei <cmath> شده است
وه
صفحه 9:
ابع جنر ۳۶ 5()
ريشةه دوم يك عدد مثبت» جذر آن عدد است.
تابع مانند یک برنامة کامل» داراي روند ورودي -
پردازش - خروجي است هرچند که پردازش»
مرحلهاي پنهان است. بعني نميدانيم که تابع روي
عدد 2 چه اعمالي انجام ميدهد که 601/0 60622
حاصل ميشود.
صفحه 10:
برنامة سادة زیر تابع از پیش تعریف شدة جذر را
به كار ميكيرد:
#include <cmath> // defines the sqrt()
function
#include <iostream> // defines the cout object using
namespace std;
int main()
براي و ۷ تابع +560[1() كافي
است نام آن تابع به صورت يك متغير در 4ك
دستورالعمل مورد نظر استفاده شود» مانند زیر: }
y=sqrt(x);
صفحه 11:
اين كار «فر اخواني تابع» یا «احضار تابع» گفته
ميشود. بنابراين وقتي کد (50۲)2 اجرا cag
تابع 0۲1و() فراخواني ميگردد. عبارت « درون
پرانتز «آرگومان» یا «پارامتر واقعي» فراخواني
نامیده ميشود. در چنین حالتي ميگوييم که ۷ توسط
«مقدار» به تابع فرستاده ميشود. لذا وقني x=3
است. با اجراي کد (50۳۲0 تابع ع50۲()
فراخواني شده و مقدار 2 به آن فرستاده ميشود.
تابع مذکور نیز حاصل 0.26000 را به عنوان
پاسخ برميگرداند...
صفحه 12:
متغيرهاي << و لا در تابع 1103113() تعريف شدهاند. مقدار »ر که
برابر با © است به تابع +5011() فرستاده ميشود و اين تابع
مقدار 0.26606 را به تابع ۲3110() برميگرداند. جعبهاي
که تابع +50[1() را نشان ميدهد به رنك تيره استء به اين معنا
كه فرايند داخلي و نحوة کار آن قابل رويت نيست.
صفحه 13:
مثال 0-0 آزمایش يك رابطة مثلثاتي
اين برنامه هم از سرفايل <11323119©> استفاده ميكند. هدف اين
است که صحت رابطة »251102605 510222 به شکل
تجربي بررسي شود.
int main()
{ for (float x=0; x < 2; x += 0.2)
cout << x << "\t\t" << sin(2*x) << "\t“
<< 2*sin(x)*cos(x) << endl;
+
صفحه 14:
صفحه 15:
بسرمیگردلند
(0۰2) 2530 مقتار
08( را
بسرمیگردلند
(0۰2) ۵180 مقار
6( را
بسرمیگردلند
(3.141593) 6611
مقدار 4.00 را بسرمیگردلند
(2) 605 مقدار
7 را
بسرمیگردلند
suis exp )2(
بيشتر توابعلعروف ريالضي كه در خاثين,حسابها هم وجَلود دارد
١! يايلا 70261]6> تعريف شده است. بعضي |
at 1 tsar de guest : sl
سینوس معکوس 5 (به رادیان)
تانژانت معکوس ۲ (به رادیان)
مقدار سقف 2 (گرد شده)
کسینوس ۲ (به رادیان)
asin(x)
atan(x)
ceil(x)
cos (x)
صفحه 16:
(3.141593) ۶۱۵۵۲
مقنار 3.0 را بسرمیگردلند
suis 109 )2(
7 را
sib fea
(2) 10910 مقدار
03 را بسرمیگردلند
(2,3) 00۷ مقنار 8.0 را
sib fea
jus Sin(2)
7 را
بسرمگردلند
(2) 50۳1 مقدار
1 را برمیگردلند
Le Qanw FOrX
مقدار کف ۲ (گرد
شده)
لگاریتم طبیعی (در
ab @
لگاریتم عمومی (در
پایه 10)
Pol به
سینوس ۶ (به رادیان)
جذر >
floor(x
)
log (x)
10010 )
)
pow(x,p
)
sin(x)
sqrt(x)
صفحه 17:
توجه داشته باشید که هر تابع رياضي یک مقدار از
نوع 000016 را برميگرداند. اگر يك نوع صحیح
به تابع فرستاده شود قبل از این که تابع آن را
پردازش کند» مقدارش را به نوع 400016 ارتقا
ميدهد.
صفحه 18:
Ke,
(a سرفایلها از کتابخانة 6 استاندارد گرا re
شدهاند. استفاده از آنها شبیه استفاده از
سرفايلهاي 6++ استاندارد (مانند
مثال اگر sls cul ( <iostream>
را از Qrand بخواهيم تابع اعداد تصادفي
4b san IS 42 <cstdlib> سرفايل
دستور پیشپردازندة زیر را به ابتداي فایل
برنامة اصلي اضافه کنیم:
#include <cstdlib>
Ke, >, fe. ع" |]!
بع "رب
18 زش ]| || Ny | 2 )ام
۸
oO
صفحه 19:
۳- توابع ساخت کاربر
گرچه توابع بسیار متنوعي در کتابخانة 6++
استاندارد وجود دارد ولي اين توابع براي بيشتر
وظايف برنامهنويسي كافي نيستند. علاوه بر اين
برنامهنویسان دوست دارند خودشان بتوانند توابعي
را بسازند و استفاده نمايند.
صفحه 20:
مثال ۵0 تابع ۷06
يك مثال ساده از توابع ساخت کاربر:
int cube(int x)
> // عطبهء دمساع 6۲
return x*x*x;
}
© را برميكرداند.
صفحه 21:
يك تابع ساخت کاربر دو قسمت دارد:
صفحه 22:
ar}
صفحه 23:
صفحه 24:
مثال *0-6 يك برنامة آزمون براي تابع © طاناء()
کد زیر شامل تابع ۷۸06ع() و برنامة آزمون آن است:
int cube(int x)
{ // returns cube of x: a
return x*x*x; برنامة حاضر اعداد صحیح
را از ورودي ميگیرد و
int main() ۱ 3
مکعب آنها را چلپ؛ tests the cube() fundiien // {
تا این که کاربر مقدار 60 int n=1;
| وارد کند )0 =! while (n
را وارك كت cin>>n; {
cout >> ۳۱۲۷/۵۵/۳ >> ۲۱ <<") =" << cube(n)
<< endl; }}
صفحه 25:
هر عدد صحيحي که خوانده ميشود با استفاده از
كد (م0)عناء به تابع عحاباع() فرستاده ميشود.
دقت کنید که تابع 60۸06() در بالاي (main at
تعریف شده زیرا قبل از اين که تابع6 م۱() در تابع
cay) IS 4 ()main کامپایلر ++ باید در بارة آن
صفحه 26:
مثل 6-6 يك برنامة آزمون براي Qmax at
تابع زير دو پارامتر دارد. این تابع از دو مقدار فرستاده شده به آن مقدار بزرگتر را برميگرداند:
int max(int x, int y)
returns larger of the two given integers: // {
int z;
Z=(x>y)?xry;
return Z;
int main()
{ intm,n;
do
4 زم << م << لمك
cout << "\tmax(" <<.m <<""<<n<<") =" <<
max(m,n) << endl; }
while (m != 0);}
صفحه 27:
توابع ميتوانند بیش از یک دستور ۲6۸۲۱ داشته باشند. مثلا تابع 1b (max
مانند اين نیز ميتوانستيم بنویسیم:
دستور ۲۵۱1۲۲ نوعي دستور پرش است
(شبیه دستور 0۲61 ) زیرا اجرا را به
بیرون از تابع هدایت ميکند. اگرچه معمولا
۳ در انتهاي تابع قرار ميگیرد.
ميتوان آن را در هر نقطة ديگري از تابع
قرار داد
صفحه 28:
۵- اعلانها و تعاریف تابع
به دو روش میتوان توابع را تعریف نمود:
0-توابع قبل از تابع 0310() به طور كامل با
بدنه مربوطه آورده شوند.
راه ديگري که بیشتر رواج دارد اين گونه
است که ابتدا تابع اعلان شود» سپس متن برنامة
le ()ain hel پس از آن تعریف کامل
تابع قرار بكيرد.
صفحه 29:
عون ۱
در انتهاي آن قرار دارد.
Gy pad نابم» متن کامل تابع است که هم شامل
یک متغیر قبل از این که به کار گرفته شود باید .
اعلان شود. تابع هم همین طور است با اين فرق
که متغیر را در هر جايي از برنامه ميتوان
اعلان کرد اما تابع را باید قبل از برنامة اصلي
اعلان نمود.
صفحه 30:
در اعلان تابع فقط بیان ميشود که نوع باز گشتي
تابع چیست. نام تابع Come و نوع پارامترهاي تابع
>
همینها براي کامپایلر كافي است تا بتواند کامپایل
برنامه را آغاز کند. سپس در زمان اجرا به
تعریف بدنه تابع نیز احتیاج ميشود که اين بدنه
در انتهاي برنامه و پس از تابع JA ()main
fe
صفحه 31:
فرق بين «آرگومان» و «پارامتر» :
پارامترها متغير هايي هستند که در فورست
پارامتر یک تابع نام برده ميشوند.
پارامترها متغيرهاي محلي براي تابع محسوب
ميشوند؛ يعني فقط در طول اجراي تابع وجود
دارند.
آرگومانها متغیر هايي هستند که از برنامة
اصلي به تابع فرستاده ميشوند.
صفحه 32:
مثل 00 تابع(۳0۵) با اعلان جدا از تعریف آن int max(int, int);
این برنامه همان برنامة آزمون تابع ۳03() در مثل م6 i i
است. اما اینجا اعلان تابع بالاي تابع اصلي ظاهر شده و n: 118/51 ۳
تعریف تابع بعد از برنامة اصلي آمده است: ۷ d
0
زم << مم << مك {
cout << ۳۱۳۵/۳ >> ۲ <<","<<n <<")
۱
<< max(m,n) << endl; }
while (m != 0);}
int max(int x, int y)
{ if (x < y) return y;
else return x;}
صفحه 33:
۶- کامبایل حداگانة توابع
توابع کتابخانة 2)++ استاندارد به همین شکل
پیادهسازی شدهاند و هنگامی که یکی از تن توابع را
در برنامههایتان به کار میبرید باید بادستور
راهنمای پیشپردازنده, فایل آن توابع را به
برنامهتان ضمیمه کنید.
اين کار چند مزیت دارد:
صفحه 34:
۱- اولین مزیت «مخفیسازی اطلاعات» است.
۲-مزیت دیگر این است که توابع مورد نیاز را میتوان قبل
از این که برنامةٌ اصلی نوشته شود. جداگانه آزمایش
نمود.
میتوان تعریف توابع را عوض کرد بدون این که لازم
باشد برنامة اصلی تغییر یابد.
۴-چهارمین مزیت هم این است که میتوانید یک بار یک
تابع را کامپایل و ذخیره کنید و از لن پس در برنامههای
مختلفی از همان تابع استفاده ببرید.
صفحه 35:
تابع ا 111() را به خاطر بياوريد. براي اين که
اين تابع را در فايل جداكانهاي قرار دهيم» تعريف
آن را در فايلي به نام ۳320۰600 ذخیره
ميكنيم. فايل 11137.©122 شامل كد زير است:
ممع .اهس
int max(int x, int y)
if (x < y) return y; {
else return x;
صفحه 36:
حال كافي است include#:4 jhe
م > را به اول برنامه اصلي وقبل
مسمس دن
tH le ane max() function:
qo"
{ cin>>m>>
cout << "\tmax(" <<m<<","<<n<<")
<< max(m,n) << endl;
while (m != 0);}
صفحه 37:
نحوة کامپایل کردن فایلها و الصاق آنها به
يكديكر به نوع سيستم عامل و نوع كاميايلر بستكي
دارد. در سيستم عامل ويندوز معمولا توابع را در
فايلهايي از نوع |(] كاميايل و ذخيره ميكنند و
مينمايند. فايلهاي 1 |(] را به دو طريق ايستا و
پویا ميتوان مورد استفاده قرار داد براي آشنايي
بیشتر با فايلهاي ]اد] به مرجم ویندوز و
كاميايلرهاي 0++ مراجعه كنيد.
صفحه 38:
۶- متغیرهای محلی توابع محلی
متغیر محلي» متغيري است که در داخل یک بلوک
اعلان گردد. این گونه متغیرها فقط در داخل همان
این متغیرها فقط تا وقتي که تابع در حال کار است
وجود دارند.
پارامترهاي تابع نیز متغيرهاي محلي محسوب
ميشوند.
صفحه 39:
* مثال 0-7 تابع فاکتوریل
ی
ni = n(n-1)(n-2)..(3)(2)(1)
زیرء فاکتوریل عدد 10 را محاسبه ميکند:
ion fact(int nm
//returns n! = n*(n-1)*(n-2)*...*(2)*(1) {
if (n < 0) return 0;
return f;
اين تابع دو متغير محلي دارد: 1 و 1
SQN yl متغير محلي است
eres ews CESS)
اعلان شده و متغیر ۶ نیز محلي است
زيرا درون بدنة تابع اعلان شده است.
صفحه 40:
همان گونه که متغیرها میتوانند محلی باشند» توابع نیز ميتوانند محلي
ina باشند.
یک تابع محلي سبمي eon 92555 دیگر به کار رود. با
استفاده از چند تابع ساده و ترکیب آنها ميتوان توابع پيچيدهتري ساخت.
به مثال زیر نگاه کنید.
در ریاضیات تابع جایگشت را با (0)10,1] نشان ميدهند. اين تابع
بیان ميکند که به چند طریق ميتوان 1 عنصر دلخواه از یک مجموعة
0 عنصري را کنار یکدیگر قرار داد. براي اين محاسبه از رابطه زیر
استفاده ميشود:
Pink 7
9 24
R42) = (4- 2)! بط 2 2
صفحه 41:
{// returns P(n,k), the number of the permutations
of k from n:
if (n < 0) ۱۱ ۷ > 0 || k > n) return 0;
return fact(n)/fact(n-k);
1
صفحه 42:
برنامة آزمون براي تابع 06۲۲0() در ادامه آمده است:
long perm(int,int);
returns P(n,k), the number of //
permutations of k from n:
int main()
{ // tests the perm() function:
for (int i = -1; i < 8; i++)
{ for (int j= -1; j <= i+1; j++
cout << "" << per
cout << endl; }
صفحه 43:
۷- تابع void
لازم نیست يك تابع حتما مقداربي را بركرداند. در )++ براي
مشخص کردن چنین توابعي از کلمة كليدي ۷00 به عنوان نوع
بازنگشتي تابع استفاده ميکنند
یک تابع ۷0161 تابعي است که هیچ مقدار بازگشتي ندارد.
از آنجا که يك تابع ۷001 مقداري را برنميگرداند» نيازي به دستور
Cus return ولي اگر قرار باشد این دستور را در J void a
دهيم؛ بايد آن را به شكل تنها استفاده كنيم بدون اين كه بعد از كلمة
۲ هيج جيز ديكري بيايد:
return;
در اين حالت دستور ۲۵۲۷۸۲۲ فقط تابع را خاتمه ميدهد.
صفحه 44:
در بسياري از اوقات لازم است در برنامه» شرطي بررسي شود.
SI بررسي این شرط به دستورات زيادي نیاز داشته باشد» بهتر است که
یک تابع این بررسي را انجام دهد. اين کار مخصوصا هنگامي که از
حلقهها استفاده ميشود بسیار مفید است.
توابع بولي فقط دو مقدار را برميگردانند: 4 false .
ام دول بولی را سرك ۰ سل مواي انح ركس ريا شاك
بولي هميشه به یک سوال مفروض پاسخ بلي یا خیر ميدهند.
صفحه 45:
مثال 0-10 تابعي که اول بودن اعداد را بررسي ميکند
كد زير يك تابع بولي است که تشخیص ميدهد آيا عدد صحیح ارسال شد به آن» اول است یا خیر:
bool isPrime(int n)
returns true if nis prime, false otherwise: // {
float sqrtn = sqrt(n);
if (n < 2) return false; // 0 and 1 are not
primes
if (n < 4) return true; // 2 and 3 are the first
primes
if (n%2 == 0) return false; // 2 is the only even
prime
for (int d=3; d <= sqrtn; d += 2)
if (n%d == 0) return false; // n has a nontrivial
divisor
return true; 1۱ 5 has no nontrivial
divisors
1
صفحه 46:
4- توابع ورودی /خروجی (۱/0)
بخشهايي از برنامه که به جزییات دست و پا گیر ميپردازد و خيلي
به هدف اصلي برنامه مربوط نیست را ميتوان به توابع سپرد. درب
چنین شرايطي سودمندي توابع محسوستر ميشود.
فرض کنید نرمافزاري براي سیستم آموزشي دانشگاه طراحي کردهاید
که سوابق تحصيلي دانشجویان را نگه ميدارد. در اين نرمافزار لازم
است که سن دانشجو به عنوان يكي از اطلاعات پروندة دانشجو وارد
شود. اگر وظيفة دریافت سن را به عهدة یک تابع بگذارید» ميتوانید
جزيياتي از قبیل کنترل ورودي معتبر» یافتن سن از روي تاریخ تولد
و ... را در اين تابع پيادسازي کنید بدون اين که از مسیر برنامة
اصلي منحرف شوید.
صفحه 47:
قبلا نمونهاي از توابع خروجي را دیدیم. تابع ۳۳100366( در مثال 0-0 هیچ چيزي به برنامة اصلي
برنميگرداند و فقط براي جاب نتايج به کار ميرود.
لحتل هب
توابع ورودي نیز به همین روش کار ميکنند آما در جهت معکوس, را وان نف رم
ارسال آن به برنامة اصلي به کار ميروند و هیچ پارامتري ندارند.
صفحه 48:
مثال 00-© تابعي براي دريافق هين
تابع عطلها ژر سح age و هتسه زو ده و ره ی 11
برنامة اصلي ميفرستد. این تابع تقریبا هوشمند استع و oH
ورودي غير منطقيردا برزوميكنمج ##اطدس مكاد
محتببی کنر راب ع و یکرت 2 ویو <a Te BP
if (n> 120) pest, << ‘Na\tYou could not دار
else return a
cout << ۳ again.\n";
صفحه 49:
يك برنامة آزمون و خروجي حاصل از 1 inka de
ye gs the age() function:
giant << “\nYou are " <<a << '" years
An;
0 ۶ 12
Su coul To be 0 120
0 5 Bre ۶ <
Our age could Hot be
ative
0 8 م2 you? 9
-You are 99 years old
صفحه 50:
تا این لحظه تمام پارامترهايي که در توابع دیدیم به طریق مقدار ارسال شدهاند. يعني ابتدا مقدار متفيري که در
فراخواني تابع ذکر شده برآورد ميشود و سپس این مقدار به پارامترهاي محلي تابع فرستاده ميشود.
مثلا در فراخواني (0206)2» ابتدا مقدار < برآورد شده و سپس ابن مقدار به متغیر محلي 0] در تابع فرستاده
ميشود و پس از آن تابع کار خویش را آغاز ميکند. در طي اجراي تابع ممکن است مقدار 9 تغییر کند اما
چون 9 محلي است هیچ تغييري روي مقدار »< تميگذارد.
صفحه 51:
بس خود ۷ به تابع نميرود بلکه مقدار آن درون تابع كپي ميشود.
تغییر دادن اين مقدار كپي شده درون تابع هیچ تاثيري بر * اصلي ندارد.
به این ترتیب تابع ميتواند مقدار »2 را بخواند اما نميتواند مقدار را
تغییر دهد.
به همین دلیل به < یک پارامتر «فقط خواندني» ميگویند.
وقتي ارسال به وسیلة مقدار باشد» هنكام فراخواني تابع ميتوان از
عبارات استفاده کرد.
مثلا تابع ۷06ع() را ميتوان به صورت(3-*۱06)2» فراخواني
كرد يا به شكل ((3) 2[ ناء-(<2*50[16)7) 196لا فراخواني نمود.
در هر یک از اين حالات» عبارت درون برانتز به شكل يك مقدار تكي
برآورد شده و حاصل آن مقدار به تابع فرستاده ميشود.
جلسه پنجم
« توابع»
:آنچه در اين جلسه مي خوانيد
-1توابع كتابخانهاي ++Cاستاندارد
-2توابع ساخت كاربر
-3برنامۀ آزمون
-4اعالنها و تعاريف تابع
-5كامپايل جداگانۀ توابع
-6متغيرهاي محلي ،توابع محلي ›››
-7تابع void
- 8توابع بولي
-9توابع ورودي/خروجي ()I/O
-10ارسال به طريق ارجاع (آدرس)
ت
ق ارجاع ثاب
-11ارسال از طري
-12توابع بيواسطه
›››
-13چندشکلي توابع
-14تابع )(main
-15آرگومانهاي پيشفرض
هدفهاي رفتاري:
بتوانيد:
انتظار ميرود پس از پايان اين جلسه
هدف کلي:
اهميت توابع و مزيت استفاده از آنها ر6ا بيان کنيد. «اعالن» و «تعريف »6تابع را بدانيد و خودتان توابعي را ايجادکنيد.
«برنامۀ آزمون» را تعريف کر6ده و دليل استفاده از 6آن را بياننماييد.
مفهوم «آرگومان» را بدانيد. تفاوت ارسال به طريق «ارجاع» و ار6سال به طريق «مقدار»6و ارسال به طر6يق «ارجاع ثابت» را بيان کنيد و شکل استفاده از
هر يک را بدانيد.
شناخت و معرفي توابع و مزاياي استفاده از تابع در برنامهها
›››
«تابع بيواسطه» را شناخته و نحوۀ معرفي آن رابدانيد.
چندشکلي توابع را تعريف کنيد و شيوۀ آن رابدانيد.
طريقۀ بهکارگيري آرگومانهاي پيشفرض رابدانيد.
-فرق بين تابع voidبا ساير توابع را بدانيد.
-1مقدمه
برنامههاي واقعي و تجاري بسيار بزرگتر از
برنامههايي هستند که تاکنون بررسي کرديم .براي
اين که برنامههاي بزرگ قابل مديريت باشند،
برنامهنويسان اين برنامهها را به زيربرنامههايي
بخشبندي ميکنند .اين زيربرنامهها «تابع» ناميده
ميشوند .توابع را ميتوان به طور جداگانه کامپايل
و آزمايش نمود و در برنامههاي مختلف دوباره از
آنها استفاده کرد.
-2توابع كتابخانهاي ++Cاستاندارد
«كتابخانۀ ++Cاستاندارد» مجموعهاي است که
شامل توابع از پيش تعريف شده و ساير عناصر
برنامه است .اين توابع و عناصر از طريق
«سرفايلها» قابل دستيابياند.
قبال برخي از آنها را استفاده كردهايم :ثابت
INT_MAXکه در < >climitsتعريف شده ،
تابع () sqrtکه در < >cmathتعريف شده است
و. ...
تابع جذر )(sqrt
ريشۀ دوم يك عدد مثبت ،جذر آن عدد است.
تابع مانند يک برنامۀ کامل ،دارايروند ورودي -
پردازش -خروجي است هرچند که پردازش،
مرحلهاي پنهان است .يعني نميدانيم که تابع روي
عدد 2چه اعمالي انجام ميدهد که 41421/1
حاصل ميشود.
تابع از پيش تعريف شدۀ جذر را،برنامۀ سادۀ زير
:به کار ميگيرد
#include <cmath>
// defines the sqrt()
function
#include <iostream> // defines the cout object using
namespace std;
int main()
{ //tests the sqrt() function:
for
(int)(x=0;
x<
6; مانند
x++)براي اجراي يك تابع
کافي
sqrt
تابع
cout << "\t" << x << "\t" << sqrt(x) <<
است نام آن تابع به صورت يک متغير در
endl;
} : مانند زير،دستورالعمل مورد نظر استفاده شود
y=sqrt(x);
اين کار «فراخواني تابع» يا «احضار تابع» گفته
ميشود .بنابراين وقتي كد ) sqrt(xاجرا شود،
تابع )(sqrtفراخواني ميگردد .عبارت xدرون
پرانتز «آرگومان» يا «پارامتر واقعي» فراخواني
ناميده ميشود .در چنين حالتي ميگوييم كه xتوسط
«مقدار» به تابع فرستاده ميشود .لذا وقتي x=3
است ،با اجراي کد ) sqrt(xتابع )(sqrt
فراخواني شده و مقدار 3به آن فرستاده ميشود.
تابع مذکور نيز حاصل 1.73205را به عنوان
پاسخ برميگرداند…
()
Main
… اين فرايند در نمودار زير نشان داده شده.
)(Sqrt
3
1.73205
int
3
x
1.732
05
y
double
متغيرهاي xو yدر تابع )(mainتعريف شدهاند .مقدار xکه
برابر با 3است به تابع )(sqrtفرستاده ميشود و اين تابع
مقدار 1.73205را به تابع )(mainبرميگرداند .جعبهاي
كه تابع )(sqrtرا نشان ميدهد به رنگ تيره است ،به اين معنا
كه فرايند داخلي و نحوۀ کار آن قابل رويت نيست.
مثال 5-2آزمايش يك رابطۀ مثلثاتي
اين برنامه هم از سر6فايل < >cmathاستفاده ميكند .هدف اين
است که صحت رابطۀ Sin2x=2SinxCosxبه شکل
تجر6بي بررسي شود.
)(int main
{
)for (float x=0; x < 2; x += 0.2
“cout << x << "\t\t" << sin(2*x) << "\t
;<< 2*sin(x)*cos(x) << endl
}
خروجي برنامه:
0
0.389418
0.717356
0.932039
0.999574
0.909297
0.675463
0.334988
-0.0583744
-0.442521
0
0.389418
0.717356
0.932039
0.999574
0.909297
0.675463
0.334988
-0.0583744
-0.442521
برنامۀ مقدار xرا
در ستون اول،
خروجي نشان ميدهد که براي هر مقدار
مقدار Sin2xرا
آزمايشي ،xمقدار Sin2xبا مقدار
در ستون دوم و
2SinxCosxبرابر است.
مقدار
2SinxCosx
را در ستون سوم
چاپ ميكند.
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
ماشينحسابها هم تابع
معروف رياضي كه در شرح
بيشتر توابعمثال
وجود دارد
) acos(0.2م قدار
>cmathتعريف شده است .بعضي از اين توابع
در 6سرفايل <
)acos(x
1.36944را
زير نشان داده شده:
جدولراديان)
در( xبه
کسينوس معکوس
ي رداند
ب رم گ
) asin(0.2م قدار
0.201358را
ي رداند
ب رم گ
سينوس معکوس ( xبه راديان)
) atan(0.2م قدار
0.197396را
ي رداند
ب رم گ
تانژانت معکوس ( xبه راديان)
)asin(x
)atan(x
)ceil(3.141593
ي رداند مقدار سقف ( xگرد شده)
م قدار 4.0را ب رم گ
) cos(2م قدار
0.416147را
ي رداند
ب رم گ
) exp(2م قدار
)ceil(x
)cos(x
کسينوس ( xبه راديان)
)floor(3.141593
ي رداند
م قدار 3.0را ب رم گ
) log(2م قدار
0.693147را
ي رداند
ب رم گ
) log10(2م قدار
ي رداند
0.30103را ب رم گ
) pow(2,3م قدار 8.0را
ي رداند
ب رم گ
) sin(2م قدار
0.909297را
ي رداند
ب رم گ
) sqrt(2م قدار
ي رداند
1.41421را ب رم گ
مقدار کف ( xگرد
شده)
لگاريتم طبيعي ( xدر
پايه )e
لگاريتم عمومي ( xدر
پايه )10
xب ه ت وانp
floor(x
)
)log(x
log10(x
)
pow(x,p
)
)sin(x
سينوس ( xبه راديان)
جذر x
)sqrt(x
توجه داشته باشيد که هر تابع رياضي يک مقدار از
نوع doubleرا برميگرداند .اگر يك نوع صحيح
به تابع فرستاده شود ،قبل از اين كه تابع آن را
doubleارتقا
پردازش کند ،مقدارش را به نوع
ميدهد.
بعض=ي از س=رفايلهاي كتابخان=ۀ ++Cاس=تاندارد که کاربرد
اززير آمده
جدول
ايندارند
بيشتري
است :استاندارد گرفته
كتابخانۀ C
سرفايدرلها
سرفايل
استفاده از
شدهاند.شرح
استفاده از آنها شبيه
سرفاي مليکند
تابع < >assertرا تعريف
><assert
هاي ++Cاستاندارد (مانند
><ctype
توابعي را براي بررسي کاراکترها تعريف ميکند
< ) >iostreamاست .براي مثال اگر
><cfloat
ثابتهاي مربوط به اعداد مميز شناور را تعريف ميکند
از
را
()
rand
تصادفي
اعداد
تابع
بخواهيم
محدودۀ اعداد صحيح را روي سيستم موجود تعريف ميکند ><climits
>cstdlibبه كار ببريم ،بايد
سرفايل
><cmath
<کند
تعريف مي
توابع رياضي را
تعريفراميبهکندابتداي فايل
استانداردزير
پردازندۀ
ورودي وپيش
توابعي را برايدستور
><cstdio
خروجي
><cstdlib
توابع کاربردي را تعريف ميکند برنامۀ اصلي اضافه کنيم:
><cstring
توابعي را براي پردازش رشتهها تعريف ميکند
>#include <cstdlib
توابع تاريخ و ساعت را تعريف ميکند
><ctime
-3توابع ساخت كاربر
گرچه توابع بسيار متنوعي در کتابخانۀ ++C
استاندارد وجود دارد ولي اين توابع براي بيشتر
وظايف برنامهنويسي كافي نيستند .عالوه بر اين
برنامهنويسان دوست دارند خودشان بتوانند توابعي
را بسازند و استفاده نمايند.
مثال 5-3تابع )(cube
يك مثال ساده از توابع ساخت كار6بر:6
)int cube(int x
يك { // returns cube of
اين تابع ،مكعب x:
;return x*x*x
عدد صحيح ارسالي
}
به آن را
برميگرداند.
بنابراين فراخواني
) cube(2مقدار
8را برميگرداند.
يك تابع ساخت كاربر دو قسمت دارد:
-2بدنه.
-1عنوان
عنوان يك تابع به صورت زير است:
نام6
(ترها(
(م
(تپ(ارا
(رس
ن66و ع ب666ازگ6شتي )ف(ه
مثال:
int
cube(int
)x
{
…
بدنه تابع
در در
() که
بازگشتي
بدنۀنوع
تعريفآن}
باالعنوان
ادامۀ
cubeكه
بلوكتابعكد است
تابع ،يك
بايد يک
باشد و
cubeم
شاملنام آن
بدنه است.
آيدint .
ميشد،
انجام
استيكه
دستوراتي
تابع
يعني
دارد.
x
نام
به
int
نوع
از
پارامتر
شود تا نتيجۀ مورد نظر به دست آيد .بدنه شامل
)(cubeيک مقدار از نوع intميگيرد و
دستور returnاست كه پاسخ نهايي را به مكان
پاسخي از نوع intتحويل ميدهد.
فراخواني تابع برميگرداند.
دستور returnدو وظيفۀ عمده دارد .اول اين
همۀاين که
که ودردوم
دهد
ي
م
خاتمه
را
تابع
اجراي
که
عبارت )(int main
گرداند.
ي
م
باز
فراخوان
برنامۀ
به
را
نهايي
مقدار
برنامهها استفاده کردهايم يک تابع به نام
يشود:
م
استفاده
زير
شکل
به
return
دستور
«تابع اصلي» را تعريف ميکند .نوع
return
expression
;
بازگشتي اين تابع از نوع intاست .نام
پارامترهاي قرار
فهرست هر عبارتي
expression
جاي
به
آن mainاست و
پارامتريمتغير
هيچرا به يک
يعني آن
است؛ مقدار
خالي بتوان
گيرد که
ي
م
آن
ندارد.با نوع
تخصيص داد .نوع آن عبارت بايد
بازگشتي تابع يکي باشد.
(مون4-
ب(رنامۀ آز
کرديد،
ايجاد
را
نياز
مورد
تابع
يک
وقتي
امتحان
برنامه،
اين
هدف
تنها
که بايد
يک است
برنامۀ باموقتي
برنامۀ
ساده
برنامۀ
يکتابع را
آزمون آن
فورا بايد
باشد؛
»
کثيف
و
سريع
«
صحت
بررسي
و
تابع
کردن
کنيد .چنين برنامهاي برنامۀ آزمون
امتحان
شود:.
يعني
ناميده مي
است.
کار آن
الزم نيست در آن تمام ظرافتهاي
برنامهنويسي – مثل پيغامهاي خروجي،
برچسبها و راهنماهاي خوانا – را لحاظ کنيد.
مثال 5-4يك برنامۀ آزمون براي تابع )(cube
کد زير شامل تابع )(cubeو برنامۀ آزمون آن است:
)int cube(int x
{ // returns cube of x:
بر6نامۀ حاضر اعداد صحيح
;return x*x*x
}
را از ورودي ميگيرد و
)(int main
مكعب آنها ر6ا چاپ ميكند
{ // tests the cube() function:
;int n=1
تا اين كه كاربر مقدار 0
)while (n != 0
را وارد كند.
;{ cin >> n
)cout << "\tcube(" << n << ") = " << cube(n
}} ;<< endl
هر عدد صحيحي که خوانده ميشود ،با استفاده از
کد ) cube(nبه تابع )(cubeفرستاده ميشود.
عبارت
جايگزين
بازگشتي
)(main
تابع،باالي تابع
از() در
cube
مقداركه تابع
دقت كنيد
)(cubeدر
گشتهازواينبا كه تابع
زيرا قبل
تعريف 6شده
coutتابعدر
استفاده از
)cube(n
چاپ دمر6يبار6ۀ آن
خروجي ++بايد
)(mainبه كار رود ،كامپايلر C
شود.
اطالع حاصل كند.
)(cube
)(main
5
5
5
)(mainو تابع
تابع
بين
رابطۀ
توان
ي
م
int
int
125
)(cubeرا شبيه اين شکل تصور نمود:
x
n
)(max زمون براي تابع6 يك برنامۀ آ5-5 مثال
: مقدار بزرگتر را برميگرداند،ر فرستاده شده به آن6 اين تابع از دو مقدا.تابع زير دو پارامتر دارد
int max(int x, int y)
{ // returns larger of the two given integers:
int z;
z = (x > y) ? x : y ;
return z;
}
int main()
{ int m, n;
do
{ cin >> m >> n;
cout << "\tmax(" << m << "," << n << ") = " <<
max(m,n) << endl; }
while (m != 0);}
توابع ميتوانند بيش از يک دستور returnداشته باشند .مثال تابع )(maxرا
مانند اين نيز ميتوانستيم بنويسيم:
استint
max(int
x,
int
)y
دستور returnنوعي دستور پرش
returnsبه{ //
larger of the two given
(شبيه دستور ) breakزيرا اجرا را
integers:
معموال
اگرچه
کند.
ي
م
هدايت
تابع
از
بيرون
;if (x < y) return y
گيرد،
ي
م
قرار
تابع
انتهاي
در
return
دستور
هر
کد
اين
در
;else return x
تابع
از
ديگري
نقطۀ
هر
در
را
آن
توان
ي
م
زودتر
که
return
}
قرار داد.
اجرا شود مقدار
مربوطهاش را بازگشت
داده و تابع را خاتمه
ميدهد.
-5اعالنها و تعاريف تابع
به دو روش ميتوان توابع را تعريف نمود:
-1توابع قبل از تابع )(mainبه طور كامل با
بدنه مربوطه آورده شوند.
-2راه ديگري که بيشتر رواج دارد اين گونه
است که ابتدا تابع اعالن شود ،سپس متن برنامۀ
اصلي )(mainبيايد ،پس از آن تعريف کامل
تابع قرار بگيرد.
اعالن تابع با تعريف تابع تفاوت دارد.
متغيرهاست.
اعالن
شبيه
تابع
اعالن
اعالن تابع ،فقط عنوان تابع است که يک سميکولن
در انتهاي آن قرار دارد.
تعريف تابع ،متن کامل تابع است که هم شامل
بدنه.
است و هم
شامل بايد
گرفته شود
عنوانبه کار
يک متغير قبل از اين که
اعالن شود .تابع هم همين طور است با اين فرق
که متغير را در هر جايي از برنامه ميتوان
اعالن کرد اما تابع را بايد قبل از برنامۀ اصلي
اعالن نمود.
در اعالن تابع فقط بيان ميشود که نوع بازگشتي
تابع چيست ،نام تابع چيست و نوع پارامترهاي تابع
چيست.
همينها براي کامپايلر کافي است تا بتواند کامپايل
برنامه را آغاز کند .سپس در زمان اجرا به
تعريف بدنۀ تابع نيز احتياج ميشود که اين بدنه
در انتهاي برنامه و پس از تابع )(mainقرار
ميگيرد.
فرق بين «آرگومان» و «پارامتر» :
پارامترها متغيرهايي هستند که در فهرست
پارامتر يک تابع نام برده ميشوند.
پارامترها متغيرهاي محلي براي تابع محسوب
ميشوند؛ يعني فقط در طول اجراي تابع وجود
دارند.
آرگومانها متغيرهايي هستند که از برنامۀ
اصلي به تابع فرستاده ميشوند.
مثال 5-6تابع )(maxبا اعالن جدا از تعريف آن ;)int max(int,int
اين برنامه همان برنامۀ آزمون تابع )(maxدر مثال 6-5
)(int main
است .اما اينجا اعالن تابع باالي تابع اصلي ظاهرشده و
{
;int m, n
تعريف تابع بعد از برنامۀ اصلي آمده است:
do
;{ cin >> m >> n
)" << cout << "\tmax(" << m << "," << n
"=
} ;<< max(m,n) << endl
};)while (m != 0
)int max(int x, int y
;{ if (x < y) return y
};else return x
توجه كنيد كه پارامترهاي xو y
در بخش عنوان تعريف تابع
آمدهاند (طبق معمول) ولي در
اعالن تابع وجود ندارند.
-6كامپايل جداگانۀ توابع
توابع=ل
=ن شک=
=
همي
=ه
=
ب
=تاندارد
=
اس
++
C
=ۀ
=
کتابخان
=ع
=
تواب
اغلب اين طور است که تعريف و بدنۀ
پيادهس=ازي شدهان=د و هنگام=ي که يک=ي از آ=ن تواب=ع را
در فايلهاي جداگانهاي قرار ميگيرد .اين
در برنامههايتان ب==ه کار ميبري==د باي==د ب==ا دس==تور
و
شوند
ي
م
1
کامپايل
مستقل
طور
به
ها
ل
فاي
راهنماي پيشپردازنده ،فاي===ل آ===ن تواب===ع را ب===ه
اصلي که آن توابع را به کار
سپس
برنامۀکنيد.
تانبهضميمه
برنامه
ميگيرد الصاق 2ميشوند.
اين کار چند مزيت دارد:
-1اولين مزيت «مخفيسازي اطالعات» است.
-2مزي=ت ديگ=ر اي=ن اس=ت که تواب=ع مورد نياز را ميتوان قب=ل
از اي=ن که برنام=ۀ اص=لي نوشت=ه شود ،جداگان=ه آزماي=ش
نمود.
-3س=ومين مزي=ت اي=ن اس=ت که در ه=ر زمان=ي ب=ه راحت=ي
ميتوان تعري==ف تواب==ع را عوض کرد بدون اي==ن که الزم
باشد برنامۀ اصلي تغيير يابد.
-4چهارمي=ن مزي=ت ه=م اي=ن اس=ت که ميتواني=د ي=ک بار ي=ک
تاب=ع را کامپاي=ل و ذخيره کني=د و از آ=ن پ=س در برنامههاي
مختلفي از همان تابع استفاده ببريد.
تابع )(maxرا به خاطر بياوريد .براي اين که
اين تابع را در فايل جداگانهاي قرار دهيم ،تعريف
آن را در فايلي به نام max.cppذخيره
ميکنيم .فايل max.cppشامل کد زير است:
max.cpp
)int max(int x, int y
;if (x < y) return y
{
;else return x
}
include#:حال كافي است عبارت
<> را به اول برنامه اصلي وقبلtest.cpp
#include
<test.cpp>
:كنيم
اضافه
int main() )(mainاز
{ // tests the max() function:
int m, n;
do
{ cin >> m >> n;
cout << "\tmax(" << m << "," << n << ")
="
<< max(m,n) << endl;
}
while (m != 0);}
نحوۀ کامپايل کردن فايلها و الصاق آنها به
يکديگر به نوع سيستم عامل و نوع کامپايلر بستگي
دارد .در سيستم عامل ويندوز معموال توابع را در
فايلهايي از نوع DLLکامپايل و ذخيره ميکنند و
سپس اين فايل را در برنامۀ اصلي احضار
مينمايند .فايلهاي DLLرا به دو طريق ايستا و
پويا ميتوان مورد استفاده قرار داد .براي آشنايي
بيشتر با فايلهاي DLLبه مرجع ويندوز و
کامپايلرهاي ++Cمراجعه کنيد.
-6متغيرهاي محلي ،توابع محلي
متغير محلي ،متغيري است که در داخل يک بلوک
اعالن گردد .اين گونه متغيرها فقط در داخل همان
هستند.
اعالن مي
اين بلوکي
است
دستيابيکار
قابلدر حال
شوندتابع
وقتي که
متغيرهاکهفقط تا
است پس
چون بدنۀ تابع ،خودش يک بلوک
دارند.
وجود
متغيرهاي محلي
نيز يک تابع
شده در
متغيرهاي
محسوب
متغيرهاي محلي
اعالن تابع
پارامترهاي
براي آن تابعميهستند.
شوند.
* مثال 5-7 6تابع فاكتوريل
اعداد فاكتوريل را در مثال 5-8ديديم .فاكتوريل عدد صحيح nبرابر است با:
)n! = n(n-1)(n-2)..(3)(2)(1
تابع زير ،فاکتوريل عدد nرا محاسبه ميکند:
)long fact(int n
){ //returns n! = n*(n-1)*(n-2)*...*(2)*(1
;if (n < 0) return 0
;int f = 1
)while (n > 1
;f *= n--
;return f
}
اين تابع دو متغير محلي دارد n :و f
پارامتر n 6يک متغير 6محلي است
زيرا در فهر6ست پارامترهاي تابع
اعالن شده و متغير fنيز محلي است
زيرا درون بدنۀ تابع اعالن شده است.
همان گونه که متغيرها ميتوانند محلي باشند ،توابع نيز ميتوانند محلي
باشند.
تابع محلي
يک تابع محلي تابعي است که درون يک تابع ديگر به کار رود .با
استفاده از چند تابع ساده و ترکيب آنها ميتوان توابع پيچيدهتري ساخت.
به مثال زير نگاه کنيد.
در رياضيات ،تابع جايگشت را با ) p(n,kنشان ميدهند .اين تابع
بيان ميکند که به چند طريق ميتوان kعنصر دلخواه از يک مجموعۀ
nعنصري را کنار يکديگر قرار داد .براي اين محاسبه از رابطۀ زير
استفاده ميشود:
!n
P(n, k)
!)(n k
!4
4! 24
P(4,2)
12
(4 2)! 2! 2
پس به 12طريق ميتوانيم دو عنصر دلخواه از يک مجموعۀ چهار
عنصري را کنار هم بچينيم .براي دو عنصر از مجموعۀ {,3 ,2 ,1
است.از:
عبارتکردهاست
}4حالتهاي ممکن
اين تابع ،خود از تابع ديگري که همان تابع فاکتوريل است استفاده
12,
21,
31,
34,
13,در اين
14,شده است.
ممکن استفاده
23,غير
24,حالتهاي
محدود کردن
if32,براي
در دستور
41,کار رفته
42,شرط به
حالتها ،تابع مقدار 0را برميگرداند تا نشان دهد که يک ورودي اشتباه وجود داشته است43.
كد زير تابع جايگشت را پيادهسازي ميكند:
)long perm(int n, int k
{// returns P(n,k), the number of the permutations
of k from n:
;if (n < 0) || k < 0 || k > n) return 0
;)return fact(n)/fact(n-k
}
:() در ادامه آمده استperm برنامۀ آزمون براي تابع
long perm(int,int);
// returns P(n,k), the number of
permutations of k from n:
int main()
{ // tests the perm() function:
for (int i = -1; i < 8; i++)
{ for (int j= -1; j <= i+1; j++)
00
cout << " " << perm(i,j);
010
0110
cout << endl; }
01220
013660
}
014
015
016
017
5040
12
20
30
42
0
24 24 0
60 120 120 0
120 360 720 720 0
210 840 2520 5040
-7تابع void
ك تابع حتما مقدار6ي را بر6گرداند .در ++Cبراي
الزم نيست ي
مشخص کردن چنين توابعي از کلمۀ کليدي voidبه عنوان نوع
باز6گشتي تابع استفاده ميکنند
يک تابع voidتابعي است که هيچ مقدار بازگشتي ندار6د.
از آنجا كه يك تابع voidمقداري را برنميگرداند ،نيازي به دستور
returnنيست ولي اگر قرار باشد اين دستور را در تابع voidقرار
دهيم ،بايد آن را به شکل تنها استفاده کنيم بدون اين که بعد از کلمۀ
returnهيچ چيز ديگري بيايد:
;return
در اين حالت دستور returnفقط تابع را خاتمه ميدهد.
-8توابع بولي
در بسياري از اوقات الزم است در برنامه ،شرطي بررسي شود.
اگر بررسي اين شرط به دستورات زيادي نياز داشته باشد ،بهتر است که
يک تابع اين بررسي را انجام دهد .اين کار مخصوصا هنگامي که از
حلقهها استفاده ميشود بسيار مفيد است.
توابع بولي فقط دو مقدار را برميگر6دانند true :يا . false
اسم توابع بولي را معموال به شکل سوالي انتخاب ميکنند زيرا توابع
بولي هميشه به يک سوال م6فروض پاسخ بلي يا خير ميدهند.
تابعي ك ه اول بودن اعداد را بررسي ميكند5-10 مثال
: اول است يا خير،کد زير يك تابع بولي است كه تشخيص ميدهد آيا عدد صحيح ارسال شده به آن
bool isPrime(int n)
{ // returns true if n is prime, false otherwise:
float sqrtn = sqrt(n);
if (n < 2) return false;
// 0 and 1 are not
primes
if (n < 4) return true;
// 2 and 3 are the first
primes
if (n%2 == 0) return false; // 2 is the only even
prime
for (int d=3; d <= sqrtn; d += 2)
if (n%d == 0) return false; // n has a nontrivial
divisor
return true;
// n has no nontrivial
divisors
}
-9توابع ورودي/خروجي ()I/O
بخشهايي از 6بر6نامه که به جز6ييات دست و پا گير 6ميپردازد و خيلي
به هدف اصلي برنامه مر6بوط نيست ر6ا ميتوان به توابع سپرد .در6
چنين شر6ايطي سودمندي توابع محسوستر ميشود.
فرض کنيد نر6مافزاري براي سيستم آموزشي دانشگاه طر6احي کردهايد
که سوابق تحصيلي دانشجويان را نگه ميدارد .در اين نرمافزار الزم
است که سن دانشجو به عنوان يکي از اطالعات پروندۀ دانشجو وارد
شود .اگر وظيفۀ دريافت سن ر6ا به عهدۀ يک تابع بگذاريد ،ميتوانيد
جزيياتي از قبيل کنترل ورودي معتبر ،يافتن سن از روي تار6يخ تولد
و ...را در اين تابع پيادهسازي کنيد بدون اين که از مسير برنامۀ
اصلي منحرف شويد.
قبال نمونهاي از توابع خروجي را ديديم .تابع )(PrintDateدر مثال 5-9هيچ چيزي به برنامۀ اصلي
برنميگرداند و فقط براي چاپ نتايج به کار ميرود.
اين تابع نمونهاي از توابع خروجي است؛ يعني توابعي که فقط براي چاپ نتايج به کار ميروند و هيچ مقدار بازگشتي
ندارند.
توابع ورودي نيز به همين روش کار ميکنند اما در جهت معکوس .يعني توابع ورودي فقط براي دريافت ورودي و
ارسال آن به برنامۀ اصلي به کار ميروند و هيچ پارامتري ندارند.
مثال بعد يک تابع ورودي را نشان ميدهد.
كاربر
مثال 5-11تابعي براي دريافت سن
)(int age
شده //را {
prompts
the
user
to
input
his/her
سن age
زيرand،
returns
به
دريافت
مقدار
و
کند
ي
م
درخواست
را
کاربر
تابع سادۀ
that value:
عدد int
برنامۀ اصلي ميفرستد .اين تابع تقريبا هوشمند است و هر ;n
صحيح
)while (true
ورودي
درخواست
طور
areو به
you:يکند
ورودي غير منطقي;"را رد م
{ cout
مکرر <<
"How
old
;nتا >>
cinدريافت
120
<<محدودۀ
"\a\tYourدر
ageيک عدد صحيح
اين که
notيکند تا
معتبر م
if (n < 0)7cout
could
;"be negative.
دارد:
else if (n > 120) cout << "\a\tYou could not
;"be over 120.
;else return n
;"cout << "\n\tTry again.\n
}
}
:ست6يك برنامۀ آزمون و خروجي حاصل از آن در ادامه آمده ا
int age()
int main()
{ // tests the age() function:
int a = age();
cout << "\nYou are " << a << " years
old.\n";
}
How old are you? 125
You could not be over 120
.Try again
How old are you? -3
Your age could not be
negative
.Try again
How old are you? 99
.You are 99 years old
ي ابتدا مقدار متغيري که در
تا اين لحظه تمام پارامترهايي ك ه در توابع ديديم ب ه طريق مقدار ارسال شدهاند .يعن
فراخواني تابع ذکر شده برآورد ميشود و سپس اين مقدار به پارامترهاي محلي تابع فرستاده ميشود.
مثال در فراخواني ) cube(xابتدا مقدار xبرآورد شده و سپس اين مقدار به متغير محلي nدر تابع فرستاده
ميشود و پس از آن تابع کار خويش را آغاز ميکند .در طي اجراي تابع ممکن است مقدار nتغيير کند اما
چون nمحلي است هيچ تغييري روي مقدار xنميگذارد.
پس خود xبه تابع نميرود بلکه مقدار آن درون تابع کپي ميشود.
تغيير دادن اين مقدار کپي شده درون تابع هيچ تاثيري بر xاصلي ندارد.
به اين ترتيب تابع ميتواند مقدار xرا بخواند اما نميتواند مقدار xرا
تغيير دهد.
به همين دليل به xيک پارامتر «فقط خواندني» ميگويند.
وقتي ارسال به وسيلۀ مقدار باشد ،هنگام فراخواني تابع ميتوان از
عبارات استفاده کرد.
مثال تابع )(cubeرا ميتوان به صورت) cube(2*x-3فراخواني
کرد يا به شکل )) cube(2*sqrt(x)-cube(3فراخواني نمود.
در هر يک از اين حاالت ،عبارت درون پرانتز به شکل يک مقدار تکي
برآورد شده و حاصل آن مقدار به تابع فرستاده ميشود.