Your SlideShare is downloading. ×
C++
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

C++

978
views

Published on

Published in: Education, Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
978
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. ‫بسم ال الرحمن‬ ‫الرحيم‬
  • 2. ‫دانشگاه پيام‬ ‫نور‬ ‫دانشكده فناوري اطلعات‬
  • 3. ‫برنامه سازي پيشرفته‬ ‫تعداد واحد: 3‬ ‫تهيه كننده:‬ ‫دكتر احمد فراهي‬
  • 4. ‫:مقدمه‬ ‫زبان ‪ C‬يک زبان همه منظوره‬ ‫است. دستورالعمل‌هاي اين زبان‬ ‫بسيار شبيه عبارات جبري و نحو‬ ‫آن شبيه جملت انگليسي مي باشد.‬ ‫اين امر سبب مي‌شود که ‪ C‬يک‬ ‫زبان سطح بال باشد که‬
  • 5. ‫++ ‪ C‬که از نسسسل ‪ C‬است، تمام‬ ‫ويژگي‌هاي ‪ C‬را بسه ارث برده اسست. اما‬ ‫برتري فني ديگري هم دارد: ‪ ++C‬اکنون‬ ‫»شي‌گرا« اسست. مي‌توان بسا استفاده از‬ ‫ايسسن خاصسسيت، برنامه‌هاي شي‌گرا توليد‬ ‫نمود. برنامه‌هاي شي‌گرا منظم و‬ ‫ساخت‌يافته‌اند، قابسل روزآمسد کردن‌انسد، به‬ ‫سهولت تغيير و بهبود مي‌يابند و قابليت‬ ‫اطمينان و پايداري بيشتري دارند.‬
  • 6. ‫:اهم مطالب اين كتاب‬ ‫جلسه اول: »مقدمات برنامه‌نويسي با ‪«++C‬‬ ‫جلسه دوم: »انواع اصلي«‬ ‫«جلسه سوم: »انتخاب‬ ‫جلسه چهارم: ››تكرار«‬ ‫«جلسه پنجم: »توابع‬ ‫جلسه‌ ششم: » آرايه‌ها«‬
  • 7. ‫‌‬ ‫‌‬ ‫«جلسه هفتم: »اشارهگرها و ارجاعها‬ ‫‌‬ ‫‌ ‌‬ ‫جلسه‌ هشتم: »رشتههاي كاراكتري و فايلها در ++‪C‬استاندارد«‬ ‫جلسه نهم: »شيئ‌گرايي«‬ ‫«جلسه‌ دهم: »سربارگذاري عملگرها‬ ‫جلسه يازدهم: »تركيب و وراثت«‬
  • 8. ‫جلسه اول‬ ‫مقدمات برنامه‌نويسي با‬ ‫‪++C‬‬
  • 9. ‫:آنچه در اين جلسه مي خوانيد‬ ‫1- چرا ‪ ++C‬؟‬ ‫2- تاريخچ ۀ ‪++C‬‬ ‫3- آماده‌سازي مقدمات‬ ‫4- شروع کار با ‪++C‬‬ ‫5- عملگر خروجي‬ ‫6- ليترال‌ها و کاراکترها‬ ‫7- متغيرها و تعريف آن‌ها‬ ‫8- مقداردهي اوليه به متغيرها‬ ‫9- ثابت‌ها‬
  • 10. ‫هدف کلي:‬ ‫آشنايي با تاريخچه و مزاياي زبان برنامه‌نويسي‬ ‫‪ ++C‬و بيان مفاهيم بنيادي شي‌گرايي و عناصر‬ ‫مهم برنامه‌هاي ‪++C‬‬
  • 11. ‫:هدف‌هاي رفتاري‬ ‫انتظار مي‌رود پس از پايان اين جلسه بتوانيد:‬ ‫- مزاياي زبان ‪ ++C‬را بر زبان‌هاي مشاب ه ذکر‬ ‫کرده و تفاوت آن را با زبان ‪ C‬بيان کنيد.‬ ‫- شرح مختص ري از رون د پيشرفت زبان‌هاي‬ ‫برنامه‌نويسي را بيان کرده و مشکلت هر دوره را‬ ‫به اختصار شرح دهيد.‬ ‫- مزاياي شي‌گرايي در توليد نرم‌افزار را برشماريد.‬ ‫- اصول سه‌گانۀ شي‌گرايي را نام برده و هر يک‬ ‫را به اختصار شرح دهيد.‬
  • 12. ‫- قال ب کل ي برنامه‌هاي ‪ ++C‬را بشناس يد و بتوانيد‬ ‫برنامه‌هاي کوچک را نوشته و آزمايش کنيد.‬ ‫- عملگر ورودي و خروجي را در ‪ ++C‬شناخته و از آن‌ها‬ ‫در برنامه‌ها استفاده کنيد.‬ ‫- نحوۀ اعلن متغيره ا و شيوۀ مقدارده ي ب ه آن‌ها را‬ ‫بدانيد.‬ ‫- سه موجوديت »ليترال« ، »کاراکتر« و »عدد« را شناخته‬ ‫و فرق بين آن‌ها را شرح دهيد.‬ ‫- علت و شيوه‌هاي افزودن توضيح به کد برنامه را شرح‬ ‫دهيد.‬ ‫- علت و شيوۀ معرفي ثابت‌ها در برنامه را شرح دهيد.‬
  • 13. ‫مقدمه‬ ‫در دهه 0791 در آزمايشگاه‌هاي بل زباني به نام ‪C‬‬ ‫ايجاد شد. انحصار اين زبان در اختيار شرکت بل بود‬ ‫تا اي ن ک ه در س ال 8791 توسط ‪ Kernighan‬و‬ ‫‪ Richie‬شرح کامل ي از اي ن زبان منتش ر ش د و به‬ ‫سرعت نظر برنامه‌نويسان حرفه‌اي را جلب نمود.‬ ‫هنگام ي ک ه بح ث شي‌گراي ي و مزاياي آن در جهان‬ ‫نرم‌افزار رون ق ياف ت، زبان ‪ C‬که قابليت شي‌گرايي‬ ‫نداشت ناقص به نظر مي‌رسيد تا اين که در اوايل‬ ‫ده ۀ 0891 دوباره شرک ت ب ل دس ت ب ه کار شد و‬ ‫‪ Bjarne Stroustrup‬زبان ‪ ++C‬را طراحي نمود‬
  • 14. ‫‪ ++C‬ترکيبي از دو زبان ‪ C‬و ‪ Simula‬بود و‬ ‫قابليت‌هاي شي‌گراي ي ني ز داشت. از آ ن زمان به‬ ‫بع د شرکت‌هاي زيادي کامپايلرهايي براي ‪++C‬‬ ‫طراحي کردند. اين امر سبب شد تفاوت‌هايي بين‬ ‫نس خه‌هاي مختل ف اي ن زبان ب ه وجود بيايد و از‬ ‫قابليت سازگاري و انتقال آن کاسته شود.‬ ‫ب ه همين دليل در س ال 8991 زبان ‪ ++C‬توسط‬ ‫موس سۀ اس تانداردهاي مل ي آمريک ا )‪ (ANSI‬به‬ ‫شکل استاندارد و يک‌پارچه در‌آمد.‬
  • 15. ‫1- چرا ‪ ++C‬؟‬ ‫‪ ‬زبان ‪ C‬يک زبان همه ظوره است‬ ‫من‬ ‫‪ ‬در اي ن زبان عملگ هاي ي ت عبيه شده که‬ ‫ر‌‬ ‫برنامه ي طح پاي ين و به زبان ماشين را‬ ‫‌نويس س‬ ‫نيز امکان‌پذير ي‌سازد‬ ‫م‬ ‫هاي فراواني دارد، کد منبع‬ ‫‪‬چون ‪ C‬عملگر‬ ‫برنام ها در اين زبان بسيار کوتاه است‬ ‫ه‌‬
  • 16. ‫- زبان ‪ C‬براي اجراي بسياري از دستوراتش از توابع کتابخانه‌اي‬ ‫‪‬‬ ‫استفاده مي‌کند و بيشتر خصوصيات وابسته به سخت‌افزار را به اين‬ ‫توابع واگذار مي‌نمايد.‬ ‫‪ ‬برنامۀ مقصدي که توسط کامپايلرهاي ‪ C‬ساخته مي‌شود بسيار‬ ‫فشرده‌تر و کم‌حجم‌تر از برنامه‌هاي مشابه در ساير زبان‌ها است.‬ ‫‪ ++C‬که از نسل ‪ C‬است، تمام ويژگي‌هاي جذاب ‪ C‬را به ارث‬ ‫‪‬‬ ‫برده است .‬ ‫و سرانجام آخرين دليل استفاده از ‪ ++C‬ورود به دنياي ‪ #C‬است.‬ ‫‪‬‬
  • 17. ‫2- تاريخچۀ ‪++C‬‬ ‫در ده ه 0791 در آزمايشگاه‌هاي ب ل زبان ي به نام ‪C‬‬ ‫ايجاد شد. انحصار اين زبان در اختيار شرکت بل بود تا‬ ‫اي ن ک ه در س ال 8791 توسط ‪ Kernighan‬و ‪Richie‬‬ ‫شرح کاملي از اين زبان منتشر شد و به سرعت نظر‬ ‫برنامه‌نويسان حرفه‌اي را جلب نمود. هنگامي که بحث‬ ‫شي‌گرايي و مزاياي آن در جهان نرم‌افزار رونق يافت،‬ ‫زبان ‪ C‬که قابلي ت شي‌گراي ي نداش ت ناق ص ب ه نظر‬ ‫مي‌رسيد تا اين که در اوايل دهۀ 0891 دوباره شرکت‬ ‫بل دست به کار شد و ‪ Bjarne Stroustrup‬زبان ‪++C‬‬ ‫را طراحي نمود.‬
  • 18. ‫‪ ++C‬ترکيبي از دو زبان ‪ C‬و ‪ Simula‬بود و‬ ‫قابليت‌هاي شي‌گرايي نيز داشت از آن زمان به بعد‬ ‫شرکت‌هاي زيادي کامپايلرهايي براي ‪ ++C‬طراحي‬ ‫کردند. اي ن ام ر س بب ش د تفاوت‌هاي ي بين‬ ‫نس خه‌هاي مختل ف اي ن زبان ب ه وجود بيايد و از‬ ‫قابليت سازگاري و انتقال آن کاسته شود . به همين‬ ‫دلي ل در س ال 8991 زبان ‪ ++C‬توس ط موسسۀ‬ ‫اس تانداردهاي مل ي آمريک ا )‪ (ANSI‬به شکل‬ ‫استاندارد و يک‌پارچه در‌آمد. کامپايلرهاي کنوني به‬ ‫اي ن اس تاندارد پايبندند. کتاب حاض ر نيز بر مبناي‬ ‫همين استاندارد نگارش يافته است.‬
  • 19. ‫آماده‌سازي مقدمات -3‬ ‫يک »برنامه« دستورالعمل‌هاي متوالي است که‬ ‫مي‌تواند توسط يک رايانه اجرا شود. براي نوشتن‬ ‫و اجراي هر برنامه به يک »ويرايش‌گر متن« و يک‬ ‫»کامپايلر« احتياج داريم.‬ ‫بس تۀ ‪ ++Visual C‬محص ول شرکت‬ ‫ميکروس افت و بس تۀ ‪ C++ Builder‬محصول‬ ‫شرکت بورلند نمونه‌هاي جالبي از محيط مجتمع‬ ‫توليد براي زبان ‪ ++C‬به شمار مي‌روند.‬
  • 20. ‫4- شروع کار با ‪++C‬‬ ‫‪ ++C ‬نسبت به حروف »حساس به حالت« است يعني ‪ A‬و‬ ‫‪ a‬را يکي نمي‌داند‬ ‫مثال : اولين برنامه‬ ‫اولين برنامه‌اي که مي‌نويسيم به محض تولد، به شما سلم مي‌کند و عبارت "‪ "!Hello, my programmer‬را‬ ‫نمايش مي‌دهد:‬ ‫#‪<include <iostream‬‬ ‫‪()int main‬‬ ‫} ‪; "std::cout << "Hello, my programmer!n‬‬ ‫0 ‪;return‬‬ ‫{‬
  • 21. ‫اولين خط از کد بال يک »راهنماي‬ ‫پيش‌پردازنده« است. راهنماي پيش‌پردازنده‬ ‫شامل اجزاي زير است:‬ ‫‪ -1 ‬کاراکتر # که نشان مي‌دهد اين خط، يک‬ ‫راهنماي پيش‌پردازنده اس ت. اي ن کاراکت ر بايد‬ ‫در ابتداي همۀ خطوط راهنماي پيش‌پردازنده‬ ‫باشد.‬ ‫‪ -2 ‬عبارت ‪include‬‬ ‫‪ -3 ‬نام يک »فايل کتابخانه‌اي« که ميان دو‬ ‫علمت >< محصور شده است.‬
  • 22. ‫خط دوم برنامه نيز بايد در همه برنامه‌هاي ‪+C‬‬ ‫+ وجود داشته باشد.‬ ‫اين خط به کامپايلر مي‌گويد که »بدنۀ اصلي برنامه« از کجا شروع‬ ‫مي‌شود. اين خط داراي اجزاي زير است:‬ ‫1 – عبارت ‪ int‬که يک نوع عددي در ‪ ++C‬است.‬ ‫2 – عبارت ‪ main‬که به آن »تابع اصلي« در ‪ ++C‬مي‌گويند.‬ ‫3 – دو پرانتز )( که نشان مي‌دهد عبارت ‪ main‬يک »تابع« است.‬ ‫هر برنامه فقط بايد يک تابع‬ ‫‪ ()main‬داشته باشد .‬
  • 23. ‫سه خط آخر برنامه، »بدنۀ اصلي برنامه« را تشکيل‬ ‫.مي‌دهند‬ ‫دستورات برنامه از خط سوم شروع شده است.‬ ‫دستور خط سوم با علمت سميکولن ; پايان يافته‬ ‫است.‬
  • 24. ‫توضيح‬ ‫‪‬توضي ح، متن ي اس ت ک ه به منظور‬ ‫راهنماي ي و درک بهت ر ب ه برنام ه اضافه‬ ‫مي‌شود و تاثيري در اجراي برنامه‬ ‫ندارد. . کامپايلر توضيحات برنامه را قبل‬ ‫از اجرا حذف مي‌کند.‬ ‫‪ ‬اس تفاده از توضي ح س بب مي‌شود که‬ ‫ساير افراد ک د برنام ۀ شم ا را راحت‌تر‬
  • 25. ‫به دو صورت مي‌توانيم به برنامه‌هاي ‪ ++C‬توضيحات اضافه‬ ‫کنيم:‬ ‫‪ – 1 ‬با اس تفاده از دو علمت‬ ‫اس لش // : هر متن ي ک ه بعد از دو‬ ‫علم ت اس لش بياي د تا پايان همان‬ ‫سطر يک توضيح تلقي مي‌شود .‬ ‫‪ – 2‬با استفاده از حالت ‪ : C‬هر متني‬ ‫که ب ا علم ت /* شروع شود و با‬ ‫علمت */ پايان يابد يک توضيح تلقي‬
  • 26. ‫5- عملگر خروجي‬ ‫علم ت >> عملگ ر خروج ي در ‪ ++C‬نام دارد )به آن‬ ‫عملگر درج نيز مي‌گويند(.‬ ‫يک »عملگر« چيزي است که عملياتي را روي يک يا چند‬ ‫شي انجام مي‌دهد. عملگر خروجي، مقادير موجود در سمت‬ ‫راستش را به خروجي سمت چپش مي‌فرستد.‬ ‫به اين ترتيب دستور‬ ‫; 66 <<‪cout‬‬ ‫مقدار 66 را به خروجي ‪ cout‬مي‌فرستد که ‪ cout‬معمول‬ ‫به صفحه‌نمايش اشاره دارد. در نتيجه مقدار 66 روي صفحه‬ ‫نمايش درج مي‌شود.‬
  • 27. ‫6 -ليترال‌ها و کاراکترها‬ ‫ي ک »ليترال« رشته‌اي از حروف، ارقام ي ا علي م چاپي‬ ‫اس ت ک ه ميان دو علم ت نق ل قول " " محصور شده‬ ‫باشد.‬ ‫يک »کاراکتر« يک حرف، رقم يا علمت قابل چاپ است‬ ‫که ميان دونشانۀ ' ' محصور شده باشد. پس '‪ 'w‬و '!' و‬ ‫'1' هر کدام يک کاراکتر است.‬ ‫به تفاوت سه موجوديت »عدد« و »کاراکتر« و »ليترال‬ ‫رشته‌اي« دق ت کني د: 6 يک عدد اس ت، '6' يک کاراکتر‬ ‫است و "6" يک ليترال رشته‌اي است.‬
  • 28. ‫7 - متغيرها و تعريف آن‌ها:‬ ‫»متغيسر« مکانسي در حافظسه اسست کسه چهار مشخصه‬ ‫دارد: نام، نوع، مقدار، آدرس س . وقتي متغيري را‬ ‫تعري ف مي‌کني م، ابتدا ب ا توج ه ب ه نوع متغير،‬ ‫آدرسي از حافظه در نظر گرفته مي‌شود، سپس‬ ‫به آن آدرس يک نام تعلق مي‌گيرد.‬
  • 29. ‫در ‪ ++C‬قبل از اين که بتوانيم از متغيري استفاده‬ ‫کنيم، بايد آن را اعلن نماييم.‬ ‫نحو اعلن يک متغير‬ ‫‪type name initializer‬‬ ‫عبارت ‪ type‬نوع متغي ر را مشخص مي‌کند.‬ ‫نوع متغير به کامپايلر اطلع مي‌دهد که اين‬ ‫متغي ر چ ه مقاديري مي‌توان د داشت ه باشد و‬ ‫چه اعمالي مي‌توان روي آن انجام داد.‬
  • 30. ‫‪name initializer‬‬ ‫عبارت ‪ name‬نام متغي ر را نشان مي‌دهد. اين نام‬ ‫حداکث ر مي‌توان د 13 کاراکت ر باش د، نباي د با عدد شروع‬ ‫شود، علي م رياض ي نداشت ه باش د و همچني ن »کلمۀ‬ ‫کليدي« نيز نباشد.‬ ‫مقداردهي اوليه‬ ‫عبارت ‪ initializer‬عبارت »مقداردهي اوليه« نام دارد. با‬ ‫استفاده از اين عبارت مي‌توان مقدار اوليه‌اي در متغير‬ ‫مورد نظر قرار داد.‬ ‫دستور زير تعريف يک متغير صحيح را نشان مي‌دهد:‬ ‫;05 = ‪int n‬‬
  • 31. ‫8 - مقداردهي اوليه به متغيرها‬ ‫در بسياري از موارد بهتر است متغيرها را در همان محلي که‬ ‫اعلن مي‌شون د مقدارده ي کنيم. استفاده از متغيرهاي‬ ‫مقداردهي نشده ممکن است باعث ايجاد دردسرهايي شود.‬ ‫دردس ر متغيرهاي مقدارده ي نشده وقت ي بزرگ‌ تر مي‌شود که‬ ‫سعي کني م متغي ر مقدارده ي نشده را در ي ک محاس به به کار‬ ‫ببريم. مثل اگر ‪ x‬را که مقداردهي نشده در عبارت 5 + ‪;y = x‬‬ ‫به کار ب بريم، حاص ل ‪ y‬غي ر قاب ل پيش‌ بيني خواهد بود. براي‬ ‫اجتناب از چنين مشکلتي عاقلنه است که متغيرها را هميشه‬ ‫هنگام تعريف، مقداردهي کنيم.‬ ‫مثال:‬ ‫;54=‪int x‬‬ ‫;0=‪int y‬‬
  • 32. ‫9- ثابت‌ها‬ ‫در بعضي از برنامه ‌ها از متغيري استفاده مي‌کنيم که فقط يک بار لزم‬ ‫است آن را مقداردهي کنيم و سپس مقدار آن متغير در سراسر برنامه‬ ‫بدون تغيير باقي مي‌ماند. مثل در يک برنامۀ محاسبات رياضي، متغيري به‬ ‫نام ‪ PI‬تعريف مي‌کنيم و آن را با 41.3 مقداردهي مي‌کنيم و مي‌خواهيم‬ ‫که مقدار اي ن متغي ر در س راسر برنام ه ثاب ت بماند. در چني ن حالتي از‬ ‫»ثابت‌ها« استفاده مي‌کنيم.‬ ‫يک ثابت، يک نوع متغير است که فقط يک بار مقداردهي‬ ‫مي‌شود و سپس تغيير دادن مقدار آن در ادامۀ برنامه ممکن‬ ‫نيست.‬ ‫تعريف ثابت‌ها مانند تعريف متغيرهاست با اين تفاوت که‬ ‫کلمه کليدي ‪ const‬به ابتداي تعريف اضافه مي‌شود.‬
  • 33. :‫مثال تعريف ثابت‌ها‬ int main() { // defines constants; has no output: const char BEEP ='b'; const int MAXINT=2147483647; const float DEGREE=23.53; const double PI=3.14159265358979323846 return 0; } ‫:برنامه فوق خروجي ندارد‬
  • 34. ‫عملگر ورودي - 01‬ ‫براي اين که بتوانيم هنگام اجراي برنامه مقاديري را وارد کنيم از‬ ‫عملگر ورودي << استفاده مي‌کنيم.‬ ‫:استفاده از دستور ورودي به شکل زير است‬ ‫;‪cin >> variable‬‬ ‫‪ variable‬نام يک متغير است.‬
  • 35. ‫مثال 101 – استفاده از عملگر ورودي‬ ‫برنامس ۀزسسسيسر يسک عدد از کاربر گرفته و همان عدد را دوباره در‬ :‫خروجي نمايش مي‌دهد‬ int main() { // reads an integer from input: int m; cout << "Enter a number: "; cin >> m; cout << "your number is: " << m << endl; return 0; } Enter a number: 52 your number is: 52
  • 36. ‫عملگسر ورودي نيسز ماننسد عملگسر خروجسي بسه شکل‬ ‫جريانسي رفتار مي‌کند. يعنسي همان طور کسه در عملگر‬ ‫خروجي مي‌توانستيم چند عبارت را با استفاده از چند‬ ‫عملگسر >> به صسورت پشست سسر هسم چاپ کنيم، در‬ ‫عملگر ورودي نيز مي‌توانيم با استفاده از چند عملگر‬ ‫<< چند مقدار را به صورت پشت سر هم دريافت کنيم.‬ ‫مثل با استفاده از دستور:‬ ‫;‪cin >> x >> y >> z‬‬ ‫سه مقدار ‪ x‬و ‪ y‬و ‪ z‬به ترتيب از ورودي دريافت مي‌شوند.‬ ‫براي ايسسن کار بايسسد بيسسن هسسر ورودي يسسک فضاي خالي‬ ‫)‪ (space‬بگذاريد و پس از تايپ کردن هم ۀوسسسرودي‌ها، کليد‬ ‫‪ enter‬را بفشاريد. آخرين مثال جلسه، اين موضوع را بهتر‬
  • 37. ‫مثال 111 – چند ورودي روي يک خط‬ ‫برنام ۀزسسسير مانند مثال 01 – 2 است با اين تفاوت که سه‬ ‫عدد را از ورودي گرفته و همان اعداد را دوباره در‬ :‫خروجي نمايش مي‌دهد‬ int main() { // reads 3 integers from input: int q, r, s; cout << "Enter three numbers: "; cin >> q >> r >> s; cout << "your numbers are: << q << ", " << r << ", " << s << endl; return 0; Enter three numbers: 35 70 9 your numbers are: 35, 70, 9 }
  • 38. ‫پايان جلسه اول‬
  • 39. ‫جلسه دوم‬ ‫»انواع اصلي«‬
  • 40. ‫:آنچه در اين جلسه مي خوانيد‬ ‫1- انواع داد ۀعسسسسددي‬ ‫2- متغير عدد صحيح‬ ‫3- محاسبات اعداد صحيح‬ ‫4- عملگرهاي افزايشي و‬ ‫کاهشي‬ ‫5- عملگرهاي مقدارگذاري مرکب ›››‬
  • 41. ‫7- تعريف متغير مميز شناور‬ ‫8 - شکل علمي مقادير مميز‬ ‫شناور‬ ‫9- نوع بولين ‪bool‬‬ ‫01- نوع کاراکتري ‪char‬‬ ‫11- نوع شمارشي ‪enum‬‬ ‫›››‬ ‫21- تبديل نوع، گسترش نوع‬
  • 42. ‫31- برخي از خطاهاي‬ ‫برنامه‌نويسي‬ ‫41 - سرريزي عددي‬ ‫51- خطاي گرد کردن‬ ‫61- حوزۀ متغيرها‬
  • 43. ‫هدف کلي:‬ ‫هدف‌هاي رفتاري:‬ ‫انتظار مي‌رود پ س از وپايان اي بن‌کارگيري‬ ‫معرف ي انواع متغييرها نحوۀ ه جلسه‬ ‫بتوانيد:در برنامه‌هاي ‪++C‬‬ ‫آن‌ها‬ ‫- انواع عددي صحيح در ‪ ++C‬را نام ببريد و‬ ‫متغيرهاي ي از اي ن نوع‌ ها را در برنامه‌ ها به‬ ‫کار ببريد.‬ ‫- انواع عددي مميز شناور در ‪ ++C‬را نام‬ ‫ببري د و متغيرهاي ي از اي ن نوع‌ها را در‬ ‫<<<‬ ‫برنامه‌ها به کار ببريد.‬ ‫- نوع بولين را تعريف کرده و متغيرهايي از‬
  • 44. ‫- نوع شمارشي را شناخته و متغيرهايي از‬ ‫اين نوع را در برنامه‌ها به کار ببريد.‬ ‫- مفاهيم »تبديل نوع« و »گسترش نوع« را‬ ‫شناخته و انواع مختلف را به يکديگر تبديل‬ ‫نماييد.‬ ‫- عل ت خطاهاي »سرريزي عددي« و‬ ‫»گردکردن« را دانسته و بتوانيد محل وقوع‬ ‫آن‌ها را کشف کنيد.‬ ‫- عملگرهاي حسابي و افزايشي و کاهشي‬
  • 45. ‫مقدمه‬ ‫م ا در زندگ ي روزمره از داده‌هاي مختلفي‬ ‫استفاده مي‌کنيم: اعداد ، تصاوير، نوشته‌ها‬ ‫يا حروف الفب ا، ص داها، بوه ا و ... . با‬ ‫پردازش اي ن داده‌ ها مي‌تواني م تصميماتي‬ ‫اتخاذ کنيم، عکس‌العمل‌هايي نشان دهيم و‬ ‫مس اله‌اي را ح ل کنيم. رايانه‌ ها نيز قرار‬ ‫اس ت همي ن کار را انجام دهند. يعني‬ ‫داده‌هايي را بگيرند، آن ‌ها را به شکلي که‬ ‫ما تعيين مي‌کنيم پردازش کنند و در نتيجه‬
  • 46. ‫1- انواع دادۀ عددي‬ ‫در ‪ ++C‬دو نوع اصلي داده وجود دارد:‬ ‫»نوع ص حيح« و »نوع مميز شناور«.‬ ‫همۀ انواع ديگر از روي اين دو ساخته‬ ‫مي‌شوند )به شکل زير دقت کنيد(.‬ ‫انواع اصلي‬ ‫انواع مميز شناور انواع صحيح‬
  • 47. ‫نوع صحيح‬ ‫نوع صحيح براي نگهداري اعداد‬ ‫صحيح )اعداد 0 و 1 و 2 و ...(‬ ‫استفاده مي‌شود. اين اعداد بيشتر‬ ‫براي شمارش ب ه کار مي‌روند و‬ ‫دامنه محدودي دارند.‬
  • 48. ‫انواع صحيح‬ ‫نوع‬ ‫نوع‬ ‫نوع‬ ‫نوع‬ boolean ‫ي‬‫شمارش‬ ‫کاراکتري‬ ‫عددي صحيح‬ short bool enum char int long unsigned Unsigned char short Unsigned wchar_t int unsigned long
  • 49. ‫نوع مميز شناور براي نگهداري اعداد اعشاري‬ ‫اس تفاده مي‌شود. اعداد اعشاري بيشتر براي‬ ‫اندازه‌گيري دقيق به کار مي‌روند و دامنۀ بزرگ‌تري‬ ‫دارند . يک عدد اعشاري مثل 781/253 را مي‌توان‬ ‫به شک ل 01×81/2537 يا 201×1/25378‬ ‫يا01×3781/251-يا01×53781/2 2-و يا ... نوشت.‬ ‫به اي ن انواع مميز کم و زياد کردن‬ ‫ترتي ب ب ا شناور‬ ‫توان عدد 01 مميز عدد نيز جابه‌جا‬ ‫مي‌شود . به همين دليل است که به‬ ‫اعداد اعشاري »اعداد مميز ‪«float‬‬ ‫شناور‬ ‫‪double‬‬ ‫‪long double‬‬ ‫مي‌گويند.‬
  • 50. ‫متغير عدد صحيح -2‬ ‫‪ ++C‬شش نوع متغي ر عدد صحيح دارد‬ ‫تفاوت اي ن ش ش نوع مربوط به ميزان‬ ‫حافظ ۀ مورد استفاده و محدودۀ مقاديري‬ ‫است که هر کدام مي‌توانند داشته باشند.‬ ‫اين ميزان حافظۀ مورد استفاده و محدودۀ‬ ‫مقادي ر، بس تگي زيادي ب ه سخت‌افزار و‬ ‫همچني ن س يستم عام ل دارد. يعن ي ممکن‬ ‫اس ت روي ي ک رايان ه، نوع ‪ int‬دو بايت از‬ ‫حافظ ه را اشغال کن د در حال ي که روي‬ ‫رايانه‌اي از نوع ديگ ر نوع ‪ int‬به چهار بايت‬
  • 51. ‫نوع متغيير‬ ‫حداقل مقدار قابل‬ ‫حداكثر مقدار قابل‬ ‫پذيرش‬ ‫پذيرش‬ ‫‪short‬‬ ‫86723-‬ ‫76723‬ ‫‪unsigned short‬‬ ‫توجسه داشته‬ ‫0‬ ‫53556‬ ‫وقتسي برنامه‌اي مي‌نويسسيد،‬ ‫باشيسد کسه از نوع صسحيح مناسسب استفاده‬ ‫‪int‬‬ ‫7463847412 8463847412-‬ ‫5927694924 برنامه دچار خطا ‪unsigned int‬‬ ‫نشود و هم‬ ‫0‬ ‫کنيد تا هم‬ ‫حافظ ۀسسسسيستم را هدر ندهيد.‬ ‫‪long‬‬ ‫8463847412-‬ ‫7463847412‬ ‫‪unsigned long‬‬ ‫0‬ ‫5927694924‬
  • 52. ‫3 -محاسبات اعداد صحيح‬ ‫‪ ++C‬مانن د اغلب زبان‌هاي‬ ‫برنامه‌نويسي براي محاسبات از‬ ‫عملگرهاي جم ع )+( ، تفريق‬ ‫)-( ، ضرب )*( ، تقسيم )/( و‬ ‫باقيمانده )%( استفاده مي‌کند.‬
  • 53. ‫4 - عملگرهاي افزايشي و کاهشي‬ ‫‪ ++C‬براي دستکاري مقدار متغيرهاي صحيح، دو‬ ‫عملگر جالب ديگر دارد:‬ ‫عملگر ++ کدام از ايسن عملگرها دو‬ ‫امسا هسر :‬ ‫شکسسسل متفاوت دارنسسسد : شکل‬ ‫مقدار يک متغير را يک واحد افزايش‬ ‫»پيشوندي« و شکل »پسوندي«.‬ ‫مي‌دهد.‬ ‫عملگر -- :‬
  • 54. ‫در شک ل پيشوندي ابتدا متغير،‬ ‫متناس ب ب ا عملگعملگر قبلش نام‬ ‫يا‬ ‫در شکل پيشوندي، ر، افزاي از‬ ‫متغير مي‌آيد مثل ++ ‪ m‬يا -- ‪ . n‬در‬ ‫کاهش مي‌يابد و پس از آن مقدار‬ ‫شک ل پس وندي، عملگ ر بعد از نام‬ ‫متغير مي‌آيد مثل محاس يا ‪ . --n‬ديگر‬ ‫متغي ر براي ‪ ++m‬بات‬ ‫استفاده مي‌شود.‬ ‫در شک ل پسوندي ابتدا مقدار‬ ‫متغير در محاسبات به کار مي‌رود‬ ‫و پس از آن مقدار متغير يک واحد‬
  • 55. ‫5 – عملگرهاي مقدارگذاري مرکب‬ ‫‪ ++ C‬عملگرهاي ديگري دارد که‬ ‫مقدارگذاري در متغيره ا را تسهيل‬ ‫م ي ‌نمايند. مثل با ا ستفاده از عملگر‬ ‫+= م ي ‌تواني م هش ت واح د به ‪m‬‬ ‫اضا فه کن يم ا ما با د ستور کوتا ه ‌ تر:‬ ‫دستور بال معادل دستور 8 + ‪ ;m = m‬است‬ ‫با اين تفاوت که کوتاه‌تر است. به عملگر +=‬ ‫»عملگ ر مرک ب« مي‌گوين د زيرا ترکيبي از‬
  • 56. ‫عملگرهاي مقدارگذاري مرکب -5‬ ‫براي مقدارگذاري در‬ ‫قبل از عملگر =‬ ‫متغيرها استفاده کرديم. ‪ ++C‬عملگرهاي‬ ‫ديگري دارد ک ه مقدارگذاري در متغيرها را‬ ‫تسهيل مي‌نمايند.‬ ‫+= و‬ ‫عملگر مرکب در ‪ ++C‬عبارتند از:‬ ‫-= و *= و /= و =%‬
  • 57. ‫نحوۀ ع مل ا ين عملگر ها به شکل‬ ‫زير است:‬ ‫;8 + ‪m += 8; → m = m‬‬ ‫;8 - ‪m -= 8; → m = m‬‬ ‫;8 * ‪m *= 8; →m = m‬‬ ‫;8 / ‪m /= 8; →m = m‬‬ ‫;8 % ‪m %= 8; →m = m‬‬
  • 58. ‫6 – انواع مميز شناور‬ ‫عدد مميز شناور به بيان ساده همان عدد اعشاري است. عددي‬ ‫مثل 54.321 يک عدد اعشاري است. براي اين که مقدار اين‬ ‫عدد در رايانسه ذخيره شود، ابتدا بايسد بسه شکسل دودويسي تبديل‬ ‫21001110.1101111 = 54.321‬ ‫شود:‬ ‫اکنون براي مشخ ص نمودن محل اعشار در عدد، تمام‬ ‫رقم ‌ها را به سمت راست مميز منتقل مي‌کنيم. البته با هر‬ ‫جابجايي مميز، عدد حاصل بايد در تواني از 2 ضرب شود:‬ ‫72 ×10011101101111.0 = 54.321‬ ‫به مقدار 10011101101111 »مانتيس عدد« و به‬ ‫7 که توان روي دو است، »نماي عدد« گفته مي‌شود.‬
  • 59. ‫در ‪ ++C‬سه نوع مميز شناور وجود‬ ‫دارد:‬ ‫انواع مميز شناور‬ ‫‪float‬‬ ‫‪double‬‬ ‫‪long double‬‬ ‫نوع ‪ double‬از هشتهشتبراي‬ ‫نوع ‪ long double‬از بايت‬ ‫معمول نوع ‪ float‬از چهار يا‬ ‫نگهداري عدد استفاده مي‌کند.بايت‬ ‫ده براي نگهداري شانزده بايت‬ ‫عدد استفاده‬ ‫ي ا دوازده ي ا‬ ‫برايي نگهداري عدد استفاده‬ ‫م ‌کند.‬
  • 60. ‫جدول تخصيص حافظه براي متغيير هاي مميز شناور‬ ‫تعداد بيت براي ذخيره‌سازيِ‬ ‫نوع متغير‬ ‫نما مانتيس‬ ‫علمت‬ ‫عدد‬ ‫23‪ float‬بيتي‬ ‫8 32‬ ‫1‬ ‫46 ‪double‬‬ ‫بيتي‬ ‫11 25‬ ‫1‬
  • 61. ‫7 – تعريف متغير مميز شناور‬ ‫تعري ف متغي ر ممي ز شناور مانن د تعريف‬ ‫تفاوت نوع ‪ float‬با نوع ‪ double‬در اين‬ ‫متغي ر ص حيح اس ت . با اي ن تفاوت که از‬ ‫است که نوع ‪ double‬دو برابر ‪ float‬از‬ ‫کلم ۀ کليدي ‪ float‬يا ‪ double‬براي‬ ‫حافظ ه اس تفاده مي‌کند. پس نوع‬ ‫مشخ ص نمودن نوع متغي ر استفاده‬ ‫‪ double‬دقت ي بس يار بيشتر از ‪float‬‬ ‫مي‌کنيم.‬ ‫دارد . به همين دليل محاسبات ‪double‬‬ ‫مثال:‬ ‫وقت‌گيرتر از محاسبات ‪ float‬است.‬ ‫;‪float x‬‬
  • 62. ‫شکل علمي مقادير مميز شناور -8‬ ‫اعداد ممي ز شناور ب ه دو صورت در ورودي و‬ ‫خروج ي نشان داده مي‌شون د : به شکل‬ ‫»ساده« و به شکل »علمي«.‬ ‫علمي -2‬ ‫ساده -1‬ ‫401×765432.1‬ ‫76.54321‬ ‫مشخ ص اس ت ک ه شک ل علمي براي‬ ‫نشان دادن اعداد خيل ي کوچک و‬ ‫همچني ن اعداد خيل ي بزرگ، کارآيي‬ ‫بيشتري دارد.‬
  • 63. ‫9 – نوع بولين ‪bool‬‬ ‫نوع ‪ bool‬يک نوع ص حيح اس ت که‬ ‫متغيرهاي اين نوع فقط مي‌توانند مقدار‬ ‫‪ true‬يا ‪ false‬داشت ه باشند. ‪ true‬به‬ ‫معني درست و ‪ false‬به معني نادرست‬ ‫است.‬ ‫اما اين مقادير در اصل به صورت 1 و 0‬ ‫درون رايان ه ذخيره مي‌شوند: 1 براي‬ ‫‪ true‬و 0 براي ‪.false‬‬
  • 64. ‫01- نوع کاراکتري ‪char‬‬ ‫يک کاراکتر يک حرف، رقم يا نشانه است که‬ ‫يک شمارۀ منحص ر ب ه فرد دارد. به عبارت‬ ‫عاميان ه، ه ر کليدي ک ه روي صفحه‌کليد خود‬ ‫مي‌بينيد يک کاراکتر را نشان مي‌دهد.‬ ‫مثل هر يک از حروف '‪ ' A‬تا '‪ 'Z‬و '‪ 'a‬تا '‪ 'z‬و‬ ‫هر يک از اعداد '0' تا '9' و يا نشانه‌هاي '~' تا‬ ‫'+' روي صفحه‌کليد را يک کاراکتر مي‌نامند.‬
  • 65. ‫براي تعري ف متغيري از نوع کاراکتر از‬ ‫کلم ه کليدي ‪ char‬اس تفاده مي‌کنيم. يک‬ ‫کاراکتر بايد درون دو علمت آپستروف )'(‬ ‫محص ور شده باشد . پس '‪ ' A‬يک کاراکتر‬ ‫است؛ همچنين'8 ' يک کاراکتر است اما 8‬ ‫يک کاراکت ر نيس ت بلک ه ي ک عدد صحيح‬ ‫است .‬ ‫مثال:‬ ‫;'‪char c ='A‬‬
  • 66. ‫11 – نوع شمارشي ‪enum‬‬ ‫يک نوع شمارشي يک نوع صحيح است که‬ ‫توسط کاربر مشخص مي‌شود. نحو تعريف‬ ‫يک نوع شمارشي به شکل زير است:‬ ‫}‪enum typename{enumerator-list‬‬ ‫که ‪ enum‬کلمه‌اي کليدي است، ‪typename‬‬ ‫نام نوع جديد است که کاربر مشخص مي‌کند‬ ‫و ‪ enumerator-list‬مجموعه مقاديري است‬ ‫که اين نوع جديد مي‌تواند داشته باشد.‬
  • 67. ‫به عنوان مثال به تعريف زير دقت کنيد:‬ ‫}‪enum Day{SAT,SUN,MON,TUE,WED,THU,FRI‬‬ ‫حال ‪ Day‬يک نوع جديد است و متغيرهايي که از اين‬ ‫نوع تعريف جديد مي‌توانند يکي از ۀمسسسسقاديرش‬ ‫وقتي نوعمي‌شوند ‪ Day‬و محدودمقادير ‪ SAT‬و را‬ ‫تعيين و ‪ MON‬مي‌توانيم متغيرهايي ازو ‪FRI‬نوع‬ ‫‪ SUN‬کرديم، و ‪ TUE‬و ‪ WED‬و ‪ THU‬اين را‬ ‫داشته باشند:‬ ‫جديسد بسسازيم. در کد بال متغيرهاي 1‪ day‬و‬ ‫;2‪Day day1,day‬‬ ‫2‪ day‬از نوع ‪ Day‬تعريف شده‌اند.= آنگاه‬ ‫;‪day1 MON‬‬ ‫1‪ day‬با مقدار ‪ MON‬و 2‪ day‬با = مقدار‬ ‫;‪day2 THU‬‬ ‫‪ THU‬مقداردهي شده است.‬
  • 68. ‫مي‌توان مقادير صحيحودلخواهي را به ... هر‬ ‫‪ SUN‬و شمارشگرها‬ ‫مقادير ‪SAT‬‬ ‫چن د ک ه ب ه همي ن شک ل به کار‬ ‫نسبت داد:‬ ‫46=‪enum Day{{SAT=1,SUN=2,MON=4,TUE=8,WED=16,THU=32,FRI‬‬ ‫ميهمچنيسن ام ايسا چنسد شمارشگسرهدرشکل‬ ‫اگسر ‌رون د دو از شمارشگرهسا مقداردهسي يک‬ ‫شوند،‬ ‫فقسط بعضسي در رايان ه ب‬ ‫آنگاه سساير مي‌تواننسد مقاديسر1مقداردهسي داشته‌اند‬ ‫فهرسست شمارشگرهسا وکسه يکسساني ونشده‬ ‫و 2 ...‬ ‫اعداد: صحيح 0‬ ‫باشندمتوالي بعدي را خواهند گرفت:‬ ‫مقادير‬ ‫‪Day{{SAT=1,SUN,MON,TUE,WED,THU,FRI‬دليل‬ ‫ذخيره مي‌شوند . به همين ‪enum‬‬ ‫1=‪enum Answer{{NO=0,FALSE=0,YES=1,TRUE=1,OK‬‬ ‫دسستورک ه مقاديسره ر تاي 7 را بسه مقادير‬ ‫ترتيسب به‬ ‫اس ت بال ب ه 1 ک از‬ ‫‪SAT‬هفته ‪ SUN‬و داد.... يک‬ ‫روزهاي و تخصيص خواهد‬
  • 69. ‫نحوۀ انتخاب نام‌شمارشگره ا آزاد اس ت ام ا بيشتر‬ ‫برنامه‌نويسان از توافق زير در برنامه‌هايشان استفاده‬ ‫مي‌کنند:‬ ‫نام – براي نام ثاب ت ‌ها از حروف‬ ‫1 شمارشگر بايد معتبر باشد:‬ ‫بزرگ استفاده کنيد‬ ‫يعني:‬ ‫2 کلمۀ کليدي نباشد. از نام نوع‬ ‫1- – اولين حرف‬ ‫2- شمارششروع نشودحرف بزرگ‬ ‫.‬ ‫با عدد ي را با‬ ‫بنويسيد.‬ ‫3- نشانه‌هاي رياض ي ني ز نداشته‬ ‫3- نشانه‌هاي رياض ي ني ز نداشته‬ ‫باشد. در هر جاي ديگر از حروف‬ ‫3 –‬ ‫کوچک استفاده کنيد.‬
  • 70. ‫آخسر ايسن کسه هم‌نام نبايد در محدودهعنوان‬ ‫‌هاي‬ ‫شمارشگرهاي نام شمارشگرهسا نبايسد به‬ ‫مشترک استفاده شوند. برايجاهاي ديگسسر برنامه‬ ‫مثال تعريف‌هاي زير‬ ‫نام متغيرهاي ديگسسر در‬ ‫استفاده شود. مثل:‬ ‫را در نظر بگيريد:‬ ‫‪enumScore{{A,B,C,D‬‬ ‫}‪enum Score{A,B,C,D‬‬ ‫;‪float B‬‬ ‫‪enum Group{{AB,B,BC‬‬ ‫;‪char c‬‬ ‫دو تعريف بال غيرمجاز است زيرا شمارشگر‬ ‫در تعريف‌هاي بال ‪ B‬و ‪ C‬را نبايد به عنوان‬ ‫‪ B‬در هر دو تعريف ‪ Score‬و ‪ Group‬آمده‬ ‫نام متغيرهاي ديگر به کار برد زيرا اين نام‌ها‬ ‫است.‬ ‫در نوع شمارشي ‪ Score‬به کار رفته است .‬
  • 71. ‫انواع شمار شي براي تول يد کد » خود‬ ‫مستند« به کار م ي ‌روند، يعني کدي که‬ ‫به راحت ي درک شود و نياز به‬ ‫توضيحات اضافي نداشته باشد.‬ ‫مثل تعاري ف زي ر خودمس تند هستند‬ ‫زيرا ب ه راحتي نام و نوع کاربرد و‬ ‫محدودۀ مقاديرشان درک م ي ‌شود:‬ ‫}‪enum Color{RED,GREEN,BLUE,BLACK,ORANGE‬‬ ‫}‪enum Time{SECOND,MINUTE,HOUR‬‬ ‫}‪enum Date{DAY,MONTH,YEAR‬‬ ‫}‪enum Language{C,DELPHI,JAVA,PERL‬‬
  • 72. ‫21 – تبديل نوع، گسترش نوع‬ ‫در محاس باتي ک ه چن د نوع متغير وجود‬ ‫دارد، جواب هميش ه ب ه شکل متغيري‬ ‫است که دقت بالتري دارد. يعني اگر يک‬ ‫عدد ص حيح را ب ا ي ک عدد مميز شناور‬ ‫جمعبراي ايسن پاسخ به يسک متغير از شناور‬ ‫ببنديم، کسه مقدار شکل مميز نوع‬ ‫مميسز شناور را بسه نوع صسحيح تبديسل کنيم‬ ‫است به اين عمل گسترش نوع مي‌گويند.‬ ‫از عبارت ‪ ()int‬اسستفاده مي‌کنيسم بسه اين‬ ‫اسستفاده مي‌کنيسم بسه اين‬ ‫از عبارت‬ ‫عمل تبديل نوع گفته مي شود‬
  • 73. .‫مثال‌هاي زير تبديل نوع و گسترش نوع را نشان مي‌دهند‬ ‫مثال گسترش نوع‬ :‫مثال تبديل نوع‬ ‫برنام ۀزسسسير يک عدد صحيح را با يک عدد مميز شناور جمع‬ :‫ تبديل مي‌کند‬int ‫ را به نوع‬double ‫اينم برنامه، يک نوع‬ :‫ي‌کند‬ int main() int main() { // casts a double value as a double value: { // adds an int value with an int: double 22; int n = v=1234.987; int n; p = 3.1415; double n = int(v); p += n; cout << "v = " << v << ", n = " << n << endl; cout << "p = " << p << ", n = " << n << endl; return 0; return 0; } }
  • 74. ‫31 – برخي از خطاهاي برنامه‌نويسي‬ ‫اي ن قبي ل خطاه ا ک ه اغلب خطاهاي نحوي‬ ‫هستند ، توسط کامپايلر کشف مي‌شوند و به‬ ‫راحتي مي‌توان آن‌ها را رفع نمود.‬ ‫»خطاي زمان اجرا«‬ ‫کشف اينگونه خطاها به راحتي ممکن نيست‬ ‫و کامپايل ر ني ز چيزي راج ع ب ه آن نمي‌داند.‬ ‫برخي از خطاهاي زمان اجرا سبب مي‌شوند‬ ‫که برنامه به طور کامل متوقف شود و از کار‬
  • 75. ‫41- سرريزي عددي‬ ‫يک متغير هر قدر هم که گنجايش داشته‬ ‫باش د، بالخره مقداري هس ت که از‬ ‫گنجايش آن متغير بيشتر باشد. اگر سعي‬ ‫کنيم در يک متغير مقداري قرار دهيم که‬ ‫از گنجايش آن متغير فراتر باشد، متغير‬ ‫»سرريز « مي‌شود،در چني ن حالتي‬ ‫مي‌گويي م ک ه خطاي سرريزي رخ داده‬
  • 76. ‫ل 21 – 2 سرريزي عدد صحيح‬ ‫مثا‬ ‫اين‌ برنامه‌ به طور مكرر ‪ n‬را در 0001 ضرب‌ ي‌كند تا‬ ‫م‬ ‫م سرريز شود:‬‫سرانجا‬ ‫وقت ي ي ک عدد صحيح‬ ‫)(‪int main‬‬ ‫{‬ ‫:‪//prints n until it overflows‬سرريز‬ ‫سرريز شود، عدد‬ ‫شده ب ه ي;‪cout << "n = " << n << endl‬‬ ‫ک مقدار منفي‬ ‫;0001= ‪int n‬‬ ‫»گردانيده«‪ n‬مي‌شود ;0001 =* ‪n‬‬ ‫0001 ‪ // multiplies by‬اما‬ ‫وقت ي ي ک‪ n‬عدد مميز شناور‬ ‫;‪cout << "n = " << n << endl‬‬ ‫;0001 =* ‪n‬‬ ‫0001 ‪// multiplies by‬‬ ‫;‪ endl‬نماد<< " = ‪cout << " n‬‬ ‫سرريز شود، << ‪ inf n‬به‬ ‫معناي بي ;‪ << endl‬را به =دست‬ ‫;0001 =* ‪n‬‬ ‫‌نهايت‬ ‫0001 ‪// multiplies n by‬‬ ‫‪cout << " n " << n‬‬ ‫;0 ‪return‬‬ ‫مي‌دهد.‬ ‫}‬
  • 77. ‫51 – خطاي گرد کردن‬ ‫خطاي‌ گرد كردن‌ نوع‌ ديگري‌ از خطاست‌ كه‌‬ ‫اغلب‌ وقتي‌ رايانه‌ها روي‌ اعداد حقيقي‌‬ ‫»هيچ‌گاه از متغي ر مميز شناور براي‬ ‫محاس به‌ مي‌كنند، رخ‌ مي‌دهد. براي‌ مثال‌‬ ‫مقايس ه برابري اس تفاده نکنيد« زيرا در‬ ‫عدد 3/1ممكن ‌ است ‌ به ‌ صورت ‌ 333333.0‬ ‫متغيرهاي مميز شناور خطاي گرد کردن‬ ‫ذخيره‌ شود كه‌ دقيقا معادل‌ 3/1 نيست‌.‬ ‫سبب مي‌شود ک ه پاس خ ب ا آ ن چه مورد‬ ‫اين خطا از آن‌جا ناشي مي‌شود که اعدادي‬ ‫نظر شماست متفاوت باشد.‬ ‫مث ل 3/1 مقدار دقي ق ندارن د و رايانه‬ ‫نمي‌توان د اي ن مقدار را پيدا کن د، پس‬ ‫نزديک‌تري ن عدد قاب ل محاس به را به جاي‬
  • 78. ‫حوز ۀمسسسستغيرها – 61‬ ‫انتخاب نام‌هاي نامفهوم ي ا ناق ص سبب‬ ‫اص طلح »بلوک« در ‪ ++C‬واژه‬ ‫کاهش خوانايي برنامه و افزايش خطاهاي‬ ‫مناس بي اس ت ک ه مي‌توان ب ه وسيلۀ‬ ‫برنامه‌نويسي مي‌شود. استفاده از متغيرها‬ ‫آن حوزۀ متغير را مشخص نمود. يک‬ ‫در حوزۀ نامناس ب ه م سبب بروز‬ ‫بلوک برنامه، قسمتي از برنامه است‬ ‫خطاهاي ي مي‌شود. »حوزه متغير«‬ ‫که درون يک جفت علمت کروشه } {‬ ‫محدوده‌اي است که يک متغير خاص اجازه‬ ‫محدود شده است.‬ ‫دارد در آن محدوده به کار رود يا فراخواني‬ ‫شود.‬
  • 79. ‫حوزۀ يک متغير از محل اعلن آن شروع‬ ‫مي‌شود و ت ا پايان همان بلوک ادامه‬ ‫مي‌يابد. خارج از آ ن بلوک نمي‌توان به‬ ‫متغير دسترسي داشت. همچنين قبل از‬ ‫اين که متغير اعلن شود نمي‌توان آن را‬ ‫استفاده نمود.‬ ‫مي‌تواني م در ي ک برنام ه، چن د متغير‬ ‫متفاوت ب ا ي ک نام داشت ه باشي م به‬ ‫شرطي که در حوزه‌هاي مشترک نباشند.‬
  • 80. ‫پايان جلسه دوم‬
  • 81. ‫جلسه سوم‬ ‫»انتخاب«‬
  • 82. ‫:آنچه در اين جلسه مي خوانيد‬ ‫1- دستور‌ ‪if‬‬ ‫2- دستور ‪if..else‬‬ ‫3- عملگرهاي مقايسه‌اي‬ ‫4- بلوك‌هاي دستورالعمل‬ ‫5- شرط‌هاي مركب‬ ‫›››‬ ‫6- ارزيابي ميانبري‬
  • 83. ‫7- عبارات منطقي‬ ‫8 - دستور‌هاي انتخاب تودرتو‬ ‫9- ساختار ‪else if‬‬ ‫01- دستورالعمل ‪switch‬‬ ‫11- عملگر عبارت شرطي‬ ‫21- كلمات كليدي‬
  • 84. ‫هدف‌هاي رفتاري:‬ ‫هدف کلي:‬ ‫انتظار مي‌رود پس از پايان اين جلسه بتوانيد:‬ ‫شناخست تور ‪ if‬شناخت ه و ل‌هاي انتخاب و شيو ۀ‬ ‫- نح و دس انواع رادستورالعم آ ن را در برنامه‌ ها به کار‬ ‫ببريد.‬ ‫به‌کارگيري هر يک‬ ‫- نحو دستور ‪ if..else‬را شناخته و آن را در برنامه ‌ها به‬ ‫کار ببريد.‬ ‫- از ساختار ‪ else..if‬در تصميم‌گيري‌هاي پيچيده استفاده‬ ‫کنيد.‬ ‫- نحو دستور ‪ switch‬را شناخته و خطاي »تلۀ سقوط«‬ ‫را تشخيص دهيد.‬ ‫- بلوک دستورالعمل را تعريف کنيد.‬ ‫- عملگرهاي مقايس ه‌اي و عملگ ر عبارت شرطي را در‬ ‫<<<‬ ‫دستورات شرطي به کار ببريد.‬
  • 85. ‫مقدمه‬ ‫ه مۀ برنام ه ‌ها يي که در دو جلسه اول‬ ‫بيان ش د، ب ه شک ل ترتيبي ‌اجرا‬ ‫م ي ‌شون د، يعن ي دس تورات برنام ه به‬ ‫ترتيب از بال به پايين و هر کدام دقيقا‬ ‫يک بار اجرا م ي ‌شوند. در اي ن ‌ جلسه ‌‬ ‫نشان داده م ي ‌شود چگونه از‬ ‫دس تورالعم ل ‌هاي انتخاب 1 جهت‬ ‫انعطا ف ‌پذيري بيشت ر برنام ه استفاده‬
  • 86. ‫بسه شکل‬ ‫دسستور ‪ if‬دستور ‪if‬‬ ‫مي‌شود برنامسه‬‫موجسب‬ ‫‌‬ ‫است‌:‬ ‫آن گون‌سسسس ۀ ‌ زير‬ ‫شرطي اجرا شود. نحو‬ ‫به‬ ‫شرطي اجرا شود نحو‬ ‫;‪If (condition) statement‬‬ ‫‪ Condition‬که شرط ناميده م ي ‌شود يك‬ ‫عبارت صحيح ا ست ) عبار تي که با يک‬ ‫مقدار صحيح برآورد م ي ‌شود( و‬ ‫‪ ‌ statement‬م ي ‌توان د ه ر فرمان قابل‬ ‫اجرا باشد. ‪ Statement‬وقتي اجرا‬ ‫خواه د ش د ك ه ‪ ‌ condition‬مقدار غير‬ ‫صفر داش ته باشد. د قت كن يد كه شرط‬
  • 87. ‫2- دستور ‪if..else‬‬ ‫دسستور ‪ if..else‬موجسب مي‌شود بسسته بسه اين‬ ‫که شرط درسست باشسد يسا خيسر، يكي از دو‬ ‫دستورالعمل فرعي اجرا گردد. نحو اين دستور‬ ‫‪ condition‬است: شرط مسساله اسست کسه يك‬ ‫به شکل زير همان‬ ‫;‬ ‫مي‌باشد و 1‪statement‬‬ ‫عبارت صسسحيح 1‪if(condition )statement‬و‬ ‫2‪ statement‬فرمان‌هاي قابل اجرا هستند. اگر‬ ‫2‪;else statement‬‬ ‫مقدار شرط، غيسر صسفر باشد، 1‪statement‬‬ ‫اجرا خواهسد شسد وگرنه 2‪ statement‬اجرا‬ ‫مي‌شود.‬
  • 88. ‫يک آزمون قابليت تقسيم‬ ‫مثال‬ int main() { int n, d; cout << " Enter two positive integers: "; cin >> n >> d; if (n%d) cout << n << " is not divisible by " << d << endl; else cout << n << " is divisible by " << d << endl; }
  • 89. ‫هاي مقايسه‌اي‬‫4- عملگر‬ ‫در ‪ ++C‬شش عملگر مقايسه‌اي وجود دارد: >‬ ‫و < و >= و <= و == و != . هر يک‬ ‫از ايسسن شسسش عملگسسر بسسه شکسسل زيسسر به کار‬ ‫مي‌روند:‬ ‫‪‌ x‬کوچکتر از ‪ y‬است // ‪x < y‬‬ ‫‪ x‬بزرگتر از ‪ y‬است // ‪x > y‬‬ ‫‪‌ x‬کوچکتر يا مساوي ‪ y‬است // ‪x <= y‬‬ ‫‪ x‬بزرگ‌تر يا مساوي ‪ y‬است // ‪x >= y‬‬ ‫‪ x‬مساوي با ‪ y‬است // ‪x == y‬‬
  • 90. ‫اين‌ ها مي‌توانن د براي مقايسۀ مقدار‬ ‫عبارات با هر نوع ترتيبي استفاده شوند.‬ ‫عبارت حاصل به عنوان يك ‌ شرط تفسير‬ ‫مي‌شود. مقدار اين شرط صفر است اگر‬ ‫شرط نادرست باشد و غير صفر است اگر‬ ‫شرط درس ت باشد. براي نمونه، عبارت‬ ‫7*8> 6*5 برابر با صفر ارزيابي مي‌شود،‬ ‫به اين معني كه اين شرط نادرست است.‬
  • 91. ‫متغير عدد صحيح -2‬ ‫‪ ++C‬شش نوع متغي ر عدد صحيح دارد‬ ‫تفاوت اي ن ش ش نوع مربوط به ميزان‬ ‫حافظ ۀ مورد استفاده و محدودۀ مقاديري‬ ‫است که هر کدام مي‌توانند داشته باشند.‬ ‫اين ميزان حافظۀ مورد استفاده و محدودۀ‬ ‫مقادي ر، بس تگي زيادي ب ه سخت‌افزار و‬ ‫همچني ن س يستم عام ل دارد. يعن ي ممکن‬ ‫اس ت روي ي ک رايان ه، نوع ‪ int‬دو بايت از‬ ‫حافظ ه را اشغال کن د در حال ي که روي‬ ‫رايانه‌اي از نوع ديگ ر نوع ‪ int‬به چهار بايت‬
  • 92. ‫ي با‬ ‫دقت کنيد كه در ++ ‪ C‬عملگر جايگزين‬ ‫ي‬ ‫عملگر برابري فرق دارد. عملگر جايگزين‬ ‫يک مساوي ي " = " است ي عملگر‬ ‫ول‬ ‫تک‬ ‫برابري، دو مساوي " = = " است.‬ ‫مثل دستور 33;= ‪ x‬مقدار 33 را در ‪ x‬قرار‬ ‫ي ي‌کند‬ ‫ي‌دهد ي دستور 33 ;==‪ x‬بررس م‬‫ول‬ ‫م‬ ‫که آيا مقدار ‪ x‬با 33 برابر است يا خير. درک‬ ‫اين تفاوت هميت زيادي دارد.‬ ‫ا‬
  • 93. ‫ل‬‫4- بلو هاي دستورالعم‬ ‫ك‌‬ ‫ي ك بلوك دستورالعمل زنجيره ‌اي از‬ ‫دستورالعم هاست كه درون براكت }{ محصور‬ ‫ل‌‬ ‫شده، مانند :‬ ‫} ‪;int temp=x‬‬ ‫‪;x = y‬‬ ‫‪;y = temp‬‬ ‫{‬ ‫در برنامه‌هاي ++‪ C‬يک بلوک دستورالعمل‬ ‫مانند يک دستورالعمل تکي است.‬
  • 94. ‫‪()int main‬‬ ‫مثال : يك بلوك دستورالعمل درون‬ ‫} ‪;int x, y‬‬ ‫يك دستور ‪if‬‬ ‫‪;" :cout << "Enter two integers‬‬ ‫ا ين برنا مه دو عدد صحيح را‪ x‬گرفته و‬ ‫‪;cin >> >> y‬‬ ‫به ترتي ب ‪ temp ‌ = x‬آن ‌ ها را> چاپ‬ ‫بزرگ تري، ‪if (x y){ ;int‬‬ ‫‪;x = y‬‬ ‫م ي ‌كند:‬ ‫;‪y = temp‬‬ ‫‪} //swap x and y‬‬ ‫;‪cout << x << " <= " << y << endl‬‬ ‫{‬
  • 95. int main() { int n=44; cout << "n = " << n << endl; { int n; cout << "Enter an integer: "; cin >> n; cout << "n = " << n << endl; } { cout << " n = " << n << endl; } { int n; cout << "n = " << n << endl; } cout << "n = " << n << endl; }
  • 96. ‫5 – شر هاي مركب‬ ‫ط‌‬ ‫ط ‌ ي مان ند ‪ n%d‬و ‪ x>=y‬ي‌توان ند به صورت‬ ‫م‬ ‫شر هاي‬ ‫يك ط مركب با م تركيب شوند. اين كار با استفاده‬ ‫ه‬ ‫شر‬ ‫هاي من ي && )‪ (and‬و || )‪ (or‬و ! )‪(not‬‬ ‫طق‬ ‫ازعملگر‬ ‫صورت ي‌پذيرد. ا ين عملگرها به ش ل ز ير تعريف‬ ‫ک‬ ‫م‬ ‫ي‌شوند:‬‫م‬ ‫‪ p && q‬درست است اگر و تنها اگر هم ‪ p‬و هم ‪ q‬هر دو درست‬ ‫باشند‬ ‫نادرست است اگر و تنها اگر هم ‪ p‬و هم ‪ q‬هر دو نادرست‬ ‫‪p || q‬‬ ‫باشند‬ ‫!‪p‬درست است‪x>=y‬تنها ‪n%d‬نادرست باشد است‬ ‫براي مثال) اگر و || اگر ‪ ( p‬نادر ست‬ ‫اگ ر و تنه ا اگ ر ‪ n%d‬برابر صفر و ‪x‬‬
  • 97. ‫!‬ ‫سسه عملگسر منطقي && )‪ (and‬و || )‪ (or‬و )‪( not‬‬ ‫معمول بسا اسستفاده از جداول درستي بسه گونس ۀزسسسير بيان‌‬ ‫مي‌شوند:‬ ‫‪p q P&&q p q P||q P !P‬‬ ‫‪T T‬‬ ‫‪T‬‬ ‫‪T T T‬‬ ‫‪T F‬‬ ‫‪T F‬‬ ‫‪F‬‬ ‫‪T F T‬‬ ‫‪F T‬‬ ‫‪F T‬‬ ‫‪F‬‬ ‫‪F T T‬‬ ‫طبق جدول‌هاي فوق اگر ‪ p‬درست و ‪ q‬نادرست‬ ‫‪p||q‬‬ ‫‪F‬‬ ‫‪F F F‬‬ ‫باشسد، عبارت ‪ p&&q‬نادرست و عبارت ‪F F‬‬ ‫درست است.‬
  • 98. ‫6- ارزيابي ميانبري‬ ‫عملگرهاي && و || به دو عملوند نياز‬ ‫دارندت ا مقايسه را روي آن دو انجام دهند.‬ ‫جداول درس تي نشان مي‌ده د که ‪p&&q‬‬ ‫شرط است مرك ب نادرست&& و. در اين‬ ‫نادرست ‌هاي اگر ‪ p‬كه از باشد ||‬ ‫اس تفادهنيازي‌كنن د عملوند دوم راشود.‬ ‫حالت ديگر مي نيست که ‪ q‬بررسي‬ ‫همچني ن ‪p||q‬ي‌كنن دت اس تناگكه ‪ p‬درست‬ ‫بررس ي نم درس مگ ر اي ر لزم‬ ‫باشددر اين حالت هم نيازي نيست که ‪q‬‬ ‫باشد و .‬ ‫بررسي شود. در هر دو حالت گفته شده، با‬ ‫ارزيابي عملوند اول به سرعت نتيجه معلوم‬ ‫مي‌شود. اين كار ارزيا بي ميانبري ناميده‬
  • 99. ‫7- عبارات منطقي‬ ‫ي ك عبارت منطق ي شرط ي اس ت ك ه يا‬ ‫درس ت اس ت ي ا نادرس ت. قبل ديدي م که‬ ‫عبارات منطق ي ب ا مقادي ر ص حيح ارزيابي‬ ‫مي‌شوند. مقدار صفر به معناي نادرست و‬ ‫هر مقدار غير صفر به معناي درست است .‬ ‫به عبارات منطق ي »عبارات بول ي « هم‬ ‫مي‌گويند.‬
  • 100. ‫چون همس ۀمسسسقاديسر صسحيح ناصسفر به معناي‬ ‫درست تفسير مي‌شوند، عبارات منطقي اغلب‬ ‫تغيير قيافه مي‌دهند. براي مثال دستور‬ ‫;"‪if (n) cout << "n is not zero‬‬ ‫وقتسي ‪ n‬غيسر صسفر است عبارت‬ ‫‪‌n is not‬‬ ‫‪ zero‬را چاپ مي‌كنسد زيرا عبارت منطقي‬ ‫)‪ ( n‬وقتسسي مقدار ‪ n‬غيسسر صسفر اسست به‬ ‫عنوان درست تفسير مي‌گردد.‬
  • 101. ‫کد زير را نگاه کنيد:‬ ‫‪if (n%d;") cout << "n is not a multiple of d‬‬ ‫دسسستور خروجسسي فقسسط وقتسسي كه ‪n%d‬‬ ‫ناصسفر اسست اجرا مي‌گردد و ‪ n%d‬وقتي‬ ‫ناصفر است که ‪ n‬بر ‪ d‬بخش‌پذير نباشد.‬ ‫گاهسسي ممکسسن اسسست فراموش کنيسسم که‬ ‫عبارات منطقي مقادير صحيح دارند و اين‬ ‫فراموشي باعث ايجاد نتايج غير منتظره و‬ ‫نامتعارف شود.‬
  • 102. ‫يك خطاي منطقي ديگر، اين برنامه خطادار است:‬ ‫)(‪int main‬‬ ‫;3‪{ int n1, n2, n‬‬ ‫;" :‪cout << "Enter three integers‬‬ ‫;3‪cin >> n1 >> n2 >> n‬‬ ‫;1‪if (n1 >= n2 >= n3) cout << "max = " << n‬‬ ‫}‬ ‫منشأ خطا در برنامۀ بال اين اصل است كه‬ ‫عبارات منطقي مقدارهاي عددي دارند.‬
  • 103. ‫دستور‌هاي انتخاب تودرتو -8‬ ‫دس تورهاي انتخاب مي‌توانن د مانند‬ ‫دس تورالعملهاي مرك ب به كار روند .‬ ‫‌‬ ‫به اي ن ص ورت ک ه ي ك دستور انتخاب‬ ‫مي‌توان د درون دس تور انتخاب ديگر‬ ‫اس تفاده شود . به اين روش، جملت‬ ‫تودرتو مي‌گويند.‬
  • 104. ‫مثال 21-3 دستور‌هاي انتخاب تودرتو‬ ‫اين برنامه همان اثر مثال 01-3 را دارد:‬ ‫وقت ي دس تور ‪ if..else‬به شکل‬ ‫)(‪int main‬‬ ‫;‪{ int n, d‬‬ ‫تو در ت و به کار م ي ‌رود،‬ ‫;" :‪cout << "Enter two positive integers‬‬ ‫كامپايل ر از قانون زي ر )0جهت‬ ‫;‪cin >> n >> d‬‬ ‫=! ‪if (d‬‬ ‫تجزيه‪ n‬اين دستورالعمل= مركب‬ ‫;‪if (n%d = 0) cout << d << " divides " << n << endl‬‬ ‫;‪else cout << d << " does not divide " << << endl‬‬ ‫استفاده م ي ‌كند:‬ ‫;‪else cout << d << " does not divide " << n << endl‬‬ ‫}‬ ‫» هر ‪ else‬با آخريسسن ‪ if‬تنهسسا جفت‬ ‫در برنام ۀ بال، دستور ‪ if..else‬دوم درون‬ ‫مي‌شود.«‬ ‫دستور ‪ if..else‬اول قرار گرفته است‌.‬
  • 105. ‫9- ساختار ‪else if‬‬ ‫دسسستور ‪ if..else‬تودرتسسو، اغلب براي‬ ‫بررسسي مجموعه‌اي از حالت‌هاي متناوب يا‬ ‫موازي بسه كار مي‌رود. در ايسن حالت فقط‬ ‫عبارت ‪ else‬شامسل دسستور ‪ if‬بعدي خواهد‬ ‫بود. ايسن قبيسل کدهسا را معمول بسا ساختار‬ ‫‪else if‬مي‌سازند.‬
  • 106. ‫ براي مشخص کردن محدود ۀنسسسمره‬else if ‫استفاده از ساختار‬ :‫برنام ۀزسسسير يك نمر ۀاسسسمتحان را به درج ۀحسسسرفي معادل تبديل مي‌كند‬ int main() { int score; cout << "Enter your test score: "; cin >> score; if (score > 100) cout << "Error: that score is out of range."; else if (score >= 90) cout << "Your grade is an A." << endl; else if (score >= 80) cout << "Your grade is a B." << endl; else if (score >= 70) cout << "Your grade is a C." << endl; else if (score >= 60) cout << "Your grade is a D." << endl; else if (score >= 0) cout << "Your grade is an F." << endl; else cout << "Error: that score is out of range."; }
  • 107. switch ‫01- دستورالعمل‬ else ‫ مي‌تواند به جاي ساختار‬switch ‫دستور‬ ‫ براي بررسي مجموعه‌اي از حالت‌هاي‬if ‫متناوب و موازي بسسه كار رود. نحسسو دستور‬ :‫ به شکل زير است‬switch switch (expression) { case constant1: statementlist1; case constant2: statementlist2; case constant3: statementlist3; : :
  • 108. ‫اين دستور ابتدا ‪ expression‬را برآورد‬ ‫مي‌كند و سپس ميان يکت‌هاي ‪ case‬به دنبال‬ ‫عبارت اختياري‬ ‫عبارت ‪ default‬ثاب‬ ‫مقدار . يعنسي مي . اگر‬ ‫اسست آن مي‌گردد‌توانيسم مقدار مربوطه از ميان‬ ‫در دستور ‪switch‬‬ ‫ثابت‌هاي فهرسسست.‌شده يافسست شسسد، دستور‬ ‫آن را قيسد نکنيم ‪ expression‬بايسد به‬ ‫‪ statementlist‬مقابسسل ارزيابي‪ case‬اجرا‬ ‫شود و‬ ‫شکسل يسك نوع صسحيح آن‬ ‫مي‌شود. اگسر مقدار مورد نظسر ميان ‪case‬ها‬ ‫‌‬ ‫‪constant‬ها بايسسد ثابتهاي صحيح‬ ‫يافست نشسد و عبارت ‪ default‬وجود داشت،‬ ‫باشند.‬ ‫دسسستور ‪ statementlist‬مقابسسل آن اجرا‬ ‫مي‌شود.‬
  • 109. ‫لزم اسسست در انتهاي هسسر ‪ case‬دستور‌‬ ‫‪ break‬قرار بگيرد. بدون ايسسن دستور،‬ ‫اجراي برنامسسه پسسس از ايسسن كه ‪case‬‬ ‫مربوطسه را اجرا کرد از دستور ‪switch‬‬ ‫خارج نمي‌شود، بلکسسه هم ۀ ‪case‬هاي‬ ‫زيريسن را هسم خسط بسه خسط مي‌پيمايد و‬ ‫دسستورات مقابسل آن‌سها را اجرا مي‌کند. به‬ ‫اين اتفاق، تلۀ سقوط مي‌گويند.‬ ‫;‪case constant1: statementlist1;break‬‬
  • 110. ‫11- عملگر عبارت شرطي‬ ‫در اي ن عملگر ابتدا شرط ‪condition‬‬ ‫عملگر عبارت شرطي يکي از درست‬ ‫بررسي مي‌شود. اگر اين شرط امکاناتي‬ ‫بود، حاص لسستک ل عبارتدر کدنويسي‬ ‫برابر با‬ ‫اختصسسار‬ ‫اسسست کسسه جه‬ ‫تدارک ديده شدهمي‌شود وسسناگر شرط را‬ ‫1‪ expression‬اسسست. اي عملگر‬ ‫منادرست بود، حاصل کل ‪ if..else‬به کار‬ ‫ي‌توانيم به جاي دستور عبارت برابر با‬ ‫2‪ expression‬مي‌شود. ‌‬ ‫ببريم. اين عملگر از نشانههاي ? و : به‬ ‫شکل زير استفاده مي‌كند:‬ ‫;2‪condition ? expression1 : expression‬‬
  • 111. ‫مثل در دستور انتساب زير:‬ ‫;) ‪min = ( x<y ? x : y‬‬ ‫اگر ‪ x<y‬باشد مقدار ‪ x‬را درون ‪min‬‬ ‫قرار مي‌دهد و اگر ‪ x<y‬نباشد مقدار‬ ‫‪ y‬را درون ‪ min‬قرار مي‌دهد. يعني‬ ‫به همي ن س ادگي و اختصار، مقدار‬ ‫کمين ۀ ‪ x‬و ‪ y‬درون متغير ‪ min‬قرار‬ ‫مي‌گيرد.‬
  • 112. ‫21- كلمات كليدي ‌‬ ‫اکنون با کلماتي مثل ‪ if‬و ‪ case‬و ‪float‬‬ ‫آشنا شديم. دانستيم که اين کلمات براي‬ ‫يك‌ كلممۀ كليدي در يك زبان‬ ‫برنامه‌نويس ي كلم دارند. از اين کلمات‬ ‫ه‌اي اس ت كه از‬ ‫‪ ++C‬معاني خاصي‬ ‫نمي‌توان به عنوان نام يک متغير يا هر‬ ‫قب ل تعريف شده و براي هدف‬ ‫منظور ديگري استفاده کرد و فقط بايد‬ ‫براي انجام منظور شده است.‬ ‫همان کار خاص استفاده‬ ‫مشخصي‬ ‫شوند. مثل کلم ۀ ‪ float‬فق ط بايد براي‬ ‫معرفي يک نوع اعشاري به کار رود.‬
  • 113. :‫ است‬and ‫++ استاندارد اكنون شامل 47 كلم ۀ‬C ‫كسسسليدي‬ and_eq asm auto bitand Bitor bool break case catch char class compl const const_cast continue default delete dodouble dynamic_cast else enum explicit export extern dfalse float for friend goto
  • 114. if inline int long mutable namespace new not not_eq operator or or_eq privat eprotected public register reinterpret_cast return short signed sizeof static static_cast struct swich template this throw TRUE try
  • 115. typedef typoid typename using union unsigned virtual void volatile wchar_t while xor xor_eq
  • 116. ‫دو نوع كلمۀ كليدي وجود دارد:‬ ‫1- كلم ه ‌هاي رزرو شد ه‌‌‬ ‫2- شناس ه ‌هاي استاندارد.‬ ‫يك كلم ۀ رزرو شده كلمه‌اي اس ت ک ه يک‬ ‫دس تور خاص از آن زبان را نشان مي‌دهد.‬ ‫كلمۀ كليدي ‪ if‬و ‪ else‬كلمات رزرو شده‬ ‫يك شناسۀ استاندارد كلمه‌اي است كه يك نوع‬ ‫هستند.‬ ‫دادۀ اس تاندارد از زبان را مشخص مي‌كند.‬ ‫كلمات كليدي ‪ bool‬و ‪ int‬شناسه‌هاي‬ ‫استاندارد هستند‬
  • 117. ‫پايان جلسه سوم‬
  • 118. ‫جلسه چهارم‬ ‫»تكرار«‬
  • 119. ‫:آنچه در اين جلسه مي خوانيد‬ ‫1- دستور ‪while‬‬ ‫2- خاتمه دادن به يك حلقه‬ ‫3- دستور ‪do..while‬‬ ‫4- دستور ‪for‬‬ ‫5- دستور ‪break‬‬ ‫6- دستور ‪continue‬‬ ‫7- دستور ‪goto‬‬ ‫8- توليد اعداد شبه تصادفي‬
  • 120. ‫هدف‌هاي رفتاري:‬ ‫هدف کلي:‬ ‫انتظار مي‌رود پس از مطالعۀ اين جلسه بتوانيد:‬ ‫- نحو دستورانواع را شناخته و از آن براي ايجاد نحو استفاده‬ ‫شناخت ‪ while‬ساختارهاي تکرار و حلقه آن‌ها‬ ‫کنيد.تبديل آن‌ها به يکديگر.‬ ‫و‬ ‫- نحو دستور ‪ do..while‬را شناخته و تفاوت آن با‬ ‫دستور ‪ while‬را بيان کنيد.‬ ‫- نح و دس تور ‪ for‬را شناخت ه و ب ا اس تفاده از آن‬ ‫حلقه‌هاي گوناگون بسازيد.‬ ‫- حلقه‌هاي فوق را به يکديگر تبديل کنيد.‬ ‫- علت استفاده از »دستورات پرش« را ذکر کرده‬ ‫و تفاوت سه دستور ‪ break‬و ‪ continue‬و ‪ goto‬را‬ ‫بيان کنيد.‬
  • 121. ‫مقدمه‬ ‫تكرار، اجراي پي در پي يك دستور يا بلوكي‬ ‫از دس تورالعمل‌ها در ي ك برنام ه اس ت. با‬ ‫اس تفاده از تکرار مي‌تواني م کنترل برنامه را‬ ‫مجبور کنيم تا به خطوط قبلي برگردد و آن‌ها‬ ‫را دوباره اجرا نمايد.‬ ‫‪ ++C‬داراي س ه دس تور تكرار اس ت: دستور‬ ‫‪ ،while‬دس تور ‪ do_while‬و دستور ‪.for‬‬ ‫دس تور‌هاي تکرار ب ه عل ت طبيعت‬
  • 122. ‫1- دستور ‪while‬‬ ‫نحو دستور ‪ while‬به شکل زير است:‬ ‫;‪while (condition) statement‬‬ ‫به جاي ‪ ، condition‬يك شرط قرار مي‌گيرد و به‬ ‫جاي ‪ statement‬دستوري که بايد تکرار شود قرار‬ ‫مي‌گيرد. اگ ر مقدار شرط، ص فر)يعن ي نادرست(‬ ‫باشد، ‪ statement‬ناديده گرفته مي‌شود و برنامه‬ ‫به اولي ن دس تور بع د از ‪ while‬پرش مي‌كند. اگر‬ ‫مقدار شرط ناص فر)يعني‌ درس ت( باشد،‬ ‫‪ statement‬اجرا ‌شده و دوباره مقدار شرط‬ ‫بررسي مي‌شود. اين تکرار آن قدر ادامه مي‌يابد‬
  • 123. while ‫مثال 1-4 محاسب ۀحسسساصل جمع اعداد صحيح متوالي با حلق ۀ‬ n ‫ را براي عدد ورودي‬n + … + 3 + 2 + 1 ‫ايسن برنامه مقدار‬ :‫محاسبه مي‌كند‬ int main() { int n, i=1; cout << "Enter a positive integer: "; cin >> n; long sum=0; while (i <= n) sum += i++; cout << "The sum of the first " << n << " integers is " << sum; }
  • 124. ‫2- خاتمه دادن به يك حلقه‬ ‫)(‪int main‬‬ ‫قبل‌ ديدي م ك ه چگون ه دستور ‪ break‬براي {‬ ‫;1=‪int n, i‬‬ ‫كنترل دس :‪cout << "Enter a positive integer‬‬ ‫;" تورالعمل ‪ switch‬استفاده‬ ‫;‪cin >> n‬‬ ‫م ي‌شود )به مثال 471- ;0=‪ .(sum‬از‬ ‫‪long‬‬ ‫نگاه كنيد‬ ‫يك ي از‌ مزيت‌هاي دستور‬ ‫‪ break‬اين است كهبراي پايان دادن به حلقه‌ها‬ ‫)‪while (true‬‬ ‫دستور ‪ break‬فورا حلقه‬ ‫رانيز ميتوان استفاده کرد. ;‪{ if (i > n) break‬‬ ‫خاتمه ‌مي‌دهد بدون اين که‬ ‫;++‪sum += i‬‬ ‫مابق ي دس تورهاي درون حلقه‬ ‫}‬ ‫اجرا شوند.‬ ‫<< " ‪cout << "The sum of the first " << n << " integers is‬‬ ‫;‪sum‬‬ ‫}‬
  • 125. ‫* مثال‌ 44- اعداد فيبوناچي‬ ‫اعداد فيبوناچي 3‪ … , F0, F1, F2, F‬به شکل‬ ‫بازگشتي توسط معادله‌هاي زير تعريف مي‌شوند:‬ ‫2-‪F0 = 0 , F1 = 1 , Fn = Fn-1 + Fn‬‬ ‫مثل براي 2=‪ n‬داريم:‬ ‫1 = 1 + 0 = 0‪F2 = F2-1 + F2-2 = F1 + F‬‬ ‫يا براي 3=‪ n‬داريم:‬ ‫2 = 1 + 1 = 1‪F3 = F3-1 + F3-2 = F2 + F‬‬ ‫و براي 4=‪ n‬داريم:‬ ‫3 = 1 + 2 = 2‪F4 = F4-1 + F4-2 = F3 + F‬‬
  • 126. ‫برنام ۀزسسسير، هم ۀاسسسعداد فيبوناچي را تا يك محدود ۀمسسسشخص که از‬ :‫ورودي دريافت مي‌شود، محاسبه و چاپ مي‌كند‬ int main() { long bound; cout << "Enter a positive integer: "; cin >> bound; cout << "Fibonacci numbers < " << bound << ":n0, 1"; long f0=0, f1=1; while (true) { long f2 = f0 + f1; if (f2 > bound) break; cout << ", " << f2; f0 = f1; f1 = f2;} } Enter a positive integer: 1000 Fibonacci numbers < 1000: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987
  • 127. ‫مثال5-4 استفاده از تابع 0(‪(exit‬‬ ‫تابع 0(‪ (exit‬روش ديگري براي خاتمه دادن به يك حلقه‌ است. هرچند که‬ ‫اين تابع بلفاصله اجراي کل برنامه را پايان مي‌دهد:‬ ‫)(‪int main‬‬ ‫;‪{ long bound‬‬ ‫;" :‪cout << "Enter a positive integer‬‬ ‫;‪cin >> bound‬‬ ‫;"1 ,0‪cout << "Fibonacci numbers < " << bound << ":n‬‬ ‫;1=1‪long f0=0, f‬‬ ‫)‪while (true‬‬ ‫;1‪{ long f2 = f0 + f‬‬ ‫برنامه‌نويس ان ترجيح‬ ‫مي‌دهند از ‪ break‬براي ;)0(‪if (f2 > bound) exit‬‬ ‫;2‪cout << ", " << f‬‬ ‫خاتم ه دادن به حلقه‌هاي‬ ‫;1‪f0 = f‬‬ ‫نامتناهي استفاده کنند زيرا‬ ‫} ;2‪f1 = f‬‬ ‫}‬ ‫قابليت انعطاف بيشتري‬ ‫دارد.‬
  • 128. ‫متوقف کردن يك حلقۀ نامتناهي :‬ ‫با فشردن کليدهاي ‪ Ctrl+C‬سيستم عامل‬ ‫يک برنام ه را ب ه اجبار خاتم ه مي‌دهد. كليد‬ ‫‪ Ctrl‬را پايي ن نگ ه داشت ه و كليد ‪ C‬روي‬ ‫صفحه‌كليد خود را فشار دهيد تا برنامۀ فعلي‬ ‫خاتمه پيدا کند.‬
  • 129. ‫3- دستور ‪do..while‬‬ ‫س اختار ‪ do..while‬روش ديگري براي س اختن حلقه‬ ‫است. نحو آن به صورت زير است:‬ ‫;)‪do statement while (condition‬‬ ‫به جاي دستور ابتدا ‪ ‌ statement‬را مي‌گيرد و‬ ‫اي ن ‪ condition‬يك شرط قرار اجرا‬ ‫به مي‌كن ‪‌ statement‬شرطتور ي ا بلوکيراقرار‬ ‫جاي د و سپس دس ‪condition‬‬ ‫ميبررس که قرار استر شرط درست بود‬ ‫‌گيرد ي مي‌كند. اگ تکرار شود.‬ ‫حلقه دوباره تکرار مي‌شود وگرنه حلقه‬ ‫پايان مييابد.‬ ‫‌‬
  • 130. ‫دستور‌ ‪ do..while‬مانند دستور ‪while‬‬ ‫است. با اين فرق كه شرط کنترل حلقه‬ ‫به نتيج ۀ ديگ که اي ن اس تحلقه حلقۀ‬ ‫ارزيابي‬ ‫جاي اين ر در ابتداي ك ه‬ ‫‪ do..while‬هميش ه بدون توج ه به‬ ‫گردد، در انتهاي حلقه ارزيابي ميشود.‬ ‫‌‬ ‫مقدار شرط كنترل، لاقل يك بار اجرا‬ ‫مي‌شود متغيرحلق ۀ ‪ while‬مي‌تواند كه‬ ‫يعني هر ام ا كنترلي به جاي اين‬ ‫قب اصل اجرا نشود. حلق ه تنظيم شود،‬ ‫ل از شروع‬ ‫مي‌تواند درون آن تنظيم گردد.‬
  • 131. ‫مثال 47- محاسسب ۀحسسساصسل جمسع اعداد صسحيح ‌متوالسي بسا حلق ۀ‬ ‌do..while :‫اين برنامه همان تأثير مثال 51- را دارد‬ int main() { int n, i=0; cout << "Enter a positive integer: "; cin >> n; long sum=0; do sum += i++; while (i <= n); cout << "The sum of the first " << n << " integers is " << sum; }
  • 132. ‫* مثال 8-4 اعداد فاكتوريال‬ ‫اعداد فاكتوريال 0! و 1! و 2! و 3! و … با استفاده از رابطه‌هاي‬ ‫بازگشتي زير تعريف مي‌شوند:‬ ‫1 = !0‬ ‫,‬ ‫!)1-‪n! = n(n‬‬ ‫براي مثال، به ازاي 1 = ‪ n‬در معادل ۀدسسسوم داريم:‬ ‫1 = )1(1 = )!0(1 = )!)1-1((1 = !1‬ ‫همچنين براي 2 = ‪ n‬داريم:‬ ‫2 = )1(2 = )!1(2 = )!)1-2((2 = !2‬ ‫و به ازاي 3 = ‪ n‬داريم:‬ ‫6 = )2(3 = )!2(3 = )!)1-3((3 = !3‬
  • 133. ‌ ،‫برنام ۀزسسسيرم‌سسسس ۀ ‌ اعداد فاكتوريال را که از عدد داده شده کوچک‌ترند‬ ‫ه‬ ‌ :‫چاپ ميکند‬ ()int main ;long bound } ;" :cout << "Enter a positive integer ;cin >> bound ;"cout << "Factorial numbers < " << bound << ":n1 ;long f=1, i=1 do ;cout << ", " << f } ;f *= ++i { ;(while (f < bound {
  • 134. ‫4 - دستور ‪for‬‬ ‫نحو دستورالعمل ‪ for‬به صورت زير است:‬ ‫;‪for (initialization; condition; update) statement‬‬ ‫سه قسمت داخل پرانتز، حلقه را کنترل مي‌کنند.‬ ‫عبارت ‪ initialization‬تعيي ن اعلنمتغير‬ ‫عبارت ‪update‬براي براي بردن يا‬ ‫اي ن ک ه آيا‬ ‫عبارت ‪ condition‬براي پيش‌‬ ‫کنترل حلق ه اولي هکار يامي‌رود کنترلم عبارت‬ ‫مقداردهي ب ه به متغي ر . اينحلقه‬ ‫حلقه بايد تکرار شود خير به کار ي‌رود.‬ ‫پس تفاده مي‌شود.اي ن عبارت اولين‬ ‫اس از اجراي‬ ‫يعني اين عبارت، ‪ statement‬ارزيابي‬ ‫شرط کنترل حلقه است.‬ ‫مي‌گردد.است که ارزيابي مي‌شود پيش‬‫عبارتي‬ ‫اگ ر اي ن شرط درس ت باش د دستور‬ ‫از اين که نوبت به تکرارها برسد.‬ ‫‪ statement‬اجرا مي‌شود.‬
  • 135. ‫بنابرايسن زنجير ۀوسسسسقايعسسي که تکرار را ايجاد‬ ‫مي‌کنند عبارتند از:‬ ‫1 – ارزيابي عبارت ‪initialization‬‬ ‫2 – بررسي شرط ‪ . condition‬اگر نادرست‬ ‫باشد، حلقه خاتمه مي‌يابد.‬ ‫3عبارت‌هاي ‪ initialization statement‬و‬ ‫– اجراي‬ ‫4 – ارزيابي عبارت و ‪update‬عبارت‌هاي‬ ‫‪update condition‬‬ ‫5 – تکرار گام‌هاي 2 تا مي‌توانيسم آن‌ها را در‬ ‫اختياري هسستند. يعنسي 4‬ ‫حلقه ذکر نکنيم.‬
  • 136. ‫مثال 49- اسستفاده از حلقس ۀ ‪ for‬براي محاسسب ۀمسسسجموع اعداد صحيح‬ ‫متوالي‬ ‫اين برنامه همان تأثير مثال 51- را دارد:‬ ‫)(‪int main‬‬ ‫;‪{ int n‬‬ ‫;" :‪cout << "Enter a positive integer‬‬ ‫;‪cin >> n‬‬ ‫;0=‪long sum‬‬ ‫در ‪ ++C‬استاندارد وقتي يك متغير كنترل درون يك حلق ۀ ‪ for‬اعلن‬ ‫مي‌شود )ماننسد ‪ i‬در مثال بال( حوز ۀآسسسسن;‪ <= n‬بسه همان حلق ۀ ‪for‬‬ ‫‪for‬‬ ‫)++‪ i‬متغيسر ‪(int i=1; i‬‬ ‫;‪sum += I‬‬ ‫‌‬ ‫محدود ميگردد. يعنسي آسن متغيسر نمي‌توانسد بيرون از آسن حلقسه استفاده‬ ‫شود. ;‪cout << "The sum of the first " << n << " integers is " << sum‬‬ ‫}‬ ‫نتيج ۀدسسسيگر اين است که مي‌توان از نام مشابهي در خارج از حلق ۀ‬ ‫‪ for‬براي يك متغير ديگر استفاده نمود.‬
  • 137. ‫مثال 421- يك حلق ۀ ‪ for‬نزولي‬ ‫برنام ۀزسسسير‌ ده عدد صحيح مثبت را به ترتيب نزولي چاپ مي‌كند:‬ ‫)(‪int main‬‬ ‫)--‪{ for (int i=10; i > 0; i‬‬ ‫;‪cout << " " << i‬‬ ‫}‬
  • 138. ‫مثال 51-4 بيشتر از يك متغير كنترل در حلق ۀ ‪for‬‬ ‫حلق ۀ ‪ for‬در برنام ۀزسسسير دو متغير كنترل دارد:‬ ‫)(‪int main‬‬ ‫)++‪{ for (int m=95, n=11, m%n > 0; m -= 3, n‬‬ ‫;‪cout << m << "%" << n << " = " << m%n << endl‬‬ ‫}‬
  • 139. ‫ تودرتو‬for ‫مثال 61-4 حلقه‌هاي‬ :‫برنام ۀزسسسير يك جدول ضرب چاپ مي‌كند‬ #include <iomanip> #include <iostream> int main() { for (int x=1; x <= 10; x++) { for (int y=1; y <= 10; y++) cout << setw(4) << x*y; cout << endl; } }
  • 140. ‫5- دستور ‪break‬‬ ‫وقت ي دستور ‪ break‬درون‬ ‫دستور ‪ break‬يک دستور آشناست. قبل از‬ ‫آن حلقخاتمه تودرتبهو استفاده‬ ‫دستور ‪ switch‬و‬ ‫دادن‬ ‫براي ه‌هاي‬ ‫همچنين حلقه ط روي حلق و‌اي که‬ ‫‪do..while‬‬ ‫شود، فق ‌هاي ‪ while‬ه‬ ‫اس مس تقيماهدرون از ناي قرار گرفته‬ ‫ن دستور براي‬ ‫تفاده کرد ‌ايم. آ‬ ‫خاتم تاثير مي‌گذارد.‬ ‫ه دادن ب ه حلق ۀ ‪ for‬ني ز مي‌توانيم‬ ‫حلقه‌هاي بيرون ي بدون هيچ‬ ‫استفاده کنيم.‬ ‫تغييري ادامه مي‌يابند.‬ ‫دستور ‪ break‬در هر جايي درون حلقه‬ ‫مي‌تواند جا بگيرد و در همان جا حلقه را‬ ‫خاتمه دهد.‬
  • 141. ‫6- دستور ‪continue‬‬ ‫دس تور ‪ break‬بقي ۀ دستورهاي درون‬ ‫بلوك حلق ه را ناديده گرفت ه و ب ه اولين‬ ‫‌‌دستور بيرون حلقه پرش مي‌كند. دستور‬ ‫‪ continue‬اين دستور، ادامۀ‬ ‫نيز شبيه همين است اما به‬ ‫جاي اين که حلقهفعلي را لغو‬ ‫را خاتمه دهد، اجرا را‬ ‫چرخۀ‬ ‫کرده و اجراي دور‬ ‫به تكرار بعدي حلقه منتقل مي‌كند.‬ ‫بعدي حلقه را آغاز‬ ‫ميکند.‬ ‫‌‬
  • 142. continue ‫ و‬break ‫مثال 491- استفاده از دستورهاي‬ :‫ را شرح مي‌دهد‬continue ‫ و‬break ‫اين برنام ۀكسسسوچك،‌ دستورهاي‬ int main() { int n = 1; char c; for( ; ;n++ ) { cout << "nLoop no: " << n << endl; cout << "Continue? <y|n> "; cin >> c; if (c = = 'y') continue; break; } cout << "nTotal of loops: " << n; }
  • 143. ‫7- دستور ‪goto‬‬ ‫دستورهاي‬ ‫دسستور ‪ goto‬نوع ديگري از‬ ‫توسسسط يك‬ ‫پرش اسسست. مقصسسد ايسسن پرش‬ ‫برچسب معين مي‌شود.‬ ‫برچ سب شناسسه‌اي اسست كسه جلوي آن‬ ‫علمست كولسن) : ( مي‌آيسد و جلوي يك دستور‬ ‫ديگر قرار مي‌گيرد.‬ ‫يک مزيت دستور ‪ goto‬اين است که با‬ ‫استفاده از آن مي‌توان از همۀ حلقه‌هاي‬ ‫تودرتو خارج شد و به مکان دلخواهي در‬
  • 144. ‫ براي خارج شدن از‬goto ‫مثال 402- اس تفاده از دستور‬ ‫حلق ه ‌هاي تودرتو‬ int main() { const int N=5; for (int i=0; i<N; i++) { for (int j=0; j<N; j++) { for (int k=0; k<N; k++) if (i+j+k>N) goto esc; else cout << i+j+k << " "; cout << "* "; } esc: cout << "." << endl; } }
  • 145. ‫8- توليد اعداد شبه تصادفي‬ ‫يك ي از كاربردهاي بس يار مه م رايانه‌ها،‬ ‫»شبيه‌ سازي «‌ سيستم‌هاي دنياي واقعي‬ ‫اس ت. تحقيقات و توس عه‌هاي بسيار‬ ‫پيشرفته به اين راهکار خيلي وابسته است .‬ ‫به وس يلۀ شبيه‌ سازي مي‌توانيم رفتار‬ ‫سيستم‌هاي مختلف را مطالعه کنيم بدون‬ ‫اي ن ک ه لزم باش د واقع ا آن‌ها را‬ ‫پياده‌سازي نماييم. در شبيه‌سازي نياز است‬ ‫»اعداد تص ادفي « توس ط رايانه‌ ها توليد‬
  • 146. ‫رايانه‌ها »ثابت‌کار« هستند ي با دادن داد هاي‬ ‫ه‌‬ ‫يعن‬ ‫ي‬ ‫مشا به به رايان هاي مشا به، هميشه خروج‬ ‫ه‌‬ ‫يکسان تولي د ي‌شود . با وجود اين ي‌توان‬ ‫م‬ ‫م‬ ‫ي هستند؛‬ ‫اعدادي توليد کرد که به ظاهر تصادف‬ ‫اعدادي که به طور يکنواخت در يک محدودۀ‬ ‫ص گسترده‌اند و براي هيچ م الگوي‬ ‫‌کدا‬ ‫خا‬ ‫ي وجود ندارد. چنين اعدادي را »اعداد‬ ‫مشخص‬ ‫ي« ي م.‬ ‫شبه‌تصادف م ‌نامي‬
  • 147. ‫ي‬ ‫ل 422- توليد اعداد شبه تصادف‬ ‫مثا‬ ‫ي استفاده‬‫اين برنامه از تابع ‪ ()rand‬براي تول يد اعداد شبه‌تصادف‬ ‫ي‌كند:‬ ‫م‬ ‫‪#include<cstdlib>//defines the rand() and RAND_MAX‬‬ ‫>‪#include <iostream‬‬ ‫)(‪int main‬‬ ‫:‪{ // prints pseudo-random numbers‬‬ ‫)++‪for (int i = 0; i < 8; i‬‬ ‫;‪cout << rand() << endl‬‬ ‫;‪cout << "RAND_MAX = " << RAND_MAX << endl‬‬ ‫هر بار که برنامۀ بال اجرا شود، رايانه هشت عدد صحيح }‬ ‫‪ ‌unsigned‬توليد مي‌کند که به طور يکنواخت‌ در فاصلۀ 0‬ ‫تا ‪ RAND_MAX‬گسترده شده‌اند.‌ ‪ RAND_MAX‬در‬ ‫اين رايانه برابر با 746,384,741,2 است.‬
  • 148. ‫هر عدد شبه‌تصادفي از روي عدد قبلي خود‬ ‫ساخته مي‌شود.‬ ‫اولي ن عدد شبه‌تص ادفي از روي يك مقدار‬ ‫داخل ي ک ه »هس ته« گفته مي‌شود ايجاد‬ ‫مي‌گردد.‬ ‫هر دفعه که برنامه اجرا شود، هسته با يک‬ ‫مقدار پيش‌فرض بارگذاري مي‌شود.‬ ‫براي حذف اين اثر نامطلوب که از تصادفي‬ ‫بودن اعداد مي‌کاهد، مي‌توانيم با استفاده از‬
  • 149. #include <cstdlib> // defines the rand() and srand() ‫مثال 432- كارگذاري هس ته به‬ #include <iostream> int main() ‫طور محاور ه ‌اي‬ { ‫اي ن برنام ه مانن د برنامۀ مثال‬ // prints pseudo-random numbers: unsigned seed; ‫422- اس ت بج ز اي ن كه م ي ‌توان‬ cout << "Enter seed: "; ‫هس تۀ توليدکنندۀ اعداد تصادفي‬ cin >> seed; :srand(seed); ‫ //‌اي‬initializes‫را به شکل‬ ‫وارد نمود‬ ‫ محاور ه‬the seed for (int i = 0; i < 8; i++) cout << rand() << endl; }
  • 150. ‫پايان جلسه چهارم‬
  • 151. ‫جلسه پنجم‬ ‫» توابع«‬
  • 152. ‫:آنچه در اين جلسه مي خوانيد‬ ‫1- توابع كتابخانه‌اي ‪ ++C‬استاندارد‬ ‫2- توابع ساخت كاربر‬ ‫3- برنامۀ آزمون‬ ‫4- اعلن‌ها و تعاريف تابع‬ ‫5- كامپايل جداگانۀ توابع‬ ‫6- متغيرهاي محلي، توابع محلي ›››‬
  • 153. ‫7- تابع ‪void‬‬ ‫8 - توابع بولي‬ ‫9- توابع ورودي/خروجي )‪(I/O‬‬ ‫01- ارسال به طريق ارجاع‬ ‫)آدرس(‬ ‫11- ارسال‌ از طريق‌ ارجاع‌ ثابت‌‬ ‫›››‬ ‫21-توابع‌ بي‌واسطه‬
  • 154. ‫31- چندشکلي توابع‌‬ ‫41- تابع‌ ‪()main‬‬ ‫51- آرگومان‌هاي‌ پيش‌فرض‬
  • 155. ‫هدف‌هاي رفتاري:‬ ‫هدفمي‌رود:پس از پايان اين جلسه بتوانيد:‬ ‫انتظار کلي‬ ‫- اهميت توابع و مزيت استفاده از آن استفاده ازکنيد.‬ ‫شناخت و معرفي توابع و مزاياي ‌ها را بيان‬ ‫تابع در‬ ‫-برنامه‌ها« و »تعريف« تابع را بدانيد و خودتان توابعي را‬ ‫»اعلن‬ ‫ايجاد کنيد.‬ ‫- »برنامۀ آزمون« را تعريف کرده و دليل استفاده از آن‬ ‫را بيان نماييد.‬ ‫- مفهوم »آرگومان« را بدانيد.‬ ‫- تفاوت ارس ال به طريق »ارجاع« و ارسال به طريق‬ ‫»مقدار« و ارسال به طريق »ارجاع ثابت« را بيان کنيد و‬ ‫شکل استفاده از هر يک را بدانيد.‬ ‫›››‬
  • 156. ‫- »تساسبسعس بسيسس‌سواسسسسطسسهس« رساس شسسناسخسستهس وس نسحسوس ۀ‬ ‫مسعسسرسفسسيسس آسن س رساس بسدسساسنسيدس.‬ ‫- چسسندسسشسسکسلسسيسس تسوساسبسسعس رساس تسعسسرسيسسف س کسنيدس وس‬ ‫شسسيوس ۀسسسسن س رساس بسدسساسنسيدس.‬ ‫آ‬ ‫آسرسگسوسمساسن س‌سسهاسيس‬ ‫- طسسرسيسق س ۀ بسسسسه ‌سسسکاسرسگسيرسيس‬ ‫پسيشسس‌سسفرسضسس رساس بسدسساسنسيدس.‬ ‫- فسسرسق س بسيسن س تساسبسعس ‪ void‬بساس سسساسيسرس تسوساسبسعس رساس‬ ‫بسدسساسنسيدس.‬
  • 157. ‫1-مقدمه‬ ‫برنامه‌هاي واقع ي و تجاري بس يار بزرگ‌تر‬ ‫از برنامه‌هاي ي هس تند ک ه تاکنون بررسي‬ ‫کرديم. براي اين که برنامه‌هاي بزرگ قابل‬ ‫مديريت باشند، برنامه‌نويسان اين برنامه‌ها‬ ‫را ب ه زيربرنامه‌هايي بخش‌بندي مي‌کنند.‬ ‫اي ن زيربرنامه‌ ها »تابع« ناميده مي‌شوند.‬ ‫توابع را مي‌توان به طور جداگانه کامپايل و‬ ‫آزماي ش نمود و در برنامه‌هاي مختلف‬ ‫دوباره از آن‌ها استفاده کرد.‬
  • 158. ‫2- توابع كتابخانه‌اي ‪ ++C‬استاندارد‬ ‫»كتابخانۀ ‪ ++C‬استاندارد« مجموعه‌اي است‬ ‫که شامل توابع ‌ از پيش تعريف شده و ساير‬ ‫عناص ر برنام ه اس ت‌. اي ن تواب ع و عناصر از‬ ‫طريق »سرفايل‌ها« قابل دستيابي‌اند.‬ ‫قبل برخي از آن‌ها را استفاده كرده‌ايم‌: ثابت‬ ‫‪ INT_MAX‬که در >‪ <climits‬تعريف شده ،‬ ‫تاب ع )( ‪ sqrt‬که در >‪ <cmath‬تعريف شده‬ ‫است و... .‬
  • 159. ‫تابع جذر ‪()sqrt‬‬ ‫ريشۀ دوم يك عدد مثبت‌، جذر آن عدد است.‬ ‫تاب ع مانن د ي ک برنام ۀ کام ل، داراي ‌روند‬ ‫ورودي - پردازش - خروجي است هرچند که‬ ‫پردازش، مرحله‌اي پنهان اس ت. يعني‬ ‫نمي‌داني م ک ه تاب ع روي عدد 2 چه اعمالي‬ ‫انجام مي‌دهد که 1/12414 حاصل مي‌شود.‬
  • 160. ‫برنا مۀ سادۀ ز ير، تا بع از پ يش تعريف‬ :‫شدۀ جذر را به کار م ي ‌گيرد‬ #include <cmath> // defines the sqrt() function #include <iostream> // defines the cout object using namespace std; int main() { //tests the sqrt() function: ‫تابع‬x=0; ‫ مانن‬x++) ‫براي اجراي ي ك‬ for (int ‫ د‬x < 6; ‫تاب ع‬ ‫)( کاف ي اس ت نام آ ن تاب ع به‬sqrt cout << "t" << x << "t" << sqrt(x) << endl; ‫صورت ي ک متغي ر در دستورالعمل‬ } :‫مورد نظر استفاده شود، مانند زير‬
  • 161. ‫اين کار »فراخواني تابع « يا »احضار تابع«‬ ‫گفت ه مي‌شود. بنابراي ن وقت ي كد ‪(sqrt(x‬‬ ‫اجرا شود، تاب ع ‪ ()sqrt‬فراخواني مي‌گردد.‬ ‫عبارت ‪ x‬درون پرانتز »آرگومان « يا »پارامتر‬ ‫واقعي« فراخواني ناميده مي‌شود. در چنين‬ ‫حالت ي مي‌گويي م ك ه ‪ x‬توس ط »مقدار« به‬ ‫تابع فرستاده مي‌شود. لذا وقتي 3=‪ x‬است،‬ ‫با اجراي ک د ‪ (sqrt(x‬تاب ع ‪ ()sqrt‬فراخواني‬ ‫شده و مقدار 3 به آن فرستاده مي‌شود. تابع‬ ‫مذکور ني ز حاص ل 50237.1 را به عنوان‬
  • 162. ‫‪()Main‬‬ ‫… اين فرايند در نمودار زير نشان داده شده.‬ ‫‪int‬‬ ‫‪()Sqrt‬‬ ‫3‬ ‫‪x‬‬ ‫3‬ ‫50237.1‬ ‫50237.1 ‪y‬‬ ‫‪double‬‬ ‫متغيرهاي ‪ x‬و ‪ y‬در تابع ‪ ()main‬تعريف شده‌اند. مقدار ‪ x‬که‬ ‫برابر با 3 است به تابع ‪ ()sqrt‬فرستاده مي‌شود و اين تابع‬ ‫مقدار 50237.1 را به تابع ‪ ()main‬برمي‌گرداند. جعبه‌اي كه‬ ‫تابع ‪ ()sqrt‬را نشان مي‌دهد به رنگ تيره است، به اين معنا‬ ‫كه فرايند داخلي و نحو ۀکسسسسار آن قابل رويت نيست.‬
  • 163. ‫مثال 52- آزمايش يك رابط ۀمسسسثلثاتي‬ ‫ايسن برنامسه هسم از سسرفايل >‪ <cmath‬استفاده‌ مي‌كند. هدف‬ ‫اين است که صحت رابط ۀ ‪ Sin2x=2SinxCosx‬به شکل‬ ‫تجربي بررسي شود.‬ ‫)(‪int main‬‬ ‫{‬ ‫)2.0 =+ ‪for (float x=0; x < 2; x‬‬ ‫“‪cout << x << "tt" << sin(2*x) << "t‬‬ ‫;‪<< 2*sin(x)*cos(x) << endl‬‬ ‫}‬
  • 164. ‫خروجي برنامه:‬ ‫0‬ ‫0‬ ‫0‬ ‫2.0‬ ‫814983.0‬ ‫814983.0‬ ‫برنام ۀ مسسسقدار ‪x‬‬ ‫4.0‬ ‫653717.0‬ ‫653717.0‬ ‫را در ستون اول،‬ ‫خروجي نشان مي‌دهد که براي هر 6.0‬ ‫930239.0‬ ‫930239.0‬ ‫مقدار ‪ Sin2x‬را‬ ‫مقدار آزمايشي ‪ ،x‬مقدار ‪ Sin2x‬با مقدار‬ ‫8.0‬ ‫475999.0‬ ‫475999.0‬ ‫در ستون دوم و‬ ‫‪ 2SinxCosx‬برابر 792909.0‬ ‫1‬ ‫792909.0 است.‬ ‫2.1‬ ‫364576.0‬ ‫364576.0‬ ‫مقدار‬ ‫4.1‬ ‫889433.0‬ ‫‪ 2SinxCosx‬را 889433.0‬ ‫6.1‬ ‫در سسستون سوم 4473850.0- 4473850.0-‬ ‫8.1‬ ‫125244.0-‬ ‫125244.0-‬ ‫چاپ‌ مي‌كند.‬
  • 165. ‫بيشت رمثال تواب ع معروف رياض ي كه در‬ ‫تابع‬ ‫شرح‬ ‫ماشي ن ‌ح سا ب ‌ها هم وجود دارد در سرفايل‬ ‫2.0(‪ (acos‬مقدار‬ ‫)‪acos(x‬‬ ‫44963.1 را برمي تعر يف شده ا ست).به بع ضي از اين‬ ‫راديان(‬ ‫کسينوس معکوس‪x‬‬ ‫>‪‌ <cmath‬گرداند‬ ‫)‪asin(x‬‬ ‫2.0(‪ (asin‬مقدار زير نشان داده شده:‬ ‫توابع در جدول‬ ‫سينوس معکوس ‪) x‬به راديان(‬ ‫853102.0 را برمي‌گرداند‬ ‫مقدار‬ ‫2.0(‪(atan‬‬ ‫)‪atan(x‬‬ ‫تانژانت معکوس ‪) x‬به راديان(‬ ‫693791.0 را برمي‌گرداند‬ ‫395141.3(‪(ceil‬‬ ‫)‪ceil(x‬‬ ‫مقدار سقف ‪) x‬گرد شده(‬ ‫مقدار 0.4 را برمي‌گرداند‬ ‫2(‪ (cos‬مقدار‬ ‫)‪cos(x‬‬ ‫کسينوس ‪) x‬به راديان(‬ ‫-741614.0 را برمي‌گرداند‬ ‫2(‪ (exp‬مقدار 60983.7‬ ‫)‪exp(x‬‬ ‫تابع نمايي ‪) x‬در پايه ‪(e‬‬ ‫را برمي‌گرداند‬ ‫2-(‪ (fabs‬مقدار 0.2 را‬ ‫)‪fabs(x‬‬ ‫قدر مطلق ‪x‬‬ ‫برمي‌گرداند‬
  • 166. ‫‪floor(x‬‬ ‫395141.3(‪ (floor‬مقدار کف ‪) x‬گرد‬ ‫(‬ ‫شده(‬ ‫مقدار 0.3 را برمي‌گرداند‬ ‫2(‪ (log‬مقدار 741396.0 لگاريتم طبيعي ‪) x‬در‬ ‫‪(log(x‬‬ ‫پايه ‪(e‬‬ ‫را برمي‌گرداند‬ ‫‪log10(x‬‬ ‫لگاريتم عمومي ‪) x‬در‬ ‫2(01‪ (log‬مقدار‬ ‫(‬ ‫پايه 01(‬ ‫30103.0 را برمي‌گرداند‬ ‫‪pow(x,p‬‬ ‫3,2(‪ (pow‬مقدار 0.8 را‬ ‫(‬ ‫‪ x‬به توان ‪p‬‬ ‫برمي‌گرداند‬ ‫2(‪ (sin‬مقدار 792909.0‬ ‫‪(sin(x‬‬ ‫سينوس ‪) x‬به راديان(‬ ‫را برمي‌گرداند‬ ‫2(‪ (sqrt‬مقدار 12414.1‬ ‫‪(sqrt(x‬‬ ‫جذر ‪x‬‬ ‫را برمي‌گرداند‬ ‫2(‪ (tan‬مقدار -40581.2‬ ‫‪(tan(x‬‬ ‫تانژانت ‪) x‬به راديان(‬ ‫را برمي‌گرداند‬
  • 167. ‫تسوسجسسهس دساسشسستسهس بساسشسسيسدس کسهس هسسرس تساسبسعس رسيساسضسيسس‬ ‫‪ double‬رساس‬ ‫يسکس مسقسسدسساسرس اسزس نسوسعس‬ ‫بسرسمسيسس‌سسگرسدساسنسدس. اسگسسرس يسسك س نسوسعس صسسحسيحس بسهس‬ ‫تساسبسعس فسسرسسسستاسدسه س شسسوسدس، قسسبلسس اسزس اسيسن س كسهس تساسبسعس‬ ‫آسن س رساس پسرسدساسزسشسس کسنسدسس، مسقسسدسساسرسشسس رساس بسهس نسوسعس‬ ‫‪ double‬اسرستسقسساس مسيسس‌سسدهسسدس.‬ ‫‌‬
  • 168. ‫اسيسسسن س سسسرسفسساسيسلسس‌سسهاس اسزسكستاسبسخساسن ‌سسسسس ۀ ‌ ‌‪C‬‬ ‫بسعسسضسسسسيسس اسزس سسسسسرسفسساسيسلسس‌سسهاسيس كستاسبسخساسنس ۀ ‪++C‬‬ ‫اسسسستاسنسدساسرسدس کسهس کساسرسبسرسدس بسيشستهس شسسدس س‌سانسد .‬ ‫گسرسفسسسترسيس دساسرسنسدسسهدسرس جسسسدسوسلسس‬ ‫اسسسسسسسسستاسنسدسساسرسدس‬ ‫زسيسرس آسمسدسهسس اسسسسستاسزس آسن س‌سسسهاس شسسبيهس اسسسستفسساسدسه س‬ ‫اسسسستفسساسدسه س:‬ ‫اسزس سسسسرسفسساسيسلسس‌سسهاسيس ‪ ++C‬اسسسستاسنسدس سرفايل‬ ‫ساسرسدس‬ ‫شرح‬ ‫>‪<assert‬‬ ‫تابع >‪ <assert‬را تعريف مي‌کند‬ ‫)مساسنسنسسدس >‪ ( <iostream‬اسسسستس. بسرساسيس‬ ‫>‪<ctype‬‬ ‫توابعي را براي بررسي کاراکترها تعريف مي‌کند‬ ‫>‪<cfloat‬‬ ‫ثابت‌هاي مربوط اسگساعداد مميز شناورسيسسمسس تساسبسعس اسعسدسساسدس‬ ‫را تعريف‬ ‫مسثاسل س به سسرس بسخسوساسهس‬ ‫محدودۀ اعداد صحيح ‪ ()rand‬رساس اسزس سس >‪<climits‬‬ ‫سرسفسساسيسلسس‬ ‫ميتسص سساسدسف سيسس را روي سيستم موجود‬ ‫‌کند س س‬ ‫تعريف ميرا تعريف مي بسهس كساسرس ب سسبرسيسمسس، >‪<cmath‬‬ ‫بساسيسدس‬ ‫س‬ ‫رياضي ‌کند‬ ‫توابع >‪‌ <cstdlib‬کند‬ ‫>‪<cstdio‬‬‫دسسسسستوسرس پسيشسس‌سپرسدساسزسنسدس ۀزسسسسيسسرس رساس بسهس‬ ‫توابعي را براي ورودي و خروجي استاندارد تعريف‬ ‫‌‬ ‫مي کاربردي را تعريف مي‌کند‬‫توابع ‌کند‬ ‫اسبستدسساسيس فسساسيسلسسبسرسنساسم ‌سسسسس ۀ ‌ اسصسسلسيسس اسضساسفسسهس‬ ‫>‪<cstdlib‬‬ ‫>‪<cstring‬‬ ‫توابعي را براي پردازش رشته‌ها تعريف مي‌کند‬ ‫>‪<ctime‬‬ ‫ساعت را تعريف مي‌کند‬ ‫توابع تاريخ و:‬ ‫کسنيمسس‬
  • 169. ‫3- توابع ساخت كاربر‬ ‫گسرسچسسسسهس تسوساسبسسسعس بسسسسسسياسرس مستنوسعسيسس دسرس‬ ‫کستاسبسخساسن ‌سسسسس ۀ ‌ ‌ ‪ ++C‬اسسسستاسنسدسساسرسدس وسجسسوسدس دساسرسدس‬ ‫وسلسسيسس اسيسسن س تسوساسبسسعس بسرساسيس بسيشسسترس وسظسساسيسف س‌س‬ ‫بسرسنساسمسهس‌سنوسيسسسسيسس كساسفسسيسس نسيسسستندس. عسلسوسه س بسرس‬ ‫اسيسسسن س بسرسنساسمسهس‌سنوسيسسسسسساسن س دسوسسسسسستس دساسرسنسدس‬ ‫خسسوسدسشسساسن س بستوساسنسنسدس تسوساسبسعسسيسس رساس بسسسساسزسنسدس وس‬ ‫اسسسستفسساسدسه س نسمسساسيسندس.‬
  • 170. ‫مسثاسلسس 3-5 تساسبسعس ‪()cube‬‬ ‫يسك س مسثاسلسس سسساسدسه س اسزس تسوساسبسعس سسساسخسستس كساسرسبسرس:‬ ‫)‪int cube(int x‬‬ ‫اي ن تاب ع، مكعب‬ ‫:‪{ // returns cube of x‬‬ ‫يك عدد صحيح‬ ‫ارسالي به آن را‬ ‫;‪return x*x*x‬‬ ‫برمي‌گرداند.‬ ‫}‬ ‫بنابراين‬ ‫فراخواني‬ ‫2(‪ (cube‬مقدار‬
  • 171. ‫يك تابع ساخت كاربر دو قسمت دارد:‬ ‫2- بدنه.‬ ‫1-عنوان‬ ‫عنوان يك تابع به صورت زير است:‬ ‫نو که ‌‌ در بالي ‌‌(‬ ‫نوع بازگشت ي تاب(ع نا‪ ()cube‬ع ‌ بازگشت‬ ‫م‌‬ ‫فهرست‌ پارامترها‌‌‬ ‫بدن ۀ تاب ع، ي ك بلوك ك د اس ت ك ه در ادامۀ‬ ‫تعري آ ن م د، ‪ int‬اس تشام ل آن ‪cube‬‬ ‫دستوراتي‬ ‫عنوان ف ش ي‌آيد. بدن ه . نام‬ ‫مثال:‬ ‫مي كه بايد انجام شود از)‪int cube(int x‬‬ ‫است ‌باشد و يک پارامتر تا نتيجۀ موردنام‬ ‫نظر‬ ‫نوع ‪ int‬به‬ ‫به دس ت. يعني تابع شام ل دستور ‪{ return‬‬ ‫‪ x‬دارد آيد. بدن ه ‪ ()cube‬يک مقدار از‬ ‫نوع ‪ int‬مي‌گيرد و پاسخي از نوع ‪…int‬‬ ‫بدنه تابع‬ ‫است كه پاسخ نهايي را به مكان فراخواني‬ ‫}‬ ‫تابع برميمي‌دهد.‬ ‫‌گرداند.‬ ‫تحويل‬
  • 172. ‫دستور ‪ return‬دو وظيف ۀعسسسمده دارد. اول اين‬ ‫که عبارت ‪()int main‬ي‌دهد در هم اين که‬ ‫ۀ‬ ‫اجراي تابع را خاتمه م که و دوم‬ ‫برنامه‌ها استفاده کرده‌ايم ۀ فسسسراخوان‬ ‫مقدار نهايسسي را بسسه برنام يک تابع به باز‬ ‫نام . دس ستور ‪ return‬به مي سسل‬ ‫مي‌گرداند»تابسعس اصسلي« را تعريف شک‌کند. زير‬ ‫نوعمي‌شود:‬ ‫بازگشتسي ايسن تابع از نوع ‪int‬‬ ‫استفاده‬ ‫است. نام آن ‪ main‬است و فهرست‬ ‫;‪return expression‬‬ ‫پارامترهاي آن خالي است؛ يعني هيچ‬ ‫بسسه جاي ‪ expression‬هر عبارتي قرار‬ ‫پارامتري ندارد.‬ ‫مي‌گيرد کسه بتوان مقدار آسن را بسه يسک متغير‬ ‫تخصسيص داد. نوع آسن عبارت بايسد با نوع‬
  • 173. ‫برنام ۀآسسسزمون -4‬ ‫تنهيا ي ک تابع اي ننياز را ايجاد‬ ‫هدف مورد برنامه،‬ ‫وقت‬ ‫برنامۀ فورا باي آ ن تابع ب ا و‬ ‫امتحان کردن موقتي‬ ‫کردي د، آزمون يکدبرنامۀ تاب ع رااستيک‬ ‫که‬ ‫بايد » ۀ سو کثيف« باشد؛ کنيد. چنين‬ ‫برنام سريع اده امتحان‬ ‫برنامه‌اي ي ص حت کار آن‬ ‫برنامۀ آزمون ناميده‬ ‫بررس‬ ‫است‬ ‫يعني:‬ ‫مي‌شود.‬ ‫.‬ ‫لزم نيس ت در آن تمام ظرافت‌هاي‬ ‫برنامه‌نويسي – مثل پيغام‌هاي خروجي،‬ ‫برچس ب‌ها و راهنماهاي خوانا – را‬
  • 174. ‫مثال 54- يك برنام ۀآسسسزمون براي تابع ‪()cube‬‬ ‫کد زير ل تابع ‪ ()cube‬و برنامۀ آزمون آن است:‬ ‫شام‬ ‫)‪int cube(int x‬‬ ‫برنام ۀ حاضر اعداد‬ ‫:‪{ // returns cube of x‬‬ ‫صحيح را از ورودي‬ ‫;‪return x*x*x‬‬ ‫مي‌گيرد و مكعب آن‌ها‬ ‫}‬ ‫را چاپ مي‌كن د ت ا اين‬ ‫)(‪int main‬‬ ‫كه كاربر مقدار 0 را‬ ‫:‪{ // tests the cube() function‬‬ ‫وارد كند.‬ ‫;1=‪int n‬‬ ‫)0 =! ‪while (n‬‬ ‫;‪{ cin >> n‬‬ ‫}} ;‪cout << "tcube(" << n << ") = " << cube(n) << endl‬‬
  • 175. ‫ه ر عدد ص حيحي ک ه خوانده مي‌شود، با‬ ‫اس تفاده از ک د ‪ (cube(n‬به تابع ‪()cube‬‬ ‫فرستاده كسهي‌شود‪ ()cube‬در بازگشتي از تابع،‬ ‫دقست كنيسد م تابسع . مقدار بالي تابع ‪()main‬‬ ‫جايگزي ن عبارت از ايسن كسه تابع ‪ ()cube‬و با‬ ‫تعريسف شده زيرا قبسل ‪ (cube(n‬گشت ه در تابع‬ ‫‌‬ ‫‪ ()main‬به ‪ cout‬در خروجي بايسد درر‌سسسس ۀ ‌ آن‬ ‫استفاده از كار رود، كامپايلسر ‪++C‬چاپ مي‌شود.‬ ‫با‬ ‫اطلع حاصل كند.‬ ‫)(‪main‬‬ ‫)(‪cube‬‬ ‫5‬ ‫مي‌توان رابط ۀ بي ن تاب ع ‪n()main‬و تابع‬ ‫5‬ ‫‪int‬‬ ‫‪x‬‬ ‫5‬ ‫‪int‬‬ ‫521‬ ‫‪ ()cube‬را شبيه اين شکل تصور نمود:‬
  • 176. ()max ‫مثال 55- يك برنام ۀآسسسزمون براي تابع‬ ‫تابسع زيسر دو پارامتسر دارد. ايسن تابسع از دو مقدار فرسستاده شده بسه آسن، مقدار بزرگ‌تر را‬ :‫برمي‌گرداند‬ 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);}
  • 177. ‫توابع مي‌توانند بيش از يک دستور ‪ return‬داشته باشند. مثل تابع ‪ ()max‬را‬ ‫مانند اين نيز مي‌توانستيم بنويسيم:‬ ‫دس تور ‪int max(int x, int y) return‬‬ ‫نوع ي دستور پرش‬ ‫است )شبيه دستور ‪ ( break‬زيرا اجرا‬ ‫:‪{ // returns larger of the two given integers‬‬ ‫را ب ه بيرون از تاب ع هدايت مي‌کند.‬ ‫در اگرچه معمول ‪ return‬در انتهاي < ‪if (x‬‬ ‫اين کد هر دستور ;‪ y) return y‬تابع‬ ‫‪ return‬مي‌گيرد، مي‌توان آ ن را در هر‬ ‫قرار که زودتر‬ ‫;‪else return x‬‬ ‫اجرانقطۀ ديگري از تابع قرار داد.‬ ‫شود مقدار‬ ‫}‬ ‫را‬ ‫مربوطه‌اش‬ ‫بازگشت داده و تابع‬ ‫را خاتمه مي‌دهد.‬
  • 178. ‫5- اعلن‌ها و تعاريف تابع‬ ‫به دو روش ميتوان توابع را تعريف نمود:‬ ‫1-توابع قبل از تابع ‪ ()main‬به طور كامل‬ ‫با بدنه مربوطه آورده شوند.‬ ‫2-راه ديگري که بيشتر رواج دارد اين گونه‬ ‫است که ابتدا تابع اعلن شود، سپس متن‬ ‫برنام ۀ اص لي ‪ ()main‬بياي د، پ س از آن‬ ‫تعريف کامل تابع قرار بگيرد.‬
  • 179. ‫اعلن تابع با تعريف تابع تفاوت دارد.‬ ‫اعلن تابع شبيه اعلن متغيرهاست.‬ ‫اعلن تاب ع، فق ط عنوان تاب ع اس ت ک ه يک‬ ‫سميکولن در انتهاي آن قرار دارد.‬ ‫تعري متغير ع، مت ن کامکه تاب ع اس ت ک ه هم‬ ‫يک ف تاب قبل از اين ل به کار گرفته شود‬ ‫شامل عنوان استتابع هم همين طور است‬ ‫بايد اعلن شود. و هم شامل بدنه.‬ ‫با اي ن فرق ک ه متغي ر را در ه ر جايي از‬ ‫برنامه مي‌توان اعلن کرد اما تابع را بايد‬ ‫قبل از برنامۀ اصلي اعلن نمود.‬
  • 180. ‫در اعلن تاب ع فق ط بيان مي‌شود که نوع‬ ‫بازگشتي تابع چيست، نام تابع چيست و نوع‬ ‫پارامترهاي تابع چيست.‬ ‫همين‌سها براي کامپايلسر کافسي اسست تسا بتواند‬ ‫کامپايسل برنامسه را آغاز کند. سپس در زمان‬ ‫اجرا به تعريف بدن ۀتسسسابع نيز احتياج مي‌شود‬ ‫که اين بدنه در انتهاي برنامه و پس از تابع‬ ‫‪ ()main‬قرار مي‌گيرد.‬
  • 181. ‫فرق بين »آرگومان« و »پارامتر« :‬ ‫پارامتره ا متغيرهاي ي هس تند که در‬ ‫فهرس ت پارامت ر ي ک تابع نام برده‬ ‫مي‌شوند.‬ ‫پارامتره ا متغيرهاي محل ي براي تابع‬ ‫محسوب مي‌شوند؛ يعني فقط در طول‬ ‫آرگوما ن ‌ه ا متغيرهاي ي هس تند که از‬ ‫اجراي تابع وجود دارند.‬ ‫برنامۀ اصلي به تابع فرستاده مي‌شوند.‬
  • 182. ‫;)‪int max(int,int‬‬ ‫مثال 56- تابع‪ ()max‬با اعل ن ‌ جدا از تعريف آن‬ ‫ا ين برنا مه همان برنا مۀ آزمون تابع ‪ ()max‬در‬ ‫)(‪int main‬‬ ‫مثال 65- است. اما اي ن ‌جا اعلن تابع بالي تابع‬ ‫ا صلي ظا هر ‌شده و تعر يف تا بع ب عد از برنامۀ‬ ‫{‬ ‫;‪int m, n‬‬ ‫اصلي آمده است:‬ ‫‪do‬‬ ‫;‪{ cin >> m >> n‬‬ ‫" = )" << ‪cout << "tmax(" << m << "," << n‬‬ ‫} ;‪<< max(m,n) << endl‬‬ ‫};)0 =! ‪while (m‬‬ ‫توجه كنيد كه پارامترهاي ‪x‬‬ ‫)‪int max(int x, int y‬‬ ‫و ‪ y‬در بخش عنوان تعريف‬ ‫;‪{ if (x < y) return y‬‬ ‫تابع آمده‌اند )طبق معمول(‬ ‫ول ي در اعلن تابع وجود‬ ‫};‪else return x‬‬
  • 183. ‫اغ لب ا ين طور ا ست ۀتسسسوابع‬ ‫که تعريف و‬ ‫6- كامپايل جداگان‬ ‫توابع کتابخانۀ ‪ ++C‬استانداردفاي همين شکل‬ ‫به ل ‌هاي‬ ‫بدن ۀ توابع در‬ ‫پياده ‌سازي شدهقرار م ي ‌گيرد. اين آن‬ ‫جداگان ه ‌اي ‌اند و هنگامي که يکي از‬ ‫فاي ل ‌را در به طور مستقل مکامپايل1با‬ ‫توابع ها برنامه‌هايتان به کار ي‌بريد بايد‬ ‫دستور راهنمايسپس به برنا مۀ آن توابع‬ ‫م ي ‌شو ند و پيش‌پردازنده، فايل اصلي‬ ‫کهبهآ برنامه‌تان ضميمه کنيد.کار م ي ‌گيرد‬ ‫را ن تواب ع را به‬ ‫الصاق2 م ي ‌شوند.‬ ‫اين کار چند مزيت دارد:‬
  • 184. ‫1- اولين مزيت »مخفي‌سازي اطلعات« است.‬ ‫2-مزي ت ديگ ر اي ن اس ت ک ه توابع مورد نياز را‬ ‫مي‌توان قبل از اين که برنامۀ اصلي نوشته شود،‬ ‫جداگانه آزمايش نمود.‬ ‫3-سومين مزي ت اي ن اس ت ک ه در ه ر زمان ي به‬ ‫راحتي مي‌توان تعريف توابع را عوض کرد بدون‬ ‫اين که لزم باشد برنامۀ اصلي تغيير يابد.‬ ‫4- چهارمين مزيت هم اين است که مي‌توانيد يک بار‬ ‫يک تابع را کامپايل و ذخيره کنيد و از آن پس در‬ ‫برنامه‌هاي مختلفي از همان تابع استفاده ببريد.‬
  • 185. ‫تا بع ‪ ()max‬را به خاطر بياوريد. براي‬ ‫اي ن ک ه اي ن تاب ع را در فايل‬ ‫جداگان ه ‌اي قرار ده يم، تعر يف آن را‬ ‫در فايل ي به نام ‪ max.cpp‬ذخيره‬ ‫م ي ‌کنيم. فاي ل ‪ max.cpp‬شام‪max.cpp‬‬ ‫ل کد‬ ‫زير است:‬ ‫)‪int max(int x, int y‬‬ ‫{‬ ‫;‪if (x < y) return y‬‬ ‫;‪else return x‬‬ ‫}‬
  • 186. include#:‫حال كاف ي است عبارت‬ ‫<< را ب ه اول برنام ه اص لي وقبل‬test.cpp #include <test.cpp> :‫)( اضافه كنيم‬main‫از‬ int main() { // tests the max() function: int m, n; do { cin >> m >> n; cout << "tmax(" << m << "," << n << ") = " << max(m,n) << endl; } while (m != 0);}
  • 187. ‫نحوۀ کامپايل کردن فايل ‌ها و الصاق آن‌ها‬ ‫به يکديگ ر ب ه نوع س يستم عامل و نوع‬ ‫کامپايل ر بس تگي دارد. در س يستم عامل‬ ‫ويندوز معمول توابع را در فايل‌هايي از نوع‬ ‫‪ DLL‬کامپايل و ذخيره مي‌کنند و سپس اين‬ ‫فاي ل را در برنام ۀ اصلي احضار مي‌نمايند.‬ ‫فايل‌هاي ‪ DLL‬را به دو طريق ايستا و پويا‬ ‫مي‌توان مورد استفاده قرار داد. براي‬ ‫آشناي ي بيشت ر ب ا فايل‌هاي ‪ DLL‬به مرجع‬ ‫ويندوز و کامپايلرهاي ‪ ++C‬مراجعه کنيد.‬
  • 188. ‫6- متغيرهاي محلي، توابع محلي‬ ‫متغيمر محلمي ، مستغسسيرسيس اسسسسستس کسهس دسرس‬ ‫م‬ ‫م‬ ‫دساسخسسسلسس يسسکس بسلسوسکس اسعسلسن س گسرسدسدس. اسيسن س‬ ‫گسوسنسهس مستغسسيرسهسساس فسفسسقسسطسسستساس وسقسستسيسس کس هس تساسبسعس‬ ‫اسيسن س مستغسسيرسهسساس سقسسطسسس دسرس دساسخسسلسس سهس سمسساسن س‬ ‫بسلسوسکحسساسل س کساسرس اسعسلسنوسجمسيسس‌سسشوسنسسسد. قسساسبسلسس‬ ‫دسرس سسسيسس کسسسهس اسسسستس س سسوسدس دساسرسنسدسس‬ ‫دسسسستياسبسيسس هسسسسستندس.‬ ‫پساسرساسمسترسهسساسيس تساسبسسسعس نسيزس مستغسسيرسهسساسيس‬ ‫مسحسلسيسسبسدسسنسس ۀتسسوسبس مسيسخسسوسدسشسس يسکس بسلسوسکس‬ ‫چسسوسن س مسحسس سسساسبسسعس، س‌سسشوسنسدس.‬ ‫اسسسستس پسسسس مستغسسيرسهسساسيس اسعسلسن س شسسدسسه س دسرس‬ ‫يسکس تساسبسسعس مستغسسيرسهسساسيس مسحسلسسيسس بسرساسيس آسن س‬
  • 189. ‫* مثال 7-5 تابع فاكتوريل‬ ‫اعداد فاكتوريل را در مثال 58- ديديم. فاكتوريل عدد صحيح ‪ n‬برابر است با:‬ ‫)1()2()3(..)2-‪n! = n(n-1)(n‬‬ ‫تابع زير، فاکتوريل عدد ‪ n‬را محاسبه مي‌کند‌:‬ ‫)‪long fact(int n‬‬ ‫)1(*)2(*...*)2-‪{ //returns n! = n*(n-1)*(n‬‬ ‫;0 ‪if (n < 0) return‬‬ ‫;1 = ‪int f‬‬ ‫اين تابع دو متغير محلي دارد: ‪ n‬و‬ ‫)1 > ‪while (n‬‬ ‫‪ f‬پارامتر ‪ n‬يک متغير محلي است‬ ‫;--‪f *= n‬‬ ‫زيرا در فهرسست پارامترهاي تابع‬ ‫;‪return f‬‬ ‫اعلن شده و متغيسر ‪ f‬نيسز محلي‬ ‫اسست زيرا درون بدنس ۀتسسسابع اعلن‬ ‫}‬ ‫شده است.‬
  • 190. ‫همان گون ه ک ه متغيره ا مي‌توانن د محل ي باشن د، تواب ع نيز‬ ‫مي‌توانند محلي باشند. تابع محلي‬ ‫يک تا بع مح لي تابعي است که درون يک تابع ديگر به کار‬ ‫رود . با استفاده از چند تابع ساده و ترکيب آن ‌ها مي‌توان توابع‬ ‫پيچيده‌تري ساخت. به مثال زير نگاه کنيد.‬ ‫در رياضيات، تابع جايگشت را با ‪ (p(n,k‬نشان مي‌دهند. اين تابع‬ ‫بيان مي‌کنسد کسه بسه چنسد طريسق مي‌توان ‪ k‬عنصسر دلخواه از يک‬ ‫مجموع ۀ ‪ n‬عنصري را کنار يکديگر قرار داد. براي اين محاسبه از‬ ‫رابط ۀزسسسير استفاده مي‌شود:‬ ‫!‪n‬‬ ‫= ) ‪P (n, k‬‬ ‫!) ‪(n − k‬‬ ‫!4‬ ‫42 !4‬ ‫= )2,4(‪P‬‬ ‫= =‬ ‫21 =‬ ‫2 !2 !)2 − 4(‬
  • 191. ‫پس به 21 طريقخود‌توانيم دو عنصر دلخواه از يک مجموع ۀچسسسهار‬ ‫ايسن تابسع، مي از تابسع ديگري کسه همان تابع‬ ‫فاکتوريلکنار هم بچينيم. براي دو عنصر. از مجموع ۀ }1, 2, 3,‬ ‫عنصري را است استفاده کرده است‬ ‫4{ حالت‌هاي ممکن عبارت است از:‬ ‫شرط بسه کار رفتسه در دستور ‪ if‬براي محدود‬ ‫34 ,24 ,14 ,43 ,23 ,13 ,42 ,32 ,12 ,41 ,31 ,21‬ ‫کردن حالت‌هاي غير ممکن استفاده شده است. در‬ ‫كد زير تابع جايگشت را پياده‌سازي‌ مي‌كند:‬ ‫اين حالت‌ها، تابع مقدار 0 را برمي‌گرداند تا نشان‬ ‫دهد که يک ورودي اشتباه وجود داشته است.‬ ‫)‪long perm(int n, int k‬‬ ‫:‪{// returns P(n,k), the number of the permutations of k from n‬‬ ‫;0 ‪if (n < 0) || k < 0 || k > n) return‬‬ ‫;)‪return fact(n)/fact(n-k‬‬ ‫}‬
  • 192. :‫)( در ادامه آمده است‬perm ‫برنام ۀآسسسزمون براي تابع‬ long perm(int,int); // returns P(n,k), the number of permutations of k from n: int main() { // tests the perm() function: 00 for (int i = -1; i < 8; i++) 010 0110 { for (int j= -1; j <= i+1; j++) 01220 013660 cout << " " << perm(i,j); 0 1 4 12 24 24 0 cout << endl; } 0 1 5 20 60 120 120 0 0 1 6 30 120 360 720 720 0 } 0 1 7 42 210 840 2520 5040 5040 0
  • 193. ‫7- تابع ‪void‬‬ ‫لزم نيست يك‌ تابع‌ حتما مقداري را برگرداند. در ‪ ++C‬براي‬ ‫مشخص کردن چنين توابعي از کلم ۀکسسسليدي ‪ void‬به عنوان‬ ‫نوع بازگشتي تابع استفاده مي‌کنند‬ ‫يک تابع ‪ void‬تابعي است که هيچ مقدار بازگشتي ندارد.‬ ‫از آن ‌جا كه يك تابع ‪ void‬مقداري را برنمي‌گرداند، نيازي به دستور‬ ‫‪ return‬نيست ولي اگر قرار باشد اين دستور را در تابع ‪ void‬قرار‬ ‫دهيم، بايد آن را به شکل تنها استفاده کنيم بدون اين که بعد از کلم ۀ‬ ‫‪ return‬هيچ چيز ديگري بيايد:‬ ‫;‪return‬‬ ‫در اين حالت دستور ‪ return‬فقط تابع را خاتمه مي‌دهد.‬
  • 194. ‫8- توابع بولي‬ ‫در بس ياري از اوقات لزم اس ت در برنام ه، شرط ي بررسي‬ ‫شود.‬ ‫اگر بررسي اين شرط به دستورات زيادي نياز داشته باشد، بهتر‬ ‫است که يک تابع اين بررسي را انجام دهد. اين کار مخصوصا‬ ‫هنگامي که از حلقه‌ها استفاده مي‌شود بسيار مفيد است.‬ ‫توابع بولي فقط دو مقدار را برم ي ‌گردانند:‬ ‫‪ true‬يا ‪. false‬‬ ‫اس م تواب ع بول ي را معمول ب ه شک ل سوالي انتخاب‬ ‫مي‌کنند زيرا توابع بولي هميشه به يک سوال مفروض‬ ‫پاسخ بلي يا خير مي‌دهند.‬
  • 195. ‫مثال 501- تابعي‌ كه‌ اول بودن اعداد را بررسي مي‌كند‬ :‫کد زير يك تابع بولي است كه تشخيص مي‌دهد آيا عدد صحيح ارسال شده به آن، اول است يا خير‬ 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 }
  • 196. ‫9- توابع ورودي/خروجي )‪(I/O‬‬ ‫بخش‌هايي از برنامه که به جزييات دست و پا گير مي‌پردازد و‬ ‫خيلي به هدف اصلي برنامه مربوط نيست را مي‌توان به توابع‬ ‫سپرد. در چنين شرايطي سودمندي توابع محسوس‌تر مي‌شود.‬ ‫فرض کنيسد نرم‌افزاري براي سسيستم آموزشسي دانشگاه طراحي‬ ‫کرده‌ايد که سوابق تحصيلي دانشجويان را نگه مي‌دارد. در اين‬ ‫نرم‌افزار لزم است که سن دانشجو به عنوان يکي از اطلعات‬ ‫پروند ۀدسسسسانشجو وارد شود. اگر وظيف ۀدسسسريافت سن را به عهد ۀ‬ ‫يک تابسع بگذاريسد، مي‌توانيسد جزيياتسي از قبيل کنترل ورودي‬ ‫معتسبر، يافتسن سسن از روي تاريسخ تولسد و ... را در ايسن تابع‬ ‫پياده‌سسازي کنيسد بدون ايسن کسه از مسسير برنامس ۀاسسسصلي منحرف‬ ‫شويد.‬
  • 197. ‫قبل نمونه‌اي از توابسسع خروجسسي را ديديم. تابع‬ ‫‪ ()PrintDate‬در مثال 59- هيسچ چيزي بسه برنام ۀ‬ ‫اصسلي برنمي‌گردانسد و فقسط براي چاپ نتايسج به کار‬ ‫مي‌رود.‬ ‫ايسن تابسع نمونه‌اي از توابسع خروجسي اسست؛ يعني‬ ‫توابعي که فقط براي چاپ نتايج به کار مي‌روند و هيچ‬ ‫مقدار بازگشتي ندارند.‬ ‫توابع ورودي نيز به همين روش کار مي‌کنند اما در‬ ‫جهست معکوسس. يعنسي توابسع ورودي فقسط براي دريافت‬ ‫ورودي و ارسال آن به برنام ۀاسسسصلي به کار مي‌روند‬ ‫و مثال بعد يکندارند. ورودي را نشان مي‌دهد.‬ ‫هيچ پارامتري تابع‬
  • 198. ‫)(‪int age‬‬ ‫مثال 511- تابعي براي دريافت سن كاربر‬ ‫:‪{ // prompts the user to input his/her age and returns that value‬‬ ‫تابع ساد ۀزسسسير، سن کاربر را درخواست مي‌کند و مقدار دريافت شده‬ ‫;‪int n‬‬ ‫را به برنام ۀاسسسصلي مي‌فرستد. اين تابع تقريبا هوشمند است و هر عدد‬ ‫)‪while (true‬‬ ‫صحيح ورودي غير منطقي را رد مي‌کند و به طور مکرر درخواست‬ ‫;" عدد ‪ old are‬محدود ۀ 7 تا {‬ ‫ورودي معتبر مي‌کند تا اين که يک :‪ you‬صحيح در‪120cout << "How‬‬ ‫;‪cin >> n‬‬ ‫دريافت دارد:‬ ‫‪if (n < 0) cout << "atYour age could not‬‬ ‫;".‪be negative‬‬ ‫‪else if (n > 120) cout << "atYou could not‬‬ ‫;".021 ‪be over‬‬ ‫;‪else return n‬‬ ‫;"‪cout << "ntTry again.n‬‬ ‫}‬ ‫}‬
  • 199. :‫يك برنام ۀآسسسزمون و خروجي حاصل از آن در ادامه آمده است‬ 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
  • 200. ‫تا اين‌ لحظه‌ تمام‌ پارامترهايي كه‌ در توابع‌ ديديم‌ به‌‬ ‫طريق‌ مقدار ارسال‌ شده‌اند. يعني‌ ابتدا مقدار‬ ‫متغيري کسسه در فراخوانسسي تابسسع ذکر شده برآورد‬ ‫مي‌شود و سسپس ايسن مقدار بسه پارامترهاي محلي‬ ‫تابع فرستاده مي‌شود.‬ ‫مثل در فراخواني ‪ (cube(x‬ابتدا مقدار ‪ x‬برآورد‬ ‫شده و سپس اين مقدار به متغير محلي ‪ n‬در تابع‬ ‫فرسستاده مي‌شود و پسس از آسن تابسع کار خويش را‬ ‫آغاز مي‌کند. در طسي اجراي تابع ممکسن است مقدار‬ ‫‪ n‬تغييسر کنسد امسا چون ‪ n‬محلسي اسست هيچ تغييري‬ ‫روي مقدار ‪ x‬نمي‌گذارد.‬
  • 201. ‫پس خود ‪ x‬به تابع نمي‌رود بلکه مقدار آن درون تابع کپي مي‌شود.‬ ‫تغيير دادن اين مقدار کپي شده درون تابع هيچ تاثيري بر ‪ x‬اصلي‬ ‫ندارد . به ايسن ترتيسب تابسع مي‌توانسد مقدار ‪ x‬را بخوانسد امسا نمي‌تواند‬ ‫مقدار ‪ x‬را تغيير دهد.‬ ‫به همين دليل به ‪ x‬يک پارامتر »فقط خواندني« مي‌گويند.‬ ‫وقتي ارسال به وسيل ۀمسسسقدار باشد، هنگام فراخواني تابع مي‌توان از‬ ‫عبارات استفاده کرد.‬ ‫مثل تابسع ‪ ()cube‬را مي‌توان بسه صسورت 3-‪ (cube(2*x‬فراخواني‬ ‫کرد يسا بسه شکسل 3(‪ ((cube(2*sqrt(x)-cube‬فراخواني نمود. در‬ ‫هر يک از اين حالت، عبارت درون پرانتز به شکل يک مقدار تکي‬ ‫برآورد شده و حاصل آن مقدار به تابع فرستاده مي‌شود.‬
  • 202. ‫‌‬ ‫01- ارسال به طريق ارجاع )آدرس(‬ ‫ارسسسال بسسه طريسسق مقدار باعسسث مي‌شود که‬ ‫متغيرهاي برنام ۀاسسسصلي از تغييرات ناخواسته در‬ ‫توابع مصون بمانند.‬ ‫اما گاهي اوقات عمدا مي‌خواهيم اين اتفاق رخ‬ ‫دهد. يعنسي مي‌خواهيسم کسه تابسع بتواند محتويات‬ ‫متغير فرستاده شده به آن را دست‌کاري کند. در‬ ‫ايسن حالست از ارسمال بمه طريق ارجاع‬ ‫‌استفاده مي‌کنيم.‬
  • 203. ‫براي ايسن کسه مشخسص کنيسم يسک پارامتسر بسه طريق‬ ‫&‬ ‫ارجاع ارسال مي‌شود، علمت را به نوع پارامتر در‬ ‫فهرسست پارامترهاي تابسع اضافسه مي‌کنيم. ايسن باعث‬ ‫مي‌شود که تابع به جاي اين که يک کپي محلي از آن‬ ‫آرگومان ايجاد کنسد، خود آرگومان محلسي را به کار‬ ‫بگيرد.‬ ‫به ايسن ترتيسب تابسع هسم مي‌تواند مقدار آرگومان‬ ‫فرسستاده شده را بخوانسد و هسم مي‌توانسد مقدار آن را‬ ‫تغييسر دهد. در ايسن حالست آسن پارامتسر يسک پارامتر‬ ‫»خواندني-نوشتني« خواهد بود.‬
  • 204. ‫هر تغييري که روي پارامتر خواندني- نوشتني در تابع صورت گيرد‬ ‫به طور مسستقيم روي متغيسر برنامس ۀاسسسصسلي اعمال مي‌شود. به مثال‬ ‫زير نگاه کنيد.‬ ‫* مثال 521- تابع‌ ‪()swap‬‬ ‫تابع‌ كوچك‌ زير در مرتب کردن داده‌ها کاربرد فراوان دارد:‬ ‫)‪void swap(float& x, float& y‬‬ ‫:‪{ // exchanges the values of x and y‬‬ ‫;‪float temp = x‬‬ ‫هدف‌ ايسن تابسع جابجسا کردن دو عنصري‬ ‫;‪x = y‬‬ ‫است که به آن فرستاده مي‌شوند. براي اين‬ ‫منظور پارامترهاي ‪ x‬و ‪ y‬به صورت‬ ‫;‪y = temp‬‬ ‫پارامترهاي ارجاع تعريف شده‌اند:‬ ‫}‬ ‫‪float& x, float& y‬‬
  • 205. ‫ آرگومان‌هاي‬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
  • 206. ‫وقتي‌ فراخوانسي ‪ (swap(a,b‬اجرا مي‌شود، ‪ x‬به ‪a‬‬ ‫اشاره مي‌کنسد و ‪ y‬به ‪ . b‬سپس متغيسر محلي ‪temp‬‬ ‫اعلن مي‌شود و )(‪swap‬هنگام)فراخواني تابع ‪ a‬است( درون آن‬ ‫)(‪main‬‬ ‫مقدار ‪ x‬که همان ‪(swap(a,b‬‬ ‫قرار مي‌گيرد . پس از ‪ x‬آن مقدار ‪) y‬که همان ‪ b‬است(‬ ‫5.55 ‪a‬‬ ‫درون ‪) x‬يعني ‪ (a‬قرار مي‌گيرد و آنگاه ‪temp float‬‬ ‫مقدار‬ ‫&‪float‬‬ ‫درون ‪) y‬يعني ‪ (b‬قرار داده مي‌شود. نتيج ۀنسسسهايي اين‬ ‫8.88 ‪b‬‬ ‫‪y‬‬ ‫&‪float‬‬ ‫‪float‬‬ ‫اسست کسه مقاديسر ‪ a‬و ‪ b‬با يکديگسر جابجسا مي شوند.‬ ‫شکل مقابل نشان مي‌دهد که از بازگشت اين جابجايي رخ‬ ‫)(‪main‬‬ ‫)(‪ swap‬بعد چطور‬ ‫‪a‬‬ ‫8.88‬ ‫‪x‬‬ ‫مي‌دهد:‬ ‫‪float‬‬ ‫&‪float‬‬ ‫‪b‬‬ ‫5.55‬ ‫‪y‬‬ ‫‪float‬‬ ‫&‪float‬‬ ‫‪temp‬‬ ‫5.55‬ ‫‪float‬‬
  • 207. ‫به‌ اعلن‌ تابع‌ ‪ ()swap‬دقت کنيد:‬ ‫)&‪void swap(float&, float‬‬ ‫اين اعلن شامل عملگر ارجاع‌ & براي‌ هر پارامتر‬ ‫است‌.‬ ‫برنامه‌نويسان ‪ c‬عادت دارند که عملگر ارجاع & را‬ ‫به عنوان پيشوند نام متغير استفاده کنند )مثل‪float‬‬ ‫‪ (&x‬در ‪ ++C‬فرض مي‌کنيم عملگر ارجاع & پسوند‬ ‫نوع است )مثل ‪(float& x‬‬ ‫به هر حال کامپايلر هيچ فرقي بين اين دو اعلن‬ ‫نمي‌گذارد و شکسسل نوشتسسن عملگر ارجاع کامل‬
  • 208. ‫مثال‌ ‪ ()f‬دو پارامتسر داردمقدار و ارسابسه به‌ طريق‌ ارجاع‌‬ ‫تابسع 531- ارسال‌ به‌ طريق‌ کسه اولسي ل‌ طريق‬ ‫اين‌ برنامه، دومسسيبين‌بسارسال‌ به طريق‌ مقدار و ارسال‌ به طريق‌ ارجاع‌ را نشان‌‬ ‫مقدار و تفاوت‌ سه طريسسق ارجاع ارسال‬ ‫مي‌شود. فراخوانسي ‪ (f(a,b‬باعسث مي‌شود که‬ ‫مي‌دهد:‬ ‫‪ a‬از طريق‌ مقدار به‌ ‪ x‬ارسال شود و ‪ b‬از ‪;(&void f(int,int‬‬ ‫طريق‌ ارجاع‌ به‌ ‪ y‬فرستاده شود.‬ ‫‪()int main‬‬ ‫} 44 = ‪;int a = 22, b‬‬ ‫‪;cout << "a = " << a << ", b = " << b << endl‬‬ ‫‪;(f(a,b‬‬ ‫‪;cout << "a = " << a << ", b = " << b << endl‬‬ ‫‪;(f(2*a-3,b‬‬ ‫‪{;cout << "a = " << a << 22, b = = " << b << endl‬‬ ‫=‪a‬‬ ‫44 ‪", b‬‬ ‫99 = ‪(void f(int x , int& y a = 22, b‬‬ ‫} 88 = ‪;x‬‬ ‫99 = ‪a = 22, b‬‬
  • 209. ‫شکل زير نحو ۀکسسسار تابع ‪ ()f‬را نشان مي‌دهد.‬ ‫هنگام فراخواني تابع ‪(f(a,b‬‬ ‫)(‪main‬‬ ‫)(‪f‬‬ ‫22 ‪a‬‬ ‫‪x‬‬ ‫22‬ ‫‪int‬‬ ‫‪int‬‬ ‫44 ‪b‬‬ ‫‪y‬‬ ‫‪int‬‬ ‫&‪int‬‬ ‫بعد از‬ ‫)(‪f‬‬ ‫)(‪main‬‬ ‫بازگشت‬ ‫‪a‬‬ ‫22‬ ‫88 ‪xx‬‬ ‫‪int‬‬ ‫‪int‬‬ ‫‪b‬‬ ‫99‬ ‫‪y‬‬ ‫‪int‬‬ ‫&‪int‬‬
  • 210. ‫در جدول‌ زير خلص ۀتسسسفاوت‌هاي بين ارسال از طريق مقدار و‬ ‫ارسال از طريق ارجاع آمده است.‬ ‫ارسال از طريق مقدار‬ ‫ارسال از طريق ارجاع‬ ‫‪;int x‬‬ ‫‪int&; x‬‬ ‫پارامتر ‪ x‬يک متغير محلي است‬ ‫پارامتر ‪ x‬يک ارجاع است‬ ‫‪ x‬يک کپي از آرگومان است‬ ‫‪ x‬مترادف با آرگومان است‬ ‫مي‌تواند محتويات آرگومان را تغيير‬ ‫تغيير محتويات آرگومان ممکن نيست‬ ‫دهد‬ ‫آرگومان ارسال شده از طريق مقدار‬ ‫آرگومان ارسال شده از طريق ارجاع‬ ‫مي‌تواند يک ثابت، يک متغير يا يک‬ ‫فقط بايد يک متغير باشد‬ ‫عبارت باشد‬ ‫آرگومان فقط خواندني است‬ ‫آرگومان خواندني-نوشتني است‬
  • 211. ‫يكي‌ از مواقعي‌ كه‌ پارامترهاي‌ ارجاع‌ مورد نياز‬ ‫هستند جايي‌ است‌ كه‌ تابع‌ بايد بيش از يك‌ مقدار‬ ‫را بازگرداند.‬ ‫دسسستور ‪ return‬فقسسط مي‌تواند يك‌ مقدار را‬ ‫برگرداند.‬ ‫بنابراين‌ اگر بايد بيش از يك‌ مقدار برگشت داده‌‬ ‫شود، اين‌ كار را پارامترهاي‌ ارجاع‌ انجام‌‬ ‫مي‌دهند.‬
  • 212. ‫* مثال‌ 541- بازگشت‌ بيشتر از يك‌ مقدار‬ :‫تابع‌ زيسر از طريسق دو پارامتسر ارجاع، دو مقدار را بازمي‌گرداند‬ ‫ )محيسط و مسساحت‌( براي دايره‌اي که‬circumference ‫ و‬area :‫ است‬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 {
  • 213. ‫برنام ۀآسسسزمون تابع فوق و يک اجراي آزمايشي آن در شکل زير‬ :‫نشان داده شده است‬ 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 >>
  • 214. ‫ارسال‌ از طريق‌ ارجاع‌ ثابت‌ -21‬ ‫ارسال پارامترها به طريق ارجاع دو خاصيت مهم دارد:‬ ‫اول اين که تابع مي‌تواند روي آرگومان واقعي تغييراتي‬ ‫بدهد‬ ‫روش ديگرياشغالبراي ارسال آرگومان وجودمي‌شود.‬ ‫دارد:‬ ‫دوم اين که از نيز بي‌مورد حافظه جلوگيري‬ ‫ارسسال از طريسق ارجاع ثابت. ايسن روش ماننسد ارسال از‬ ‫طريسق ارجاع اسست بسا ايسن فرق کسه تابسع نمي‌تواند محتويات‬ ‫پارامتسر ارجاع را دسست‌کاري نمايسد و فقسط اجاز ۀخسسسسواندن آن‬ ‫را دارد.‬ ‫براي ايسن کسه پارامتري را از نوع ارجاع ثابست اعلن کنيم‬
  • 215. ‫مثال‌ 551- ارسال‌ از طريق‌ ارجاع‌ ثابت‌‬ ‫سه طريقه ارسال پارامتر در تابع زير به کار رفته است:‬ ‫)‪void f(int x, int& y, const int& z‬‬ ‫;‪{ x += z‬‬ ‫;‪y += z‬‬ ‫" = ‪cout << "x = " << x << ", y = " << y << ", z‬‬ ‫;‪<< z << endl‬‬ ‫}‬ ‫در تابع فوق اولين‌ پارامتر يعني ‪ x‬از طريق مقدار ارسال مي‌شود،‬ ‫دوميسن پارامتسر يعنسي ‪ y‬از طريسق ارجاع و سسومين پارامتسر نيز از‬ ‫طريق ارجاع ثابت.‬
  • 216. ‫برنام ۀآسسسزمون و يک اجراي آزمايشي از مثال قبل:‬ ‫;)&‪void f(int, int&, const int‬‬ ‫44 = ‪a = 22, b = 33, c‬‬ ‫44 = ‪x = 66, y = 77, z‬‬ ‫)(‪int main‬‬ ‫44 = ‪a = 22, b = 77, c‬‬ ‫:‪{ // tests the f() function‬‬ ‫44 = ‪x = 85, y = 121, z‬‬ ‫44 = ‪a = 22, b = 121, c‬‬ ‫;44 = ‪int a = 22, b = 33, c‬‬ ‫‪ y‬را‬ ‫پارامترهاي‌ ‪x‬‬ ‫تابع‌ فوق " = ‪<< b << ", c‬و" = ‪cout << "a = " << a << ", b‬‬ ‫;‪<< c << endl‬‬ ‫مي‌توانسد تغييسر دهسد ولي‌ قادر نيست‬ ‫;)‪f(a,b,c‬‬ ‫پارامتسر ‪ z‬را تغييسر دهد. تغييراتسي که‬ ‫روي ‪ x‬صورت مي‌گيرد اثري روي‬ ‫" = ‪cout << "a = " << a << ", b = " << b << ", c‬‬ ‫آرگومان ‪ a‬نخواهسد داشت زيرا ‪ a‬از‬ ‫;‪<< c << endl‬‬ ‫طريسق مقدار بسه تابسع ارسال شده.‬ ‫;)‪f(2*a-3,b,c‬‬ ‫تغييراتسي کسه روي ‪ y‬صورت مي‌گيرد‬ ‫" = ‪cout << "a = " << a << ", b = " << b << ", c‬‬ ‫روي آرگومان ‪ b‬هم تاثير مي‌گذارد‬ ‫;‪<< c << endl‬‬ ‫زيرا ‪ b‬از طريسسق ارجاع بسسه تابع‬ ‫}‬ ‫فرستاده شده.‬
  • 217. ‫ارسال به طريق ارجاع ثابت بيشتر براي توابعي‬ ‫اسستفاده مي‌شود کسه عناصسر بزرگ را ويرايش‬ ‫مي‌کننسد مثسل آرايه‌سها يسا نمونس ۀکسسسلسس‌ها که در‬ ‫جلسسسه‌‌هاي بعدي توضيسسح آن‌سسها آمده است.‬ ‫عناصري که از انواع اصلي هستند )مثل ‪ int‬يا‬ ‫‪ ( float‬به طريسق مقدار ارسسسال مي‌شونسد به‬ ‫شرطسي کسه قرار نباشسد تابسع محتويات آن‌ها را‬ ‫دست‌کاري کند.‬
  • 218. ‫‌توابع‌ بي‌واسطه -31‬ ‫تابعي که به شکل بي‌واسطه تعريف مي‌شود، ظاهري شبيه به‬ ‫توابع معمولي دارد با اين فرق که عبارت ‪ inline‬در اعلن‬ ‫و تعريف آن قيد شده است.‬ ‫‌‬ ‫مثال‌ 561- تابع‌ ‪ ()cube‬به شکل بي‌واسطه‬ ‫اين‌ همان‌ تابع‌ ‪ ()cube‬مثال‌ 53- است‌:‬ ‫)‪inline int cube(int x‬‬ ‫‌‬ ‫تنهسا تفاوت‌ اين‌ است‌ ككلم‌سسسس ۀ ‌ كليدي‌‬ ‫ه‌‬ ‫‪ inline‬در ابتداي عنوان تابسع ذکر‬ ‫شده. اين‌ عبارت به‌ كامپايلسر مي‌گويد :‪{ // returns cube of x‬‬ ‫;‪return x*x*x‬‬ ‫كه‌ در برنامه به جاي ‪ (cube(n‬کد‬ ‫واقعي )‪ (n)*(n)*(n‬را قرار دهد.‬ ‫}‬
  • 219. ‫. به برنام ۀآسسسزمون زير نگاه کنيد:‬ ‫)(‪int main‬‬ ‫:احتياط‬ ‫:‪{ // tests the cube() function‬‬ ‫اسستفاده از توابسع بي‌واسسطه مي‌تواند اثرات‬ ‫;‪cout << cube(4) << endl‬‬ ‫منفسسي داشتسسه باشد. مثل اگسسر يسسک تابع‬ ‫;‪int x, y‬‬ ‫;‪cin >> x‬‬ ‫بي‌واسطه داراي 04 خط کد باشد و اين تابع‬ ‫};)3-‪y = cube(2*x‬‬ ‫در 62 نقطسسه مختلسسف درم برنام ۀ اسسسصلي‬ ‫ايسن برنامسه هنگام کامپايسل بسه شکسل زيسر ازي‌آيسد، گويسيس اصسل تابعي وجود‬ ‫:نداشته‬ ‫فراخواني شود، هنگام کامپايل بيش از هزار‬ ‫)(‪int main‬‬ ‫وقتي‌ كامپايلر کد واقعي تابع‬ ‫را خط کسد بسه برنامس ۀ :‪ cube() function‬مي ‪{ //.tests‬‬ ‫جايگزيسن فراخوانسي آن اسسسصلي افزوده ‪‌ the‬شود‬ ‫;‪endl‬ي‌تواند* قابليت << ‪cout‬‬ ‫مي‌کنسد، مي‌گوييسم کسهبي‌واسطه م << )4( )4( * )4( انتقال‬ ‫همچنين تابع تابع‬ ‫بي‌واسطه، باز مي‌شود‌‌.‬ ‫برنامس ۀ شسسسمسسا را روي سسسيستم‌هاي مختلف‬ ‫;‪int x, y‬‬ ‫;‪cin >> x‬‬ ‫کاهش دهد.‬
  • 220. ‫چندشکلي توابع‌ -41‬ ‫در ‪ ++C‬مي‌توانيسم چنسد تابسع داشتسه باشيسم که‬ ‫همگي يک نام دارند. در اين حالت مي‌گوييم که‬ ‫تابع مذکور، چندشکلي دارد. شرط اين کار آن‬ ‫اسست کسه فهرسست پارامترهاي ايسن توابسع با‬ ‫يکديگر تفاوت داشته باشد. يعني تعداد پارامترها‬ ‫متفاوت باشسد يسا دسست کسم يکي از پارامترهاي‬ ‫متناظر هم نوع نباشند.‬
  • 221. ‫مثال‌ 571- چندشکلي تابع ‪‌()max‬‬ ‫در مثال‌ 53- تابع‌ ‪ ()max‬را تعريسف کرديم. حال توابسع ديگري با‬ ‫همان نام ولي شکلي متفاوت تعريف مي‌کنيم و همه را در يک برنامه‬ ‫به کار مي‌گيريم:‬ ‫;)‪int max(int, int‬‬ ‫;)‪int max(int, int, int‬‬ ‫;)‪int max(double, double‬‬ ‫)(‪int main‬‬ ‫" << )33,66,55(‪{ cout << max(99,77) << " " << max‬‬ ‫;)8.88,4.44(‪" << max‬‬ ‫}‬
  • 222. 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); }
  • 223. ‫در ايسن برنامسه سسه تابسع بسا نام ‪ ()max‬تعريف شده‬ ‫است.‬ ‫وقتسي تابسع ‪ ()max‬در جايسي از برنامسه فراخواني‬ ‫مي‌شود، کامپايلسر فهرسست آرگومان آسن را بررسي‬ ‫مي‌کند تا بفهمد که کدام نسخه از ‪ max‬بايد احضار‬ ‫شود.‬ ‫مثل در اوليسن فراخوانسي تابع ‪ ()max‬دو آرگومان‬ ‫‪ int‬ارسال شده، پس نسخه‌اي که دو پارامتر ‪ int‬در‬ ‫فهرست پارامترهايش دارد فراخواني مي‌شود. اگر اين‬ ‫نسسخه وجود نداشتسه باشسد، کامپايلسر ‪int‬ها را به‬ ‫‪ double‬ارتقسا مي‌دهسد و سسپس نسسخه‌اي که دو‬
  • 224. ‫41- تابع‌ ‪()main‬‬ ‫برنامه‌هايي که تا کنون نوشتيم همه داراي تابعي به‬ ‫نام ‪ ()main‬هستند.‬ ‫منطق ‪ ++C‬اين طور است که هر برنامه بايد داراي‬ ‫تابعي به نام ‪ ()main‬باشد.‬ ‫در حقيقت هر برنامه کامل، از يک تابع ‪ ()main‬به‬ ‫همراه توابع ديگر تشکيل شده است که هر يک از اين‬ ‫توابسع بسه شکسل مسستقيم يسا غيسر مسستقيم از درون تابع‬ ‫‪ ()main‬فراخواني مي‌شوند.‬
  • 225. ‫خود برنامه با فراخواني تابع ‪ ()main‬شروع مي‌شود.‬ ‫چون اين تابع يک نوع بازگشتي ‪ int‬دارد، منطقي است که‬ ‫بلوک تابع ‪ ()main‬شامل دستور 0 ‪ ;return‬باشد هرچند‬ ‫که در برخي از کامپايلرهاي ‪ ++C‬اين خط اجباري نيست و‬ ‫مي‌توان آن را ذکر نکرد.‬ ‫مقدار صسحيحي کسه بسا دسستور ‪ return‬به سسيستم عامل‬ ‫برمي‌گردد بايد تعداد خطاها را شمارش کند. مقدار پيش‌فرض‬ ‫آن 0 اسست بسه ايسن معنسا کسه برنامسه بدون خطسا پايان گرفته‬ ‫است.‬ ‫با استفاده از دستور ‪ return‬مي‌توانيم برنامه را به طور‬ ‫غيرمعمول خاتمه دهيم.‬
  • 226. ‫مثال‌ 581- اسستفاده‌ از دستور ‪ return‬براي‌ پايان دادن به‌ يك‌‬ ‫برنامه‌‬ ‫)(‪int main‬‬ ‫دستور ‪ input return‬را خاتمه مي‌دهد‬ ‫:‪integers‬تابع فعلي‪{ // prints the quotient of two‬‬ ‫و کنترل را بسه فراخواننده بازمي‌گرداند. به‬ ‫;‪int n, d‬‬ ‫همين دليل است که اجراي دستور ‪return‬‬ ‫در تابسسع ‪ integers: "; ()main‬خاتمه ‪cout << "Enter‬‬ ‫کل برنامسسه را ‪two‬‬ ‫مي‌دهد.‬ ‫;‪cin >> n >> d‬‬ ‫;0 ‪if (d = = 0) return‬‬ ‫;‪cout << n << "/" << d << " = " << n/d << endl‬‬ ‫71 99 :‪} Enter two integers‬‬ ‫5 = 71/99‬
  • 227. ‫چهار روش وجود دارد کسسه بتوانيسسم برنامسسه را بسسه شکل‬ ‫غيرمعمول )يعنسي قبسل از ايسن کسه اجرا بسه پايان بلوک اصلي‬ ‫برسد( خاتمه دهيم:‬ ‫1 - استفاده‌ از دستور ‪return‬‬ ‫ايسسن تابسسع در سرفايل‬ ‫2 - فراخواني‌ تابع‌ ‪()exit‬‬ ‫>‪ <cstdlib‬تعريف شده‬ ‫اسسست. تابع ‪ ()exit‬براي‬ ‫خاتمسه دادن بسه کسل برنامه‬ ‫3 - فراخواني‌ تابع‌ ‪()abort‬‬ ‫در هسر تابعسي غيسر از تابع‬ ‫‪ ()main‬مفيد است.‬ ‫4 – ايجاد يک حالت استثنا‬
  • 228. ‌‫)( براي‌ پايان‌ دادن به برنامه‬exit ‌‫مثال‌ 591- استفاده‌ از تابع‬ #include <cstdlib> // defines the exit() function #include <iostream> // defines thi cin and cout objects using namespace std; double reciprocal(double x); 0 ‫در ايسن برنامس ۀاسسسگر كاربر عدد‬ int main() ‫تابع‬ ،‫کنسسسسسسد‬ ‫وارد‬ ‫را‬ { double x; ‫)( خاتمسه مي‌يابد و‬reciprocal cin >> x; ‫برنامه بدون هيچ مقدار چاپي به‬ cout << reciprocal(x); ‫پايان مي‌رسد‬ } double reciprocal(double x)1 – Exception { // returns the reciprocal of x: if (x = = 0) exit(1); // terminate the program return 1.0/x; }
  • 229. ‫‌آرگومان‌هاي‌ پيش‌فرض -51‬ ‫در ‪ ++C‬مي‌توان تعداد آرگومان‌هاي يسک تابع را در زمان‬ ‫اجرا به دلخواه تغيير داد.‬ ‫ايسسن امسسر بسسا اسسستفاده از آرگومان‌هاي اختياري و مقادير‬ ‫پيش‌فرض امکان‌پذير است.‬ ‫براي اين که به يک پارامتر مقدار پيش‌فرض بدهيم بايد آن مقدار را‬ ‫در فهرسست پارامترهاي تابسع و جلوي پارامتسر مربوطسه به همراه‬ ‫علمت مساوي درج کنيم. به اين ترتيب اگر هنگام فراخواني تابع، آن‬ ‫آرگومان را ذکر نکنيم، مقدار پيش‌فرض آن در محاسبات تابع استفاده‬ ‫مي‌شود . به هميسن خاطسر بسه ايسن گونسه آرگومان‌ها، آرگومان اختياري‬ ‫مي‌گويند.‬
  • 230. double p(double, double, double=0, double=0, double=0); ‌‫مثال‌ 502- آرگومان‌هاي ‌پيش‌فرض‬ int main() ‫برنام ۀزسسسير حاصل چند جمله‌اي درجه سوم را پيدا مي‌کند. براي‬ { // tests the p() function: ‫محاسب ۀاسسسين مقدار از الگوريتم هورنر استفاده شده . به اين شکل‬ double x = 2.0003;0 + (a1 + (a2 + a3 x) x) x a ‫که براي کارايي بيشتر، محاسبه به صورت‬ 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: p(x,7) = 7 p(x,7,6) = 19.0018 return a0 + (a1 + (a2 + a3*x)*x)*x; p(x,7,6,5) = 39.00781 – Default } p(x,7,6,5,4) = 71.0222
  • 231. ‫دقست کنيسد کسه پارامترهايسي کسه مقدار پيش‌فرض دارنسد بايسد در فهرست‬ ‫پارامترهاي تابع بعد از هم ۀپسسسارامترهاي اجباري قيد شوند مثل:‬ ‫;)3=‪void f( int a, int b, int c=4, int d=7, int e‬‬ ‫‪// OK‬‬ ‫;)3=‪void g(int a, int b=2, int c=4, int d, int e‬‬ ‫‪// ERROR‬‬ ‫همچنين هنگام فراخواني تابع، آرگومان‌هاي ذکر شده به ترتيب از چپ‬ ‫به راست تخصيص مي‌يابند و پارامترهاي بعدي با مقدار پيش‌فرض پر‬ ‫مي‌شوند.‬ ‫مثل در تابسع ‪ ()p‬که در بال قيسد شسد، فراخوانسي 6,7,0.8(‪ (p‬باعث‬ ‫مي‌شود که پارامتر ‪ x‬مقدار 0.8 را بگيرد سپس پارامتر 0‪ a‬مقدار 7‬ ‫را بگيرد و سسپس پارامتر 1‪ a‬مقدار 6 را بگيرد. پارامترهاي 2‪ a‬و‬ ‫3‪ a‬مقدار پيش‌فرض‌شان را خواهند داشت. اين ترتيب را نمي‌توانيم به‬ ‫هم بزنيم. مثل نمي‌توانيم تابع را طوري فرا بخوانيم که پارامترهاي ‪x‬‬ ‫و 0‪ a‬و 3‪ a‬مسستقيما مقدار بگيرند ولي پارامترهاي 1‪ a‬و 2‪ a‬مقدار‬ ‫پيش‌فرض‌شان را داشته باشند.‬
  • 232. ‫پايان جلسه پنجم‬
  • 233. ‫جلسه ششم‬ ‫»آرايه‌ها«‬
  • 234. ‫:آنچه در اين جلسه مي خوانيد‬ ‫1- پردازش‌ آرايه‌ها‬ ‫2- مقداردهي آرايه‌ها‌‬ ‫3- ايندكس بيرون از حدود آرايه‌‬ ‫4- ارسال آرايه به تابع‬ ‫5- الگوريتم جستجوي خطي‬ ‫›››‬ ‫6- مرتب‌سازي حبابي‬ ‫7- الگوريتم جستجوي دودويي‬
  • 235. ‫8- استفاده از انواع شمارشي در آرايه‬ ‫9- تعريف‌ انواع‌‬ ‫01 -آرايه‌هاي چند بعدي‬
  • 236. ‫هدف کلي: هسسدسسف س‌سسهاسيس رسفسستاسرسيس:‬ ‫انتظار مي‌رود پس از پايان اين جلسه بتوانيد:‬ ‫شناخت و معرفي آرايه‌ها و مزيت و طريق ۀ‬ ‫- علت استفاده از آرايه‌ها‌کارگيري وآ بتوانيد آن‌ها را در برنامه‌ها‬ ‫به را بدانيد ن‌ها‬ ‫به کار ببريد.‬ ‫- آرايه‌هاي »يک‌بعدي« و »چندبعدي« را تعريف کنيد.‬ ‫- مفهوم »ايندک س« را بداني د و خطاي »اث ر همسايگي« را‬ ‫تعريف و شناسايي کنيد.‬ ‫- طريقۀ ارسال آرايه به توابع را بدانيد.‬ ‫- »جستجوي خطي« و »جستجوي دودويي« را به اختصار شرح‬ ‫دهيد.‬ ‫- »مرتب‌سازي حبابي« را به اختصار شرح دهيد.‬
  • 237. ‫مقدمه:‬ ‫در برنامه‌هايي که داده‌هاي فراواني را پردازش‬ ‫مي‌کنن د اس تفاده از متغيرهاي معمولي کار‬ ‫عاقلنه‌اي نيست زيرا در بسياري از اين برنامه‌ها‬ ‫»پردازش دسته‌اي مي‌توان مي‌گيرد به اين معني‬ ‫آرايه را « صورت متغيري‬ ‫که مجموعه‌اي کرد داده يک مرتب داردا هم در‬ ‫تص ور از ک ه ‌هاي نام ط ب‬ ‫حافظه قرار داده مي‌شود و را به از پردازش، کل‬ ‫ولي چندين مقدار پس طور‬ ‫اين مجموعه از حافظه خارجيي‌شود و مجموعۀ‬ ‫هم‌زمان نگهداري م م ‌نمايد.‬ ‫بعدي در حافظه بارگذاري مي‌شود. اگر قرار باشد‬ ‫براي اين کار از متغيرهاي معمولي استفاده شود‬ ‫بيشتر وقت برنامه‌نويس صرف پر و خالي کردن‬
  • 238. ‫يک آرايه، يك زنجيره از متغيرهايي است كه همه‬ ‫از يك نوع هستند.‬ ‫به اين متغيرها »اعضاي آرايه« مي‌گويند.‬ ‫هر عضو آرايه با يک شماره مشخص مي‌شود‬ ‫که ب ه اي ن شماره »ايندک س « يا »زيرنويس«‬ ‫مي‌گويند‬ ‫عناص ر ي ک آراي ه در خانه‌هاي پش ت س ر هم در‬ ‫حافظ ه ذخيره مي‌شوند . به اي ن ترتي ب آرايه را‬ ‫مي‌توان بخش ي از حافظ ه تص ور کرد ک ه اين‬ ‫بخش خود به قسمت‌هاي مساوي تقسيم شده و‬ ‫هر قسمت به يک عنصر تعلق دارد.‬
  • 239. ‫شکل مقابل آرايۀ ‪ a‬که پنج عنصر دارد را نشان مي‌دهد.‬ ‫عنص ر 0[‪ [a‬حاوي مقدار 5.71 و عنصر 1[‪ [a‬حاوي 0.91 و‬ ‫عنصر 4[‪ [a‬حاوي مقدار 0.81 است.‬ ‫0‬ ‫05.71‬ ‫1‬ ‫00.91‬ ‫2‬ ‫57.61‬ ‫3‬ ‫00.51‬ ‫4‬ ‫00.81‬
  • 240. ‫پردازش‌ آرايه‌ها -2‬ ‫مثال 61- دستيابي مستقيم به عناصر آرايه‬ ‫برنام ۀسسسساد ۀزسسسير يک آراي ۀسسسسه عنصري را تعريف مي‌کند و سپس مقاديري‬ ‫مسثلسس ‌کند:‬ ‫را آسرساسيسه ‌سسسسسهاس و سرانجام اين‌ستوساسنسسرا چاپ مي مستغسسيرسهسساسيس‬ ‫در آن قرار داده رساس مسيسس مقادير‬ ‫)(‪int main‬‬ ‫مسعسسمسسوسلسسيسس تسعسسرسيسسفس وس اسسسسستفسساسدسهسس کسرسدس. بساس‬ ‫;]3[‪{ int a‬‬ ‫اسيسنسس تسفسساسوستس کسسهس آسرساسيسهس يسکس مستغسسيسرس;55 = ]2[‪a‬س‬ ‫مسرسکسب‬ ‫اسسسست س وس بسرساسيس دسسسستياسبسيسس بسهس ه سسرس يسکس ]0[‪a‬‬ ‫س س ;11 = اسزس‬ ‫;33 = ]1[‪a‬‬ ‫خسساسنسهس‌سسهاسيس آسنسس ;‪ << endl‬اسيسندسکسسسس اسسس<<س ‪cout‬س‬ ‫بساسيسدس اسزس ]0[‪ "a[0] = " << a‬ستف ساسدسهس‬ ‫;‪cout << "a[1] = " << a[1] << andl‬‬ ‫نسمسوسدس. ]0[‪a‬‬ ‫س 11 =‬ ‫;‪cout << "a[2] = " << a[2] << endl‬‬ ‫33 = ]1[‪a‬‬ ‫}‬ ‫55 = ]2[‪a‬‬
  • 241. ‫نحو کلي براي اعلن آرايه به شکل زير است:‬ ‫;]‪type array_name[array_size‬‬ ‫عبارت ‪ type‬نوع عناصسسر آرايسسه را مشخص‬ ‫مي‌کند. ‪ array_name‬نام آرايه است .‬ ‫‪ array_size‬تعداد عناصسسر آرايه را نشان‬ ‫مي‌دهد. اين مقدار بايد يک عدد ثابت صحيح باشد‬ ‫و حتما بايد داخل کروشه ][ قرار بگيرد.‬
  • 242. ‫3- مقداردهي آرايه‌ها‬ ‫در ‪ ++C‬مي‌توانيم يک آرايه را با استفاده از فهرست مقداردهي، اعلن و‬ ‫مقدارگذاري کنيم:‬ ‫;}6.66,4.44,2.22{ = ][‪float a‬‬ ‫به اين ترتيب مقادير داخل فهرست به همان ترتيبي که‬ ‫چيده شده‌ان د درون عناص ر آرايه قرار مي‌گيرند. اندازه‬ ‫آرايه نيز برابر با تعداد عناصر موجود در فهرست خواهد‬ ‫بود.‬ ‫پس همين خط مختصر، آرايه‌اي از نوع ‪ float‬و با ‪a‬نام ‪ a‬و‬ ‫با تعداد سسه عنصسر اعلن کرده و هسر سسه عنصسر را 0 با‬ ‫2.22‬ ‫4.44 1‬ ‫مقدارهاي درون فهرست، مقداردهي مي‌کند.‬ ‫6.66 2‬
  • 243. ‫مثال‌ 3-6 مقداردهي آرايه با استفاده از فهرست مقداردهي‬ ‫برنام ۀزسسسير، آراي ۀ ‪ a‬را مقداردهي کرده و سپس مقدار هر عنصر را چاپ مي‌كند:‬ ‫)(‪int main‬‬ ‫;} 6.66 ,4.44 ,2.22 { = ][‪{ float a‬‬ ‫;)‪int size = sizeof(a)/sizeof(float‬‬ ‫)++‪for (int i=0; i<size; i‬‬ ‫;‪cout << "ta[" << i << "] = " << a[i] << endl‬‬ ‫}‬ ‫2.22 = ]0[‪a‬‬ ‫4.44 = ]1[‪a‬‬ ‫6.66 = ]2[‪a‬‬
  • 244. ‫هنگام استفاده از فهرست مقداردهي براي اعلن آرايه،‬ ‫مي‌توانيم تعداد عناصر آرايه را هم به طور صريح ذکر‬ ‫کنيم. در ايسن صسورت اگسر تعداد عناصسر ذکر شده از‬ ‫تعداد عناصسسر موجود در فهرسسست مقداردهسسي بيشتر‬ ‫باشد، خانه‌هاي بعدي با مقدار صفر پر مي‌شوند:‬ ‫;} 7.77 ,6.66 ,5.55 { = ]7[‪float a‬‬ ‫‪a‬‬ ‫5.55 0‬ ‫دق ت کني د ک ه تعداد مقادير موجود در‬ ‫فهرست مقداردهي نبايد از تعداد عناصر‬ ‫6.66 1‬ ‫7.77 2‬ ‫3‬ ‫0.0‬ ‫آرايه بيشتر باشد:‬ ‫4‬ ‫0.0‬ ‫!‪float a[3] = { 22.2, 44.4, 66.6, 88.8 }; // ERROR: too many values‬‬ ‫5‬ ‫0.0‬ ‫6‬ ‫0.0‬
  • 245. ‫يك‌ آرايه‌ را مي‌تواني م ب ه طور کام ل ب ا ص فر مقداردهي‬ ‫اوليه کنيم. براي مثال سه اعلن زير با هم برابرند:‬ ‫;} 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 { = ] [‪float a‬‬ ‫;} 0 ,0 { = ]9[‪float a‬‬ ‫;} 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 { = ]9[‪float a‬‬ ‫اما مطلب فوق اصل به اين معني نيست که از فهرست‬ ‫مقداردهي استفاده نشود.‬ ‫درست مثل يک متغير معمولي، اگر يک آرايه مقداردهي‬ ‫اوليه نشود، عناصر آن حاوي مقادير زباله خواهد بود.‬
  • 246. ‫مثال‌ 65- يك آراي ۀمسسسقداردهي نشده‬ ‫ را اعلن مي‌کنسد ولسي مقداردهسي نمي‌كند. با‬a ‌ ‌ ‫برنامس ۀ آراي‌سسسس ۀ‬ ،‫زسسسيسر‬ :‫وجود اين، مقادير موجود در آن را چاپ مي‌كند‬ int main() { const int SIZE=4; // defines the size N for 4 elements float a[SIZE]; // declares the array's elements as float for (int i=0; i<SIZE; i++) cout << "ta[" << i << "] = " << a[i] << endl; } a[0] = 6.01838e-39 a[1] = 9.36651e-39 a[2] = 6.00363e-39 a[3] = 0
  • 247. ‫آرايه ‌ها را ميتوان ب ا اس تفاده از عملگ ر جايگزيني‬ ‫‌‬ ‫مقدارده ي کرد ام ا نميتوان مقدار آن ‌ها را به‬ ‫‌‬ ‫:يکديگر تخصيص داد‬ ‫;} 6.66 ,4.44 ,2.22 { = ]7[‪float a‬‬ ‫;} 7.77 ,5.55 ,3.33 { = ]7[‪float b‬‬ ‫!‪b = a; // ERROR: arrays cannot be assigned‬‬ ‫‌‬ ‫همچنين ‌ نميتوانيم ‌ يك ‌ آرايه را به طور مستقيم براي‬ ‫‌‬ ‫مقداردهي به آرايۀ ديگر استفاده كنيم:‬ ‫‌‬ ‫;} 6.66 ,4.44 ,2.22 { = ]7[‪float a‬‬ ‫!‪float b[7] = a; // ERROR: arrays cannot be used as nitializers‬‬
  • 248. ‫‌‬ ‫4- ايندكس بيرون از حدود آرايه‬ ‫در بعض ي از زبان‌هاي برنامه‌نويس ي‌، ايندکس‬ ‫آرايه نمي‌تواند از محدودۀ تعريف شده براي آن‬ ‫بيشتر باشد. براي مثال در پاسکال اگر آرايۀ ‪ a‬با‬ ‫تعداد پنج عنصر تعريف شده باشد و آنگاه 7[‪[a‬‬ ‫دستيابي شود، برنامه از کار مي‌افتد . اين سيستم‬ ‫حفاظتي در ‪ ++C‬وجود ندارد . مثال بعدي نشان‬ ‫مي‌ده د ک ه ايندک س ي ک آراي ه هنگام دستيابي‬ ‫مي‌توان د بيشت ر از عناص ر تعري ف شده براي آن‬ ‫باشد و باز هم بدون اين که خطايي گرفته شود،‬ ‫برنامه ادامه يابد.‬
  • 249. ‫مثا ل ‌ 66- تجاوز ايند کس آرا يه از محدودۀ تعريف شده‬ ‫براي آن‬ ‫برنام ۀ زي ر ي ک خطاي زمان اجرا دارد؛ به بخش ي از حافظه‬ ‫دستيابي مي‌کند که از محدودۀ آرايه بيرون است:‬ ‫)(‪in main‬‬ ‫;4=‪{ const int SIZE‬‬ ‫;} 6.66 آرايه‌اي که در اين برنامه تعريف شده، چهار‬ ‫,5.55 ,4.44 ,3.33 { = }‪float a[SIZE‬‬ ‫3.33 = ]0[‪ a‬عنص ر دارد ول ي تلش مي‌شود ب ه هفت‬ ‫4.44 = ]1[‪for (int i=0; i<7; i++) //ERROR: index is outa‬‬ ‫!‪of bounds‬‬ ‫عنصر دستيابي شود . سه مقدار آخر واقعا‬ ‫5.55 = ]2[‪a‬‬ ‫6.66 = ;‪endl‬جزو آراي ه" = ]" تند ‪ "ta[" << i‬سلول‌هايي از‬ ‫]3[‪ << a[i] << a‬نيس << و فق ط << ‪cout‬‬ ‫54-‪ a[4] = 5.60519e‬حافظه‌ان د ک ه دقيق ا بع د از عنصر چهارم‬ ‫}‬ ‫93-‪a[5] = 6.01888e‬‬ ‫93-‪ a[6] = 6.01889e‬آراي ه قرار گرفته‌اند. اي ن سلول‌ها داراي‬
  • 250. ‫ي‬‫* مثال‌ 67- اثر همسايگ‬ ‫برنامۀ زير از ايندکس خارج از محدوده استفاده مي‌کند و اين باعث مي‌شود که‬ ‫مقدار يک متغير به طور ناخواسته تغيير کند:‬ ‫)(‪int main‬‬ ‫;4=‪{ const int SIZE‬‬ ‫;} 6.66 ,4.44 ,2.22 { = ][‪float a‬‬ ‫;1.11=‪float x‬‬ ‫;‪cout << "x = " << x << endl‬‬ ‫!‪a[3] = 88.8; // ERROR: index is out of bounds‬‬ ‫;‪cout << "x = " << x << endl‬‬ ‫}‬ ‫8.88 = ‪x‬‬
  • 251. ‫متغي ر ‪ x‬بع د از آراي ۀ ‪ a‬اعلن‌ شده، پ س ي ک سلول‬ ‫چهاربايت ي بلفاص له بع د از دوازده باي ت آراي ه ب ه آن‬ ‫تخص يص مي‌يابد. بنابراي ن وقت ي برنام ه تلش مي‌کند‬ ‫مقدار 8.88 را در 3[‪ [a‬قرار دهد )که جزو آرايه نيست(‬ ‫اين مقدار به شکل ناخواسته در ‪ x‬قرار مي‌گيرد. شکل‬ ‫مقاب مثال بعديمي‌ده ديگري ازاي ن اتفاق در حافظه رخ‬ ‫ل نشان نوع د چطور خطاي زمان اجرا را‬ ‫اي خط يک ي : وقتي ايندکس‬ ‫مين نشانا مي‌دهد از وحشت‌ناک‌ترينآرايه بيش از ‪a‬حد‬ ‫‌دهد.‬ ‫2.22‬ ‫0‬ ‫خطاهاي زمان اجراس .بزرگ ممکن‬ ‫ت زيرا باشد‬ ‫2.22‬ ‫4.44‬ ‫1‬ ‫اس ت اص ل نتواني م منب ع خط ا را کشف‬ ‫4.44‬ ‫6.66‬ ‫2‬ ‫کنيم. حت ي ممک ن اس ت ب ه اين روش‬ ‫6.66‬ ‫داده‌هاي برنامه‌هاي ديگري که در حال‬ ‫8.88‪x‬‬ ‫8.88‬ ‫کارن د را خراب کني م و اي ن باعث ايجاد‬ ‫اختلل در کل سيستم شود. به اين خطا‬ ‫»اثر همسايگي « مي‌گويند. اين وظيفۀ‬ ‫برنامه‌نوي س اس ت ک ه تضمي ن کند‬
  • 252. ‫مثال‌ 68- ايجاد استثناي مديريت نشده‬ :‫برنام ۀزسسسير از كار مي‌افتد زيرا ايندكس آرايه خيلي بزرگ است‬ int main() { const int SIZE=4; float a[] = { 22.2, 44.4, 66.6 }; float x=11.1; cout << "x = " << x << endl; a[3333] =88.8;//ERROR: index is out of bounds! cout << "x = " << x << endl; }
  • 253. ‫وقت ي اي ن برنام ه روي رايانه‌اي ب ا س يستم عامل‬ ‫ويندوز اجرا شود، يک صفحۀ هشدار که در شکل‬ ‫نشان داده شده روي صفحه ظاهر مي‌شود.‬ ‫اي ن پنجره بيان مي‌کن د ک ه برنام ه تلش دارد به‬ ‫نشان ي ‪ 0040108e‬از حافظ ه دس تيابي کند. اين‬ ‫مکان خارج از حافظۀ تخصيصي است که براي اين‬ ‫برنامه منظور شده، بنابراين سيستم عامل برنامه‬
  • 254. ‫پردازش‌گر استثنا‬ ‫خطايي که در مثال 68- بيان شده يک »استثناي‬ ‫مديريت نشده« ناميده مي‌شود زيرا کدي وجود‬ ‫ندارد که به اين استثنا پاسخ دهد.‬ ‫در ‪ ++C‬مي‌توانيم کدهايي به برنامه اضافه کنيم‬ ‫که هنگام رخ دادن حالت‌هاي اس تثنا، از توقف‬ ‫برنام ه جلوگيري کند . به اي ن کده ا »پردازش‌گر‬ ‫استثنا« مي‌گويند.‬
  • 255. ‫ارسال آرايه به تابع‌ -5‬ ‫كد ‪ ;[]float a‬كه آرايه ‪ a‬را اعلن مي‌كند دو چيز را به‬ ‫كامپايلر مي‌گويد:‬ ‫1- اين که نام آرايه ‪ a‬است‬ ‫2- عناصر آرايه از نوع ‪ float‬هستند.‬ ‫سمبل ‪ a‬نشان ي حافظ ۀ آرايه را ذخيره مي‌کند . لزم‬ ‫نيس ت تعداد عناص ر آراي ه ب ه کامپايل ر گفته شود زيرا از‬ ‫روي نشان ي موجود در ‪ a‬مي‌توان عناص ر را بازيابي‬ ‫نمود . به همي ن طري ق مي‌توان ي ک آراي ه را ب ه تابع‬ ‫ارسال کرد. يعني فقط نوع آرايه و نشاني حافظۀ آن به‬ ‫عنوان پارامتر به تابع فرستاده مي‌شود.‬
  • 256. ‫مثا ل ‌ 69- ارس ال آراي ه ب ه تابع ي ك ه مجموع عناصر‬ ‫آرايه را برم ي ‌گرداند‬ ‫;)‪int sum(int[],int‬‬ ‫)(‪int main‬‬ ‫;} 77 ,55 ,33 ,11 { = ][‪{ int a‬‬ ‫;)‪int size = sizeof(a)/sizeof(int‬‬ ‫};‪cout << "sum(a,size) = " << sum(a,size) << endl‬‬ ‫فهرست پارامتر تابع فوق به شکل ),][‪int a‬‬ ‫)‪int sum(int a[], int n‬‬ ‫‪ (int n‬است‌ به اين معنا که اين تابع يک آرايه‬ ‫از نوع ‪ int‬و ي ک متغي ر از نوع ‪ int‬دريافت‬ ‫;0=‪{ int sum‬‬ ‫مي‌کند.‬ ‫)++‪for (int i=0; i<n; i‬‬ ‫ب ه اعلن اي ن تاب ع در بالي تابع‬ ‫;]‪sum += a[i‬‬ ‫‪ ()main‬نگاه کنيد. نام پارامترها‬ ‫;‪return sum‬‬ ‫حذف شده است.‬
  • 257. ‫هنگام فراخواني تابع نيز از عبارت ‪(sum(a,size‬‬ ‫اس تفاده شده ک ه فق ط نام آراي ه ب ه تاب ع ارسال‬ ‫شده.‬ ‫نام آراي ه در حقيق ت نشان ي اولي ن عنص ر آراي ه است‬ ‫)يعني 0[‪([a‬‬ ‫تابع از اين نشاني براي دستيابي به عناصر آرايه‬ ‫استفاده مي‌کند. همچنين تابع مي‌تواند با استفاده‬ ‫از پس ارسال محتوياتتابع شبيه ارسالدست‌کاري‬ ‫اين نشاني، آرايه به عناصر آرايه را متغير‬ ‫کند.به طريق ارجاع است. به مثال بعدي دقت‬ ‫.کنيد‬
  • 258. ‫مثا ل ‌ 601- توا بع ورودي و خرو جي براي يک آرا يه‬ ‫)( ا ستفاده م ي ‌شود تا‬read ‫در اي ن برنام ه از تاب ع‬ ‫مقاديري به داخل آرايه وارد شود. سپس با استفاده‬ :‫)( مقادير داخل آرايه چاپ م ي ‌شوند‬print ‫از تابع‬ void read(int[],int&;) Enter integers. Terminate with 0: void print(int[],int); a[0]: 11 a[1]: 22 int main() a[2]: 33 { const int MAXSIZE=100; a[3]: 44 a[4]: 0 int a[MAXSIZE]={0}, size; The array has 4 elements: 11 22 33 44 read(a,size); cout << "The array has " << size << " elements: "; print(a,size);
  • 259. void read(int a[], int& n) { cout << "Enter integers. Terminate with 0:n"; n = 0; do { cout << "a[" << n << "]: "; cin >> a[n]; { while (a[n++] !=0 && n < MAXSIZE); --n; // don't count the 0 }
  • 260. ‫)‪void print(int a[], int n‬‬ ‫)++‪{ for (int i=0; i<n; i‬‬ ‫;" " << ]‪cout << a[i‬‬ ‫}‬ ‫چون ‪ n‬يك متغي ر اس ت، براي اي ن ک ه تابع ‪()read‬‬ ‫بتواند مقدار آن را تغيير دهد اين متغير بايد به شکل‬ ‫ارجاع ارسال شود.‬ ‫همچنين براي اين که تابع مذکور بتواند مقادير داخل‬ ‫آرايه ‪ a‬را تغيير دهد، آرايه نيز بايد به طريق ارجاع‬ ‫ارسال شود، اما ارجاع آرايه‌ها کمي متفاوت است.‬
  • 261. ‫در ‪ ++C‬توا بع قادر ني ستند تعداد عنا صر آرا يۀ ارسالي‬ ‫را تشخ يص دهند. بنابرا ين به منظور ار سال آراي ه ‌ ها به‬ ‫تابع از سه مشخصه استفاده م ي ‌شود:‬ ‫1 – آدرس اولي ن خانۀ‬ ‫آرايه‬ ‫2 – تعداد عناصر آرايه‬ ‫3 – نوع عناصر آرايه‬ ‫تابع با استفاده از اين سه عنصر مي‌تواند به تک‬ ‫تک اعضاي آرايه دستيابي کند.‬
  • 262. ‫آدرس اولين خانۀ آرايه، همان نام آرايه است.‬ ‫پس وقت ي نام آراي ه را ب ه تاب ع بفرستيم آدرس‬ ‫اولين خانه را به تابع فرستاده‌ايم.‬ ‫نوع آرايه نيز در تعريف تابع اعلن مي‌شود.‬ ‫بنابراين با اين دو مقدار، تابع مي‌تواند به آرايه‬ ‫دسترسي داشته باشد.‬
  • 263. ‫مثا ل ‌ 11-6 آدرس اولين خانۀ آرايه و مقدار درون‬ ‫آن‬ ‫برنامۀ زير، آدرس ذخيره شده در نام آرايه و مقدار موجود در آن خانه را‬ ‫چاپ مي‌کند:‬ ‫)(‪int main‬‬ ‫‪a = 0x0064fdec‬‬ ‫22 = ]0[‪a‬‬ ‫;} 88 ,66 ,44 ,22 { = ][‪{ int a‬‬ ‫]0[‪cout << "a = " << a << endl; // the address of a‬‬ ‫;]0[‪cout << "a[0] = " << a‬‬ ‫]0[‪// the value of a‬‬ ‫}‬ ‫اي ن برنام ه تلش مي‌کن د ک ه ب ه طور مستقيم مقدار ‪ a‬را چاپ‬ ‫کند. نتيجۀ چاپ ‪ a‬اين است که يک آدرس به شکل شانزده دهي‬ ‫چاپ مي‌شود. اين همان آدرس اولين خانۀ آرايه است. يعني‬ ‫درون نام ‪ a‬آدرس اولي ن عنصر آراي ه قرار گرفته. خروج ي نيز‬ ‫نشان مي‌ده د ک ه ‪ a‬آدرس اولي ن عنصر را دارد و 0[‪ [a‬مقدار‬
  • 264. ‫6- الگوريتم جستجوي خطي‬ ‫آرايه‌ها بيشتر براي پردازش يک زنجيره از داده‌ها‬ ‫به کار مي‌روند.‬ ‫اغلب لزم است که بررسي شود آيا يک مقدار‬ ‫خاص درون ي ک آراي ه موجود اس ت يا خير .‬ ‫ساده‌ترين راه اين است که از اولين عنصر آرايه‬ ‫شروع کني م و يک ي يک ي هم ۀ عناص ر آرايه را‬ ‫جستجو نماييم تا بفهميم که مقدار مورد نظر در‬ ‫کدام عنصر قرار گرفته . به اين روش »جستجوي‬ ‫خطي« مي‌گويند.‬
  • 265. ‫مثا ل ‌ 621- جستجوي خطي‬ ‫برنام ۀ زي ر تابع ي را آزماي ش مي‌کن د که در اي ن تاب ع از روش جستجوي‬ :‫خطي براي يافتن يک مقدار خاص استفاده شده‬ int index(int,int[],int); int main() { int a[] = { 22, 44, 66, 88, 44, 66, 55}; cout << "index(44,a,7) = " << index(44,a,7) << endl; cout << "index(50,a,7) = " << index(50,a,7) << endl; } int index(int x, int a[], int n) { for (int i=0; i<n; i++) if (a[i] == x) return i; return n; // x not found index(44,a,7) = 1 } index(40,a,7) = 7
  • 266. ‫تابع ‪ ()index‬سه پارامتر دارد:‬ ‫2. پارامتر ‪ x‬مقداري است که قرار است جستجو شود،‬ ‫3. پارامتر ‪ a‬آرايه‌اي است که بايد در آن جستجو صورت‬ ‫گيرد‬ ‫4. و پارامتر ‪ n‬هم ايندکس عنصري است که مقدار مورد‬ ‫نظر در آن پيدا شده است.‬ ‫در اي ن تاب ع ب ا اس تفاده از حلق ۀ ‪ for‬عناص ر آرايه ‪a‬‬ ‫پيماي ش شده و مقدار ه ر عنص ر ب ا ‪ x‬مقايسه‬ ‫مي‌شود. اگر اين مقدار با ‪ x‬برابر باش د، ايندکس آن‬ ‫عنصر بازگردانده شده و تابع خاتمه مي‌يابد.‬
  • 267. ‫اگسر مقدار ‪ x‬در هيسچ يسک از عناصسر آرايه موجود‬ ‫نباشسسد، مقداري خارج از ايندکسسس آرايه بازگردانده‬ ‫مي‌شود کسه بسه ايسن معناسست کسه مقدار ‪ x‬در آراي ۀ ‪a‬‬ ‫موجود نيست.‬ ‫در اولين اجراي آزمايشي، مشخص شده که مقدار 44‬ ‫در 1[‪ [a‬واقسسع اسسست و در اجراي آزمايشي دوم‬ ‫مشخسص شده کسه مقدار 04 در آراي ۀ ‪ a‬موجود نيست‬ ‫)يعنسي مقدار 44 در 7[‪ [a‬واقع اسست و از آن‌سجا که‬ ‫آرايس ۀ ‪ a‬فقسط تسا 6[‪ [a‬عنصر دارد، مقدار 7 نشان‬ ‫مي‌دهد که 04 در آرايه موجود نيست(.‬
  • 268. ‫مرتبسازي حبابي -7‬ ‫‌‬ ‫»مرتب‌ سازي حباب ي « يک ي از ساده‌ترين الگوريتم‌هاي‬ ‫مرتب‌سازي است.‬ ‫دسرس اسيسسن س رسوسشسس، آسرساسيسسهس چسسندسسيسسن س مسرستسبهس‬ ‫پسوسيسسسشسس مسيسس‌سسشوسدس وس دسرس هسسسسرس مسرستسبهس‬ ‫بسزسرسگس‌سترسيسن س عسنصسسرس مسوسجسسوسدس بسهس سسسمسستس بساسلس‬ ‫هسسدسساسيسسستس مسيسس‌سسشوسدس وس سسسپسسس مسحسدسسوسدس ۀ‬ ‫مسرستسبس‌سسسسساسزسيس بسرساسيس مسرستسبسس ۀ بسسسسعسسدسسيس يسکسيسس‬ ‫کساسسسستهس مسيسس‌سسشوسدس.‬ ‫دسرس پساسيساسن س هسسمسس ۀپسسسسوسيسشسس‌سسسهاس، آسرساسيسهس مسرستسبس‬
  • 269. ‫طريقۀ يافتن بزرگ‌ترين عنصر و انتقال آن به بالي عناصر ديگر به اين شکل‬ ‫است‬ ‫2.اولين عنصر آرايه با عنصر دوم مقايسه مي‌شود.‬ ‫3. اگر عنصر اول بزرگ‌تر بود، جاي اين دو با هم عوض مي‌شود.‬ ‫4. سپس عنصر دوم با عنصر سوم مقايسه مي‌شود.‬ ‫5. اگر عنصر دوم بزرگ‌تر بود، جاي اين دو با هم عوض مي‌شود‬ ‫وس بسهس هسسمسيسن س تسرستسيسبس مسقسساسيسسسسهس وس جسساسبسجساسيسيسس زسوسج‌سسهاسيس هسسمسسسساسيسهس اسدساسمسهس‬ ‫مسيسس‌سياسبسدس تسساس وسقسستسيسس بسسهس اسنستهاسيس آسرساسيسهس رسسسسيدسسيسمسس، بسزسرسگس‌سترسيسن س عسضسوس‬ ‫آسرساسيسهس دسرس خسساسنس ۀاسسسسنستهاسيسيسس قسسرساسرس خسسوساسهسسدس گسرسفسستس.‬ ‫در اين حالت محدودۀ جستجو يکي کاسته مي‌شود‬ ‫و دوباره زوج‌هاي کناري يک ي يک ي مقايس ه مي‌شون د تا عدد‬ ‫بزرگ ‌تر بعدي به مکان بالي محدوده منتقل شود. اين پويش‬
  • 270. ‫مثا ل ‌ 631- مرت ب ‌سازي‬ ‫برنام ۀ زي ر تابع ي را آزماي ش مي‌کن د ک ه اي ن تاب ع ب ا استفاده از‬ ‫مرتب‌سازي حبابي يک آرايه را مرتب مي‌نمايد:‬ ‫;)‪void print(float[],int‬‬ ‫;)‪void sort(float[],int‬‬ ‫)(‪int main‬‬ ‫;}7.77 ,3.33,8.88,4.44,6.66,9.99,2.22,5.55{=][‪{float a‬‬ ‫;)8,‪print(a‬‬ ‫;)8,‪sort(a‬‬ ‫;)8,‪print(a‬‬ ‫}‬ ‫7.77 ,3.33 ,8.88 ,4.44 ,6.66 ,9.99 ,2.22 ,5.55‬ ‫9.99 ,8.88 ,7.77 ,6.66 ,5.55 ,4.44 ,3.33 ,2.22‬
  • 271. void sort(float a[], int n) { // bubble sort: for (int i=1; i<n; i++) // bubble up max{a[0..n-i]}: for (int j=0; j<n-i; j++) if (a[j] > a[j+1]) swap (a[j],a[j+1]); //INVARIANT: a[n-1-i..n-1] is sorted }
  • 272. ‫تابع ‪ ()sort‬از دو حلقۀ تودرتو استفاده مي‌كند.‬ ‫1- حلقه ‪ for‬داخلي زوج‌هاي همسايه را با هم‬ ‫مقايسه مي‌كند و اگر آن ‌ها خارج از ترتيب باشند،‬ ‫جاي آن دو را با هم عوض مي‌کند.‬ ‫وقتي ‪ for‬داخلي به پايان رسيد، بزرگ‌ترين عنصر‬ ‫موجود در محدودۀ فعل ي ب ه انتهاي آ ن هدايت‬ ‫شده است.‬ ‫2-سپس حلق ۀ ‪ for‬بيرون ي محدودۀ جستجو را‬ ‫يک ي ک م مي‌کن د و دوباره ‪ for‬داخلي را راه‬ ‫مي‌اندازد تا بزرگ‌ترين عنصر بعدي به سمت بالي‬
  • 273. ‫8- الگوريتم جستجوي دودويي‬ ‫در روش ج ستجوي دودو يي به يک آرايۀ مرتب‬ ‫نياز است.‬ ‫‪ ‬هنگام جستجو آرايه از وسط به دو بخش باليي‬ ‫و پاييني تقسيم مي‌شود.‬ ‫‪‬مقدار مورد جستجو با آخرين عنصر بخش پاييني‬ ‫مقايسه مي‌شود.‬ ‫‪ ‬اگر اين عنصر کوچک ‌تر از مقدار جستجو بود،‬ ‫مورد جستجو در بخش پاييني وجود ندارد و بايد در‬
  • 274. ‫دوباره بخش باليي به دو بخش تقسيم‬ ‫مي‌گردد و گام‌هاي بال تکرار مي‌شود.‬ ‫سرانجام محدودۀ جستجو به يک عنصر‬ ‫محدود مي‌شود که يا آن عنصر با مورد‬ ‫جستجو برابر است و عنصر مذکور يافت شده‬ ‫و يا اين که آن عنصر با مورد جستجو برابر‬ ‫نيست و لذا مورد جستجو در آرايه وجود‬ ‫ندارد.‬ ‫اين روش پيچيده‌تر از روش جستجوي‬
  • 275. ‫مثال‌ 641- جستجوي دودويي‬ ‫برنام ۀ آزمون زي ر ب ا برنام ۀ آزمون مثال 621- يک ي اس ت اما‬ ‫تابع ي ک ه در زي ر آمده از روش جس تجوي دودوي ي براي يافتن‬ ‫مقدار درون آرايه استفاده مي‌کند:‬ ‫;)‪int index(int, int[],int‬‬ ‫)(‪int main‬‬ ‫;} 88 ,77 ,66 ,55 ,44 ,33 ,22 { = ][‪{ int a‬‬ ‫;‪cout << "index(44,a,7) = " << index(44,a,7) << endl‬‬ ‫;‪cout << "index(60,a,7) = " << index(60,a,7) << endl‬‬ ‫}‬
  • 276. int index(int x, int a[], int n) { // PRECONDITION: a[0] <= a[1] <= ... <= a[n-1]; // binary search: int lo=0, hi=n-1, i; while (lo <= hi) { i = (lo + hi)/2; // the average of lo and hi if (a[i] == x) return i; if (a[i] < x) lo = i+1; // continue search in a[i+1..hi] else hi = i-1; // continue search in a[0..i-1] } return n; // x was not found in a[0..n-1] } index(44,a,7) = 2 index(60,a,7) = 7
  • 277. ‫براي اين که بفهميم تابع چطور کار مي‌کند، فراخواني‬ ‫7,‪ (index(44,a‬را دنبال مي‌کنيم.‬ ‫وقتي حلقه شروع مي‌شود، 44=‪ x‬و 7=‪ n‬و 0=‪ lo‬و‬ ‫6=‪ hi‬است.‬ ‫ابتدا ‪ i‬مقدار )0+6(/2 = 3 را مي‌گيرد .پس عنصر ‪[a[i‬‬ ‫عنصر وسط آرايۀ 6..0[‪ [a‬است. مقدار 3[‪ [a‬برابر با 55‬ ‫است که از مقدار ‪ x‬بزرگ‌تر است. پس ‪ x‬در نيمۀ باليي‬ ‫نيست و جستجو در نيمۀ پاييني ادامه مي‌يابد. لذا ‪ hi‬با‬ ‫1-‪ i‬يعني 2 مقداردهي مي‌شود و حلقه تکرار مي‌گردد.‬
  • 278. ‫حال 2=‪ hi‬و 0=‪ lo‬اس ت و دوباره عنص ر وسط‬ ‫آراي ۀ 2..0[‪ [a‬يعن ي 1[‪ [a‬با ‪ x‬مقايسه مي‌شود.‬ ‫1[‪ [a‬برابر با 33 است که کوچک‌تر از ‪ x‬مي‌باشد.‬ ‫پس اين دفعه ‪ lo‬برابر با 1+‪ i‬يعني 2 مي‌شود.‬ ‫در سومين دور حلقه، 2=‪ hi‬و 2=‪ lo‬است. پس‬ ‫عنصر وسط آرايۀ 2..2[‪ [a‬که همان 2[‪ [a‬است با‬ ‫‪ x‬مقايسه مي‌شود. 2[‪ [a‬برابر با 44 است که با ‪x‬‬ ‫برابر است . پس مقدار 2 بازگشت داده مي‌شود؛‬ ‫يعني ‪ x‬مورد نظر در 2[‪ [a‬وجود دارد.‬
  • 279. lo hi i [a[i ?? x 0 6 3 55 < 44 2 1 33 > 44 2 2 44 == 44
  • 280. ‫حال فراخواني 7,‪ (index(60,a‬را دنبال مي‌کنيم.‬ ‫وقت ي حلقه شروع مي‌شود، 06=‪ x‬و 7=‪ n‬و‬ ‫0=‪ lo‬و 6=‪ hi‬است. عنصر وسط آرايۀ 6..0[‪[a‬‬ ‫عنص ر 55=]3[‪ a‬اس ت ک ه اc