کامپیوتر و IT و اینترنتعلوم مهندسی

برخی از توابع در زبان برنامه نوسی ++ C

صفحه 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ته باشند. پايان جلسه پنجم

51,000 تومان