صفحه 1:
صفحه 2:
صفحه 3:
«gg»
صفحه 4:
آنچه در این جلسه می خوانید
oles ۳ كتابخانهاى ()++ استاندارد
'!- توابع ساخت كارير
۳ برنامةً آزمون
۳- اعلانها و تعاریف تابع
کامپابل جداکانة توابع
7 یرس سطر: تایه نی
صفحه 5:
هر
توارع بولق
ا ا 4160
-١ ارسال به طريق ارجاع (درس)
۱ - ارسال از طریق ارجاع ثابت
1
)3
صفحه 6:
Eee ee le
OSS) el
|۱۳ to) a
صفحه 7:
هدفهای رفتاری؛
ا 7
oe «تعریف» Ghee ۳ 5 و خودتان توابعى را ايجاد
PolPen prem ip ISS arr I OVEN RpCarer Septal DiTUye ey Oper
peer ben) مفهوم دآ ركومان» -
- تفاوت ارسال به طريق ى «ارجاع» و ارسال به طريق «مقدار» و
ارسال به طريق «ارجاع ثابت» را بيان كنيد و شكل استفاده از هر
يكد را بدانيد.
>>>
صفحه 8:
۳ ew a hee
بدانيد.
- جندشكلى توابع را تعريف كنيد و شيوة آحن را
بدانيد.
Ie De aC مم ا ee
صفحه 9:
| دموتروه
|۱7 oe
برنامههايى هستند كه تاكنون بررسى كرديم.
EEC ل ا ل ل bs)
باشند. برنامهنويسان اين برنامهها رابه
Re CCG a tL Lee)
زيريرنامههها «تابسع» نامیده مى شوند. رت را
0 ا ا
Psy Frame] ل ا ا
كرد
صفحه 10:
glseaty als} سب ارندارد
«كتابخانة ++O استاندارد» مجموعهای است که
ee ere) ل ا ل
برنامه است. این توابع و عناصر از طریق « .. »
قابل دستیابیاند.
قبلا برخی از آنها را استفاده کردهایم: ثاببت
1011٠1 كهدر < ١ > تعريف شده.
تابع (702010 كه در < 220 > تعريف شده است
wed
صفحه 11:
he ab
ريشة دوم يك عدد مثبت مثيت. حذر آن عدد است.
تابع مانند يك برنامة كاملء. داراى روند ورودى -
پردازش - خروجی است هرچند که پردازش»
مرحلهای پنهان است. یعنی نمیدانیم که تابع روی
عدد ۲ چه اعمالی انجام میدهد که ۴۱۴۲۱/۱
حاصل میشود.
صفحه 12:
برای اجرای یک تابع مانند تابع جح() کافی
are ae a ree Ree 0
Pepe ا ا ا py vers
p=sqt(x);
صفحه 13:
See | م تانيع ما داحضار تایسع» گفته
مىشود. بنابراين وقتى كد (:)01+< اجرا شود, تابع
1<() فراخوانى مى كردد. عبارت << درون يرانتز
nen eS DC] eer) Fe wey CD 0
میشود. در چنین حالتی میگوییم که > توسط
«مقدار» به نت فرستاده مىشود. لذا 39 /
است. با اجرای کد (71< تابع ۷۱() فراخوانی
شده و مقدار "ابه لن فرستاده مىشود. تابع مذكور
تحر حاسكل :دراه عنوان ياسخ
صفحه 14:
ا 0
رم نج
5
متغيرهاى « و بر در تابع ۵() تعریف شدهاند. مقدار « که برابر
با ااست به تابع #4() فرستاده مىشود و اين تابع مقدار
۵ .را به تابع ل ا ا 000
را نشان مىدهذ به رنك تيره است, به اين معنا كه فرايند داخلى و
eS) ا 2 055
صفحه 15:
۱ ا any]
این برنامه هم از سرفایل <7۵3> استفاده میکند. هدف این
است که صحت رابطةً :)20 :2) به شکل تجربی
بررسى شود.
ref ca)
{ Por Poatx=O; x < S; x += ©.)
rout << x << "WI" << (C*x) << "\"
>>( رم 2۳ >>
صفحه 16:
io لان
0 0
خروجى نشان مىدهد كه براى هر مقدار
آزمایشی >« مقدار 2:6 با مقدار
rere 0
0
۷
تچ ۱0 ار
سر ۱۳۱۱۱۹
ار الحا .0 1۳
Te
0
ری
ae
9
۳9
صفحه 17:
i a Sc م Tee
ریت شده است. بعفيى إن لين ae
را ee
00 ا ل
asin(x) 1, 0.201358
aie سينوس معكوس + ابه راديان)
(8830)0.2 مقبار
atan(x) 1, 0.197396
بر تنزانت معکوس (بهرادیان)
ceil (3.141593)
ceil(x) 0 aie
5 0 cos (2)
cos (x) 1,0.416147
در رط کسینوس (به رادیان)
suis exp (2)
صفحه 18:
floor(x مقدار كف (كرد floor(3.141593)
مقدار 3.00 را برمیگردلند شده) )
۳۹
0.693147 ,| لگاریتم طبیعی عد (در و۱0
بسرمیگردلند پایه ع)
rere jus Log (2) لك
۹ [
pow(x,p 1, 8.0 ,vi pow(2,3)
جردا نه «به تولن )
صفحه 19:
7 pee teers Er Te ya
lead eee Pelee Tew) نوع
تابع فرستاده شود. قبل از اين که تابع آن را پردازش
كند. مقدارش ex el ارتقا مىدهد.
صفحه 20:
۸
fe
715۳5
© لع ع ٩
اين سرفايلها از كتابخانة 0 استاندارد كرفته ”7
شدهاند. استفاده از آنها شبیه استفاده از
سرفایلهای ()++ استاندارد (مانند
> ) است. برای مثال اگر
بخواهیم تابع اعداد تصادفی له را از
سرفایل <7210> به کار ببریم. باید
دستور پیشپردازندةٌ زیر را به ابتدای فایل
برنامةٌ اصلی اضافه کنیم:
۸ ۸۱ | ۸
<vstdlib> مش
صفحه 21:
Dy ces alin
گرچه توابع بسیار متنوعی در کتابخانةً 0++
استاندارد وجود دارد ولی این توابع برای بیشتر
وظایف برنامهنویسی کافی نیستند. علاوه بر این
برنامهنویسان دوست دارند خودشان بتوانند
توابعی را بسازند و استفاده نمایند.
صفحه 22:
eat eo Ole
Pye Coes an eas Sane | oa
tot vube(tat x)
{ ac Nac oa ate eS
ca ed
return کرک
صفحه 23:
یک تا
بع سا< 3
خت كارير دو ق
7 اح
عنوان 5 تابع به
8 بر
۳۳ aT
1 7
ست:
صفحه 24:
روص و۲۳ ae عمده قاب اول اين كه
اجراء pipe
نها ay ime ae
coli! pq كرددايم 5-1 كت به نام «تابع
اصلى» را تعريف م ىكند. نوع باز كشتى
اين تابع از نوع #وااست. نام آلن 5د
mean و و كه
ست؛ یعنی هیچ پارامتری ندارد. وع
سس
eee ee 0 مه
= . {=
صفحه 25:
Ao po آزسون و
تنها هدف این برنامه. امتحان
كردن تابع و بررسی صحت
بر = ms 2
برچسبها و راهنماهای خوانا - را لحاظ کنید.
صفحه 26:
مثال ۵-۴ یک برنامهةً آزمون برای تابع علح()
AC run eee EC 00
برنامهً حاضر اعداد صحیح
رااز ورودى مى كيرد و
0
gad Sh کر
مكار د را رجاه تي
tot vube(tat x)
اس
0000 a atc ORO can
0 20:
white (a != O)
9
a <<") = "<< pube(a) << eo); }} << ما مت
صفحه 27:
هر عدد صحیحی که خوانده میشود. با استفاده از
کد et cay عل na میشود.
۰ | PY ee
دقت كنيد كه oo Fan EO AC ar تعریف
شده زيرا قبل از اين كه 7 ENO at 2-495 () به كار
رودء كاميايلر (00++ بايد در بارةٌ آن اطلاع حاصل كند.
main() cube()
5 ع
لما ل pea 0 ۳ 9
تصور نمود: a ۳7
صفحه 28:
مثال 0-8 يك برنامة آزمون براى تابع ©(
اا ا ا PU Pee
سا سس
mee ee ا 11
سس
|
صفحه 29:
دستور 202020 نوعى دستور يرش است
(شبیه دستور . . ) زیرااجرارابه
لك ل a> S|
07 20202 درانتهاى تابع قرار
ce رس الس
ديكرى از تابع قرار داد.
صفحه 30:
به دو روش ميتوان توابع را تعريف نمود:
-تولبع قبل از تابع 7۵0() به طور کامل با بدنه
مربوطه آورده شوند.
-راه ديكرى كه بيشتر رواج دارد اين كونه
است که ابتدا تابع اعلان 01000
|
قرار بگیرد.
صفحه 31:
لت لت لت لب تمس لد
520 اعلان مه Ewer 2 ire) es
۷ Come ce) peri ea
Sy Pw Prom pp)
ايك Bd CS ISS er) paste
:اعلان شود. تابع هم همين طور است با اين فرق
كه متغير رادر هر جايى از برنامه میتوان اعلان
کرد ا.ا تابیر را راب د قبل از برنامة اصلی الا
نمود.
صفحه 32:
در اعلان. تابع فقط 9 مى شود تك نوع
تابع .نام ets a ae
همينها براى كاميايلر كافى است تا بتواند
کامپایل برنامه را آغاز کند. سپس در زمان اجرا
به تعريف بدنة تابع نيز احتياج مىشود كه اين
بدنه در انتهاى برنامه و يس از تابع 25ت () قرار
مى كيرد.
صفحه 33:
: ارگومان _ پارامتر oe
) متغیرهایی هستند که در فهرست
يارامتر يك تابع نام برده مى شوند.
pene) ا ی
میشوند؛ یعنی فقط در طول اجرای تابع وجود
۰۳
202 متغيرهايى هستند كهاز برنامة
اصلى به fold فرستاده مى شوند.
صفحه 34:
waren tne); بر
iat wai)
) ۸
dy
زو << مه << وو {
>> و ک> )م۱۱ >> نوس
صفحه 35:
ee
| تاتداردر در ۱۱۱۱۵
يبادهسازى شدداند و هنكامى كه يكى از لن توايع را
در برنامههایتان بسه کار میبرید باید با دستور
راشای پیش بر دازنددء 0 توابع رابه
hed QUA كثيدر
FF رت
صفحه 36:
۱- اولین مزیت «مخفیسازی اطلاعات» است.
۲-مزیت دیگر این است که توابع مورد نیاز را میتوان قبل
از این که برنامة اصلی نوشته شود. جداگانه آزمایش
نمود.
۳-سومین مزیت این است که در هر زمانی به راحتی
میتوان تعریف توابع را عوض کرد بدون این که لازم
باشد برنامة اصلی تغییر یابد.
۴چهارمین مزیت هم این است که میتوانید یک بار یک
تابع را کامپایل و ذخیره کنید و از تن پس در برنامههای
مختلفی از همان تابع استفاده ببرید.
صفحه 37:
رت
صفحه 38:
رک
اول برنامه اصلی وقبل از اضافه کنیم:
cee Rec ee ی
اه ز
Sct er ORS ae
00000
2
۱
الي ۱
<< wax(w,a) << eo;
صفحه 39:
نحوةٌ كاميايل كردن فايلها و الصاق آنها به
ee nCe) ا ا Fee rN eer
PEED] Dea ا PD
رادر فايلهايى از نوع و
Peers) 7 0
بيشتر بافايلهاى ,ارا(ا) به مرجع ويندوز و
كاميايلرهاى ()++ مراجعه كنيد.
صفحه 40:
ee eee
اعلان گر دد. ۱ نه متغیر ها فقط در دا<
پارامترهای تابع
محلى براى آن تابع هستند.
صفحه 41:
22010 an ae
BOROW Be beh F Se eet Foyer POE CET 7 WBS LOIN SpyecIC Ee
0 ..)0()()0(
BR 7
وا هام
۰ ۱
للك اش
Stel
WE =a)
PAS or;
ca
صفحه 42:
Bee Pepe ye oom ercmy ee) باشند تن
باشند.
1 Sl Ree Mey oS Coen ee eS
eo eve We ا ree eee Bee ene ا
ساخت. به مثال زير نكاه كنيد.
0000 Te
ا ل ا ا ا ل Polar
مىكند كه به جند طريق مىتوان >اعنصر دلخواه از يك مجموعة -
۰ 7
استفاده مى شود:
صفحه 43:
0 ا ا otro ee
۳ ا SF oe)|
شرط به كار رفتهدر دستور “#براى محدود كردن
Tene ا ا ال ل ا ا ا 01
تابع مقدار ٠ را برمى كرداند تانشان دهد كه يك ورودى
اشتباه وجود داشته است.
ی هن سمتت اما
ee ac Aa i) Ree et eee ead
F(a <Q) || ١ > © || (ه < ؟! ret O;
تست يي
صفحه 44:
Pom ESOL NBEO. ac ant bey oi Ab
UN AA Nea em aaa
۱
میمصت
joo ۱
6 ا Por (Gre eH)
ere
vot << pod OG@ dear ee o
i 956 60 160 560 ۵0۵
SPO. S680 و2 وحن + لبن
صفحه 45:
vor gi -۷
لازم نیست یک تابع حتما مقداری را بر گرداند. در ۶++ برای
۱
باز كشتى تابع استفاده مى كنند
ل ل ال ات
از آنجا که یک تابع لس مقداری را برنمی گرداند. نیازی به دستور 9
reser SBIR eee eee ele Sec Crowe
به شکل تنها استفاده کنیم بدون این که بعد از کلمةٌ نم تم .۶
دیگری بیاید:
۳۳2
CSW ال NaN ay re Ren caus] a)
صفحه 46:
rope ۳ 1۱ ا ا
ere استفاده مى شود بسيار مفيد است.
رت ا ee
ال رن
owe ters] ا et Se re ie ed Oo ۱
صفحه 47:
مثال ۵-۱۰ تابعی که اول بودن اعداد را بررسی میکند
كد زير یک تابع بولی است که تشخیص میدهد آیا عدد صحیح ارسال شده به آن, اول است یا خیر:
اس مها
Race A ate aa ee oe 10
ی مت مزا
// O ood ( we wit priwes ۱
[CO od 9 oe the Pret prives ۱
PF (a%C == O) retura Poe} // © is the oly eves prive
Lael (ic Re Ros a HR talc)
(QMO) aisha eam es ieee
retura fru; USN aaa aa es cece
صفحه 48:
(VO) توابغ ورودق /خروجی -٩
بح 1۱۳
به هدف اصلى برنامه مربوط نيست را مىتوان به توابع سيرد. در
چنین شرایطی سودمندی توابع محسوستر میشود.
BND EC See eer cE Se) الم
كرددايد كه سوابق تحصيلى دانشجويان را نكه مىدارد. در اين
Or Ps) Ibe ee ا 0000
دانشجو وارد شود. اكر وظيفة دريافت سن را به عهدةٌ يك تابع
.۰ جزییاتی از قبیل کنترل ورودی معتبر. يافتن سن
از روی تاریخ تولد و ... را در اين تابع پیادهسازی کنید ... ..
از مسير برنامة اصلى منحرف شويد.
صفحه 49:
ec) ا اا ا ل لاا ا
۵-٩ 0 0 اصلی برنمی گرداند و
فقط برای چاپ نتایج به کار میرود.
ابن ارت 3 :نات ١ توابع خروجی . . یعنی توابعی که
فقط برای چاپ نتایج به کار میروند و هیچ مقدار باز گشتی
ندارند.
.سا نیز به همین روش کار میکنند اما در جهت
رت ۳
el tpeE exes el ewd] ۱
ندارند.
صفحه 50:
een) مثال ۵-۱۱ تابعی برای دریافت سن کاربر
رس عفص ارسي ا ع سي 007
7
PEP bo5)) cuelys y2 4 Se FE ede el CD eae ek SED
1۱ ot ga hea ee eRe 0
مى ين ست
الا ينا
PF (a < O) wu << “Wow wee cod wt
be vexnive.";
ebe F (ac > (CO) pou << "\l/ou coud wot
aa el
eee 5
a Ai >> بود
صفحه 51:
fom eM AN Brel bn ener pear eres A eres
اسف
ابر
{ [ests the ae() Puowtiva:
)صم د مم
Ae م ا و ل ی ام
57
Nae Rn av)
تسم
0
سنطكيوكه صط اص للنوص جكب عسويو نا
ماده بصا
512101011116
امس ا
0
صفحه 52:
sails لحظه aes] يارامترهايى كه 8 توابع ديديم به
طریق SO | aD ا 10
ROO ES ES ere eee ne Peper Cy
eee ee at eer Eee] 1
0 ۱
سپس این مقدار به متغير محلى ES تابع فرستاده
میشود و پس از آّن تابع کار خویش را آغاز میکند. در
0
۰ محلی است هیچ تغییری روی مقدار « نمی گذارد.
صفحه 53:
پس خود به تابع نمیرود بلکه مقدار آن درون تابع کپی میشود.
ee Oe ee See ae an eS SEE eer ee ne Leer)
به اين ترتيب تابع مى تواند مقدار »ارا بخواند اما نمى تواند مقدار »درا
تغيير دهد.
به همین دلیل به « یک پارامتر «فقط خواندنی» میگویند.
وقتی ارسال به وسیلةٌ مقدار باشد. هنگام فراخوانی تابع میتوان از عبارات
استفاده كرد.
aC Aeon co) لل ا eC oe ae) eer نك
Pepe (eM a Cont (o)) Bp ear ry 0
حالات. عبارت درون يرانتز به شكل يك مقدار تكى براورد شده و حاصل
آن مقدار به تابع فرستاده میشود.
صفحه 54:
هرت
ا peppy ocd pea tne) pret] 00
ey
اما كاهى اوقات عمدا مىخواهيم اين اتفاق رخ
دهد. يعنى مىخواهيم كه تابع بتواند محتويات
متغير فرستاده شده به اسن را دس تكارى كند. در
اين حالتا٠زف << -2 استفاده
مى كنيم.
صفحه 55:
برای این که مشخص کنیم یک پارامتر به طریق ارجاع
ارسال میشود. علامت را به نوع پارامتر در فهرست
يارامترهاى تابع اضافه مى كنيم. اين باعث مىشود كه تابع
Cure A ا ل ا ا م
خود آرگومان محلی را به کار بگیرد.
به این ترتیب تابع هم میتواند مقدار آر گومان فرستاده
FEC Seared Creel ire Selle prac
ee eaten ا eee Ne
خواهد بود.
صفحه 56:
هر تغييرى كه روى يارامتر ا ا 7
۱
* مثال ۵-۱۲ تابع جمط)
Ree BPO ees Boil ۱
vord swap(Piout& x, Pioat& py)
۱0/۳ و مت مر
هدف این تابع جابجا کردن دو عنصری است
rr cae ل ree 1۱
پارامترهای >«و مربه صورت پارامترهای
۱
ماما سنا
صفحه 57:
ل ل 0 ارسالی
Pow SL ees OP vel el 1 NT pee toy alk Hee econo)
votd swap(Pioat&, Piot&)
وت رم رات رت
تیمک
atc, a AT |
Ha biel oleh oil ol wlohe)
eek ee <a ee |
صفحه 58:
وقتى فراخوانى (ط,هك)صيح اجرا مىشود. »ابه رن
مىكند و عإبه ط سيس متغير |
BEES ens Sil ere peg comp TU ee COE BCE E)
از آلن مقدار بم(كهيجمان حااست) درون
0 میگیرد ا
میشود. نتيجمة :4581 إِينْ است كه مقادي
جابجا می شوند. سل مقابل نشان میا
مى د هذ : ر) ووو بعد از بازگشت fe) جابجايى
1
float&
float&
لت
float
صفحه 59:
1
vord swap(Poat&, Pioat&)
ROWS pes OBC TSSOP A ees Po ee]
1۳ برنامهنویسان 7 عادت دارند كه عملكر ارجاع و6
ا ا ان ان
PSP eek ل ا ا ل OBS)
0
صفحه 60:
۲ Beebe ENO ato)
۱ a ey ener yy
۳ n 9) pe wont eb) ا A)
7 0 ل S| era eo
A Reo Ml dame
۳ OS |
P(,b)
wou << "a= "<<u<<"\b="<<b << ocd
رت سوت
eS SE الج >> ط >> " د نز
ا (مرهه , عدم)ع لد
2م © ( ۱
ته وو رن
صفحه 61:
00 TO NO FBR Tee SIN Ces
Cha Roane reared
۲)(
۳ 22
10
cane
صفحه 62:
در جدول زير خلاصة تفاوتهاى بين ارسال از طریق مقدار و ارسال
7
00
jint x
Cee wee
*مترادفبا آركومازلست
| و
آ رگومان ارسال شده از طبریق ارجاع فقط باید
يك متغيس باشد
آركومان نواندنى- نوشتنى است
a اه
Pah a 4
eee Pee.
Cee Pe sen
CORP Ar Sia io wer)
آركومان ارسال شده از طبریق مقدار میتواند
يك ثابته يك متغيس یا یک عبارت باشد
آركومان فتط خواندنى است
صفحه 63:
يكى از مواقعى كه يارامترهاى ارجاع مورد نياز
more BE Eatery ا 0
7(
دستور a Nat 0 مىتواند يك مقدار ۳
۹
بنابراين اكر بايد بيش از يك مقدار بر كشت داده
شودء pple roe) پارامترهای ارجاع انجام مى دهند.
صفحه 64:
۷ FY ea av OME?
ae At PP ee dee SNCS Pe Be ioc
جح أمس جوج (محيط و مساحت) براى دايرهاى كه شعاع آن عدد
مفروض «است:
arcu, double& vircucPereuwe, ل
ام
۸/۱ ان Ne AS ahh ane ee oats
Pac tg
رت ارت بت ره رت رت ره یت لا ل
Cod baat ال
ماس ات تس مت المع
1
صفحه 65:
برنامة آزمون تابع فوق و يك اجراى آزمايشى آن در شكل زير نشان
داده شده است:
لي گت مس مگ سر
oF a circle wits // ام لعن يا يس يدا
مه
هط
۱
Pe oe ain id
He AC ata
<< جوز
صفحه 66:
ارسال پارامترها به طریق ارجاع دو خاصیت مهم دارد:
این که تابع میتواند روی آر گومان واقعی تفییراتی بدهد
er CES SPO ee be Cae| 1
ly SI RU wont been SES) اك
. این روش مانند ارسال از طریق
ارجاع است با اين فرق كه تابع نمى تواند محتويات يارامتر ارجاع
tr el Mento CrOwny by 1 ۱
براى اين كه يارامترى رااز نوع ارجاع ثابت اعلان كنيم بايد
es ا ا 0
صفحه 67:
مثال ۵-۱۵ ارسال از طریق ارجاع ثابت
سه طریقه ارسال پارامتر در تابع زیر به کار رفته است:
a et 9) ۱
3
تصش
Peet ee ee I eo Sd
لو >> >>
صفحه 68:
۱
يمي يننا ۳ اج
میا
مها را ۱
۱
Peet he ed a
eC SRT Cre 1 وت
CRE be Ser ل | eno
۰ سس«
Se PILES Tee) 3
CO Re we. wikis eerie)
EIT OO Tae See beatae)
روى آركومان طهم تاثير مىكذارد زيرا ط
از طريق ارجاع به تابع فرستاده شده.
صفحه 69:
ee RC peer Ron Bao ee ene aed]
BT Le Oe eee en wey we ES evar
مى كنند مثل آرايهها يا نمونة كلاس_-ها كه در
02000 0م Lene
ee ا ا ل
ا 2
صفحه 70:
تسولبع بسپلسطه -16
تابعی که به شکل بیواسطه تعریف میشود. ظاهری شبیه به تولبع
معمولی دارد با این فرق که عبارت ۲ در اعلان و تعریف آنن
قبد شده است.
ها
۱
falta tot rube(tat 2)
Race A aes
خم
ار ها تما
صفحه 71:
. به برنامهةٌ آزمون زیر نگاه کنید:
بر
:مصاعصخذا ()وطدج صذا كاوها | )
ripe Seer ا رد ی
داشته باشد. مثلا اكر يك تابع بىواسطه ee
6 خط كدباشدواين تابع روم ويل نقطية,
ا لمم د
١ eet
صفحه 72:
چندشکلیتولیع -16
در + میتوانیم چند تابع داشته باشیم که
Free ee.) دارند. در این حالت میگوییم که
تابع مذكور, جندشكلى دارد. شرط اين كار آسن
است كه فهرست يارامترهاى اين توابع با يكديكر
تفاوت داشته باشد. يعنى تعداد يارامترها متفاوت
باشد با دست کم یکی از ارا تاق متتاظر هم
نوع نباشند.
صفحه 73:
مثال 0-11 جندشكلى تابع >5 ()
۱ Same) oe)
9 eee Ee i ee Ray) cea)
میگیریم:
رسمه
tat war(tet, te, tof);
fof wax(doubk, dole);
tot wain()
{ wt << um(9,P?) <<" << wn(SO,89,99) <<
۱۰ >> )سس 6060.6 ,.6© .©(:
i
صفحه 74:
v) ۵ب موی با
تحص مهب مب عا ۴ مومت سا یو || )
vetura («> py ? xiv);
}
ket rant >, tol, ۸ z)
وه مورف oP he tere موم the بو | )
(رر ی درجم عم
4( :2 ۰ <2<) موم
}
Rie hese a are
MERE ROTC اي ا ا
Gey ٩ ۶ باق
۷
صفحه 75:
در این برنامه سه تابع با نام «() تعریف شده است.
لكت ل ا ا ا ل ان
م م ا 0
Oey ا ل مه ۱
Clee OLE. at م ل م ا Ew cs
ارسال شده. يس نسخهداى كه دو يارامتر وادر فهرست
يارامترهايش دارد فراخوانى مىشود. اكر اين نسخه
20 وجود نداشته باشد. کامپایلر #هارابه
میدهد و سپس نسخداى كه دو 7 طاطحلك دارد را
فرا مىخواند.
صفحه 76:
(Oxo تابع -۴
۱ Rey oe oe Opel eels
هستند. 0
Pe ETD PEC el gripe Sc mon BT) nar Es Omt esa)
همراه Oras sir در حقيقت هر برنامه كاملء از يى
توابع ديكر تشكيل شده است كه هر يك از اين توابع به
)(۵۲ شکل مستقیم یاغیر مستقیم از درون تابع
00
صفحه 77:
خود برنامه با فراخوانی تابع ۵۳() شروع میشود.
چون این تابع یک نوع باز گشتی ۱ دارد. منطقی است که بلوک
دمص eS
Hee Reenter as OamT | SrA rece ل
ذكر نكرد.
SSIES ren ha a Byrn Cape re ae Ibe)
ere ed EP BC Mey be EE CC MED Pe DRED BeBe
به این معنا که برنامه بدون خطا پایان گرفته است.
oy ee el Te a gy mere DL mec) a)
Peer Se Cee U eer Bers
صفحه 78:
مثال 0-١ استفاده از دستور هؤْه: براى يايان دادن به يى برنامه
اماه
ب لي للا
Cay oe) ل ل 30 :لك ره ها
را به قراخواننده بازمی گرداند. به همین دلیل است
كه اجراى دستور محف ةك در تابع 45 () كل برنامة 27" >> ابوس
را خاتمه مىدهد. << ی << وی
P (d = = O) rete 0:
pout <<a << "/" << d << "=" << did << ech;
i
نت يمد ين
تت
صفحه 79:
صفحه 80:
مثال ۹٩ ۵-۱ استفاده از تابع ۳۳4 برای پایان دادن به برنامه
تم a ORO وت دس رز
dePces ti oto ood pout bbe || = ا
Re a a
دراین برنامة اگر کاربر عدد ۰را تم ی
رم ۱
مییابد و برنامه بدون هیچ مقدار double x; {
ا ا Pere
PR Stace oH
}
Cee eee Ca oe - eee
و سس ها عسه | )
Poe dete) 0 cE ea acd
+ م00 یمس
صفحه 81:
آیکو مارهاو ینور ض- 19
در (0)++ مىتوان تعداد ۱۳ تابع را در زمان اجرا به
دلخواه تغيير داد.
BO per eR TS Rests oer co sore ee ger |
امکانپذیر است.
9 SON SOG we Bee ROSE neve iC be
فهرست پارامترهای تابع و جلوی پارامتر مربوطه به همراه علامت مساوی
۱
Ore Rey TP rd nl ee) nd a PORES De ا
BMP res econ on el SIT ael Op cs
صفحه 82:
مثال ل ور جر با بح کت
5-5
30 زير حاصل جند جملهاى درجه سوم را اك
این مقدار از الگوریتم هورنر استفاده شده. ل ا ري
1 بيشتر. محاسبه به صورت
oe 2 > ان eee ل
mnt << دا p(x,P,O) << ead;
rout << "p(x,P,8,S) =" << p(x,P,O,S) << ccd;
mut << "p(x,P,8,9,P) =" << p(x,P,9,9,€) << ead;
0
الل db لاا يي الال لد ا
لحن
EL الاي ا ا ال 0
ee ein 0 + ©) + اه + هه مدر
- ۳
دش i
©1062 د ۱۳
صفحه 83:
دقت كنيد كه يارامترهايى كه مقدار يب شفرض دارند بايد در فهرست
ل ل ا ل ل
vod A tata, الا الي لي // OM
vod y(tag, tot b=O, ta v=, tad, cte=O); // GRROR
همچنین هنگام فراخوانی تابع. آر گومانهای ذکر شده به ترتیب از چپ به
0 ل لل San Oe ee TP RO rere Rec y)
لاسرم () كه در بالا قيد شد. فراخوانى ار
۰ را 00 0
صفحه 84:
پایان جلسه پنجم
بسم الله
الرحمن
الرحيم
برنامه سازي
تعداد واحد3 :
تهيه كننده:
دکتر حسن توکلی
جلسه پنجم
« توابع»
:آنچه در اين جلسه مي خوانيد
-1توابع كتابخانهاي ++Cاستاندارد
-2توابع ساخت كاربر
-3برنامۀ آزمون
-4اعالنها و تعاريف تابع
-5كامپايل جداگانۀ توابع
-6متغيرهاي محلي ،توابع محلي
›››
-7تابع void
- 8توابع بولي
-9توابع ورودي/خروجي ()I/O
-10ارسال به طريق ارجاع (آدرس)
ق ارجاع ثابت
-11ارسال از طري
-12توابع بيواسطه
›››
-13چندشکلي تواب
ع
-14تابع )(main
ي پيشفرض
-15آرگومانها
هدفهاي رفتاري:
پس از پايان اين جلسه بتوانيد:
يرود
انتظار م
کلي:
هدف
-اهميت توابع و مزيت استفاده از آنها را بيان کنيد.
شLLناخت و معرفي توابLLع و مزاياي اسLLتفاده از تLLابع در
هاو «تعريLLف» تLLابع را بدانيLLد و خودتLLان تLLوابعي را ايجاد
«اعالن»
-برنامه
کنيد.
«برنامۀ آزمون» را تعريف کرده و دليLLل اسLLتفاده از آن را بياننماييد.
-مفهوم «آرگومان» را بدانيد.
تفاوت ارسال به طريLLق «ارجاع» و ارسال بLLه طريLLق «مقLLدار» وارسال به طريق «ارجاع ثابت» را بيان کنيد و شکل اسLLLتفاده از هر
يک را بدانيد.
›››
«تابع بيواسLLطه» را شLLناخته و نحLLوۀ معرفي آن رابدانيد.
چندشLLکلي توابLLع را تعريLLف کنيLLد و شLLيوۀ آن رابدانيد.
طريقLLLۀ بهکارگيري آرگومانهاي پيشفرض رابدانيد.
-فرق بين تابع voidبا ساير توابع را بدانيد.
-1مقدمه
برنامههاي واقعي و تجاري بسLLLLLLLيار بزرگتر از
برنامههايي هسLLتند که تLLاکنون بررسLLي کرديم.
بLLراي اين که برنامههاي بLLزرگ قابLLل مLLديريت
باشLLLLLLLند ،برنامهنويسان اين برنامهها را بLLLLLLLه
زيربرنامههايي بخشبنLLLLLLLدي ميکننLLLLLLLد .اين
زيربرنامهها «تLLLابع» ناميLLLده ميشLLLوند .توابLLLع را
ميتوان به طور جداگانه کامپايل و آزمايش نمود و
در برنامههاي مختلLLLLف دوباره از آنها اسLLLLتفاده
کرد.
-2توابع كتابخانهاي ++Cاستاندارد
«كتابخانLLۀ ++CاسLLتاندارد» مجمLLوعهاي اسLLت که
ع از پيش تعريLLف شLLده و ساير عناصر
شLLامل تLLواب
برنامه است .اين توابع و عناصر از طريق «سرفايلها»
قابل دستيابياند.
قبال بLLLLرخي از آنها را اسLLLLتفاده كردهايم :ثLLLLابت
INT_MAXکه در < >climitsتعريLLف شLLده ،
تابع () sqrtکه در < >cmathتعريLLف شLLده اسLLت
و. ...
تابع جذر )(sqrt
ريشۀ دوم يك عدد مثبت ،جذر آن عدد است.
تابع مانند يLLک برنامLLۀ کامLLل ،دارايرونLLد ورودي -
پLLردازش -خروجي اسLLت هرچنLLد که پLLردازش،
مرحلهاي پنهان است .يعني نميدانيم که تLLابع روي
عLLدد 2چLLه اعمالي انجام ميدهLLد که 41421/1
حاصل ميشود.
ذر راLLدۀ جLL تابع از پيش تعريف ش،برنامۀ سادۀ زير
:به کار ميگيرد
#include <cmath>
// defines the sqrt() function
#include <iostream> // defines the cout object using namespace std;
int main()
{ //tests the sqrt() function:
}
() کافيsqrt ابعLLد تLLابع ماننLLبراي اجراي يك ت
for (int x=0; x < 6; x++)
ير درLLک متغLLورت يLLه صLLابع بLLام آن تLLت نLLاس
cout << "\t" << x << "\t" << sqrt(x) << endl;
: مانند زير،دستورالعمل مورد نظر استفاده شود
y=sqrt(x);
اين کار «فراخLLواني تLLابع» يا «احضLLار تLLابع» گفتLLه
ميشود .بنابراين وقتي كد ) sqrt(xاجرا شود ،تLLابع
)(sqrtفراخواني ميگردد .عبارت xدرون پرانLLLLتز
«آرگومان» يا «پارامتر واقعي» فراخLLLLواني ناميLLLLده
ميشLLود .در چLLنين حالتي ميگLLوييم كLLه xتوسLLط
«مقدار» به تابع فرسLLتاده ميشLLود .لLLذا وقLLتي x=3
است ،با اجراي کد ) sqrt(xتLLابع )(sqrtفراخLLواني
شده و مقدار 3به آن فرستاده ميشود .تابع مذکور
نLLLLيز حاصLLLLل 1.73205را بLLLLه عنLLLLوان پاسخ
برميگرداند…
… اين فرايند در نمودار زير نشان داده شده.
)(Sqrt
3
1.73205
)(Main
int
3
x
1.73205
y
double
متغيرهاي xو yدر تابع )(mainتعريف شدهاند .مقدار xکه برابر
با 3اسLLت بLLه تLLابع )(sqrtفرسLLتاده ميشLLود و اين تLLابع مقLLدار
1.73205را به تابع )(mainبرميگرداند .جعبهاي كه تابع )(sqrt
را نشان ميدهد به رنگ تيره است ،به اين معنا كه فرايند داخلي و
نحوۀ کار آن قابل رويت نيست.
مثال 5-2آزمايش يك رابطۀ مثلثاتي
اين برنامه هم از سرفايل < >cmathاستفاده ميكند .هLLدف اين
است که صحت رابطۀ Sin2x=2SinxCosxبه شLLکل تجLLربي
بررسي شود.
)(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
برنامLLۀ مقLLدار xرا
0.717356
0.717356
در سLLLLLLLتون اول،
0.932039مقدار
دهد که براي هر
خروجي نشان مي
0.932039
مقLLLLدار Sin2xرا
0.999574
0.999574
مقدار
مقدار Sin2xبا
آزمايشي ،x
و
دوم
سLLLLLتون
در
0.909297
0.909297
2SinxCosxبرابر است.
مقLLLLLLLLLLLLLLLLLدار
0.675463
0.675463
2SinxCosxرا
0.334988
0.334988
در سLLLLتون سLLLLوم
-0.0583744 -0.0583744
چا
-0.442521
پ ميكند-0.442521 .
0.389418
0.389418
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
ماشينحسابها همتابع
مثالمعروف رياضي كLLه در شرح
وجLLود
بيشتر توابع
دار
) acos(0.2مق
اين
از
بعضي
است.
شده
تعريف
>
cmath
<
سرفايل
دارد در
)acos(x
1.36944را برميگرداند کسينوس معکوس( xبه راديان)
نشان داده شده:
جدول زير
توابع در
دار
) asin(0.2مق
0.201358
برميگرداند
) atan(0.2مق
0.197396
برميگرداند
)ceil(3.141593
مقدار 4.0را برميگرداند
) cos(2مق
0.416147برميگرداند
را
دار
را
دار
را
سينوس معکوس ( xبه راديان)
تانژانت معکوس ( xبه راديان)
مقدار سقف ( xگرد شده)
کسينوس ( xبه راديان)
دار
) exp(2مق
7.38906را برميگرداند تابع نمايي ( xدر پايه )e
)asin(x
)atan(x
)ceil(x
)cos(x
)exp(x
) floor(3.141593مقدار کف ( xگرد
شده)
مقدار 3.0را برميگرداند
لگاريتم طبيعي ( xدر
) log(2مقدار
0.693147را برميگرداند پايه )e
لگاريتم عمومي ( xدر
) log10(2مقدار
0.30103را برميگرداند پايه )10
) pow(2,3مقدار 8.0را
xبه توان p
برميگرداند
) sin(2مقدار
0.909297را برميگرداند سينوس ( xبه راديان)
) sqrt(2مقدار
1.41421را برميگرداند جذر x
) tan(2مقدار
2.18504-را برميگرداند تانژانت ( xبه راديان)
floor(x
)
)log(x
log10(x
)
pow(x,p
)
)sin(x
)sqrt(x
)tan(x
توجه داشته باشيد که هر تابع رياضLLي يLLک مقLLدار از
نوع doubleرا برميگرداند .اگر يك نوع صLLحيح بLLه
تLLابع فرسLLتاده شLLود ،قبLLل از اين كLLه تLLابع آن را
doubleارتقLLا
پLLردازش کنLLد ،مقLLدارش را بLLه نLLوع
ميدهد.
بعضي از سرفايلهاي كتابخانۀ ++Cاستاندارد که کاربرد
استاندارد گرفته
آمدهC
كتابخان ۀ
ها از
سرفاي
اين
است:
جدول زير
دارندلدر
بيشتري
اسLLتفاده از آنها شبيه اسLLتفاده از
شLLدهاند.
سرفايل
شرح
اسLLLLLLLتاندارد (ماننLLLLLLLد
هاي C
تابع <سرفايل
++ميکند
تعريف
>assertرا
><assert
يکند
کاراکترها تعريف م
<براي بررسي
توابعي را
><ctype
بLLLLراي مثLLLLال اگر
اسLLLLت.
) >iostream
اعLLLدادتعريف مي
تLLLابع شناور را
بخLLLواهيماعداد مميز
ثابتهاي مربوط به
><cfloat
کند )(randرا از
تصادفي
محدودۀ اعداد صحيح را روي سيستم موجود تعريف ميکند ><climits
سرفايل < >cstdlibبLLLه كLLLار بLLLبريم ،بايLLLد
توابع رياضي را تعريف ميکند
><cmath
Lل
L
فاي
Lداي
L
ابت
Lه
L
ب
را
زير
پردازندۀ
ش
پي
دستور
توابعي را براي ورودي و خروجي استاندارد تعريف ميکند
><cstdio
اضافه کنيم:
کاربرديۀرااصلي
توابع برنام
تعريف ميکند
><cstdlib
توابعي را براي پردازش رشتهها تعريف ميکند
><cstring
#include
><cstdlib
توابع تاريخ و ساعت را تعريف ميکند
><ctime
-3توابع ساخت كاربر
گرچLLه توابLLع بسLLيار متنLLوعي در کتابخانLLۀ ++C
استاندارد وجLLود دارد ولي اين توابLLع بLLراي بيشLLتر
ف برنامهنويسLLي كLLافي نيسLLتند .عالوه بLLر اين
وظاي
برنامهنويسان دوسLLLت دارنLLLد خودشLLLان بتواننLLLد
توابعي را بسازند و استفاده نمايند.
مثال 5-3تابع )(cube
يك مثال ساده از توابع ساخت كاربر:
اين تLLLLLابع ،مكعب
يLLك عLLدد صLLحيح
ارسالي بLLLLLLه آن را
برميگردانLLLLLLLLLد.
بنLLابراين فراخLLواني
) cube(2مقLLدار 8
را برميگرداند.
)int cube(int x
{ // returns cube of x:
;return x*x*x
}
يك تابع ساخت كاربر دو قسمت دارد:
-2بدنه.
-1عنوان
عنوان يك تابع به صورت زير است:
نا م
نوع بازگشتي )فهرست پارامترها(
تعريLLف
باال
در
که
()
cube
تابع
بازگشتي
نوع
بدنۀ تابع ،يك بلوك كد است كه در ادامLLۀ عنLLوان
مثال:
Lک
L
ي
و
Lد
L
باش
ي
م
cube
آن
Lام
L
ن
Lت.
L
اس
int
شد،
آن ميآيد .بدنه شامل دسLLتوراتي اسLLت كLLه بايLLد
Lابع int
cube(int
پارامتر از نLLوع intبLLه نLLام xداردx).
L
ت
Lني
L
يع
انجام شود تا نتيجۀ مورد نظر به دست آيLLد .بدنLLه
)(cubeيLLLک مقLLLدار از نLLLوع intميگLLLيرد و {
بLLLLه
را
نهايي
پاسخ
كه
است
return
دستور
شامل
پاسخي از نوع intتحويل ميدهد .بدنه تابع …
گرداند.
ي
برم
تابع
فراخواني
مكان
}
دستور returnدو وظيفۀ عمLLده دارد .اول اين که
اجراي تابع را خاتمه ميدهد و دوم اين که مقLLدار
برنامهها
همLLۀ
)(int main
دسLLتور
گرداند.
در مي
که باز
فراخوان
عبارت برنامۀ
نهايي را به
شودL:ام «تLLابع
LابعيبLLه نL
ايم يک تL
استفاده م
کردهزير
استفادهشکل
returnبه
اصلي» را تعريف ميکند .نLLوع بازگشLLتي
return
expression
;
اين تابع از نLLوع intاسLLت .نLLام آن main
خLLالي
اسLLت و
گيرد که
آن مي
پارامترهايقرار
فهرسLLتهر عبارتي
expression
به جاي
متغيرندارد.
پارامتري
هيچ
بتواناست؛
تخصيص داد .نوع
به يک
يعني را
مقدار آن
آن عبارت بايد با نوع بازگشتي تابع يکي باشد.
برنامۀ آزمون 4-
فورا
برنامLLLه،کرديد،
ايننياز را ايجاد
هدفمورد
تنهايک تابع
وقتي
امتحان
که بايLLد
است
برنامۀ موقتي
يک
آزمون
برنامۀ
امتحان
ساده
برنامLLLۀ
يLLLک
با
را
تابع
آن
بايد
باشد؛ بررسLLي صLLحت
تLLابع و
کردن
»
کثيف
و
سريع
«
کنيد .چنين برنLLامهاي برنامLLۀ آزمLLون ناميLLده
شود.آن است.
کار
مييعني:
الزم نيسLLLLLLLLLLLLLLت در آن تمام ظرافتهاي
برنامهنويسLLLLLي – مثLLLLLل پيغامهاي خروجي،
برچسبها و راهنماهاي خوانا – را لحاظ کنيد.
مثال 5-4يك برنامۀ آزمون براي تابع )(cube
کد زير شامل تابع )(cubeو برنامۀ آزمون آن است:
برنامۀ حاضر اعداد صLLحيح
را از ورودي ميگLLLLLLيرد و
مكعب آنها را چاپ
ميكنLLد تLLا اين كLLه كLLاربر
مقدار 0را وارد كند.
)int cube(int x
{ // returns cube of x:
;return x*x*x
}
)(int main
{ // tests the cube() function:
;int n=1
)while (n != 0
;{ cin >> n
}} ;cout << "\tcube(" << n << ") = " << cube(n) << endl
هر عدد صحيحي که خوانده ميشود ،با استفاده از
کد ) cube(nبLLه تLLابع )(cubeفرسLتاده ميشLLود.
مقدار بازگشتي از تابع ،جايگزين عبارت )cube(n
دقت كنيد كه تابع )(cubeدر باالي تLLابع )(mainتعريLLف شLLده
چاپ
خروجي
در
cout
از
اسLLLLLتفاده
با
و
گشLLLLLته
زيرا قبLLل از اين كLLه تLLابع )(cubeدر تLLابع )(mainبLLه كLLار رود،
شود.
مي
++Cبايد در بارۀ آن اطالع حاصل كند.
كامپايلر
)(cube
)(main
5
5
تLLابع )(cube 5را
و
()
main
تابع
بين
رابطۀ
توان
مي
int
int
125
شبيه اين شکل تصور نمود:
x
n
)(max يك برنامۀ آزمون براي تابع5-5 مثال
: مقدار بزرگتر را برميگرداند، اين تابع از دو مقدار فرستاده شده به آن.تابع زير دو پارامتر دارد
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را ماننLLد اين
نيز ميتوانستيم بنويسيم:
Lرش اسLLت
Lتور پL
int max(int
x, int
دسLLتور returnنLLوعي دسy) L
(شبيه دستور ) breakزيرا اجرا را به بيرون
{ // returns larger of the two given integers:
از تLLابع هLLدايت ميکنLLد .اگرچLLه معمLLوال
تLLLLLابع قرار م
در انتهاي
returnهر
در اين کد
گLLLLLيردif،
returnي )(x < y
دسLLLتور ;y
هر نقطLLۀ ديگري از تLLابع
را در
توان آن
مي
اجLLرا
زودتر
returnکه
;else return x
شودقرار
داد.مربLLوطهاش
مقدار
را بازگشت داده و تLLابع
}
را خاتمه ميدهد.
-5اعالنها و تعاريف تابع
به دو روش ميتوان توابع را تعريف نمود:
-1توابع قبل از تابع )(mainبه طور كامل با بدنLLه
مربوطه آورده شوند.
-2راه ديگري که بيشLLتر رواج دارد اين گونLLه
است که ابتدا تابع اعالن شود ،سپس متن برنامLLۀ
اصلي )(mainبيايد ،پس از آن تعريف کامل تLLابع
قرار بگيرد.
اعالن تابع با تعريف تابع تفاوت دارد.
اعالن تابع شبيه اعالن متغيرهاست.
اعالن تابع ،فقط عنوان تابع است که يک سLLميکولن
در انتهاي آن قرار دارد.
Lامل
هم شL
LابعکاراسLLت
اينLLل
متن کام
Lابع،
تعريف تL
بايLLد
کهشود
گرفته
کهتLبه
قبل از
متغير
يک
شامل
اعالن است
عنوان
بدنه.طور است با اين فرق
همين
هم هم
شود.وتابع
که متغير را در هر جايي از برنامه ميتLLوان اعالن
کرد اما تLLابع را بايLLد قبLLل از برنامLLۀ اصLLلي اعالن
نمود.
در اعالن تابع فقط بيان ميشLLود که نLLوع بازگشLLتي
تابع چيست ،نام تابع چيست و نوع پارامترهاي تLLابع
چيست.
همينها بLLراي کامپايلر کافي اسLLت تLLا بتوانLLد
کامپايل برنامه را آغاز کند .سپس در زمان اجLLLرا
به تعريف بدنۀ تابع نLLيز احتياج ميشLLود که اين
بدنه در انتهاي برنامه و پس از تابع )(mainقرار
ميگيرد.
فرق بين «آرگومان» و «پارامتر» :
پارامترها متغيرهايي هسLLتند که در فهرسLLت
پارامتر يک تابع نام برده ميشوند.
پارامترها متغيرهاي محلي براي تابع محسLLوب
ميشوند؛ يعني فقط در طول اجراي تLLابع وجLLود
دارند.
آرگومانها متغيرهايي هسLLLتند که از برنامLLLۀ
اصلي به تابع فرستاده ميشوند.
مثال 5-6تابع )(maxبا اعالن جدا از تعريف آن
اين برنامه همان برنامۀ آزمون تابع )(maxدر مثال 6-5اسLLت.
اما اينجا اعالن تابع باالي تابع اصلي ظاهرشLLده و تعريLLف تLLابع
بعد از برنامۀ اصلي آمده است:
;)int max(int,int
)(int main
;int m, n
{
do
;{ cin >> m >> n
" = )" << cout << "\tmax(" << m << "," << n
} ;<< max(m,n) << endl
توجه كنيLLد كLLه پارامترهاي xو y
در بخش عنLLLوان تعريLLLف تLLLابع
آمدهانLLد (طبLLق معمLLول) ولي در
اعالن تابع وجود ندارند.
};)while (m != 0
)int max(int x, int y
;{ if (x < y) return y
};else return x
-6كامپايل جداگانۀ توابع
شLLکل
همين
بLLه
اسLLتاندارد
++
C
کتابخانLLۀ
توابLLع
اغلب اين طور است که تعريف و بدنۀ توابLLع در
پيادهسازي شدهاند و هنگامي که يکي از آن توابع را
فايلهاي جداگانهاي قرار ميگLLLيرد .اين فايلها
در برنامههايتLLان بLLه کار ميبريLLد بايLLد با دسLLتور
بLLLه
سپس
و
شLLLوند
ي
م
1
کامپايل
مستقل
طور
به
راهنماي پيشپردازنLLLده ،فايLLLل آن توابLLLع را بLLLه
کنيد.توابLLع را بLLه کار ميگLLيرد
که آن
تانLلي
برنامۀهاصL
ضميمه
برنام
الصاق 2ميشوند.
اين کار چند مزيت دارد:
-1اولين مزيت «مخفيسازي اطالعات» است.
-2مزيت ديگر اين است که توابع مورد نياز را ميتوان قبLLل
از اين که برنامLLۀ اصLLلي نوشLLته شLLود ،جداگانLLه آزمايش
نمود.
-3سLLومين مزيت اين اسLLت که در هر زماني بLLه راحLLتي
ميتوان تعريف توابLLع را عLLوض کرد بLLدون اين که الزم
باشد برنامۀ اصلي تغيير يابد.
-4چهارمين مزيت هم اين است که ميتوانيد يک بار يLLLک
تابع را کامپايل و ذخيره کنيد و از آن پس در برنامههاي
مختلفي از همان تابع استفاده ببريد.
تابع )(maxرا به خاطر بياوريد .بLLراي اين که اين
تابع را در فايل جداگانهاي قرار دهيم ،تعريLLLف آن
را در فايلي به نام max.cppذخيره ميکنيم .فايLLل
max.cppشامل کد زير است:
max.cpp
)int max(int x, int y
;if (x < y) return y
{
;else return x
}
#
> راinclude <test.cpp :حال كافي است عبارت
:() اضافه كنيمmainبه اول برنامه اصلي وقبل از
#include <test.cpp>
int main()
{ // tests the max() function:
int m, n;
do
{ cin >> m >> n;
cout << "\tmax(" << m << "," << n << ") = "
<< max(m,n) << endl;
}
while (m != 0);}
نحLLLوۀ کامپايLLLل کردن فايلها و الصاق آنها بLLLه
يکLLديگر بLLه نLLوع سيسLLتم عامLLل و نLLوع کامپايلر
بستگي دارد .در سيستم عامل ويندوز معموال توابع
را در فايلهايي از نLLLوع DLLکامپايLLLل و ذخLLLيره
ميکنند و سپس اين فايل را در برنامۀ اصلي احضار
مينمايند .فايلهاي DLLرا بLLه دو طريLLق ايسLLتا و
پويا ميتوان مورد استفاده قرار داد .بLLراي آشLLنايي
بيشLLLتر با فايلهاي DLLبLLLه مرجLLLع وينLLLدوز و
کامپايلرهاي ++Cمراجعه کنيد.
-6متغيرهاي محلي ،توابع محلي
متغير محلي ،متغيري است که در داخل يک بلوک
اعالن گردد .اين گونLLLه متغيرها فقLLLط در داخLLLل
دسLLتيابي
قابLLل
اعالن Lم
کار
در حال
شLLوندLابع
ي که تL
Lتي
که تLLا وق
بلLLوکيفقط
همانمتغيرها
اين
هستند.وجود دارند.
است
LتLپس
محلياسL
متغيرهايبلLLوک
Lودش يLLک
Lابع،
چLLون بدنLLۀ
Lوب
محس
Lابع نخLLLيز
پارامترهايتLتL
متغيرهاي اعالن شLLLده در يLLLک تLLLابع متغيرهاي
ميشوند.
محلي براي آن تابع هستند.
* مثال 5-7تابع فاكتوريل
اعداد فاكتوريل را در مثال 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
اين تLLابع دو متغLLير محلي دارد n :و f
پارامتر nيک متغير محلي است زيLLرا
در فهرسLLLت پارامترهاي تLLLابع اعالن
شده و متغير fنيز محلي اسLLت زيLLرا
درون بدنۀ تابع اعالن شده است.
;int f = 1
)while (n > 1
;f *= n--
;return f
}
همان گونه که متغيرها ميتوانند محلي باشند ،توابLLع نLLيز ميتواننLLد محلي
باشند.
تابع محلي
يک تابع محلي تLLابعي اسLLت که درون يLLک تLLابع ديگر بLLه کار رود .با
استفاده از چنLLد تLLابع ساده و ترکيب آنها ميتLLوان توابLLع پيچيLLدهتري
ساخت .به مثال زير نگاه کنيد.
در رياضيات ،تابع جايگشت را با ) p(n,kنشان ميدهنLLد .اين تLLابع بيان
ميکند که به چنLLد طريLLق ميتLLوان kعنصر دلخLLواه از يLLک مجموعLLۀ n
عنصري را کنLLار يکLLديگر قرار داد .بLLراي اين محاسبه از رابطLLۀ زيLLر
استفاده ميشود:
!n
P(n, k)
!)(n k
!4
4! 24
P(4,2)
12
(4 2)! 2! 2
چهار
مجموعLLۀ
تLLابع يLLک
دلخLLواه از
تLLوانيم دو
طريLLق مي
اينبLLه
پس
اسLLت
فاکتوريLLل
عنصرهمان
ديگري که
تLLابع
12خود از
تابع،
بچيLLنيم .بLLراي دو عنصر از مجموعLLۀ {}4 ,3 ,2 ,1
کنLLار هم
عنصري
است.
استفادهراکرده
حالتهاي ممکن عبارت است از:
شرط به کار رفته در دستور ifبراي محLLLLدود کردن حالتهاي
12, 13, 14, 21, 23, 24, 31, 32, 34, 41, 42,
غير ممکن استفاده شده است .در اين حالتها ،تLLابع مقLLدار 0را
43
برميگرداند تا نشان دهد که يLLک ورودي اشLLتباه وجLLود داشLLته
ي ميكند:
زير تابع جايگشت را پيادهساز
كد
است.
)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++)
cout << " " << perm(i,j);
cout << endl; }
}
00
010
0110
01220
013660
0 1 4 12 24 24 0
0 1 5 20 60 120 120 0
0 1 6 30 120 360 720 720
0
0 1 7 42 210 840 2520
-7تابع void
الزم نيست يك تابع حتما مقLLداري را برگردانLLد .در ++CبLLراي
مشخص کردن چنين توابعي از کلمۀ کليدي voidبه عنLLوان نLLوع
بازگشتي تابع استفاده ميکنند
يک تابع voidتابعي است که هيچ مقدار بازگشتي ندارد.
از آنجا كه يك تابع voidمقداري را برنميگرداند ،نيازي به دستور return
نيست ولي اگر قرار باشد اين دستور را در تابع voidقرار دهيم ،بايLLد آن را
به شکل تنها اسLLتفاده کنيم بLLدون اين که بعLLد از کلمLLۀ returnهيچ چLLيز
ديگري بيايد:
;return
در اين حالت دستور returnفقط تابع را خاتمه ميدهد.
-8توابع بولي
در بسياري از اوقات الزم است در برنامه ،شرطي بررسي شود.
اگر بررسي اين شرط به دستورات زيادي نياز داشته باشد ،بهتر است که
يک تابع اين بررسLLي را انجام دهLLد .اين کار مخصوصا هنگLLامي که از
حلقهها استفاده ميشود بسيار مفيد است.
توابع بولي فقط دو مقدار را برميگردانند true :يا . false
اسم توابع بولي را معموال به شکل سوالي انتخاب ميکنند زيLLرا توابLLع
بولي هميشه به يک سوال مفروض پاسخ بلي يا خير ميدهند.
تابعي ك ه اول بودن اعداد را بررسي ميكند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
بخشهايي از برنامه که به جزييات دست و پا گير ميپردازد و خيلي
به هدف اصلي برنامه مربوط نيسLLت را ميتLLوان بLLه توابLLع سپرد .در
چنين شرايطي سودمندي توابع محسوستر ميشود.
فرض کنيLLد نرمافزاري بLLراي سيسLLتم آموزشLLي دانشLLگاه طراحي
کردهايLLد که سLLوابق تحصLLيلي دانشجويان را نگLLه ميدارد .در اين
نرمافزار الزم است که سن دانشجو به عنوان يکي از اطالعات پروندۀ
دانشجو وارد شود .اگر وظيفLLۀ دريافت سLLن را بLLه عهLLدۀ يLLک تLLابع
بگذاريد ،ميتوانيد جزيياتي از قبيل کنترل ورودي معتبر ،يافتن سLLن
از روي تاريخ تولد و ...را در اين تابع پيادهسازي کنيد بدون اين که
از مسير برنامۀ اصلي منحرف شويد.
قبال نمونهاي از توابع خروجي را ديديم .تابع )(PrintDate
در مثال 5-9هيچ چيزي به برنامLLۀ اصLLلي برنميگردانLLد و
فقط براي چاپ نتايج به کار ميرود.
اين تابع نمونهاي از توابع خروجي است؛ يعني تLLوابعي که
فقLLط بLLراي چاپ نتLLايج بLLه کار ميرونLLد و هيچ مقLLدار
بازگشتي ندارند.
توابع ورودي نيز به همين روش کار ميکنند اما در جهت
معکوس .يعني توابع ورودي فقط بLLLراي دريافت ورودي و
ارسال آن به برنامۀ اصلي به کار ميرونLLLد و هيچ پارامتري
ندارند.
مثال بعد يک تابع ورودي را نشان ميدهد.
مثال 5-11تابعي براي دريافت سن كاربر
)(int age
{ // prompts the user to input his/her age and returns that value:
بLLه
تابع سادۀ زير ،سن کاربر را درخواست ميکند و مقدار دريافت شLLده را
برنامۀ اصلي ميفرستد .اين تابع تقريبا هوشLLمند اسLLت و هر عLLدد ;int n
صLLحيح
وروديwhile
ورودي غير منطقي را رد ميکند و به طور مکرر درخواسLLLLت )(true
معتبر
{ cout
"How120
old are
ميکند تا اين که يک عدد صحيح در ;"
دريافت<<دارد:
7you:تا
محدودۀ
;cin >> n
if (n < 0) cout << "\a\tYour age could not
;"be negative.
else if (n > 120) cout << "\a\tYou could not
;"be over 120.
;else return n
;"cout << "\n\tTry again.\n
}
}
:يك برنامۀ آزمون و خروجي حاصل از آن در ادامه آمده است
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
تLLا اين لحظه تما م پارامترهايي كه در تLLوابع ديLLديم ب ه
طريق مقدار ارسال شدهاند .يعني ابتLLدا مقLLدار متغLLيري
که در فراخواني تابع ذکر شده برآورد ميشود و سپس
اين مقدار به پارامترهاي محلي تابع فرستاده ميشود.
مثال در فراخواني ) cube(xابتدا مقدار xبرآورد شLLده و
سپس اين مقLLدار بLLه متغLLير محلي nدر تLLابع فرسLLتاده
ميشود و پس از آن تابع کار خLLويش را آغLLاز ميکنLLد.
در طي اجراي تابع ممکن است مقدار nتغيLLير کنLLد اما
چLLLLون nمحلي اسLLLLت هيچ تغيLLLLيري روي مقLLLLدار x
نميگذارد.
پس خود xبه تابع نميرود بلکه مقدار آن درون تابع کپي ميشود.
تغيير دادن اين مقدار کپي شده درون تابع هيچ تاثيري بر xاصلي نLLدارد.
به اين ترتيب تLLابع ميتوانLLد مقLLدار xرا بخوانLLد اما نميتوانLLد مقLLدار xرا
تغيير دهد.
به همين دليل به xيک پارامتر «فقط خواندني» ميگويند.
وقتي ارسال به وسيلۀ مقدار باشد ،هنگام فراخواني تابع ميتوان از عبارات
استفاده کرد.
مثال تابع )(cubeرا ميتوان به صورت) cube(2*x-3فراخواني کرد يا
به شکل )) cube(2*sqrt(x)-cube(3فراخواني نمود .در هر يک از اين
حاالت ،عبارت درون پرانتز به شکل يک مقدار تکي برآورد شده و حاصل
آن مقدار به تابع فرستاده ميشود.
-10ارسال به طريق ارجاع (آدرس)
ارسال به طريق مقدار باعث ميشود که متغيرهاي
برنامۀ اصلي از تغييرات ناخواسته در توابLLع مصLLون
بمانند.
اما گLLاهي اوقLLات عمLLدا ميخLLواهيم اين اتفLLاق رخ
دهد .يعLLني ميخLLواهيم که تLLابع بتوانLLد محتويات
متغير فرستاده شده بLLه آن را دسLتکاري کنLLد .در
اين حالت از ارسال بLLLLه طريLLLLق ارجاعاسLLLLتفاده
ميکنيم.
براي اين که مشخص کنيم يک پارامتر بLLه طريLLق ارجاع
ارسال ميشLLود ،عالمت&را بLLه نLLوع پارامتر در فهرسLLت
پارامترهاي تابع اضافه ميکنيم .اين باعث ميشود که تابع
به جاي اين که يک کپي محلي از آن آرگومان ايجاد کند،
خود آرگومان محلي را به کار بگيرد.
به اين ترتيب تابع هم ميتواند مقدار آرگومان فرسLLتاده
شده را بخواند و هم ميتواند مقدار آن را تغيير دهLLد .در
اين حالت آن پارامتر يLLLک پارامتر «خواندني-نوشLLLتني»
خواهد بود.
هر تغييري که روي پارامتر خواندني-نوشتني در تابع صLLورت گLLيرد بLLه طLLور
مستقيم روي متغير برنامۀ اصلي اعمال ميشود .به مثال زير نگاه کنيد.
ع )(swap
* مثال 5-12تاب
ك زير در مرتب کردن دادهها کاربرد فراوان دارد:
تابع كوچ
)void swap(float& x, float& y
{ // exchanges the values of x and y:
ف اين تابع جابجا کردن دو عنصري اسLLت
هد
که به آن فرستاده ميشوند .براي اين منظLLور
پارامترهاي xو yبLLLLه صLLLLورت پارامترهاي
ارجاع تعريف شدهاند:
float& x, float& y
;float temp = x
;x = y
;y = temp
}
آرگومانهاي ارساليy وx ب ميشود ك ه به جاي
ع & موج
عملگر ارجا
: برنامۀ آزمون و اجراي آزمايشي آن در زير آمده است.قرار بگيرند
void swap(float&, float&)
:exchanges the values of x and y //
)(int main
:tests the swap() function // {
;float a = 55.5, b = 88.8
;cout << "a = " << a << ", b = " << b << endl
;swap(a,b)
;cout << "a = " << a << ", b = " << b << endl
}
a = 55.5, b = 88.8
a = 88.8, b = 55.5
وقتي فراخواني ) swap(a,bاجرا ميشLLود x ،بLLه aاشLLاره
ميکند و yبه .bسپس متغLLير محلي tempاعالن ميشLLود
)swap(a,bگيرد .پس
تابعقرار مي
فراخوانيآن
هنگامدرون
و مقدار ( xکه همان aاست)
)(main
a)a 55.5قرار
همان bاست) درون ( xيعLLLني
از آن مقدار ( yکه
x
ميگيرد و آنگاه&float
floatقرار داده
مقدار tempدرون ( yيعني )b
y
b 88.8
يکديگر
اين است که مقادير aو bبا
نهايي
نتيجۀ
شود.
ي
م
&float
float
جابجا مي شوند .شکل مقابل نشان ميدهد که چطLLور اين
دهد:
ي
م
رخ
جابجايي
)(swap
)(main
بعد از بازگشت
)(swap
x
88.8
float
y
55.5
&float
&float
55.5
float
temp
float
a
b
به اعالن تابع )(swapدقت کنيد:
)&void swap(float&, float
اين اعالن شامل عملگر ارجاع & براي هر پارامتر است.
برنامهنويسان cعادت دارند که عملگر ارجاع & را بLLه
عنوان پيشوند نام متغLLير اسLLتفاده کننLLد (مثل)float &x
در ++Cفرض ميکنيم عملگر ارجاع & پسLLLوند نLLLوع
است (مثل )float& x
بLLLLLLLLLLه هر حال کامپايلر هيچ فرقي بين اين دو اعالن
نميگذارد و شکل نوشتن عملگر ارجاع کامال اختياري و
سليقهاي است.
ق مقدار و ارسال ب ه طريق ارجاع
مثال 5-13ارسال به طري
تLLابع )(fدو پارامتر دارد که اولي بLLه طريLLق مقLLدار و
طريق ارجاع را نشان ميدهد:
ارسال به
شود.مقدار و
ق
بهيطري
ن ارسال
تفاوت بي
برنامه،
اين
)f(a,b
فراخواني
ارسال م
ارجاع
طريق
دومي به
باعث ميشود که aاز طريق مقدار به xارسال شLLLود و
)&;void f(int,int
bاز طريق ارجاع به yفرستاده شود.
)(int main
{ ;int a = 22, b = 44
;cout << "a = " << a << ", b = " << b << endl
);f(a,b
;cout << "a = " << a << ", b = " << b << endl
);f(2*a-3,b
};cout << "a = " << a << ", b = " << b << endl
)void f(int x , int& y
a = 22, b = 44
a = 22, b = 99
{ ;x = 88
a = 22, b = 99
};y = 99
شکل زير نحوۀ کار تابع )(fرا نشان ميدهد.
هنگام فراخواني تابع )f(a,b
)(f
22
int
&int
)(main
x
a 22
int
y
b 44
int
)(f
بعد از بازگشت
)(main
xx 88
int
22
int
y
99
&int
int
a
b
در جدول زير خالصۀ تفاوتهاي بين ارسال از طريق مقدار و ارسال
از طريق ارجاع آمده است.
ارسال از طريق ارجاع
ارسال از طريق مقدار
;int& x
;int x
پارامتر xيک ارجاع است
پارامتر xيک متغير محلي است
xمترادف با آرگومان است
xيک کپي از آرگومان است
ميتواند محتويات آرگومان را تغيير دهد
تغيير محتويات آرگومان ممکن نيست
آرگومان ارسال شده از طريق ارجاع فقط بايد
يک متغير باشد
آرگومان ارسال شده از طريق مقدار ميتواند
يک ثابت ،يک متغير يا يک عبارت باشد
آرگومان خواندني-نوشتني است
آرگومان فقط خواندني است
ع مLLLLورد نياز
ي ارجا
ي از مLLLLواقعي كه پارامترها
يك
ك مقدار را
ع بايد بيش از ي
ت كه تاب
ي اس
هستند جاي
بازگرداند.
ك مقLLLLدار را
دسLLLLتور returnفقLLLLط ميتوانLLLLد ي
برگرداند.
ك مقLLدار برگشLLت داده
ن اگر بايد بيش از ي
بنابراي
ع انجا م ميدهند.
ي ارجا
ن كار را پارامترها
شود ،اي
ك مقدار
ت بيشتر از ي
بازگش5-14 ل
* مثا
وarea :دLLدار را بازميگردانLL دو مق،ق دو پارامتر ارجاعLLتابع زير از طري
ددLLعاع آن عLLرهاي که شLLراي دايLL (محيط و مساحت) بcircumference
: استr مفروض
void ComputeCircle(double& area, double& circumference,
double r)
returns the area and circumference of a circle with // {
:radius r
;const double PI = 3.141592653589793
;area = PI*r*r
;circumference = 2*PI*r
}
برنامۀ آزمون تابع فوق و يک اجراي آزمايشي آن در شکل زير نشان
:داده شده است
;void ComputerCircle(double&, double&, double)
returns the area and circumference of a circle with //
;radius r
)(int main
:tests the ComputeCircle() function // {
;double r, a, c
;" :cout << "Enter radius
;cin >> r
;ComputeCircle(a, c, r)
" = cout << "area = " << a << ", circumference
};c << endl <<
ارسال از طريق ارجاع ثابت 12-
ارسال پارامترها به طريق ارجاع دو خاصيت مهم دارد:
اول اين که تابع ميتواند روي آرگومان واقعي تغييراتي بدهد
دوم اين که از اشغال بيمورد حافظه جلوگيري ميشود.
روش ديگري نيز براي ارسال آرگومان وجود دارد:
ارسال از طريLLق ارجاع ثLLابت .اين روش ماننLLد ارسال از طريLLق
ارجاع است با اين فرق که تابع نميتواند محتويات پارامتر ارجاع
را دستکاري نمايد و فقط اجازۀ خواندن آن را دارد.
براي اين که پارامتري را از نLLوع ارجاع ثLLابت اعالن کنيم بايLLد
عبارت constرا به ابتداي اعالن آن اضافه نماييم.
ت
ع ثاب
ق ارجا
ل 5-15ارسال از طري
مثا
سه طريقه ارسال پارامتر در تابع زير به کار رفته است:
)void f(int x, int& y, const int& z
;{ x += z
;y += z
" = cout << "x = " << x << ", y = " << y << ", z
;<< z << endl
}
ن پارامتر يعني xاز طريق مقدار ارسال ميشLLLود ،دومين
در تابع فوق اولي
پارامتر يعني yاز طريق ارجاع و سومين پارامتر نيز از طريق ارجاع ثابت.
برنامۀ آزمون و يک اجراي آزمايشي از مثال قبل:
a = 22, b = 33, c = 44
;)&void f(int, int&, const int
x = 66, y = 77, z = 44
)(int main
a = 22, b = 77, c = 44
x = 85, y = 121, z = 44
{ // tests the f() function:
a = 22, b = 121, c = 44
;int a = 22, b = 33, c = 44
" = cout << "a = " << a << ", b = " << b << ", c
تLLLابع فLLLوق پارامترهاي xو yرا ميتوانLLLد
;<< c << endl
تغيير دهLLد ولي قLLادر نيسLLت پارامتر zرا
;)f(a,b,c
روي xbص
Lيراتي cکه
Lورتcout << "a = " << a << ", b
<<= " L
<< ",
تغيير دهLLد .تغي= " L
ميگLLLيرد اثري روي آرگومان aنخواهLLLد
;<< c << endl
داشت زيرا aاز طريق مقدار به تابع ارسال
;)f(2*a-3,b,c
شده .تغييراتي که روي yصورت ميگLLيرد
زيرا=cout << "a = " << a << ", bb
<< "
<< b
هم = c
روي آرگومان " b
گذارد
تاثير",مي
;<< c << endl
از طريق ارجاع به تابع فرستاده شده.
}
ارسال به طريق ارجاع ثLLابت بيشLLتر بLLراي تLLوابعي
اسLLتفاده ميشLLود که عناصر بLLزرگ را ويLLرايش
ميکننLLLد مثLLLل آرايهها يا نمونLLLۀ کالسها که در
جلسههاي بعدي توضيح آنها آمده است .عناصري
که از انواع اصلي هستند (مثل intيا )floatبه طريLLق
مقدار ارسال ميشوند به شرطي که قرار نباشد تLLابع
محتويات آنها را دستکاري کند.
توابع بيواسطه 13-
تابعي که به شکل بيواسطه تعريف ميشود ،ظاهري شبيه به توابع
معمولي دارد با اين فرق که عبارت inlineدر اعالن و تعريLLLف آن
قيد شده است.
واسطه
ع )(cubeبه شکل بي
مثال 5-16تاب
ل 5-3است:
ن تابع )(cubeمثا
ن هما
اي
ي
ت ك ه كلم Lۀ كليLLد
ت اين اس L
تنها تفاو
inlineدر ابتداي عنوان تابع ذکر شLLLده.
ن عبارت ب ه كامپايلر ميگويLLLد كه در
اي
برنامLLLه بLLLه جاي ) cube(nکد واقعي
( )n(*)n(*)nرا قرار دهد.
)inline int cube(int x
{ // returns cube of x:
;return x*x*x
}
.به برنامۀ آزمون زير نگاه کنيد:
:احتياط
)(int main
{ // tests the cube() function:
استفاده از توابع بيواسطه ميتواند اثرات منفي
;int x, y
داشته باشد .مثال اگر يک تLLابع بيواسLLطه داراي
;cin >> x
نقطLLه
26
در
تLLابع
اين
و
باشLLد
کد
خLLط
40
};)y = cube(2*x-3
وجودLLام
تابعيهنگ
Lود،
گوييشL
Lواني
هنگامبرنامۀ
برنامه از
مختلف
نداشته
اصال
فراخيLآيد،
اصليزير درم
کامپايل به شکل
:اين
Lلي int
)(main
کامپايل بيش از هزار خط کد بLLه برنامLLۀ اصL
وقتي كامپايلر کد واقعي تLLابع
{ // tests the cube() function:
همچنين تابع بيواسطه ميتواند
افزوده ميشود.
آن
فراخLLLLLLواني
جايگزين
را
;cout << (4) * (4) * (4) << endl
که تLLابع
گLLوييم
ميکنLLد ،مي
هاي
م
Lت
L
سيس
روي
را
Lما
L
ش
Lۀ
L
برنام
Lال
L
انتق
قابليت
;int x, y
بيواسطه ،باز ميشود.
مختلف کاهش دهد.
;cin >> x
;cout << cube(4) << endl
};)y = (2*x-3) * (2*x-3) * (2*x-3
چندشکلي توابع 14-
در ++CميتLLوانيم چنLLد تLLابع داشLLته باشLLيم که
همگي يک نام دارند .در اين حالت ميگLLوييم که
تLLابع مLLذکور ،چندشLLکلي دارد .شرط اين کار آن
است که فهرست پارامترهاي اين توابع با يکLLديگر
تفاوت داشته باشد .يعني تعداد پارامترها متفLLاوت
باشد يا دسLLت کم يکي از پارامترهاي متنLLاظر هم
نوع نباشند.
ل 5-17چندشکلي تابع )(max
مثا
ع )(maxرا تعريف کرديم .حاال توابع ديگري با همان نLLام
در مثال 5-3تاب
ولي شLLکلي متفLLاوت تعريLLف ميکنيم و همLLه را در يLLک برنامLLه بLLه کار
ميگيريم:
;)int max(int, int
;)int max(int, int, int
;)int max(double, double
)(int main
<< ){ cout << max(99,77) << " " << max(55,66,33
;)" " << max(44.4,88.8
}
int max(int x, int y)
{ // returns the maximum of the two given integers:
return (x > y ? x : y);
}
int max(int x, int y, int z)
{ // returns the maximum of the three given integers:
int m = (x > y ? x : y); // m = max(x , y)
return ( z > m ? z : m);
}
int max(double x, double y)
{ // return the maximum of the two given doubles:
return (x>y ? x : y);
}
در اين برنامه سه تابع با نام )(maxتعريف شده است.
وقتي تابع )(maxدر جايي از برنامه فراخLLواني ميشLLود،
کامپايلر فهرست آرگومان آن را بررسي ميکند تا بفهمد
که کدام نسخه از maxبايد احضار شود.
مثال در اولين فراخLLLLواني تLLLLابع )(maxدو آرگومان int
ارسال شده ،پس نسخهاي که دو پارامتر intدر فهرسLLLت
پارامترهايش دارد فراخLLواني ميشLLود .اگر اين نسLLخه
وجود نداشLLته باشLLد ،کامپايلر intها را بLLه doubleارتقLLا
ميدهد و سپس نسخهاي که دو پارامتر doubleدارد را
فرا ميخواند.
-14تابع )(main
برنامههايي که تا کنون نوشتيم همLLه داراي تLLابعي بLLه نLLام
)(mainهستند.
منطق ++Cاين طور است که هر برنامه بايد داراي تLLابعي
به نام )(mainباشد.
در حقيقت هر برنامه کامل ،از يک تابع )(mainبLLLه همراه
توابع ديگر تشکيل شده است که هر يLLک از اين توابLLع بLLه
شLLLکل مسLLLتقيم يا غLLLير مسLLLتقيم از درون تLLLابع )(main
فراخواني ميشوند.
خود برنامه با فراخواني تابع )(mainشروع ميشود.
چون اين تابع يک نوع بازگشتي intدارد ،منطقي است که بلوک
تLLابع )(mainشLLامل دسLLتور ;return 0باشLLد هرچنLLد که در
برخي از کامپايلرهاي ++Cاين خط اجباري نيست و ميتوان آن
را ذکر نکرد.
مقدار صحيحي که با دستور returnبه سيستم عامل برميگردد
بايد تعداد خطاها را شمارش کند .مقدار پيشفرض آن 0اسLLت
به اين معنا که برنامه بدون خطا پايان گرفته است.
با اسLLLتفاده از دسLLLتور returnميتLLLوانيم برنامLLLه را بLLLه طLLLور
غيرمعمول خاتمه دهيم.
ك برنام ه
ي پايان دادن ب ه ي
ل 5-18استفاد ه از دستور returnبرا
مثا
)(int main
{ // prints the quotient of two input integers:
دستور returnتابع فعلي را خاتمه ميدهد و کنLLترل را بLLه
فراخواننده بازميگرداند .به همين دليل اسLLت که اجLLراي
cout << "Enter two
integers:
خاتمLLه
دسLLتور returnدر تLLابع )(mainکل;"برنامLLه را
ميدهد.
;int n, d
;cin >> n >> d
;if (d = = 0) return 0
;cout << n << "/" << d << " = " << n/d << endl
}
Enter two integers: 99 17
99/17 = 5
چهار روش وجود دارد که بتوانيم برنامه را بLLه شLLکل غLLيرمعمول
(يعني قبل از اين که اجLLرا بLLه پايان بلLLوک اصLLلي برسLLد) خاتمLLه
دهيم:
- 1استفاده از دستور return
- 2فراخواني تابع )(exit
- 3فراخواني تابع )(abort
– 4ايجاد يک حالت استثنا
اين تLLLLLLLLLLLابع در سرفايل
< >cstdlibتعريLLLف شLLLده
است .تابع )(exitبراي خاتمLLه
دادن بLLه کل برنامLLه در هر
تLLابعي غLLير از تLLابع )(main
مفيد است.
() براي پايان دادن به برنامهexit استفاده از تابع5-19 مثال
#include <cstdlib>
// defines the exit() function
#include <iostream>
// defines thi cin and cout objects
using namespace std;
double reciprocal(double x);
int main()
{ double x;
cin >> x;
را0 ددLLاربر عLLدراين برنامۀ اگر ك
() خاتمهreciprocal تابع،وارد کند
دارLLدون هيچ مقLLه بLLمييابد و برنام
چاپي به پايان ميرسد
cout << reciprocal(x);
}
double reciprocal(double x)1 – Exception
{ // returns the reciprocal of x:
if (x = = 0) exit(1);
return 1.0/x; }
// terminate the program
آرگومانهاي پيشفرض 15-
در ++Cميتوان تعداد آرگومانهاي يک تابع را در زمان اجرا بLLه
دلخواه تغيير داد.
اين امر با استفاده از آرگومانهاي اختياري و مقLLLادير پيشفرض
امکانپذير است.
براي اين که به يک پارامتر مقدار پيشفرض بLLدهيم بايLLد آن مقLLدار را در
فهرست پارامترهاي تابع و جلوي پارامتر مربوطه به همراه عالمت مساوي
درج کنيم .به اين ترتيب اگر هنگام فراخواني تLLLLابع ،آن آرگومان را ذکر
نکنيم ،مقدار پيشفرض آن در محاسبات تابع اسLLتفاده ميشLLود .بLLه همين
خاطر به اين گونه آرگومانها ،آرگومان اختياري ميگويند.
double p(double, double, double=0,ض
double=0);
double=0,
هايپيشفر
آرگومان5-20 ل
مثا
int main()
براي محاسبۀ.برنامۀ زير حاصل چند جملهاي درجه سوم را پيدا ميکند
{ // tests the p() function:
به اين شکل که براي کارايي.اين مقدار از الگوريتم هورنر استفاده شده
double x = 2.0003;
: دستهبندي ميشودa0 (a1 (a2 a3x)x)x محاسبه به صورت،بيشتر
cout << "p(x,7) = " << p(x,7) << endl;
cout << "p(x,7,6) = " << p(x,7,6) << endl;
cout << "p(x,7,6,5) = " << p(x,7,6,5) << endl;
cout << "p(x,7,6,5,4) = " << p(x,7,6,5,4) << endl;
}
double p(double x, double a0, double a1=0, double a2=0, double
a3=0)
{ // returns a0 + a1*x + a2*x^2 + a3*x^3:
return a0 + (a1 + (a2 + a3*x)*x)*x;
}
p(x,7) = 7
p(x,7,6) = 19.0018
p(x,7,6,5)
Default
=
39.00781
p(x,7,6,5,4) = 71.0222
–
دقت کنيد که پارامترهايي که مقLLدار پيشفرض دارنLLد بايLLد در فهرسLLت
پارامترهاي تابع بعد از همۀ پارامترهاي اجباري قيد شوند مثل:
// OK
;)void f( int a, int b, int c=4, int d=7, int e=3
// ERROR
;)void g(int a, int b=2, int c=4, int d, int e=3
همچنين هنگام فراخواني تابع ،آرگومانهاي ذکر شده به ترتيب از چپ بLLه
راسLLت تخصLLيص مييابنLLد و پارامترهاي بعLLدي با مقLLدار پيشفرض پLLر
ميشوند.
مثال در تLLابع )(pکه در باال قيLLد شLLد ،فراخLLواني ) p(8.0,7,6باعث
ميشود که پارامتر xمقLLLدار 8.0را بگLLLيرد سپس پارامتر a0مقLLLدار 7را
بگيرد و سپس پارامتر a1مقدار 6را بگيرد .پارامترهاي a2و a3مقLLLدار
پيشفرضشان را خواهند داشت .اين ترتيب را نميتوانيم به هم بزنيم .مثال
نميتوانيم تابع را طوري فرا بخوانيم که پارامترهاي xو a0و a3مستقيما
مقLLدار بگيرنLLد ولي پارامترهاي a1و a2مقLLدار پيشفرضشLLان را داشLLته
باشند.
پايان جلسه پنجم