توابع :
دربرنامه های طولانی وپیچیده که شامل چندین بخش منطقی ومستقل از هم هستند ، بهتر است برای هرقسمت منطقی ، برنامه جداگانه ای نوشته شود .
برنامه هایی که برای هر یک از بخش نوشته می شود ، تابع نام دارد درواقع تابع ، برنامه ای است که برای حل بخشی از مسئله نوشته می شود .
- توابع کتابخانه ای :
تعدادی از توابع که دراغلب برنامه ها مورد استفاده قرارمی گیرند و کاربرد زیادی دارند ، از قبل نوشته شده ، به همراه کامپایلر C++ ارائه می شوند که به آنهاتوابع کتابخانه ای گویند مثل تابع clrsc() که صفحه نمایش را پاک می کند .
برحسب ضرورت می توان توابعی را بنویسید ودر برنامه مورد استفاده قرار داد .
بااستفاده از توابع می توان برنامه های ساخت یافته نوشت وظایف این نوع برنامه ها توسط بخش های مستقلی که تشکیل دهنده برنامه اند انجام می شود .
این بخش ها ی مستقل همان توابع هستند امتیازات برنامه نویسی ساخت یافته عبارتند از 1- نوشتن برنامه های ساخت یافته آسان است 2- همکاری بین افراد رافراهم می کند 3- اشکال زدایی برنامه های ساخت یافته ساده تر است 4- برنامه نویس ساخت یافته موجب صرفه جویی در وقت می شود .
نوشتن تابع
برای نوشتن تابع باید اهداف تابع مشخص باشد تابع چه وظیفه ای به عهده دارد ،ورودی های تابع چیست ، وخروجی های تابع کدامند با دانستن این موارد نوشتن تابع چندان دشوار نیست .
هر تابع دارای سه جنبه است ،1- جنبه تعریف تابع : که مجموع ای از دستورات است که عملکرد تابع را مشخص می کند 2- جنبه فراخوانی تابع دستوری است که تابع را فراخوانی می کندفراخوانی تابع بانام آن انجام می شود 3- جنبه اعلان .
نکاتی درمورد نوشتن تابع :
1- ابتدا بدون پرداختن به جزئیات پیاده سازی توابع ، آرگومانها ونتیجه ای را که ازتابع انتظار دارید ،مشخص کرده ،برنامه اصلی را بنویسید به عبارت دیگر درقدم اول لازم نیست با جزئیات پیاده سازی تابع بپردازید پس ازنوشتن برنامه اصلی ، توابع دیگر را بنویسید 2- توابع را طوری طراحی وپیاده سازی کنید که هرتابع فقط به آنچه که نیاز دارد دسترسی داشته باشد وبقیه قسمتهای برنامه وسایر اطلاعات توسط توابع غیرمرتبط قابل دستیابی نباشد این موضوع را پنهان سازی اطلاعات گویند برای این منظور ، هرتابع باید یک نقطه ورود ویک نقطه خروج داشته باشد .
3- برای ارتباط بین توابع ، ازآرگومان ها وپارامترها استفاده کنید .
چگونگی کار تابع :
وقتی تابعی ،توسط تابع دیگری فراخوانی می شود ، دستورات آن تابع اجرا می شوند پس از اجرای دستورات تابع ،کنترل اجرای برنامه ، به برنامه فراخوانی بر می گردد ، پس ازبرگشت ازتابع فراخوانی شده ، اولین دستور بعداز فراخوانی تابع ( درتابع فراخوانی ) اجرامی شود .
روش های ارسال پارامترها به توابع :
پارامترها را به دوطریق می توان ازتابع فراخوانی شونده ارسال کرد .
این دوروش عبارت اند از 1- روش فراخوانی بامقدار 2- روش فراخوانی با ارجاع .
روش فراخوانی ، تعداد مقادیری رامشخص می کندکه توابع فراخوانی شونده می توانند بر گردانند در روش فراخوانی بامقدار ، دو دسته توابع می توانند وجود داشته باشد 1- توابعی که هیچ مقداری رابر نمی گردانند 2- توابعی که فقط یک مقدار را برمی گردانند اما در روش فراخوانی باارجاع توابع می توانند چندین مقدار را به تابع فراخوان برگردانند .
توابعی که هیچ مقداری را برنمی گردانند :
ممکن است در برنامه ای
توابعی که هیچ مقداری را بر نمی گردانند
ممکن است دربرنامه از توابعی استفاده کنیم که آن توابع پس از فراخوانی ، عملیات مورد نظر را انجام دهند و خروجی های مورد انتظار راتولید وچاپ نمایند وهیچ مقداری را به تابع فراخوان تحویل ندهند .
دربسیاری از مسئله هایی که با کامپیوتر حل می شوند ، این گونه توابع به چشم می خورند .
توابعی که یک مقدار را بر می گردانند در بسیاری از مسئله هایی که توسط کامپیوتر حل می شوند ، نیاز به نوشتن توابعی است که یک مقدار را بر می گردانند .
مثل تابع Sin () که سینوس یک زاویه رابر می گرداند .
اینگونه ، توابع کاربردهای فراوانی دارند .
برای نوشتن اینگونه توابع ، نوع آنها رابا ید در الگوی تابع وعنوان تابع مشخص کرد برای برگرداندن مقداری توسط تابع ، ازدستور return به صورت های زیر استفاده میشود : ،(> عبارت ؛ >عبارت تفاوتی بین دورش کاربرد return وجودندارد مقداری که توسط دستور returnبرگشت داده می شود درنام تابع قرارمی گیرددربرنامه فراخوان ، می توان نام تابع را به متغیری نسبت داد وازمحتویات آن استفاده کرد.
به عنوان مثال اگر ، f1() یک تابع از نوع x,int متغیری از نوع int باشد ، دستورزیر ، تابع f1() رافراخوانی کرده ، مقداری را که توسط دستور return در نام تابع قرارمی گیرد ، در x قرار می دهد .
بازگشتی بازگشتی به مفهومی گفته می شود که در آن ، تابعی خودش را فراخوانی می کند .
توابع می توانند به طور مستقیم یا غیر مستقیم خودشان رافراخوانی کنند .
درروش مستقیم ، یکی ازدستورات تابع ، فراخوانی خودش است در روش غیر مستقیم ، تابعی مثل f1() تابع f2() رافراخوانی می کند وتابع f2() نیز به نوبه خود تابع f1() را فرا خوانی می نماید برای ایجاد بازگشتی ، الگوریتمی که توسط تابع پیاده سازی می شود ، باید خصوصیت بازگشتی داشته باشد .
طرح کلی الگوریتم های بازگشتی به صورت زیر است : یک یا چند حالت ، که در آن ، تابع وظیفه خودش را به صورت بازگشتی انجام می دهد .
یعنی این حالت ها خاصیت بازگشتنی دارند .
یک یا چندحالت که در آن ، تابع وظیفه خودش را بدون فراخوانی بازگشتنی انجام می دهد .
این حالت را حالت توقف گویند .
اغلب با استفاده از یک دستور if مشخص می شود که کدام یک از این حالت ها باید انجام شوندبرای این که فراخوانی های بازگشتی به اتمام برسد .
باید حالت توقف اتفاق بیفتد .
یعنی هر فراخوانی تابع ، سرانجام باید به حالت توقف ختم شود ، در غیر این صورت ، فراخوانی تابع خاتمه نمی یابد .
( به حالت توقف رسیدی ) if مسئله حالت توقف را حل کن تابع را بار دیگر فراخوانی کن Else عملگرها عملگرها نمادهایی هستند که اعمال خاصی را انجام می دهند .
به عنوان مثال نماد ُ+ ُ عملگری است که دو مقدار را باهم جمع می کند ( عمل جمع را انجام می دهد ) پس از اعلان متغیرها ومقدار دادن به آنها باید بتوان عملیاتی را روی آنها انجام دادبرای انجام این عملیات باید از عملگرها استفاده کرد .
عملگرها درزبان C++ به چند دسته تقسیم می شوند : عملگرهای محاسباتی عملگرهای رابطه ای عملگرهای منطقی عملگرهای ترکیبی عملگرهای بیتی عملگرهای متفرقه عملگرها بر روی یک یا دو مقدار عمل می کنند .
مقادیری را که عملگرها بر روی آنها عمل می کنند ، عملوند گویند .
1-7-1 عملگرهای محاسباتی عملگرهای محاسباتی ، اعمال محاسباتی را روی عملوندها انجام می دهند .
تقدم عملگرهای محاسباتی وقتی درعبارتی ، چندین عملگر با هم ترکیب می شوند ، ترتیب اجرای آنها با دوویژگی زبان برنامه سازی C+ + تعیین می شود : تقدم علمگرها شرکت پذیری عملگرها جدول4-1 تقدم عملگرهای محاسباتی عملگرهای رابطه ای عملگرهای رابطه ای ، ارتباط بین عملوندها رامشخص می کنند .اعمالی مثل تساوی دو مقدار ، کوچک تر یا بزرگ تر بودن ، مقایسه با صفر وغیره ، توسط عملگرهای رابطه ای مشخص می شودعملگرهای رابطه ای در جدول 5-1 آمده اند .
درمورد عملگرهای رابطه ای ، شاید با عملگر == آشنایی نداشته باشید .
این عملگر دردستورات شرطی برای مقایسه دو مقدار مورد استفاده قرار می گیرد به عنوان مثال ، دستور مقایسه دومقدار Y,X بایدبه صورت آیا X = = Y نوشته شود .
جدول 5-1 عملگرهای رابطه ای عملگرهای منطقی عملگرهای منطقی بر روی عبارات منطقی عمل می کنند .
عبارات منطقی دارای دو ارزش درستی ونادرستی اند .
در زبان C ++ ارزش نادرستی بامقدار صفر وارزش درستی بامقادیر غیر صفر مشخص می شود روش دیگر تعیین مقادیر درستی ونادرستی ،استفاده از ثوابت False, trueاست .
true به معنی ارزش درستی وfalse به معنی ارزش نادرستی است ثابت true به 1 وثابت false به صفر تبدیل می شود ، عکس این مطلب نیز درست است ، مقدار صفر به false ومقدار یک به true تبدیل خواهد شد .
عملگرهای منطقی درجدول 6-1 آمده اند ترتیب قرارگرفتن آنهادر جدول ، از تقدم بالا به پایین است .
جدول 6-1 عملگرهای منطقی به ترتیب تقدم عملگرهای ترکیبی ازترکیب عملگرهای محاسباتی وعملگر = مجموعه دیگر ی از عملگرها ایجاد می شود که عمل محاسباتی وانتساب را انجام می دهد این عملگرها در جدول 8-1 آمده اند تقدم این عملگرها پایین تر ازسایر عملگرها است .
جدول 8-1 عملگرهای ترکیبی عملگرهای بیتی وجود عملگرهای بیتی در C++ موجب شد تا بسیاری ازکارهای زبان اسمبلی در انجام شود عملگرهای بیتی برای تست کردن ، مقدار دادن یا شیفت دادن وسایر اعمال بر روی مقادیری به کارمی روند که دریک بایت ( CHAR) یاکلمه ( int) ذخیره شده اند عملگرهای بیتی را نمی توان با انواع void,long,double,double,float یا سایر انواع پیچیده به کار برد .
عملگرهای بیتی در جدول 9-1 آمده اند .
جدول 9-1 عملگرهای بیتی عملگرهای متفرقه تعدادی ازعملگرها در C++ وجود دارند که دردسته بندی خاصی نمی گنجد .
به همین دلیل آنها را تحت عنوان عملگرهای متفرقه مورد بحث قرار می دهیم .
عملگرهای & و ْ همان طور که گفته شد ، متغیرها نامی برای کلمات حافظه اند وکلمات حافظه نیزدارای شماره ردیف می باشند که ما آنها را آدرس می نامیم با استفاده از عملگر & می توانیم به آدرس متغیرها دسترسی داشته باشیم عملگر * نیز برای دسترسی غیرمستقیم به حافظه مورد استفاده قرار می گیرد .
عملگر ؟
این عملگر ، عبارتی را ارزیابی کرده ، براساس ارزش آن عبارت ( درستی یا نادرستی ) نتیجه عبارت دیگر را در متغیری قرار می دهد .
>عبارت 3 عبارت 2 عبارت 1 عملگر کاما ( ، ) این عملگر برای انجام چندعمل در یک دستوربه کار می رود وکاربرد آن به صورت زیراست : >) , عبارت 2 ,عبارت 1 ( عملگر sizeof این عملگر ، یک عملگر زمان ترجمه است ومی تواند طول یک متغیر یانوع داده را برحسب بایت تعیین کند .
اگر با کامپیوتری کار می کنید ونمی دانید انواع آن ، مثلا نوع int چندبایتی است ، با این عملگر می توانید به آن پی ببرید این عملگر به صورت های زیر به کار می رود : عملگر() پرانتزها عملگرهایی هستند که تقدم عملگرهای داخل خود را بالا می برند به عنوان مثال ، عبارت زیرا را درنظر بگیرید : Y = 4 * 2/(3+ 1) +( 6+ ( 7-2)) تقدم عملگرها درحالت کلی تاکنون عملگرهای موجود در C++ رامطالعه کردیم .
اگرانواع مختلفی از عملگرها با هم در عبارتی به کار گرفته شوند ، برای ارزیابی عبارت باید ترتیب اجرای آنها را بدانیم تقدم عملگرها در حالت کلی ، درجدول 12-1 آمده است .
جدول 12-1 تقدم عملگرها درحالت کلی بعضی از عملگرها رامی توانید طوری تعریف کنید که اعمال خاصی را در مورد کلاس هایی که ایجاد می کنید انجام دهند این عمل را تعریف مجدد عملگر گویند وقتی عملگری دوباره تعریف می شودتاماموریت جدیدی را درموردکلاس ها انجام دهد ، وظیفه اصلی خودش رانیز می تواند انجام دهد .
عملگرها رامی توان با ایجادتابعی به نام تابع عملگر مجدداً تعریف کرد .
این تابع ، اعمالی را تعریف می کند که این عملگر بایددر تعریف جدیدخود ، درخصوص کلاس ها انجام دهد .
این تابع به کلمه کلیدی operator شروع می شود که پس از آن عملگری که دوباره بایدتعریف شود ، قرار می گیرد .
برای به کار بردن عملگرها باا شیای کلاس ، آن عملگرها باید دوباره تعریف شوند دراین خصوص ،دو استثنا وجود دارد ، عملگر انتساب ( =) را بدون تعریف مجددمی توان با کلاس ها به کار برد .
رفتارعادی عملگر انتساب این است که اعضای داده ای کلاس را بیت به بیت به یکدیگر نسبت می دهد البته در ادامه خواهیم دید که این کار برای اعضایی ازکلاس که از نوع اشاره گر هستند ، خطرناک است درمورد این گونه کلاس ها ، عملگر انتساب را مجدداً تعریف خواهیم کرد .
توصیه می شود که درتعریف مجدد عملگرها کاری کنید که مفهوم اصلی عملگر از دست نرود به عنوان مثال ، عملگر * را طوری تعریف نکنند که عمل تقسیم را انجام دهد ویاعملگر + را طوری تعریف نکنید که عمل تفریق را انجام دهد .
1-8 محدودیت های تعریف مجدد عملگرها اغلب عملگرها رامی توان در C++