Professional Documents
Culture Documents
com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
C++
به زبان ساده
Contents
C++چیست 8 ......................................................................................................................................................
توضیحات02 .....................................................................................................................................................
کاراکترهای کنترلی06............................................................................................................................................
متغیر 02..........................................................................................................................................................
عملگرهای ر یاضی20............................................................................................................................................
حلقه14............................................................................................................................................. do while
متد86 .................................................................................................................................................................
شمارش 94...........................................................................................................................................................
وراثت 608............................................................................................................................................................
622 ........................................................................................................................................................Protect
تقدیم به:
فصل اول
C++چیست
C++یک زبان برنامه نویسی است که از paradigmیا سبکهای مختلف برنامه نویسی پشتیبانی میکند C++.نسخه توسعه یافته
زبان Cمیباشد و بیشتر کدهای زبان Cبه راحتی میتواند در C++کامپایل شود .در C++از ویژگیهای مهمی که به Cاضافه
شده است میتوان به برنامه نویسی شی گرا ،سربارگذاری عملگرها ،وراثت چندگانه و مدیریت خطاها اشاره نمود .توسعه C++در
سال 9191آغاز شد و 9سال پس از زبان Cبه نمایش گذاشته شد.با وجود قدیمی بودن زبانهای Cو c++هنوز هم به صورت
گسترده ای در نرم افزارهای صنعتی مورد استفاده قرار میگیرد .این زبانها برای ساخت هر چیزی از سیستم عامل گرفته تا نرم
در مقایسه با زبانهای جدید تر ،برنامههای نوشته شده با C++اغلب پیچیده تر میباشند و زمان بیشتری برای توسعه نیاز دارد.در
عوضC++ ،زبانی است که به شما اجازه میدهد که هم به صورت ( High-levelنزدیک به زبان انسان) و هم به صورتlow-
( levelنزدیک به زبان ماشین ) سخت افزار را تحت کترل خود قرار دهید.همچنین با پشتیبانی از سبکها یا پارادایمهای مختلف
برنامه نویسی از جمله روی ه ای ،شی گرا یا عمومی ،دست برنامه نویس را در انتخاب سبک مورد نظرش آزاد میگذارد .اکنون 5
نسخه از استاندارد این زبان منتشر شده است؛ و استاندارد C++17نیز برای انتشار در سال 7199برنامه ریزی شده است.
برای اجرای کدهای C++نیاز به یک کامپایلر داریم .کامپایلرها و محیطهای برنامه نویسی ) (IDEگوناگونی برای زبان C++
وجود دارند از بین معروفترین آنها میتوان موارد زیر اشاره نمود:
زبان C++وابسته به یک سیستم عامل نیست یعنی شما بعد از نوشتن برنامه خود به زبان ، C++اگر کد استانداری نوشته باشید
میتوانید با توجه به سیستم عامل ،کدتان را کامپایل کنید .میتوان کد C++را در هر محیطی ،مثالً NotePadدر ویندوز و یا
gEditدر گنو/لینوکس نوشته و بعد آن را بوسیله یک کامپایلر کامپایل کنیم ،ولی برای راحتی کار ما میتوانیم از یک IDEمناسب،
نیز بهره ببریم .البته در این سری آموزشی ما از راحتترین روش برای کامپایل کدها استفاده میکنیم.
همانطور که اشاره شد برای اجرای کدهای C++نیاز به یک کامپایلر داریم .کامپایلری که در این سری آموزشی میخواهیم از آن
dl.w3-farsi.com/Software/Cplusplus/mingw-w64-install.exe
نصب MinGW
بعد از دانلود فایل باال بر روی آن دو بار کلیک کرده و مراحل زیر را برای نصب و پیکربندی آن طی کنید:
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
پیکربندیMinGW
بعد از اتمام نصب نوبت به پیکربندی MinGWمیرسد .در کل باید مسیر پوشه binنرم افزار MinGWرا در متغیر PATHویندوز
قرار دهید .پوشه binنرم افزار MinGWما در مسیر زیر قرار دارد و البته ممکن است برای شما این مسیر متفاوت باشد:
همانطور که در شکل باال مشاهده میکنید بعد از کلیک بر روی متغیر pathسپس دکمه Editپنجره ای به صورت زیر نشان
داده میشود .نشانگر ماوس را به آخر جعبه متن برده و سپس یک عالمت سیمیکالن (;) گذاشته و مسیر پوشه binخود را بعد
در نهایت دکمه OKتمام پنجرههای باز را بزنید .با این کار پیکربندی هم به اتمام میرسد .در درس بعد نحوه اجرای اولین برنامه
اجازه بدهید یک برنامه بسیار ساده به زبان سی پالس پالس ) (C++بنویسیم .این برنامه یک پیغام را در محیط کنسول نمایش
میدهد .در این درس میخواهم ساختار و دستور زبان یک برنامه ساده C++را توضیح دهم .هر چند که محیطهای کدنویسی
زیادی برای C++وجود دارند ولی ما از سادهترین روش برای کدنویسی استفاده میکنیم .برنامه NotePadویندوز را باز کرده و
>#include <iostream
)(int main
{
;"!std::cout << "Welcome to C++ Tutorials
}
حال فایل را با نام Myappو پسوند cpp.به صورت زیر در درایو Dذخیره کنید:
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
مثال باال سادهترین برنامه ای است که شما میتوانید در C++بنویسید .هدف در مثال باال نمایش یک پیغام در صفحه نمایش
است .هر زبان برنامه نویسی دارای قواعدی برای کدنویسی است .اجازه بدهید هر خط کد را در مثال باال توضیح بدهیم .در خط
اول فایل هدر یا سرایند آمده است .فایلهای سرآیند کتابخانه استاندارد C++میباشند و در این برنامه ما به فایل سرایند
iostreamنیاز داریم (در درسهای آینده در مورد این فایلها به طور مفصل توضیح میدهیم) .خط 1متد )( mainیا متد
اصلی نامیده میشود .هر متد شامل یک سری کد است که وقتی اجرا میشوند که متد را صدا بزنیم .درباره متد و نحوه صدا زدن
آن در فصول بعدی توضیح خواهیم داد .متد )( mainنقطه آغاز اجرای برنامه است .این بدان معناست که ابتدا تمام کدهای
داخل متد )( mainو سپس بقیه کدها اجرا میشود .درباره متد )( mainدر فصول بعدی توضیح خواهیم داد .متد )(main
و سایر متدها دارای آکوالد و کدهایی در داخل آنها میباشند و وقتی کدها اجرا میشوند که متدها را صدا بزنیم .هر خط کد در
C++به یک سمیکالن ( ; ) ختم میشود .اگر سمیکالن در آخر خط فراموش شود برنامه با خطا مواجه میشود .مثالی از یک خط
این خط کد پیغام !Welcome to Visual C++ Tutorialsرا در صفحه نمایش نشان میدهد .از شیء coutبرای چاپ
یک رشته استفاده میشود .یک رشته گروهی از کاراکترها است ،که به وسیله دابل کوتیشن (“) محصور شده است .مانند
یک کاراکتر میتواند یک حرف ،عدد ،عالمت یا … باشد .در کل مثال باال نحوه استفاده از شیء coutاست که در داخل فضای
نام stdقرار دارد را نشان میدهد .توضیحات بیشتر در درسهای آینده آمده است . C++فضای خالی و خطوط جدید را نادیده
میگیرد .بنابراین شما میتوانید همه برنامه را در یک خط بنویسید .اما اینکار خواندن و اشکال زدایی برنامه را مشکل میکند .یکی
از خطاهای معمول در برنامه نویسی فراموش کردن سمیکالن در پایان هر خط کد است .به مثال زیر توجه کنید :
<< std::cout
;"!"Welcome to C++ Tutorials
سی پالس پالس فضای خالی باال را نادیده میگیرد و از کد باال اشکال نمیگیرد .اما از کد زیر ایراد میگیرد:
; << std::cout
;"!"Welcome to C++ Tutorials
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
به سمیکالن آخر خط اول توجه کنید .برنامه با خطای نحوی مواجه میشود چون دو خط کد مربوط به یک برنامه هستند و شما
فقط باید یک سمیکالن در آخر آن قرار دهید .همیشه به یاد داشته باشید که C++به بزرگی و کوچکی حروف حساس است .یعنی
به طور مثال MANو manدر سی پالس پالس با هم فرق دارند .رشتهها و توضیحات از این قاعده مستثنی هستند که در درسهای
آینده توضیح خواهیم داد .مثالً کدهای زیر با خطا مواجه میشوند و اجرا نمیشوند:
تغییر در بزرگی و کوچکی حروف از اجرای کدها جلوگیری میکند .اما کد زیر کامالً بدون خطا است:
{
;statement1
}
این کار باعث میشود که کدنویسی شما بهتر به چشم بیاید و تشخیص خطاها راحت تر باشد.
برای کامپایل و اجرای برنامهcmd ،ویندوز را باز کرده و سپس به درایو Dیعنی جایی که فایل را ذخیره کردهاید بروید:
C:\Users\YounesCsharp>D:
>\D:
C:\Users\YounesCsharp>D:
C:\Users\YounesCsharp>D:
D:\>MyApp.exe
>\D:
در برنامه فوق ما یک فضای نام در برنامه مان با نام stdداریم ،اما سی پالس پالس دارای تعداد زیادی فضای نام میباشد .یکی
از این فضاهای نامی ،فضای نام stdاست که شیء coutکه ما از آن در برنامه باال استفاده کردیم در این فضای نام قرار دارد.
اینکه قبل از استفاده از هر کالس ابتدا فضای نام آن را مانند کد باال بنویسیم کمی خسته کننده است .خوشبختانه C++به ما اجازه
میدهد که برای جلوگیری از تکرار مکررات ،فضاهای نامی را که قرار است در برنامه استفاده کنیم با استفاده از دستور usingو
دستور باال نحوه وارد کردن یک فضای نام در برنامه را نشان میدهد .در نتیجه به جای آنکه به صورت زیر ابتدا نام فضای نام و
میتوانیم فضای نام را با دستوری که ذکر شد وارد برنامه کرده و کد باال را به صورت خالصه شده زیر بنویسیم:
>#include <iostream
;using namespace std
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
)(int main
{
;"!cout << "Welcome to C++ Tutorials
}
حال که با خصوصیات و ساختار اولیه C++آشنا شدید در درسهای آینده مطالب بیشتری از این زبان برنامه نویسی قدرتمند
خواهید آموخت.
توضیحات
وقتی که کدی تایپ میکنید شاید بخواهید که متنی جهت یادآوری وظیفه آن کد به آن اضافه کنید .در ( C++و بیشتر زبانهای
برنامه نویسی) میتوان این کار را با استفاده از توضیحات انجام داد .توضیحات متونی هستند که توسط کامپایلر نادیده گرفته
هدف اصلی ا ز ایجاد توضیحات ،باال بردن خوانایی و تشخیص نقش کدهای نوشته شده توسط شما ،برای دیگران است .فرض کنید
که میخواهید در مورد یک کد خاص ،توضیح بدهید ،میتوانید توضیحات را در باالی کد یا کنار آن بنویسید .از توضیحات برای
مستند سازی برنامه هم استفاده میشود .در برنامه زیر نقش توضیحات نشان داده شده است:
در کد باال ،خط 1یک توضیح درباره خط 9است که به کاربر اعالم میکند که وظیفه خط 9چیست؟ با اجرای کد باال فقط جمله
Hello Worldچاپ شده و خط 9در خروجی نمایش داده نمیشود چون کامپایلر توضیحات را نادیده میگیرد .توضیحات بر
دو نوعاند:
توضیحات تک خطی
/* multi
line
comment */
توضیحات تک خطی همانگونه که از نامش پیداست ،برای توضیحاتی در حد یک خط به کار میروند .این توضیحات با عالمت //
شروع میشوند و هر نوشته ای که در سمت راست آن قرار بگیرد جز توضیحات به حساب میآید .این نوع توضیحات معموال ً در باال
یا کنار کد قرار میگیرند .اگر توضیح درباره یک کد به بیش از یک خط نیاز باشد از توضیحات چند خطی استفاده میشود .توضیحات
چند خطی با */شروع و با */پایان مییابند .هر نوشته ای که بین این دو عالمت قرار بگیرد جز توضیحات محسوب میشود.
کاراکترهای کنترلی
کاراکترهای کنترلی کاراکترهای ترکیبی هستند که با یک بک اسلش )\( شروع میشوند و به دنبال آنها یک حرف یا عدد میآید
و یک رشته را با فرمت خاص نمایش میدهند .برای مثال برای ایجاد یک خط جدید و قرار دادن رشته در آن میتوان از کاراکتر
>#include <iostream
;using namespace std
)(int main
{
;"cout << "Hello\nWorld
}
Hello
World
مشاهده کردید که کامپایلر بعد از مواجهه با کاراکتر کنترلی \nنشانگر ماوس را به خط بعد برده و بقیه رشته را در خط بعد
نمایش میدهد .جدول زیر لیست کاراکترهای کنترلی و کارکرد آنها را نشان میدهد:
ما برای استفاده از کاراکترهای کنترلی از بک اسلش )\( استفاده میکنیم.از آنجاییکه \ معنای خاصی به رشتهها میدهد برای
;"cout << "We can print a \\ by using the \\\\ escape sequence.
یکی از موارد استفاده از \\ ،نشان دادن مسیر یک فایل در ویندوز است:
از آنجاییکه از دابل کوتیشن )“( برای نشان دادن رشتهها استفاده میکنیم برای چاپ آن از ”\استفاده میکنیم:
Left Right
هر تعداد کاراکتر که بعد از کاراکتر کنترلی \rبیایند به اول سطر منتقل و جایگزین کاراکترهای موجود میشوند:
Kitten
مثالً در مثال باال کاراکتر Kبعد از کاراکتر کنترلی \rآمده است.کاراکتر کنترلی حرف Kرا به ابتدای سطر برده و جایگزین حرف M
میکند .برای چاپ کاراکترهای یونیکد میتوان از \uاستفاده کرد .برای استفاده از ،\uمقدار در مبنای 91کاراکتر را درست بعد از
عالمت \uقرار میدهیم.برای مثال اگر بخواهیم عالمت)⌐┬( را چاپ کنیم باید بعد از عالمت \uمقدار A9 11را قرار دهیم مانند
:
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
⌐┬
برای مشاهده لیست مقادیر مبنای 91برای کاراکترهای یونیکد به لینک زیر مراجعه نمایید:
http://www.ascii.cl/htmlcodes.htm
اگر کامپایلر به یک کاراکتر کنترلی غیر مجاز برخورد کند ،برنامه پیغام خطا میدهد.بیشترین خطا زمانی اتفاق میافتد که برنامه
نویس برای چاپ اسلش )\( از \\ استفاده میکند .برای دریافت اطالعات بیشتر در مورد کاراکترهای کنترلی به لینک زیر مراجعه
کنید:
https://msdn.microsoft.com/en-us/library/h21280bw.aspx
متغیر
متغیر مکانی از حافظه است که شما میتوانید مقادیری را در آن ذخیره کنید.میتوان آن را به عنوان یک ظرف تصور کرد که دادههای
خود را در آن قرار دادهاید.محتویات این ظرف میتواند پاک شود یا تغییر کند.هر متغیر دارای یک نام نیز هست.که از طریق آن
میتوان متغیر را از دیگر متغیرها تشخیص داد و به مقدار آن دسترسی پیدا کرد.همچنین دارای یک مقدار میباشد که میتواند
توسط کاربر انتخاب شده باشد یا نتیجه یک محاسبه باشد.مقدار متغیر میتواند تهی نیز باشد.متغیر دارای نوع نیز هست بدین
معنی که نوع آن با نوع داده ای که در آن ذخیره میشود یکی است .متغیر دارای عمر نیز هست که از روی آن میتوان تشخیص
داد که متغیر باید چقدر در طول برنامه مورد استفاده قرار گیرد.و در نهایت متغیر دارای محدوده استفاده نیز هست که به شما
میگوید که متغیر در چه جای برنامه برای شما قابل دسترسی است.ما از متغیرها به عنوان یک انبار موقتی برای ذخیره داده استفاده
میکنیم .هنگامی که یک برنامه ایجاد میکنیم اح تیاج به یک مکان برای ذخیره داده ،مقادیر یا دادههایی که توسط کاربر وارد
میشوند داریم.ایم مکان همان متغیر است .برای این از کلمه متغیر استفاده میشود چون ما میتوانیم بسته به نوع شرایط هر جا
که الزم باشد مقدار آن را تغییر دهیم .متغیرها موقتی هستند و فقط موقعی مورد استفاده قرار میگیرند که برنامه در حال اجراست
و وقتی شما برنامه را میبندید محتویات متغیرها نیز پاک میشود .قبالً ذکر شد که به وسیله نام متغیر میتوان به آن دسترسی
پیدا کرد .برای نامگذاری متغیرها باید قوانین زیر را رعایت کرد:
نمیتوان از کلمات رزرو شده در C++برای نام متغیر استفاده کرد.
اسامی متغیرها نسبت به بزرگی و کوچکی حروف حساس هستند .در C++دو حرف مانند aو Aدو کاراکتر مختلف
دو متغیر با نامهای myNumberو MyNumberدو متغیر مختلف محسوب میشوند چون یکی از آنها با حرف کوچک mو دیگری
با حرف بزرگ Mشروع میشود .شما نمیتوانید دو متغیر را که دقیق شبیه هم هستند را در یک ( scopeمحدوده) تعریف کنید.
Scopeبه معنای یک بلوک کد است که متغیر در آن قابل دسترسی و استفاده است .در مورد Scopeدر فصلهای آینده بیشتر
توضیح خواهیم داد .متغیر دارای نوع هست که نوع داده ای را که در خود ذخیره میکند را نشان میدهد .معمولترین انواع داده
int, double, string, char, floatمیباشند .برای مثال شما برای قرار دادن یک عدد صحیح در متغیر باید از نوع
intاستفاده کنید.
انواع ساده
انواع ساده انواعی از دادهها هستند که شامل اعداد ،کاراکترها و رشتهها و مقادیر بولی میباشند .به انواع ساده انواع اصلی نیز
گفته میشود چون از آنها برای ساخت انواع پیچیده تری مانند کالسها و ساختارها استفاده میشود .انواع ساده دارای مجموعه
مشخصی از مقادیر هستند و محدوده خاصی از اعداد را در خود ذخیره میکنند .در C++هفت نوع داده وجود دارد که در جدول
Boolean bool
Character char
Integer int
Valueless void
انواع باال ( به جز )voidمیتوانند با عباراتی مثل unsigned ،long ، signedو shortترکیب شده و نوعهای دیگری را
unsigned short
2bytes 0 to 65,535
int
signed short
2bytes -32768 to 32767
int
-9,223,372,036,854,775,808 to
long int 8bytes
9,223,372,036,854,775,807
-9,223,372,036,854,775,808 to
signed long int 8bytes
9,223,372,036,854,775,807
unsigned long
8bytes 0 to 18,446,744,073,709,551,615
int
نوع charبرای ذخیره کاراکترهای یونیکد استفاده میشود .کاراکترها باید داخل یک کوتیشن ساده قرار بگیرند مانند(‘a’).
نوع boolفقط میتواند مقادیر درست ) (trueیا نادرست ) (falseرا در خود ذخیره کند و بیشتر در برنامههایی که دارای
مقادیر ذخیره شده در یک رشته باید داخل دابل.برای ذخیره گروهی از کاراکترها مانند یک پیغام استفاده میشودstring نوع
(“massage”) مانند.کوتیشن قرار گیرند تا توسط کامپایلر به عنوان یک رشته در نظر گرفته شوند
استفاده از متغیرها
:در مثال زیر نحوه تعریف و مقدار دهی متغیرها نمایش داده شده است
#include <iostream>
using namespace std;
int main()
{
//Declare variables
int num1;
int num2;
double num3;
double num4;
bool boolVal;
char myChar;
string message;
}
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
تعریف متغیر
در کد باال متغیرهایی با نوع و نام متفاوت تعریف شدهاند .ابتدا باید نوع دادههایی را که این متغیرها قرار است در خود ذخیره کنند
را مشخص کنیم و سپس یک نام برای آنها در نظر بگیریم و در آخر سیمیکولن بگذاریم.همیشه به یاد داشته باشید که قبل از مقدار
دهی و استفاده از متغیر باید آن را تعریف کرد .شاید برایتان این سؤال پیش آمده باشد که کاربرد endlچیست؟ endlبرای
ایجاد خط جدید مورد استفاده قرار گرفته است .یعنی نشانگر ماوس را همانند کاراکتر کنترلی \ nبه خط بعد میبرد ،در نتیجه
//Declare variables
;int num1
;int num2
;double num3
;double num4
;bool boolVal
;char myChar
;string message
;data_type identifier
date_typeهمان نوع داده است مانند double ، intو dentifier .….نیز نام متغیر است که به ما امکان استفاده و
دسترسی به مقدار متغیر را میدهد .برای تعریف چند متغیر از یک نوع میتوان به صورت زیر عمل کرد:
مثال
در مثال باال 5متغیر از نوع صحیح و 1متغیر از نوع رشته تعریف شده است.توجه داشته باشید که بین متغیرها باید عالمت کاما
)(,باشد.
نامگذاری متغیرها
نام متغیر باید با یک حرف یا زیرخط و به دنبال آن حرف یا عدد شروع شود.
نمیتوان از کاراکترهای خاص مانند & #, %,یا عدد برای شروع نام متغیر استفاده کرد مانند 2numbers.
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
نام متغیر نباید دارای فاصله باشد.برای نامهای چند حرفی میتوان به جای فاصله از عالمت زیرخط یا _استفاده کرد.
نامهای مجاز:
اگر به نامهای مجاز در مثال باال توجه کنید متوجه قراردادهای به کار رفته در نامگذاری آنها خواهید شد.یکی از روشهای نامگذاری،
نامگذاری کوهان شتری است.در این روش که برای متغیرهای دو کلمه ای به کار میرود،اولین حرف اولین کلمه با حرف کوچک و
اولین حرف دومین کلمه با حرف بزرگ نمایش داده میشود مانند . myNumber:توجه کنید که اولین حرف کلمه Numberبا حرف
بزرگ شروع شده است .مثال دیگر کلمه numberOfStudentsاست.اگز توجه کنید بعد از اولین کلمه حرف اول سایر کلمات با
محدوده متغیر
متغیرهای ابتدای درس در داخل متد )( mainتعریف شدهاند .در نتیجه این متغیرها فقط در داخل متد )( mainقابل دسترسی
هستند .محدوده یک متغیر مشخص میکند که متغیر در کجای کد قابل دسترسی است .هنگامیکه برنامه به پایان متد )(main
میرسد متغیرها از محدوده خارج و بدون استفاده میشوند تا زمانی که برنامه در حال اجراست.محدوده متغیرها انواعی دارد که
در درسهای بعدی با آنها آشنا میشوید .تشخیص محدوده متغیر بسیار مهم است چون به وسیله آن میفهمید که در کجای کد
میتوان از متغیر استفاده کرد .باید یاد آور شد که دو متغیر در یک محدوده نمیتوانند دارای نام یکسان باشند .مثالً کد زیر در برنامه
;int num1
;int num1
از آنجاییکه C++به بزرگی و کوچک بودن حروف حساس است میتوان از این خاصیت برای تعریف چند متغیر هم نام ولی با
حروف متفاوت (از لحاظ بزرگی و کوچکی) برای تعریف چند متغیر از یک نوع استفاده کرد مانند:
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
;int num1
;int Num1
;int NUM1
مقداردهی متغیرها
ً
فورا بعد از تعریف متغیرها مقادیری را به آنها اختصاص داد.این عمل را مقداردهی مینامند .در زیر نحوه مقدار دهی میتوان
همچنین میتوان چندین متغیر را فقط با گذاشتن کاما بین آنها به سادگی مقدار دهی کرد:
تعریف متغیر با مقدار دهی متغیرها متفاوت است .تعریف متغیر یعنی انخاب نوع و نام برای متغیر ولی مقدار دهی یعنی اختصاص
در زیر نحوه اختصاص مقادیر به متغیرها نشان داده شده است:
;num1 = 1
;num2 = 2
;num3 = 3.54
;num4 = 4.12
;boolVal = true
;'myChar = 'R
;"!message = "Hello World
به این نکته توجه کنید که شما به مغیری که هنوز تعریف نشده نمیتوانید مقدار بدهید .شما فقط میتوانید از متغیرهایی استفاده
کنید که هم تعریف و هم مقدار دهی شده باشند .مثالً متغیرهای باال همه قابل استفاده هستند .در این مثال num1و num2هر دو
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
تعریف شدهاند و مقادیری از نوع صحیح به آنها اختصاص داده شده است .اگر نوع داده با نوع متغیر یکی نباشد برنامه پیغام
خطا میدهد.
ثابت
ً
حتما باید مقدار دهی اولیه شوند و اگر مقدار دهی ثابتها انواعی هستند که مقدار آنها در طول برنامه تغییر نمیکند .ثابتها
آنها فراموش شود در برنامه خطا به وجود میآید .بعد از این که به ثابتها مقدار اولیه اختصاص داده شد هرگز در زمان اجرای
برنامه نمیتوان آن را تغییر داد .برای تعریف ثابتها باید از کلمه کلیدی constو define#استفاده کرد .معموال ً نام ثابتها
را طبق قرارداد با حروف بزرگ مینویسند تا تشخیص آنها در برنامه راحت باشد .نحوه تعریف ثابت در زیر آمده است:
در کد باال ابتدا کلمه کلیدی constو سپس نوع ثابت و بعد نام ثابت را با حروف بزرگ مینویسیم .و در نهایت یک مقدار را به
در روش باال فقط define#را نوشته و سپس نام ثابت و بعد مقداری که قرار است دریافت کند .به این نکته توجه کنید که در
>#include <iostream
;using namespace std
)(int main
{
;const int NUMBER = 1
>#include <iostream
;using namespace std
)(int main
{
#define NUMBER 1
}
در این مثال میبینید که مقدار دادن به یک ثابت ،که قبالً مقدار دهی شده برنامه را با خطا مواجه میکند.نکته دیگری که نباید
فراموش شود این است که نب اید مقدار ثابت را با مقدار دیگر متغیرهای تعریف شده در برنامه برابر قرار داد.
مثال:
;int someVariable
;const int MY_CONST = someVariable
ممکن است این سؤال برایتان پیش آمده باشد که دلیل استفاده از ثابتها چیست؟ اگر مطمئن هستید که مقادیری در برنامه
وجود دارند که هرگز در طول برنامه تغییر نمیکنند بهتر است که آنها را به صورت ثابت تعریف کنید.این کار هر چند کوچک کیفیت
عبارات و عملگرها
مثالً :X+Yیک عبارت است که در آن Xو Yعملوند و عالمت +عملگر به حساب میآیند.
زبانهای برنامه نویسی جدید دارای عملگرهایی هستند که از اجزاء معمول زبان به حساب میآیند . C++دارای عملگرهای مختلفی
از جمله عملگرهای ریاضی ،تخصیصی ،مقایسه ای ،منطقی و بیتی میباشد .از عملگرهای ساده ریاضی میتوان به عملگر جمع و
انواع مختلف عملگر که در این بخش مورد بحث قرار میگیرند عبارتاند از:
عملگرهای ریاضی
C++از عملگرهای ریاضی برای انجام محاسبات استفاده میکند .جدول زیر عملگرهای ریاضی سی پالس پالس را نشان میدهد:
Var1برابر است با حاصل جمع var2و var3 ;var1 = var2 + var3 Binary +
Var1برابر است با حاصل تفریق var2و var3 ;var1 = var2 – var3 Binary -
Var1برابر است با حاصلضرب var2در var3 ;var1 = var2 * var3 Binary *
Var1برابر است با حاصل تقسیم var2بر var3 ;var1 = var2 / var3 Binary /
Var1برابر است با باقیمانده تقسیم var2و var3 ;var1 = var2 % var3 Binary %
مثال باال در از نوع عددی استفاده شده است.اما استفاده از عملگرهای ریاضی برای نوع رشته ای نتیجه متفاوتی دارد .همچنین در
جمع دو کاراکتر کامپایلر معادل عددی آنها را نشان میدهد .دیگر عملگرهای C++عملگرهای کاهش و افزایش هستند.این
عملگرها مقدار 9را از متغیرها کم یا به آنها اضافه میکنند .از این متغیرها اغلب در حلقهها استفاده میشود:
مقدار var1برابر است با var2منهای 1 ;var1 = – -var2 Unary - -
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
به این نکته توجه داشته باشید که محل قرار گیری عملگر در نتیجه محاسبات تأثیر دارد .اگر عملگر قبل از متغیر var2بیاید افزایش
یا کاهش var1اتفاق میافتد.چنانچه عملگرها بعد از متغیر var2قرار بگیرند ابتدا var1برابر var2میشود و سپس متغیر
>#include <iostream
;using namespace std
)(int main
{
;int x = 0
;int y = 1
;x = ++y
x=2
y=2
>#include <iostream
;using namespace std
)(int main
{
;int x = 0
;int y = 1
;x = --y
x=0
y=0
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
همانطور که در دو مثال باال مشاهده میکنید،درج عملگرهای --و ++قبل از عملوند yباعث میشود که ابتدا یک واحد از yکم
و یا یک واحد به yاضافه شود و سپس نتیجه در عملوند xقرار بگیرد .حال به دو مثال زیر توجه کنید:
>#include <iostream
;using namespace std
)(int main
{
;int x = 0
;int y = 1
;x = y--
x=1
y=0
>#include <iostream
;using namespace std
)(int main
{
;int x = 0
;int y = 1
;x = y++
x=1
y=2
همانطور که در دو مثال باال مشاهده میکنید،درج عملگرهای --و ++بعد از عملوند yباعث میشود که ابتدا مقدار yدر داخل
متغیر xقرار بگیرد و سپس یک واحد از yکم و یا یک واحد به ان اضافه شود .حال میتوانیم با ایجاد یک برنامه نحوه عملکرد
>#include <iostream
;using namespace std
)(int main
{
//Variable declarations
;int num1, num2
;string msg1, msg2
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
برنامه باال نتیجه هر عبارت را نشان میدهد .در این برنامه از endlبرای نشان دادن نتایج در سطرهای متفاوت استفاده شده
است C++ .خط جدید و فاصله و فضای خالی را نادیده میگیرد .در خط 77مشاهده میکنید که دو رشته به وسیله عملگر +به
هم متصل شدهاند .نتیجه استفاده از عملگر +برای چسباندن دو کلمه “ “Helloو ”! “Worldرشته ”!“Hello World
خواهد بود .به فاصلههای خالی بعد از اولین کلمه توجه کنید اگر آنها را حذف کنید از خروجی برنامه نیز حذف میشوند.
عملگرهای تخصیصی
نوع دیگر از عملگرهای C++عملگرهای جایگزینی نام دارند .این عملگرها مقدار متغیر سمت راست خود را در متغیر سمت چپ
قرار میدهند .جدول زیر انواع عملگرهای تخصیصی در سی شارپ را نشان میدهد:
مقدار var1برابر است با حاصل جمع var1و var2 ;var1 += var2 =+
مقدار var1برابر است با حاصل تفریق var1و var2 ;var1 -= var2 =-
مقدار var1برابر است با حاصل ضرب var1در var2 ;var1 *= var2 =*
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
مقدار var1برابر است با حاصل تقسیم var1بر var2 ;var1 /= var2 =/
مقدار var1برابر است با باقیمانده تقسیم var1بر var2 ;var1 %= var2 =%
استفاده از این نوع عملگرها در واقع یک نوع خالصه نویسی در کد است .مثالً شکل اصلی کد var1 += var2به صورت var1
= var1 + var2میباشد .این حالت کدنویسی زمانی کارایی خود را نشان میدهد که نام متغیرها طوالنی باشد .برنامه زیر
>#include <iostream
;using namespace std
)(int main
{
;int number
Assigning 10 to number...
Number = 10
Adding 10 to number...
Number = 20
Subtracting 10 from number...
Number = 10
در برنامه از 1عملگر تخصیصی استفاده شده است .ابتدا یک متغیر و مقدار 10با استفاده از عملگر = به آن اختصاص داده شده
است.سپس به آن با استفاده از عملگر = +مقدار 91اضافه و در آخر به وسیله عملگر = -عدد 91از آن کم شده است.
از عملگرهای مقایسه ای برای مقایسه مقادیر استفاده میشود .نتیجه این مقادیر یک مقدار بولی(منطقی) است.این عملگرها اگر
نتیجه مقایسه دو مقدار درست باشد مقدار 9و اگر نتیجه مقایسه اشتباه باشد مقدار 1را نشان میدهند .این عملگرها به طور
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
معمول در دستورات شرطی به کار میروند به این ترتیب که باعث ادامه یا توقف دستور شرطی میشوند.جدول زیر عملگرهای
>#include <iostream
;using namespace std
)(int main
{
;int num1 = 10
;int num2 = 5
cout << num1 << " == " << num2 << " : " << (num1 ;== num2) << endl
cout << num1 << " =! " << num2 << " : " << (num1 ;!= num2) << endl
cout << num1 << " < " << num2 << " : " << (num1 ;< num2) << endl
cout << num1 << " > " << num2 << " : " << (num1 ;> num2) << endl
cout << num1 << " =< " << num2 << " : " << (num1 ;<= num2) << endl
cout << num1 << " => " << num2 << " : " << (num1 ;>= num2) << endl
}
10 == 5 : 0
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
در مثال باال ابتدا دو متغیر را که میخواهیم با هم مقایسه کنیم را ایجاد کرده و به آنها مقادیری اختصاص میدهیم.سپس با
استفاده از یک عملگر مقایسه ای آنها را با هم مقایسه کرده و نتیجه را چاپ میکنیم.به این نکته توجه کنید که هنگام مقایسه دو
متغیر از عملگر == به جای عملگر = باید استفاده شود .عملگر = عملگر تخصیصی است و در عبارتی مانند x = yمقدار yرا در
به xاختصاص میدهد .عملگر == عملگر مقایسه ای است که دو مقدار را با هم مقایسه میکند مانند x==yو اینطور خوانده
عملگرهای منطقی
عملگرهای منطقی بر روی عبارات منطقی عمل میکنند و نتیجه آنها نیز یک مقدار بولی است .از این عملگرها اغلب برای شرطهای
پیچیده استفاده میشود .همانطور که قبالً یاد گرفتید مقادیر بولی میتوانند falseیا trueباشند .فرض کنید که var2و
اگر مقادیر دو طرف عملگر true ، ANDباشند عملگر ANDمقدار trueرا بر میگرداند .در غیر اینصورت اگر یکی از مقادیر یا هر
دوی آنها falseباشند مقدار falseرا بر میگرداند .در زیر جدول درستی عملگر ANDنشان داده شده است:
برای درک بهتر تأثیر عملگر ANDیاد آوری میکنم که این عملگر فقط در صورتی مقدار trueرا نشان میدهد که هر دو عملوند
مقدارشان trueباشد.در غیر اینصورت نتیجه تمام ترکیبهای بعدی falseخواهد شد .استفاده از عملگر ANDمانند استفاده
از عملگرهای مقایسه ای است .به عنوان مثال نتیجه عبارت زیر درست ) (trueاست اگر سن ) (ageبزرگتر از 98و salary
کوچکتر از 9111باشد.
عملگر ANDزمانی کارامد است که ما با محدود خاصی از اعداد سرو کار داریم .مثالً عبارت 10 <= x <= 100بدین معنی است
که xمیتواند مقداری شامل اعداد 91تا 911را بگیرد .حال برای انتخاب اعداد خارج از این محدوده میتوان از عملگر منطقی
اگر یکی یا هر دو مقدار دو طرف عملگر ، ORدرست ) (trueباشد،عملگر ORمقدار trueرا بر میگرداند .جدول درستی عملگر
در جدول باال مشاهده میکنید که عملگر ORدر صورتی مقدار falseرا بر میگرداند که مقادیر دو طرف آن falseباشند .کد
زیر را در نظر بگیرید.نتیجه این کد در صورتی درست ) (trueاست که رتبه نهایی دانش آموز ) (finalGradeبزرگتر از 95یا
برخالف دو اپراتور ORو ANDعملگر منطقی NOTیک عملگر یگانی است و فقط به یک عملوند نیاز دارد .این عملگر یک مقدار یا
اصطالح بولی را نفی میکند .مثالً اگر عبارت یا مقدار trueباشد آنرا falseو اگر falseباشد آنرا trueمیکند .جدول
X !X
true false
false true
نتیجه کد زیر در صورتی درست است که( ageسن) بزرگتر یا مساوی 98نباشد.
عملگرهای بیتی
عملگرهای بیتی به شما اجازه میدهند که شکل باینری انواع دادهها را دستکاری کنید .برای درک بهتر این درس توصیه میشود که
شما سیستم باینری و نحوه تبدیل اعداد دهدهی به باینری را از لینک زیر یاد بگیرید :
http://www.w3-farsi.com/?p=5698
در سیستم باینری (دودویی) که کامپیوتر از آن استفاده میکند وضعیت هر چیز یا خاموش است یا روشن .برای نشان دادن حالت
روشن از عدد 9و برای نشان دادن حالت خاموش از عدد 1استفاده میشود .بنابراین اعداد باینری فقط میتوانند صفر یا یک
باشند.اعداد باینری را اعداد در مبنای 7و اعداد اعشاری را اعداد در مبنای 91می گویند .یک بیت نشان دهنده یک رقم باینری است
و هر بایت نشان دهنده 8بیت است .به عنوان مثال برای یک داده از نوع intبه 17بیت یا 4بایت فضا برای ذخیره آن نیاز
داریم ،این بدین معناست که اعداد از 17رقم 1و 9برای ذخیره استفاده میکنند .برای مثال عدد 911وقتی به عنوان یک متغیر از
000000000000000000000000000001100100
عدد 911در مبنای ده معادل عدد 9911911در مبنای 7است .در اینجا 9رقم سمت راست نشان دهنده عدد 911در مبنای 7است و
مابقی صفرهای سمت راست برای پر کردن بیتهایی است که عدد از نوع intنیاز دارد .به این نکته توجه کنید که اعداد باینری
از سمت راست به چپ خوانده میشوند .عملگرهای بیتی C++در جدول زیر نشان داده شدهاند:
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
عملگر بیتی ANDکاری شبیه عملگر منطقی ANDانجام میدهد با این تفاوت که این عملگر بر روی بیتها کار میکند .اگر مقادیر
دو طرف آن 9باشد مقدار 9را بر میگرداند و اگر یکی یا هر دو طرف آن صفر باشد مقدار صفر را بر میگرداند .جدول درستی عمگر
1
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
همانطور که در مثال باال مشاهده میکنید نتیجه عملکرد عملگر ANDبر روی دو مقدار 5و 1عدد 9میشود .اجازه بدهید ببینیم که
5: 00000000000000000000000000000101
3: 00000000000000000000000000000011
------------------------------------
1: 00000000000000000000000000000001
ابتدا دو عدد 5و 1به معادل باینریشان تبدیل میشوند .از آنجاییکه هر عدد صحیح (int) 32بیت است از صفر برای پر کردن
بیتهای خالی استفاده میکنیم .با استفاده از جدول درستی عملگر بیتی ANDمیتوان فهمید که چرا نتیجه عدد یک میشود.
اگر مقادیر دو طرف عملگر بیتی ORهر دو صفر باشند نتیجه صفر در غیر اینصورت 9خواهد شد .جدول درستی این عملگر در زیر
آمده است:
نتیجه عملگر بیتی ORدر صورتی صفر است که عملوندهای دو طرف آن صفر باشند .اگر فقط یکی از دو عملوند یک باشد نتیجه
15
وقتی که از عملگر بیتی ORبرای دو مقدار در مثال باال ( 9و )1استفاده میکنیم نتیجه 95میشود .حال بررسی میکنیم که چرا این
7: 00000000000000000000000000000111
9: 00000000000000000000000000001001
-----------------------------------
15: 00000000000000000000000000001111
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
با استفاده از جدول درستی عملگر بیتی ORمیتوان نتیجه استفاده از این عملگر را تشخیص داد .عدد 9999باینری معادل عدد 95
صحیح است.
در صورتیکه عملوندهای دو طرف این عملگر هر دو صفر یا هر دو یک باشند نتیجه صفر در غیر اینصورت نتیجه یک میشود .در
مثال زیر تأثیر عملگر بیتی XORرا بر روی دو مقدار مشاده میکنید:
2
در زیر معادل باینری اعداد باال ( 5و )9نشان داده شده است.
5: 00000000000000000000000000000101
7: 00000000000000000000000000000111
-----------------------------------
2: 00000000000000000000000000000010
با نگاه کردن به جدول درستی عملگر بیتی ، XORمیتوان فهمید که چرا نتیجه عدد 7میشود.
این عملگر یک عملگر یگانی است و فقط به یک عملوند نیاز دارد .در زیر جدول درستی این عملگر آمده است:
1 0
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
0 1
عملگر بیتی NOTمقادیر بیتها را معکوس میکند .در زیر چگونگی استفاده از این عملگر آمده است:
-8
به نمایش باینری مثال باال که در زیر نشان داده شده است توجه نمایید.
7: 00000000000000000000000000000111
------------------------------------
-8: 11111111111111111111111111111000
این نوع عملگرها به شما اجازه میدهند که بیتها را به سمت چپ یا راست جا به جا کنید .دو نوع عملگر بیتی تغییر مکان وجود
دارد که هر کدام دو عملوند قبول میکنند .عملوند سمت چپ این عملگرها حالت باینری یک مقدار و عملوند سمت راست تعداد
این عملگر بیتهای عملوند سمت چپ را به تعداد nمکان مشخص شده توسط عملوند سمت راست ،به سمت چپ منتقل میکند.
40
در مثال باال ما بیتهای مقدار 91را دو مکان به سمت چپ منتقل کردهایم ،حال بیایید تأثیر این انتقال را بررسی کنیم:
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
10: 00000000000000000000000000001010
------------------------------------
40: 00000000000000000000000000101000
مشاهده میکنید که همه بیتها به اندازه دو واحد به سمت چپ منتقل شدهاند .در این انتقال دو صفر از صفرهای سمت چپ کم
این عملگر شبیه به عمگر تغییر مکان به سمت چپ است با این تفاوت که بیتها را به سمت راست جا به جا میکند .به عنوان
مثال:
6
با استفاده از عملگرتغییر مکان به سمت راست بیتهای مقدار 911را به اندازه 4واحد به سمت چپ جا به جا میکنیم .اجازه بدهید
100: 00000000000000000000000001100100
------------------------------------
6: 00000000000000000000000000000110
هر بیت به اندازه 4واحد به سمت راست منتقل میشود،بنابراین 4بیت اول سمت راست حذف شده و چهار صفر به سمت چپ
اضافه میشود.
تقدم عملگرها
تقدم عملگرها مشخص میکند که در محاسباتی که بیش از دو عملوند دارند ابتدا کدام عملگر اثرش را اعمال کند .عملگرها در C++
;number = 1 + 2 * 3 / 1
اگر ما حق تقدم عملگرها را رعایت نکنیم و عبارت باال را از سمت چپ به راست انجام دهیم نتیجه 1خواهد شد ( 9+7=1سپس
1×1=1و در آخر .)1/9=1اما کامپایلر با توجه به تقدم عملگرها محاسبات را انجام میدهد.برای مثال عمل ضرب و تقسیم نسبت به
www.SourceSara.com آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده- ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا
به دست1 میشود که نتیجه9 و سپس نتیجه آنها تقسیم بر1 ضربدر7 بنابراین در مثال فوق ابتدا عدد.جمع و تفریق تقدم دارند
: از باال به پایین آمده استC++ در جدول زیر تقدم عملگرهای. حاصل میشود9 جمع میشود و عدد9 با1 در آخر عدد.میآید
1 Scope :: Left-to-right
++ –
()
2 Postfix (unary) Left-to-right
[]
. ->
++ –
~ !
+ -
new delete
sizeof
(type)
9 Equality == != Left-to-right
11 Exclusive or ^ Left-to-right
12 Inclusive or | Left-to-right
14 Disjunction || Left-to-right
Assignment-level = *= /= %= += -=
15 Right-to-left
expressions >>= <<= &= ^= |=
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
?:
ابتدا عملگرهای با باالترین و سپس عملگرهای با پایینترین حق تقدم در محاسبات تأثیر میگذارند.به این نکته توجه کنید که تقدم
عملگرها ++و – به مکان قرارگیری آنها بستگی دارد (در سمت چپ یا راست عملوند باشند) .به عنوان مثال:
در عبارت اول ابتدا به مقدار numberیک واحد اضافه شده و 4میشود و سپس مقدار جدید با عدد 1جمع میشود و در نهایت
عدد 9به دست میآید.در عبارت دوم مقدار عددی 1به مقدار numberاضافه میشود و عدد 1به دست میآید.سپس این مقدار
در متغیر number2قرار میگیرد .و در نهایت مقدار numberبه 4افزایش مییابد .برای ایجاد خوانایی در تقدم عملگرها و انجام
در مثال باال ابتدا هر کدام از عباراتی که داخل پرانتز هستند مورد محاسبه قرار میگیرند.به نکته ای در مورد عبارتی که در داخل پرانتز
سوم قرار دارد توجه کنید.در این عبارت ابتدا مقدار داخلیترین پرانتز مورد محاسبه قرار میگیرد یعنی مقدار 1ضربدر 9شده و سپس
از 5کم میشود .اگر دو یا چند عملگر با حق تقدم یکسان موجود باشد ابتدا باید هر کدام از عملگرها را که در ابتدای عبارت میآیند
;number = 3 * 2 + 8 / 4
هر دو عملگر * و /دارای حق تقدم یکسانی هستند .بنابر این شما باید از چپ به راست آنها را در محاسبات تأثیر دهید.یعنی ابتدا
1را ضربدر 7میکنید و سپس عدد 8را بر 4تقسیم میکنید .در نهایت نتیجه دو عبارت را جمع کرده و در متغیر numberقرار
میدهید.
سی پالس پالس دارای تعدادی شیء و متد برای گرفتن ورودی از کاربر میباشد .حال میخواهیم درباره cinیکی دیگر از اشیاء
کالس Istraemبحث کنیم که یک مقدار را از کاربر دریافت میکند .کار cinاین است که تمام کاراکترهایی را که شما در محیط
کنسول تایپ میکنید تا زمانی که دکمه Enterرا میزنید میخواند .به برنامه زیر توجه کنید:
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
>#include <iostream
>#include <string
)(int main
{
;string name
;int age
;double height
Name is John.
Age is 18.
Height is 160.5.
ابتدا 1متغیر را برای ذخیره داده در برنامه تعریف میکنیم (خطوط 8و 1و .)91برنامه از کاربر میخواهد که نام خود را وارد کند
(خط .)97در خط 91شما به عنوان کاربر نام خود را وارد میکنید .مقدار متغیر نام ،برابر مقداری است که توسط cinخوانده
میشود.از آنجاییکه نام از نوع رشته است باید کتابخانه مربوط به رشتهها را در ابتدای برنامه وارد کنیم:
>#include <string
سپس برنامه از ما سن را سؤال میکند(خط .)94آن را در خط 95وارد کرده و در نهایت در خط 91و 99هم قد را وارد میکنیم.
ساختارهای تصمیم
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
ً
تقریبا همه زبانها ی برنامه نویسی به شما اجازه اجرای کد را در شرایط مطمئن میدهند .حال تصور کنید که یک برنامه دارای ساختار
تصمیم گیری نباشد و همه کدها را اجرا کند .این حالت شاید فقط برای چاپ یک پیغام در صفحه مناسب باشد ولی فرض کنید که
شما بخواهید اگر مقدار یک متغیر با یک عدد برابر باشد سپس یک پیغام چاپ شود آن وقت با مشکل مواجه خواهید شد . C++
راههای مختلفی برای رفع این نوع مشکالت ارائه میدهد .در این بخش با مطالب زیر آشنا خواهید شد:
دستورif
دستورif…else
دستورswitch
دستور if
میتوان با استفاده از دستور ifو یک شرط خاص که باعث ایجاد یک کد میشود یک منطق به برنامه خود اضافه کنید .دستور
ifسادهترین دستور شرطی است که برنامه میگوید اگر شرطی برقرار است کد معینی را انجام بده .ساختار دستور ifبه صورت
زیر است:
)if (condition
;code to execute
قبل از اجرای دستور ifابتدا شرط بررسی میشود.اگر شرط برقرار باشد یعنی درست باشد سپس کد اجرا میشود.شرط یک عبارت
مقایسه ای است .میتوان از عملگرهای مقایسه ای برای تست درست یا اشتباه بودن شرط استفاده کرد .اجازه بدهید که نگاهی
به نحوه استفاده از دستور ifدر داخل برنامه بیندازیم .برنامه زیر پیغام Hello Worldرا اگر مقدار numberکمتر از 91و
Goodbye Worldرا اگر مقدار numberاز 91بزرگتر باشد در صفحه نمایش میدهد.
Hello World.
Goodbye World.
در خط 9یک متغیر با نام numberتعریف و مقدار 5به آن اختصاص داده شده است .وقتی به اولین دستور ifدر خط 91
میرسیم برنامه تشخیص میدهد که مقدار numberاز 91کمتر است یعنی 5کوچکتر از 91است.
منطقی است که نتیجه مقایسه درست میباشد بنابراین دستور ifدستور را اجرا میکند(خط )99و پیغام Hello Worldچاپ
میشود .حال مقدار numberرا به 95تغییر میدهیم (خط .)94وقتی به دومین دستور ifدر خط 99میرسیم برنامه مقدار
numberرا با 91مقایسه میکند و چون مقدار numberیعنی 95از 10بزرگتر است برنامه پیغام Goodbye Worldرا چاپ
میکند(خط .)98به این نکته توجه کنید که دستور ifرا میتوان در یک خط نوشت:
شما میتوانید چندیندستور را در داخل دستور ifبنویسید .کافیست که از یک آکوالد برای نشان دادن ابتدا و انتهای دستورات
استفاده کنید .همه دستورات داخل بین آکوالد جز بدنه دستور ifهستند .نحوه تعریف چند دستور در داخل بدنه ifبه صورت
زیر است:
)if (condition
{
;statement1
;statement2
.
.
.
;statementN
}
در مثال باال اگر مقدار xاز 91بزرگتر باشد دو پیغام چاپ میشود .حال اگر به عنوان مثال آکوالد را حذف کنیم و مقدار xاز 91
کد باال در صورتی بهتر خوانده میشود که بین دستورات فاصله بگذاریم.
میبیند که دستور دوم (خط )1در مثال باال جز دستور ifنیست .اینجاست که چون ما فرض را بر این گذاشتهایم که مقدار xاز
91کوچکتر است پس خط )?This is still part of the if statement. (Reallyچاپ میشود .در نتیجه اهمیت
وجود آکوالد مشخص میشود .به عنوان تمرین همیشه حتی اگر فقط یک دستور در بدنه ifداشتید برای آن یک آکوالد بگذارید.
فراموش نکنید که از قلم انداختن یک آکوالد باعث به وجود آمدن خطا شده و یافتن آن را سخت میکند .مثالی دیگر در مورد
دستورif :
>#include <iostream
;using namespace std
)(int main
{
;int firstNumber
;int secondNumber
;cout << firstNumber << " < " << secondNumber << endl
}
)if (firstNumber > secondNumber
{
;cout << firstNumber << " > " << secondNumber << endl
}
)if (firstNumber <= secondNumber
{
;cout << firstNumber << "<= " << secondNumber << endl
}
)if (firstNumber >= secondNumber
{
;cout << firstNumber << " >= " << secondNumber << endl
}
}
ما از عملگرهای مقایسه ای در دستور ifاستفاده کردهایم .ابتدا دو عدد که قرار است با هم مقایسه شوند را به عنوان ورودی از
کاربر میگیریم.اعداد با هم مقایسه میشوند و اگر شرط درست بود پیغامی چاپ میشود.به این نکته توجه داشته باشید که شرطها
مقادیر بولی هستند ،بنابراین شما میتوانید نتیجه یک عبارت را در داخل یکمتغیر بولی ذخیره کنید و سپس از متغیر به عنوان شرط
در دستور ifاستفاده کنید .اگر مقدار yearبرابر 7111باشد سپس حاصل عبارت در متغیر isNewMilleniumذخیره
میشود.میتوان از متغیر برای تشخیص کد اجرایی بدنه دستور ifاستفاده کرد خواه مقدار متغیر درست باشد یا نادرست.
)if (isNewMillenium
{
;"!cout << "Happy New Millenium
}
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
دستور if…else
دستور ifفقط برای اجرای یک حالت خاص به کار میرود یعنی اگر حالتی برقرار بود کارخاصی انجام شود.اما زمانی که شما
بخواهید اگر شرط خاصی برقرار شد یک دستور و اگر برقرار نبود دستور دیگر اجرا شود باید از دستور if elseاستفاده کنید.
)if (condition
{
;code to execute if condition is true
}
else
{
;code to execute if condition is false
}
بدنه ifو بدنه elseدارید استفاده از آکوالد اختیاری است .کد داخل بلوک elseفقط در صورتی اجرا میشود که شرط داخل
دستور ifنادرست باشد .در زیر نحوه استفاده از دستور if…elseآمده است.
در خط 1یک متغیر به نام numberتعریف کردهایم و در خط 1تست میکنیم که آیا مقدار متغیر numberاز 91کمتر است یا نه
و چون کمتر است در نتیجه کد داخل بلوک ifاجرا میشود (خط )99و اگر مقدار numberرا تغییر دهیم و به مقداری بزرگتر از
91تغییر دهیم (خط ،)91شرط نادرست میشود (خط )77و کد داخل بلوک elseاجرا میشود (خط .)78
عملگر شرطی
عملگر شرطی (? ):در C++مانند دستور شرطی if…elseعمل میکند .در زیر نحوه استفاده از این عملگر آمده است:
عملگر شرطی تنها عملگر سه تایی C++است که نیاز به سه عملوند دارد ،شرط ،یک مقدار زمانی که شرط درست باشد و یک مقدار
زمانی که شرط نادرست باشد .اجازه بدهید که نحوه استفاده این عملگر را در داخل برنامه مورد بررسی قرار دهیم.
>#include <iostream
>#include <String
;using namespace std
)(int main
{
string ;"pet1 = "puppy
string ;"pet2 = "kitten
string ;type1
string ;type2
dog
cat
برنامه باال نحوه استفاده از این عملگر شرطی را نشان میدهد .خط یک به صورت زیر ترجمه میشود :اگر مقدار pet1برابر با
puppyسپس مقدار dogرا در type1قرار بده در غیر این صورت مقدار catرا type1قرار بده .خط دو به صورت زیر ترجمه
میشود :اگر مقدار pet2برابر با kittenسپس مقدار catرا در type2قرار بده در غیر این صورت مقدار dog.حال برنامه
;"type1 = "cat
هنگامی که چندین دستور در داخل یک بلوک ifیا elseدارید از عملگر شرطی استفاده نکنید چون خوانایی برنامه را پایین
میآورد.
دستور ifچندگانه
اگر بخواهید چند شرط را بررسی کنید چکار میکنید؟ میتوانید از چندین دستور ifاستفاده کنید و بهتر است که این دستورات
)if (condition
{
;code to execute
}
else
{
)if (condition
{
;code to execute
}
else
{
)if (condition
{
;code to execute
}
else
{
;code to execute
}
}
}
خواندن کد باال سخت است .بهتر است دستورات را به صورت تو رفتگی در داخل بلوک elseبنویسید .میتوانید کد باال را ساده
تر کنید:
)if (condition
{
;code to execute
}
)else if (condition
{
;code to execute
}
)else if (condition
{
;code to execute
}
www.SourceSara.com آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده- ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا
else
{
code to execute;
}
وابستهif نیز به دستورelse if ، else را یاد گرفتید باید بدانید که مانندelse if حال که نحوه استفده از دستور
else if اشتباه باشد دستورelse if حال اگر.اشتباه باشدif وقتی اجرا میشود که اولین دستورelse if دستور.است
راif else برنامه زیر نحوه استفاده از دستور.اجرا میشودelse و اگر آن نیز اجرا نشود در نهایت دستور.بعدی اجرا میشود
:نشان میدهد
#include <iostream>
#include <String>
using namespace std;
int main()
{
int choice;
if (choice == 1)
{
cout << "You might like my black t-shirt." << endl;
}
else if (choice == 2)
{
cout << "You might be a clean and tidy person." << endl;
}
else if (choice == 3)
{
cout << "You might be sad today." << endl;
}
else if (choice == 4)
{
cout << "You might be inlove right now." << endl;
}
else if (choice == 5)
{
cout << "Lemon might be your favorite fruit." << endl;
}
else
{
cout << "Sorry, your favorite color is not in the choices above." << endl;
}
www.SourceSara.com آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده- ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا
بسته به اینکه شما چه چیزی انتخاب میکنید پیغامهای مختلفی چاپ. وابسته استchoice خروجی برنامه باال به متغیر
. اجرا میشودelse اگر عددی که شما تایپ میکنید در داخل حالتهای انتخاب نباشد کد مربوط به بلوک.میشود
تو در توif دستور
. دیگرif در داخل دستورif یک دستور ساده. استفاده کردC++ تو در تو درif میتوان از دستور
if (condition)
{
code to execute;
if (condition)
{
code to execute;
}
else if (condition)
{
if (condition)
{
code to execute;
}
}
}
else
{
if (condition)
{
code to execute;
}
}
اجازه بدهید که برنامه را کالبد شکافی کنیم .ابتدا برنامه از شما درباره سنتان سؤال میکند (خط .)91در خط 91درباره جنستان از
شما سؤال میکند.سپس به اولین دستور ifمیرسد(خط .)91در این قسمت اگر سن شما بیشتر از 97سال باشد برنامه وارد بدنه
دستور ifمیشود در غیر اینصورت وارد بلوک ( elseخط )14مربوط به همین دستور ifمیشود.
حال فرض کنیم که سن شما بیشتر از 97سال است و شما وارد بدنه اولین ifشدهاید .در بدنه اولین ifدو دستور ifدیگر را
مشاهده میکنید .اگر سن کمتر 71باشد شما وارد بدنه ifدوم میشوید و اگر نباشد به قسمت elseمتناظر با آن میروید(خط
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
.)71دوباره فرض میکنیم که سن شما کمتر از 71باشد ،در اینصورت وارد بدنه ifدوم شده و با یک ifدیگر مواجه میشوید(خط
.)71در اینجا جنسیت شما مورد بررسی قرار میگیرد که اگر برابر ” “maleباشد ،کدهای داخل بدنه سومین ifاجرا میشود در
غیر اینصورت قسمت elseمربوط به این ifاجرا میشود(خط .)74پیشنهاد میشود که از ifتو در تو در برنامه کمتر استفاده
عملگرهای منطقی به شما اجازه میدهند که چندین شرط را با هم ترکیب کنید .این عملگرها حداقل دو شرط را در گیر میکنند و در
آخر یک مقدار بولی را بر میگردانند .در جدول زیر برخی از عملگرهای منطقی آمده است :
خواهد شد .
خواهد شد .
falseاست که مقدار falseباشد و در صورتی )z = !(x > 2 Not !
به عنوان مثال جمله )z = (x > 2) && (y < 10را به این صورت بخوانید “ :در صورتی مقدار zبرابر trueاست که مقدار
xبزرگتر از 7و مقدار yکوچکتر از 91باشد در غیر اینصورت falseاست” .این جمله بدین معناست که برای اینکه مقدار کل
دستور trueباشد باید مقدار همه شروط trueباشد .عملگر منطقی )||( ORتأثیر متفاوتی نسبت به عملگر منطقی AND
)&&(دارد .نتیجه عملگر منطقی ORبرابر trueاست اگر فقط مقدار یکی از شروط trueباشد .و اگر مقدار هیچ یک از شروط
www.SourceSara.com آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده- ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا
را با هم ترکیب کرده و در یک عبارت به کار بردOR وAND میتوان عملگرهای منطقی. خواهد شدfalse نباشد نتیجهtrue
:مانند
(y > 3) || (z در اینجا ابتدا عبارت.در اینجا استفاده از پرانتز مهم است چون از آن در گروه بندی شرطها استفاده میکنیم
( مقایسهx == 1) با نتیجهAND ( به علت تقدم عملگرها)سپس نتیجه آن بوسیله عملگر. <مورد بررسی قرار میگیرد10)
: حال بیایید نحوه استفاده از عملگرهای منطقی در برنامه را مورد بررسی قرار دهیم.میشود
#include <iostream>
#include <String>
using namespace std;
int main()
{
int age;
string gender;
برنامه باال نحوه استفاده از عملگر منطقی ANDرا نشان میدهد (خط .)91وقتی به دستور ifمیرسید (خط )91برنامه سن شما
را چک میکند.اگر سن شما بزرگتر از 97و کوچکتر از 71باشد (سنتان بین 97و 71باشد) یعنی مقدار هر دو trueباشد سپس
کدهای داخل بلوک ifاجرا میشوند.اگر نتیجه یکی از شروط falseباشد کدهای داخل بلوک elseاجرا میشود .عملگر
ANDعملوند سمت چپ را مرود بررسی قرار میدهد.اگر مقدار آن falseباشد دیگر عملوند سمت راست را بررسی نمیکند و
مقدار falseرا بر میگرداند .بر عکس عملگر || عملوند سمت چپ را مورد بررسی قرار میدهد و اگر مقدار آن trueباشد سپس
)if (x == 2 | y == 3
{
//Some code here
}
نکته مهم اینجاست که شما میتوانید از عملگرهای & و | به عنوان عملگر بیتی استفاده کنید .تفاوت جزئی این عملگرها وقتی
که به عنوان عملگر بیتی به کار میروند این است که دو عملوند را بدون در نظر گرفتن مقدار عملوند سمت چپ مورد بررسی قرار
میدهند .به عنوان مثال حتی اگر مقدار عملوند سمت چپ falseباشد عملوند سمت چپ به وسیله عملگر بیتی )&( AND
ارزیابی میشود .اگر شرطها را در برنامه ترکیب کنید استفاده از عملگرهای منطقی )&&( ANDو )||( ORبه جای عملگرهای بیتی
)&( ANDو )|( ORبهتر خواهد بود .یکی دیگر از عملگرهای منطقی عملگر )!( NOTاست که نتیجه یک عبارت را خنثی یا منفی
دستور Switch
در C++ساختاری به نام switchوجود دارد که به شما اجازه میدهد که با توجه به مقدار ثابت یک متغیر چندین انتخاب داشته
باشید .دستور switchمعادل دستور ifتو در تو است با این تفاوت که در دستور switchمتغیر فقط مقادیر ثابتی از اعداد ،
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
رشتهها و یا کاراکترها را قبول میکند .مقادیر ثابت مقادیری هستند که قابل تغیر نیستند .در زیر نحوه استفاده از دستور switch
آمده است:
)switch (testVar
{
case compareVal1:
code to execute ;if testVar == compareVa11
;break
case compareVa12:
code to execute ;if testVar == compareVa12
;break
.
.
.
case compareVa1N:
code to execute ;if testVer == compareVa1N
;break
default:
code to execute ;if none of the values above match the testVar
;break
}
ابتدا یک مقدار در متغیر switchکه در مثال باال testVarاست قرار میدهید.این مقدار با هر یک از عبارتهای caseداخل
بلوک switchمقایسه میشود .اگر مقدار متغیر با هر یک از مقادیر موجود در دستورات caseبرابر بود کد مربوط به آنcase
اجرا خواهد شد .به این نکته توجه کنید که حتی اگر تعداد خط کدهای داخل دستور caseاز یکی بیشتر باشد نباید از آکوالد
استفاده کنیم .آخر هر دستور caseبا کلمه کلیدی breakتشخیص داده میشود که باعث میشود برنامه از دستور switch
خارج شده ودستورات بعد از آن اجرا شوند .اگر این کلمه کلیدی از قلم بیوفتد برنامه با خطا مواجه میشود .دستور switchیک
defaultدارد .این دستور در صورتی اجرا میشود که مقدار متغیر با هیچ یک از مقادیر دستورات caseبرابر نباشد. بخش
دستور defaultاختیاری است و اگر از بدنه switchحذف شود هیچ اتفاقی نمیافتد .مکان این دستور هم مهم نیست اما بر
طبق تعریف آن را در پایان دستورات مینویسند .به مثالی در مورد دستور switchتوجه کنید:
>#include <iostream
>#include <String
;using namespace std
)(int main
{
;int choice
switch (choice)
{
case 1:
cout << "Your favorite pet is Dog." << endl;
break;
case 2:
cout << "Your favorite pet is Cat." << endl;
break;
case 3:
cout << "Your favorite pet is Rabbit." << endl;
break;
case 4:
cout << "Your favorite pet is Turtle." << endl;
break;
case 5:
cout << "Your favorite pet is Fish." << endl;
break;
case 6:
cout << "Your favorite pet is not in the choices." << endl;
break;
default:
cout << "You don't have a favorite pet." << endl;
break;
}
}
شما عدد را. به اسم هر حیوان یک عدد نسبت داده شده است.برنامه باال به شما اجازه انتخاب حیوان مورد عالقهتان را میدهد
مقایسه میشود و با هر کدام از آن مقادیر که برابر بود پیغام مناسبcase با مقادیرswitch وارد میکنید و این عدد در دستور
یکی دیگر از ویژگیهای. اجرا میشودdefault ها برابر نبود دستورcase اگر هم با هیچ کدام از مقادیر.نما یش داده خواهد شد
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
دستور switchاین است که شما میتوانید از دو یا چند caseبرای نشان داده یک مجموعه کد استفاده کنید .در مثال زیر اگر
مقدار numberعدد 2 ،9یا 1باشد یک کد اجرا میشود .توجه کنید که caseها باید پشت سر هم نوشته شوند.
)switch (number
{
case 1:
case 2:
case 3:
;cout << "This code is shared by three values." << endl
;break
}
همانطور که قبالً ذکر شد دستور switchمعادل دستور ifتو در تو است .برنامه باال را به صورت زیر نیز میتوان نوشت:
ً
دقیقا نتیجه ای مانند دستور switchدارد .دستور defaultمعادل دستور elseمیباشد .حال از بین این دو دستور کد باال
( switchو )if elseکدامیک را انتخاب کنیم .از دستور switchموقعی استفاده میکنیم که مقداری که میخواهیم با دیگر
مقادیر مقایسه شود ثابت باشد .مثالً در مثال زیر هیچگاه از switchاستفاده نکنید.
)switch (myNumber
{
case x:
cout << "Error, you can't use variables as a value to be compared in a case
;"statment.
;break
}
مشاهده میکنید که با اینکه مقدار xعدد 5است و به طور واضح با متغیر myNumberمقایسه شده است برنامه خطا میدهد
چون xیک ثابت نیست بلکه یک متغیر است یا به زبان ساده تر ،قابلیت تغییر را دارد .اگر بخواهید از xاستفاده کنید و برنامه
خطا ندهد باید از کلمه کلیدی constبه صورت زیر استفاده کنید.
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
)switch (myNumber
{
case x:
;cout << "Error has been fixed!" << endl
;break
}
از کلمه کلیدی constبرای ایجاد ثابتها استفاده میشود.توجه کنید که بعد از تعریف یک ثابت نمیتوان مقدار آن را در طول
ً
حتما مقداردهی کنید .دستور switchیک مقدار را با مقادیر caseها برنامه تغییر داد .به یاد داشته باشید که باید ثابتها را
مقایسه میکند و شما الزم نیست که به شکل زیر مقادیر را با هم مقایسه کنید:
)switch (myNumber
{
case x > myNumber:
cout << "switch staments can't test if a value is less than or greater than the other
;"value.
;break
}
تکرار
ساختارهای تکرار به شما اجازه میدهند که یک یا چند دستور کد را تا زمانی که یک شرط برقرار است تکرار کنید.بدون ساختارهای
تکرار شما مجبورید همان تعداد کدها را بنویسید که بسیار خسته کننده است.مثالً شما مجبورید 91بار جمله ”“Hello World.
البته شما میتوانید با کپی کردن این تعداد کد را راحت بنویسید ولی این کار در کل کیفیت کدنویسی را پایین میآورد .راه بهتر
برای نوشتن کدهای باال استفاده از حلقهها است .حلقهها در C++عبارتاند از:
while
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
حلقه While
ابتداییترین ساختار تکرار در C++حلقه Whileاست.ابتدا یک شرط را مورد بررسی قرار میدهد و تا زمانیکه شرط برقرار باشد
کدهای درون بلوک اجرا میشوند .ساختار حلقه Whileبه صورت زیر است:
)while(condition
{
;code to loop
}
میبینید که ساختار Whileمانند ساختار ifبسیار ساده است .ابتدا یک شرط را که نتیجه آن یک مقدار بولی است مینویسیم
اگر نتیجه درست یا trueباشد سپس کدهای داخل بلوک Whileاجرا میشوند .اگر شرط غلط یا falseباشد وقتی که برنامه به
حلقه Whileبرسد هیچکدام از کدها را اجرا نمیکند .برای متوقف شدن حلقه باید مقادیر داخل حلقه Whileاصالح شوند .به یک
متغیر شمارنده در داخل بدنه حلقه نیاز داریم .این شمارنده برای آزمایش شرط مورد استفاده قرار میگیرد و ادامه یا توقف حلقه به
نوعی به آن وابسته است .این شمارنده را در داخل بدنه باید کاهش یا افزایش دهیم .در برنامه زیر نحوه استفاده از حلقه While
آمده است:
>#include <iostream
)(int main
{
;int counter = 1
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
برنامه باال 91بار پیغام ! Hello Worldرا چاپ میکند .اگر از حلقه در مثال باال استفاده نمیکردیم مجبور بودیم تمام 91خط را
تایپ کنیم .اجازه دهید که نگاهی به کدهای برنامه فوق بیندازیم .ابتدا در خط 9یک متغیر تعریف و از آن به عنوان شمارنده حلقه
استفاده شده است.سپس به آن مقدار 9را اختصاص میدهیم چون اگر مقدار نداشته باشد نمیتوان در شرط از آن استفاده کرد.
در خط 1حلقه Whileرا وارد میکنیم .در حلقه Whileابتدا مقدار اولیه شمارنده با 91مقایسه میشود که آیا از 91کمتر است یا با
آن برابر است .نتیجه هر بار مقایسه ورود به بدنه حلقه Whileو چاپ پیغام است .همانطور که مشاهده میکنید بعد از هر بار
مقایسه مقدار شمارنده یک واحد اضافه میشود (خط .)97حلقه تا زمانی تکرار میشود که مقدار شمارنده از 91کمتر باشد.
اگر مقدار شمارنده یک بماند و آن را افزایش ندهیم و یا مقدار شرط هرگز falseنشود یک حلقه بینهایت به وجود میآید .به
این نکته توجه کنید که در شرط باال به جای عالمت < از =< استفاده شده است .اگر از عالمت <استفاده میکردیم کد ما 1بار تکرار
میشد چون مقدار اولیه 9است و هنگامی که شرط به 91برسد falseمیشود چون 10<10نیست .اگر میخواهید یک حلقه بی
نهایت ایجاد کن ید که هیچگاه متوقف نشود باید یک شرط ایجاد کنید که همواره درست ) (trueباشد.
)while(true
{
//code to loop
}
این تکنیک در برخی موارد کارایی دارد و آن زمانی است که شما بخواهید با استفاده از دستورات breakو returnکه در آینده
حلقه do whileیکی دیگر از ساختارهای تکرار است .این حلقه بسیار شبیه حلقه whileاست با این تفاوت که در این حلقه
ابتدا کد اجرا می شودو سپس شرط مورد بررسی قرار میگیرد .ساختار حلقه do whileبه صورت زیر است:
do
{
;code to repeat
همانطور که مشاهده میکنید شرط در آخر ساختار قرار دارد .این بدین معنی است که کدهای داخل بدنه حداقل یکبار اجرا میشوند.
برخالف حلقه whileکه اگر شرط نادرست باشد دستورات داخل بدنه اجرا نمیشوند .برای اثبات این موضوع به کدهای زیر توجه
کنید:
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
!Hello World
با اجرای کد باال ،اول دستورات بلوک doاجرا میشوند و بعد مقدار numberبا عدد 91مقایسه میشود .در نتیجه حتی اگر شرط
اما در کد باال چون اول مقدار numberابتدا مورد مقایسه قرار میگیرد ،اگر شرط درست نباشد دیگر کدی اجرا نمیشود .یکی از
موارد برتری استفاده از حلقه do whileنسبت به حلقه whileزمانی است که شما بخواهید اطالعاتی از کاربر دریافت کنید.
در دو کد زیر ،یک عملیات یکسان توسط دو حلقه whileو do whileپیاده سازی شده است:
//while version
;cout << "Enter a number greater than 10: " << endl
;cin >> number
do
{
;cout << "Enter a number greater than 10: " << endl
;cin >> number
;)} while (number < 10
حلقه for
یکی دیگر از ساختارهای تکرار حلقه forاست .این حلقه عملی شبیه به حلقه whileانجام میدهد و فقط دارای چند خصوصیت
مقدار دهی اولیه ) (initializationاولین مقداری است که به شمارنده حلقه میدهیم.شمارنده فقط در داخل حلقه for
شرط ) (conditionدر اینجا مقدار شمارنده را با یک مقدار دیگر مقایسه میکند و تعیین میکند که حلقه ادامه یابد یا نه.
>#include <iostream
;using namespace std
)(int main
{
)for (int i = 1; i <= 10; i++
{
;cout << "Number " << i << endl
}
}
Number 1
Number 2
Number 3
Number 4
Number 5
Number 6
Number 7
Number 8
Number 9
Number 10
برنامه باال اعداد 9تا 91را با استفاده از حلقه forمیشمارد.ابتدا یک متغیر به عنوان شمارنده تعریف میکنیم و آن را با مقدار 9
مقدار دهی اولیه میکنیم .سپس با استفاده از شرط آن را با مقدار 91مقایسه میکنیم که آیا کمتر است یا مساوی؟ توجه کنید که
ً
فورا اجرا نمیشود .کد اجرا میشود و ابتدا رشته Numberو سپس مقدار جاری iیعنی 9را چاپ قسمت سوم حلقه )(i++
میکند .آنگاه یک واحد به مقدار iاضافه شده و مقدار iبرابر 7میشود و بار دیگر iبا عدد 91مقایسه میشود و این حلقه تا
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
زمانی که مقدار شرط trueشود ادامه مییابد .حال اگر بخواهید معکوس برنامه باال را پیاده سازی کنید یعنی اعداد از بزرگ به
کد باال اعداد را از 91به 9چاپ میکند (از بزرگ به کوچک) .مقدار اولیه شمارنده را 91میدهیم و با استفاده از عملگر کاهش ()--
برنامه ای که شمارش معکوس را انجام میدهد ایجاد میکنیم .میتوان قسمت شرط و عملگر را به صورتهای دیگر نیز تغییر داد.
به عنوان مثال میتوان از عملگرهای منطقی در قسمت شرط و از عملگرهای تخصیصی در قسمت عملگر افزایش یا کاهش استفاده
}
به این نکته توجه کنید که اگر از چندین متغیر شمارنده یا عملگر در حلقه forاستفاده میکنید باید آنها را با استفاده از کاما از
C++به شما اجازه میدهد که از حلقهها به صورت تو در تو استفاده کنید .اگر یک حلقه در داخل حلقه دیگر قرار بگیرد ،به آن حلقه
تو در تو گفته میشود .در این نوع حلقهها ،به ازای اجرای یک بار حلقه بیرونی ،حلقه داخلی به طور کامل اجرا میشود .در زیر نحوه
)while (condition
{
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
)while (condition
{
;)//statement(s
}
;)//statement(s
}
do
{
;)//statement(s
do
{
;)//statement(s
;)} while (condition
نکته ای که در مورد حلقههای تو در تو وجود دارد این اسن که میتوان از یک نوع حلقه در داخل نوع دیگر استفاده کرد .مثالً
میتوان از حلقه forدر داخل حلقه whileاستفاده نمود .در مثال زیر نحوه استفاده از این حلقهها ذکر شده است .فرض کنید
در کد باال به ازای یک بار اجرای حلقه forاول (خط ،)1حلقه forدوم ( )8-99به طور کامل اجرا میشود .یعنی وقتی مقدار i
برابر عدد 9میشود ،عالمت * توسط حلقه دوم 5بار چاپ میشود ،وقتی iبرابر 7میشود ،دوباره عالمت * پنج بار چاپ میشود
و … .در کل منظور از دو حلقه forاین است که در 4سطر عالمت * در 5ستون چاپ شود یا 4سطر ایجاد شود و در هر سطر 5
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
بار عالمت * چاپ شود .خط 97هم برای ایجاد خط جدید است .یعنی وقتی حلقه داخلی به طور کامل اجرا شد ،یک خط جدید
گاهی اوقات با وجود درست بودن شرط میخواهیم حلقه متوقف شود .سؤال اینجاست که چطور این کار را انجام دهید؟ با استفاده
از کلمه کلیدی breakحلقه را متوقف کرده و با استفاده از کلمه کلیدی continueمیتوان بخشی از حلقه را رد کرد و به مرحله
بعد رفت .برنامه زیر نحوه استفاده از continueو breakرا نشان میدهد:
>#include <iostream
)(int main
{
;cout << "Demonstrating the use of break" << endl
Number 1
Number 2
Number 3
Number 4
Number 1
Number 2
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
Number 3
Number 4
Number 6
Number 7
Number 8
Number 9
در این برنامه از حلقه forبرای نشان دادن کاربرد دو کلمه کلیدی فوق استفاده شده است اگر به جای forاز حلقههای while
و do…whileاستفاده میشد نتیجه یکسانی به دست میآمد .همانطور که در شرط برنامه (خط )99آمده است وقتی که مقدار x
حلقه بالفاصله متوقف میشود حتی اگر شرط x < 10برقرار باشد.از طرف دیگر در خط 74حلقه forفقط برای یک تکرار خاص
متوقف شده و سپس ادامه مییابد(.وقتی مقدار xبرابر 5شود حلقه از 5رد شده و مقدار 5را چاپ نمیکند و بقیه مقادیر چاپ
میشوند).
آرایهها
آرایه نوعی متغیر است که لیستی از آدرسهای مجموعه ای از دادههای هم نوع را در خود ذخیره میکند.تعریف چندین متغیر از
یک نوع برای هدفی یکسان بسیار خسته کننده است.مثالً اگر بخواهید صد متغیر از نوع اعداد صحیح تعریف کرده و از آنها
ً
طمئنا تعریف این همه متغیر بسیار کسالت آور و خسته کننده است.اما با استفاده از آرایه میتوان همه آنها را دراستفاده کنید .م
یک خط تعریف کرد .در زیر راهی ساده برای تعریف یک آرایه نشان داده شده است:
;]datatype arrayName[length
Datatypeنوع دادههایی را نشان میدهد که آرایه در خود ذخیره میکند.کروشه که بعد از نوع داده قرار میگیرد و نشان دهنده
استفاده از آرایه است . lenghtیا طول آرایه که به کامپایلر میگوید شما قصد دارید چه تعداد داده یا مقدار را در آرایه ذخیره
کنید arrayName .که نام آرایه را نشان میدهد.هنگام نامگذاری آرایه بهتر است که نام آرایه نشان دهنده نوع آرایه باشد.به
عنوان مثال برای نامگذاری آرایه ای که اعداد را در خود ذخیره میکند از کلمه numbersاستفاده کنید.برای تعریف یک آرایه که 5
مقدار از نوع اعداد صحیح در خود ذخیره میکند باید به صورت زیر عمل کنیم:
;]int numbers[5
در این مثال 5آدرس از فضای حافظه کامپیوتر شما برای ذخیره 5مقدار رزرو میشود .حال چطور مقادیرمان را در هر یک از این
آدرسها ذخیره کنیم؟ برای دسترسی و اصالح مقادیر آرایه از اندیس یا مکان آنها استفاده میشود.
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
اندیس یک آرایه از صفر شروع شده و به یک واحد کمتر از طول آرایه ختم میشود.به عنوان مثال شما یک آرایه 5عضوی
دارید،اندیس آرایه از 1تا 4میباشد چون طول آرایه 5است پس 5-9برابر است با .4این بدان معناست که اندیس 1نشان دهنده
اولین عضو آرایه است و اندیس 9نشان دهنده دومین عضو و الی آخر .برای درک بهتر مثال باال به شکل زیر توجه کنید:
به هر یک از اجزاء آرایه و اندیسهای داخل کروشه توجه کنید .کسانی که تازه شروع به برنامه نویسی کردهاند معموال ً در گذاشتن
اندیس دچار اشتباه میشوند و مثالً ممکن است در مثال باال اندیسها را از 9شروع کنند .یکی دیگر از راههای تعریف سریع و مقدار
ً
فورا بعد از تعریف اندازه آرایه مقادیر را در داخل آکوالد قرار دهید .به یاد داشته باشید که هر کدام از ر این روش شما میتوانید
مقادیر را با استفاده از کاما از هم جدا کنید .همچنین تعداد مقادیر داخل آکوالد باید با اندازه آرایه تعریف شده برابر باشد .به مثال
این مثال با مثال قبل هیچ تفاوتی ندارد و تعداد خطهای کدنویسی را کاهش میدهد.شما میتوانید با استفاده از اندیس به مقدار
هر یک از اجزاء آرایه دسترسی یابید و آنها را به دلخواه تغییر دهید.تعداد اجزاء آرایه در مثال باال 5است و ما 5مقدار را در آن
قرار میدهیم .اگر تعداد مقادیری که در آرایه قرار میدهیم کمتر یا بیشتر از طول آرایه باشد با خطا مواجه میشویم.یک راه بسیار
به سادگی و بدون احتیاج ذکر طول میتوان مقادیر را در داخل آکوالد قرار داد .کامپایلر به صورت اتوماتیک با شمارش مقادیر طول
در زیر مثالی در مورد استفاده از آرایهها آمده است .در این برنامه 5مقدار از کاربر گرفته شده و میانگین آنها حساب میشود:
>#include <iostream
;using namespace std
)(int main
{
;]int numbers[5
در خط 1یک آرایه تعریف شده است که میتواند 5عدد صحیح را در خود ذخیره کند.خطوط 8و 1متغیرهایی تعریف شدهاند که
از آنها برای محاسبه میانگین استفاده میشود.توجه کنید که مقدار اولیه totalصفر است تا از بروز خطا هنگام اضافه شدن
مقدار به آن جلوگیری شود.در خطوط 99تا 95حلقه forبرای تکرار و گرفتن ورودی از کاربر تعریف شده است.از متد )(size
برای تشخیص تعداد اجزای آرایه استفاده میشود.اگر چه میتوانستیم به سادگی در حلقه forمقدار 5را برای شرط قرار دهیم
ولی استفاده از خاصیت طول آرایه کار راحت تری است و میتوانیم طول آرایه را تغییر دهیم و شرط حلقه forبا تغییر جدید
هماهنگ میشود .در خط 94ورودی دریافت شده از کاربر در آرایه ذخیره میشود.اندیس استفاده شده در ( numberخط )94
مقدار iجاری در حلقه است.برای مثال در ابتدای حلقه مقدار iصفر است بنابراین وقتی در خط 94اولین داده از کاربر گرفته
میشود اندیس آن برابر صفر میشود .در تکرار بعدی iیک واحد اضافه میشود و در نتیجه در خط 94و بعد از ورود دومین داده
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
توسط کاربر اندیس آن برابر یک میشود .این حالت تا زمانی که شرط در حلقه forبرقرار است ادامه مییابد .در خطوط 99-71از
حلقه forدیگر برای دسترسی به مقدار هر یک از دادههای آرایه استفاده شده است.در این حلقه نیز مانند حلقه قبل از مقدار
هر یک از اجزای عددی آرایه به متغیر totalاضافه میشوند .بعد از پایان حلقه میتوانیم میانگین اعداد را حساب کنیم (خط
.)77مقدار totalرا بر تعداد اجزای آرایه ( تعداد عددها) تقسیم میکنیم.برای دسترسی به تعداد اجزای آرایه میتوان از متد
()sizeاستفاده کرد.توجه کنید که در اینجا ما خروجی متد ()sizeرا به نوع doubleتبدیل کردهایم بنابراین نتیجه عبارت
یک مقدار از نوع doubleخواهد شد و دارای بخش کسری میباشد .حال اگر عملوندهای تقسیم را به نوع doubleتبدیل
نکنیم نتیجه تقسیم یک عدد از نوع صحیح خواهد شد و دارای بخش کسری نیست .خط 74مقدار میانگین را در صفحه نمایش
چاپ میکند .طول آرایه بعد از مقدار دهی نمیتواند تغیر کند .به عنوان مثال اگر یک آرایه را که شامل 5جز است مقدار دهی کنید
دیگر نمیتوانید آن را مثالً به 91جز تغییر اندازه دهید.البته تعداد خاصی از کالسها مانند آرایهها عمل میکنند و توانایی تغییر
تعداد اجزای تشکیل دهنده خود را دارند.آرایهها در برخی شرایط بسیار پر کاربرد هستند و تسلط شما بر این مفهوم و اینکه چطور
آرایههای چند بعدی آرایههایی هستند که برای دسترسی به هر یک از عناصر آنها باید از چندین اندیس استفاده کنیم.یک آرایه
چند بعدی را میتوان مانند یک جدول با تعدای ستون و ردیف تصور کنید .با افزایش اندیسها اندازه ابعاد آرایه نیز افزایش مییابد
و آرایههای چند بعدی با بیش از دو اندیس به وجود میآیند .نحوه ایجاد یک آرایه با دو بعد به صورت زیر است:
;]datatype arrayName[lengthX][lengthY
;]datatype arrayName[lengthX][lengthY][lengthZ
میتوان یک آرایه با تعداد زیادی بعد ایجاد کرد به شرطی که هر بعد دارای طول مشخصی باشد .به دلیل اینکه آرایههای سه بعدی
یا آرایههای با بیشتر از دو بعد بسیار کمتر مورد استفاده قرار میگیرند اجازه بدهید که در این درس بر روی آرایههای دو بعدی تمرکز
کنیم .در تعریف این نوع آرایه ابتدا نوع آرایه یعنی اینکه آرایه چه نوعی از انواع داده را در خود ذخیره میکند را مشخص میکنیم.
سپس نام آرایه و در نهایت دو جفت کروشه قرار میدهیم .در یک آرایه دو بعدی برای دسترسی به هر یک از عناصر به دو مقدار
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
نیاز داریم یکی مقدار Xو دیگری مقدار Yکه مقدار xنشان دهنده ردیف و مقدار Yنشان دهنده ستون آرایه است البته اگر ما
آرایه دو بعدی را به صورت جدول در نظر بگیریم.یک آرایه سه بعدی را میتوان به صورت یک مکعب تصور کرد که دارای سه بعد
است و xطولY ،عرض و zارتفاع آن است .یک مثال از آرایه دو بعدی در زیر آمده است:
;]int numbers[3][5
کد باال به کامپایلر میگوید که فضای کافی به عناصر آرایه اختصاص بده (در این مثال 95خانه) .در شکل زیر مکان هر عنصر در یک
مقدار 1را به xاختصاص میدهیم چون 1سطر و مقدار 5را به Yچون 5ستون داریم اختصاص میدهیم .چطور یک آرایه چند
بعدی را مقدار دهی کنیم؟ چند راه برای مقدار دهی به آرایهها وجود دارد.
ً
حتما باید ذکر شوند: البته میتوان تعداد سطرها را هم ننوشت ولی تعداد ستونها
همانطور که مشاهده میکنید برای دسترسی به هر یک از عناصر در یک آرایه دو بعدی به سادگی میتوان از اندیسهای Xو Y
گردش در میان عناصر آرایههای چند بعدی نیاز به کمی دقت دارد .برنامه زیر نشان میدهد که چطور از حلقه forبرای خواندن
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
همانطور که در مثال باال نشان داده شده است با استفاده از یک حلقه forنمیتوان به مقادیر دسترسی یافت بلکه به یک حلقه
forتو در تو نیاز داریم ،زیرا آرایه دو بعدی به صورت یک جدول شامل سطر و ستون است ،پس الزم است که از یک حلقه for
برای گردش در میان سطرها و از حلقه forدیگر برای گردش در میان ستونهای این جدول (آرایه) استفاده کنیم.
اولین حلقه ( forخط )97برای گردش در میان ردیفهای آرایه به کار میرود .این حلقه تا زمانی ادامه مییابد که مقدار ردیف
کمتر از طول اولین بعد باشد (زیرا اندیس ابعاد آرایه از صفر شروع میشود .در مثال باال مقدار اولین بعد برابر 1است) .در این مثال
از متد )( sizeاستفاده کردهایم.این متد طول آرایه را در یک بعد خاص نشان میدهد .به عنوان مثال برای به دست آوردن طول
اولین یا همان تعداد سطرها کافیست که نام آرایه را به این متد ارسال میکنیم.
در داخل اولین حلقه forحلقه forدیگری تعریف شده است (خط .)94در این حلقه یک شمارنده برای شمارش تعداد ستونهای
)(colهر ردیف تعریف شده است و در شرط داخل آن بار دیگر از متد )( sizeاستفاده شده است ،ولی این بار مقدار
] numbers[0را به آن ارسال میکنیم تا طول بعد دوم آرایه را به دست آوریم .پس به عنوان مثال وقتی که مقدار ردیف )(row
صفر باشد ،حلقه دوم از ] [0][0تا [ ]4[]0اجرا میشود .سپس مقدار هر عنصر از آرایه را با استفاده از حلقه نشان میدهیم ،اگر
مقدار ردیف )(rowبرابر 1و مقدار ستون ) (colبرابر 1باشد مقدار عنصری که در ستون 9و ردیف (numbers[0][0]) 9قرار
ً
فورا دستورات بعد از آن اجرا خواهند شد ،که در اینجا دستور ;cout << endlکه بعد از اینکه دومین حلقه تکرار به پایان رسید،
به برنامه اطالع میدهد که به خط بعد برود .سپس حلقه با اضافه کردن یک واحد به مقدار rowاین فرایند را دوباره تکرار میکند.
سپس دومین حلقه forاجرا شده و مقادیر دومین ردیف نمایش داده میشود .این فرایند تا زمانی اجرا میشود که مقدار row
کمتر از طول اولین بعد باشد .حال بیایید آنچه را از قبل یاد گرفتهایم در یک برنامه به کار بریم.این برنامه نمره چهار درس مربوط به
در برنامه باال یک آرایه چند بعدی از نوع doubleتعریف شده است (خط .)9همچنین یک متغیر به نام totalتعریف میکنیم
که جمع نمرات وارد شده برای دانش آموز در آن قرار میگیرد .حال وارد حلقه forتو در تو میشویم (خط )91در اولین حلقه
forیک متغیر به نام studentتعریف کردهایم که مقادیر اولین بعد آرایه ( که همان تعداد دانش آموزان است ) در آن قرار
میگیرد .از متد متد )( sizeهم برای تشخیص تعداد دانش آموزان استفاده شده است .وارد بدنه حلقه forمیشویم.در خط
97مقدار متغیر totalرا برابر صفر قرار میدهیم .سپس برنامه یک پیغام را نشان میدهد و از شما میخواهد که نمرات دانش
آموز را وارد کنید (student + 1).عدد 9را به studentاضافه کردهایم تا به جای نمایش ،Student 0با Student 1
سپس به دومین حلقه forدر خط 91میرسیم .وظیفه این حلقه گردش در میان دومین بعد که همان نمرات دانش آموز است
میباشد .برنامه چهار نمره مربوط به دانش آموز را میگیرد .هر وقت که برنامه یک نمره را از کاربر دریافت میکند ،نمره به متغیر
totalاضافه میشود .وقتی همه نمرهها وارد شدند ،متغیر totalهم جمع همه نمرات را نشان میدهد .در خطوط 71-74معدل
(جمع) بر تعداد نمرات به دست میآید .از total دانش آموز نشان داده میشود .معدل از تقسیم کردن
متد
متدها به شما اجازه میدهند که یک رفتار یا وظیفه را تعریف کنید و مجموعه ای از کدها هستند که در هر جای برنامه میتوان از
آنها استفاده کرد.متدها دارای آرگومانهایی هستند که وظیفه متد را مشخص میکنند .نمیتوان یک متد را در داخل متد دیگر
تعریف کرد .وقتی که شما در برنامه یک متد را صدا میزنید برنامه به قسمت تعریف متد رفته و کدهای آن را اجرا میکند .در C++
متدی وجود دارد که نقطه آغاز هر برنامه است و بدون آن برنامهها نمیدانند با ید از کجا شروع شوند ،این متد )( mainنام دارد.
گاهی اوقات دو کلمه پارامتر و آرگومان به یک منظور به کار میروند .سادهترین ساختار یک متد به صورت زیر است:
به برنامه ساده زیر توجه کنید.در این برنامه از یک متد برای چاپ یک پیغام در صفحه نمایش استفاده شده است:
در خطوط 4-9یک متد تعریف کردهایم .مکان تعریف آن در داخل کالس مهم نیست .به عنوان مثال میتوانید آن را زیر متد
)( mainتعریف کنید .میتوان این متد را در داخل متد دیگر صدا زد (فراخوانی کرد) .متد دیگر ما در اینجا متد )( mainاست که
میتوانیم در داخل آن نام متدی که برای چاپ یک پیغام تعریف کردهایم (یعنی متد )( )PrintMessageرا صدا بزنیم.
در تعریف متد باال کلمه کلیدی voidآمده است که نشان د هنده آن است که متد مقدار برگشتی ندارد .در درس آینده در مورد
مقدار برگشتی از یک متد و استفاده از آن برای اهداف مختلف توضیح داده خواهد شد .نام متد ما )( PrintMessageاست.
به این نکته توجه کنید که در نامگذاری متد از روش پاسکال (حرف اول هر کلمه بزرگ نوشته میشود) استفاده کردهایم .این روش
نامگذاری قراردادی است و میتوان از این روش استفاده نکرد ،اما پیشنهاد میشود که از این روش برای تشخیص متدها استفاده
کنید .بهتر است در نامگذاری متدها از کلماتی استفاده شود که کار متد را مشخص میکند مثالً نامهایی مانند GoToBedیا
.OpenDoorهمچنین به عنوان مثال اگر مقدار برگشتی متد یک مقدار بولی باشد میتوانید اسم متد خود را به صورت یک کلمه
سوالی انتخاب کنید مانند IsLeapyearیا … IsTeenagerولی از گذاشتن عالمت سؤال در آخر اسم متد خودداری کنید .دو
پرانتزی که بعد از نام میآید نشان ده نده آن است که نام متعلق به یک متد است .در این مثال در داخل پرانتزها هیچ چیزی
میدهیم. توضیح بیشتر متدها مورد در آینده درسهای ندارد.در پارامتری چون نشده نوشته
بعد از پرانتزها دو آکوالد قرار میدهیم که بدنه متد را تشکیل میدهد و کدهایی را که میخواهیم اجرا شوند را در داخل این
آکوالدها مینویسیم .در داخل متد )( mainمتدی را که در خط 99ایجاد کردهایم را صدا میزنیم .برای صدا زدن یک متد کافیست
اگر متد دارای پارامتر باشد باید شما آراگومانها را به ترتیب در داخل پرانتزها قرار دهید .در این مورد نیز در درسهای آینده توضیح
بیشتری میدهیم .با صدا زدن یک متد کدهای داخل بدنه آن اجرا میشوند .برای اجرای متد )( PrintMessageبرنامه از متد
)( mainبه محل تعریف متد )( PrintMessageمیرود .مثالً وقتی ما متد )( PrintMessageرا در خط 99صدا میزنیم برنامه
از خط 99به خط ، 4یعنی جایی که متد تعریف شده میرود .اکنون ما یک متد در برنامه classداریم و همه متدهای این برنامه
متدها میتوانند مقدار برگشتی از هر نوع داده ای داشته باشند .این مقادیر میتوانند در محاسبات یا به دست آوردن یک داده مورد
استفاده قرار بگیرند .در زندگی روزمره فرض کنید که کارمند شما یک متد است و شما او را صدا میزنید و از او میخواهید که کار
یک سند را به پایان برساند .سپس از او میخواهید که بعد از اتمام کارش سند را به شما تحویل دهد .سند همان مقدار برگشتی
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
متد است .نکته مهم در مورد یک متد ،مقدار برگشتی و نحوه استفاده شما از آن است .برگشت یک مقدار از یک متد آسان است.
)(returnType MethodName
{
;return value
}
returnTypeدر اینجا نوع داده ای مقدار برگشتی را مشخص میکند ( .)bool،intدر داخل بدنه متد کلمه کلیدی returnو
بعد از آن یک مقدار یا عبارتی که نتیجه آن یک مقدار است را مینویسیم .نوع این مقدار برگشتی باید از انواع ساده بوده و در
هنگام نامگذاری متد و قبل از نام متد ذکر شود .اگر متد ما مقدار برگشتی نداشته باشد باید از کلمه voidقبل از نام متد استفاده
کنیم .مثال زیر یک متد که دارای مقدار برگشتی است را نشان میدهد.
همانطور که در خط 4مثال فوق مشاهده میکنید هنگام تعریف متد از کلمه intبه جای voidاستفاده کردهایم که نشان دهنده
آن است که متد ما دارای مقدار برگشتی از نوع اعداد صحیح است .در خطوط 1و 9دو متغیر تعریف و مقدار دهی شدهاند.
توجه کنید که این متغیرها ،متغیرهای محلی هستند .و این بدان معنی است که این متغیرها در سایر متدها مانند متد )(main
قابل دسترسی نیستند و فقط در متدی که در آن تعریف شدهاند قابل استفاده هستند .در خط 91جمع دو متغیر در متغیر sumقرار
میگیرد .در خط 99مقدار برگشتی sumتوسط دستور returnفراخوانی میشود .در داخل متد )( mainیک متغیربه نام
متد )( CalculateSumمقدار 95را بر میگرداند که در داخل متغیر resultذخیره میشود .در خط 98مقدار ذخیره شده در
متغیر resultچاپ میشود .متدی که در این مثال ذکر شد متد کاربردی و مفیدی نیست.با وجودیکه کدهای زیادی در متد باال
نوشته شده ولی همیشه مقدار برگشتی 95است ،در حالیکه میتوانستیم به راحتی یک متغیر تعریف کرده و مقدار 95را به آن
اختصاص دهیم .این متد در صورتی کارامد است که پارامترهایی به آن اضافه شود که در درسهای آینده توضیح خواهیم داد.
هنگامی که میخواهیم در داخل یک متد از دستور ifیا switchاستفاده کنیم باید تمام کدها دارای مقدار برگشتی باشند .برای
در خطوط 91-4یک متد با نام )( GetNumberتعریف شده است که از کاربر یک عدد بزرگتر از 91را میخواهد .اگر عدد وارد شده
توسط کاربر درست نباشد متد مقدار صفر را بر میگرداند .و اگر قسمت elseدستور ifو یا دستور returnرا از آن حذف
چون اگر شرط دستور ifنادرست باشد (کاربر مقداری کمتر از 91را وارد کند) برنامه به قسمت elseمیرود تا مقدار صفر را بر
گرداند و چون قسمت elseحذف شده است برنامه با خطا مواجه میشود و همچنین اگر دستور returnحذف شود چون برنامه
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
نیاز به مقدار برگشتی دارد پیغام خطا میدهد .و آخرین مطلبی که در این درس میخواهیم به شما آموزش دهیم این است که شما
میتوانید از یک متد که مقدار برگشتی ندارد خارج شوید .حتی اگر از نوع داده ای voidدر یک متد استفاده میکنید باز هم
میتوانید کلمه کلیدی returnرا در آن به کار ببرید .استفاده از returnباعث خروج از بدنه متد و اجرای کدهای بعد از آن
میشود.
در برنامه باال نحوه خروج از متد با استفاده از کلمه کلیدی returnو نادیده گرفتن همه کدهای بعد از این کلمه کلیدی نشان داده
شده است .در پایان برنامه متد تعریف شده ))( (TestReturnExitدر داخل متد )( mainفراخوانی و اجرا میشود.
پارامترها و آرگومانها
پارامترها دادههای خامی هستند که متد آنها را پردازش میکند و سپس اطالعاتی را که به دنبال آن هستید در اختیار شما قرار
میدهد .فرض کنید پارامترها مانند اطالعاتی هستند که شما به یک کارمند میدهید که بر طبق آنها کارش را به پایان برساند.
یک متد میتواند هر تعداد پارامتر داشته باشد .هر پارامتر میتواند از انواع مختلف داده باشد .در زیر یک متد با Nپارامتر نشان
;code to execute
}
پارامترها بعد از نام متد و بین پرانتزها قرار میگیرند .بر اساس کاری که متد انجام میدهد میتوان تعداد پارامترهای زیادی به متد
اضافه کرد .بعد از فراخوانی یک متد باید آرگومانهای آن را نیز تأمین کنید .آرگومانها مقادیری هستند که به پارامترها اختصاص
داده میشوند .ترتیب ارسال آرگومانها به پارامترها مهم است .عدم رعایت ترتیب در ارسال آرگومانها باعث به وجود آمدن خطای
در برنامه باال یک متد به نام )(( CalculateSumخطوط )5-8تعریف شده است که وظیفه آن جمع مقدار دو عدد است .چون
این متد مقدار دو عدد صحیح را با هم جمع میکند پس نوع برگشتی ما نیز باید intباشد .متد دارای دو پارامتر است که اعداد
را به آنها ارسال میکنیم .به نوع داده ای پارامترها توجه کنید .هر دو پارامتر یعنی number1و number2مقادیری از نوع
اعداد صحیح ) (intدریافت میکنند .در بدنه متد دستور returnنتیجه جمع دو عدد را بر میگرداند .در داخل متد Main
برنامه از کاربر دو مقدار را درخواست میکند و آنها را داخل متغیرها قرار میدهد .حال متد را که آرگومانهای آن را آماده کردهایم
فراخوانی میکنیم .مقدار num1به پارامتر اول و مقدار num2به پارامتر دوم ارسال میشود .حال اگر مکان دو مقدار را هنگام
ارسال به متد تغییر دهیم (یعنی مقدار num2به پارامتر اول و مقدار num1به پارامتر دوم ارسال شود) هیچ تغییری در نتیجه متد
ً
دقیقا با ترتیب قرار گیری پارامترها تعریف شده در فقط به یاد داشته باشید که باید ترتیب ارسال آرگومانها هنگام فراخوانی متد
متد مطابقت داشته باشد .بعد از ارسال مقادیر 91و 5به پارامترها ،پارامترها آنها را دریافت میکنند .به این نکته نیز توجه کنید
که نام پارامترها طبق قرارداد به شیوه کوهان شتری یا ( camelCasingحرف اول دومین کلمه بزرگ نوشته میشود) نوشته
میشود .در داخل بدنه متد (خط )9دو مقدار با هم جمع میشوند و نتیجه به متد فراخوان (متدی که متد )(CalculateSum
را فراخوانی میکند) ارسال میشود .در درس آینده از یک متغیر برای ذخیره نتیجه محاسبات استفاده میکنیم ولی در اینجا مشاهده
میکنید که میتوان به سادگی نتیجه جمع را نشان داد (خط .)9در داخل متد )( mainاز ما دو عدد که قرار است با هم جمع
در خط 91متد )( CalculateSumرا فراخوانی میکنیم و دو مقدار صحیح به آن ارسال میکنیم .دو عدد صحیح در داخل متد با
هم جمع شده و نتیجه آنها برگردانده میشود .مقدار برگشت داده شده از متد به وسیله متد coutنمایش داده میشود (خط
.) 91در برنامه زیر یک متد تعریف شده است که دارای دو پارامتر از دو نوع داده ای مختلف است:
!Hello World
Number = 100
در مثال باال یک متدی تعریف شده است که اولین پارامتر آن مقداری از نوع رشته و دومین پارامتر آن مقداری از نوع intدریافت
میکند .متد به سادگی دو مقداری که به آن ارسال شده است را نشان میدهد .در خط 91متد را اول با یک رشته و سپس یک عدد
خاص فراخوانی میکنیم .حال اگر متد به صورت زیر فراخوانی میشد:
در برنامه خطا به وجود میآمد چون عدد 911به پارامتری از نوع رشته و رشته ! Hello Worldبه پارامتری از نوع اعداد صحیح
ارسال میشد.این نشان میدهد که ترتیب ارسال آرگومانها به پارامترها هنگام فراخوانی متد مهم است .به مثال 9توجه کنید در
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
آن مثال دو عدد از نوع intبه پارامترها ارسال کردیم که ترتیب ارسال آنها چون هردو پارامتر از یک نوع بودند مهم نبود .ولی
اگر پارامترهای متد دارای اهداف خاصی باشند ترتیب ارسال آرگومانها مهم است.
در مثال باال نشان داده شده است که حتی اگر متد دو آرگومان با یک نوع داده ای قبول کند باز هم بهتر است ترتیب بر اساس
تعریف پارامترها رعایت شود .به عنوان مثال در اولین فراخوانی متد باال اشکالی به چشم نمیآید چون سن شخص 71و قد او 911
سانتی متر است .اگر آرگومانها را به ترتیب ارسال نکنیم سن شخص 911و قد او 71سانتی متر میشود که به واقعیت نزدیک
نیست .دانستن مبانی مقادیر برگشتی و ارسال آرگومانها باعث میشود که شما متدهای کارامد تری تعریف کنید .تکه کد زیر
نشان میدهد که شما حتی میتوانید مقدار برگشتی از یک متد را به عنوان آرگومان به متد دیگر ارسال کنید.
)(int MyMethod
{
;return 5
}
;))(AnotherMethod(MyMethod
چون مقدار برگشتی متد )( MyMethodعدد 5است و به عنوان آرگومان به متد )( AnotherMethodارسال میشود خروجی
آرگومانها را میتوان به کمک ارجاع ارسال کرد .این بدان معناست که شما آدرس متغیری را ارسال میکنید نه مقدار آن را .ارسال
با ارجاع زمانی مفید است که شما بخو اهید یک آرگومان که دارای مقدار بزرگی است ( مانند یک آبجکت) را ارسال کنید .در این
www.SourceSara.com آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده- ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا
در زیر.حالت وقتی که آرگومان ارسال شده را در داخل متد اصالح میکنیم مقدار اصلی آرگومان در خارج از متد هم تغییر میکند
برای ارسال یک.دستورالعمل پایه ای تعریف پارامترها که در آنها به جای مقدا ر از آدرس استفاده شده است نشان داده شده است
:اجازه دهید که تفاوت بین ارسال با ارجاع و ارسال با مقدار آرگومان را با یک مثال توضیح دهیم
1 #include <iostream>
2 using namespace std;
3
4 void ModifyNumberVal(int number)
5 {
6 number += 10;
7 cout << "Value of number inside method is " << number << endl;
8 }
9
10 void ModifyNumberRef(int &number)
11 {
12 number += 10;
13 cout << "Value of number inside method is " << number << endl;
14 }
15
16 int main()
17 {
18 int num = 5;
19
20 cout << "num = " << num << endl;
21
22 cout << "Passing num by value to method ModifyNumberVal() ..." << endl;
23 ModifyNumberVal(num);
24 cout << "Value of num after exiting the method is " << num << endl;
25
26 cout << "Passing num by ref to method ModifyNumberRef() ..." << endl;
27 ModifyNumberRef(num);
28 cout << "Value of num after exiting the method is " << num << endl;
29 }
num = 5
Passing num by value to method ModifyNumberVal() ...
Value of number inside method is 15
Value of num after exiting the method is 5
Passing num by ref to method ModifyNumberRef() ...
Value of number inside method is 15
Value of num after exiting the method is 15
به مقداری است که به آنها91 در برنامه باال دو متد که دارای یک هدف یکسان هستند تعریف شدهاند و آن اضافه کردن عدد
وقتی که متد را.) داردint ) دارای یک پارامتر است که نیاز به یک مقدار آرگومان (از نوع5-1 اولین متد (خطوط.ارسال میشود
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
صدا میزنیم و آرگومانی به آن اختصاص میدهیم (خط ،)74کپی آرگومان به پارامتر متد ارسال میشود .بنابراین مقدار اصلی متغیر
خارج از متد هیچ ارتباطی به پارامتر متد ندارد .سپس مقدار 91را به متغیر پارامتر )(numberاضافه کرده و نتیجه را چاپ میکنیم.
برای اثبات اینکه متغیر numهیچ تغییری نکرده است مقدار آن را یکبار دیگر چاپ کرده و مشاهده میکنیم که تغییری نکرده است.
دومین متد (خطوط )99-95نیاز به یک مقدار با ارجاع دارد .در این حالت به جای اینکه یک کپی از مقدار به عنوان آرگومان به ان
ارسال شود آدرس متغیر به آن ارسال میشود .حال پارامتر به مقدار اصلی متغیر که زمان فراخوانی متد به آن ارسال میشود
دسترسی دارد .وقتی که ما مقدار متغیر پارامتری که شامل آدرس متغیر اصلی است را تغییر میدهیم (خط )91در واقع مقدار متغیر
اصلی در خارج از متد را تغییر دادهایم .در نهایت مقدار اصلی متغیر را وقتی که از متد خارج شدیم را نمایش میدهیم و مشاهده
ً
واقعا تغییر کرده است. میشود که مقدار آن
میتوان آرایهها را به عنوان آرگومان به متد ارسال کرد .ابتدا شما باید پارامترهای متد را طوری تعریف کنید که آرایه دریافت
1
2
3
4
5
مشاهده کردید که به سادگی میتوان با گذاشتن کروشه بعد از نام پارامتر یک متد ایجاد کرد که پارامتر آن ،آرایه دریافت میکند.
وقتی متد در خط 91فراخوانی میشود ،آرایه را فقط با استفاده از نام آن و بدون استفاده از اندیس ارسال میکنیم .پس آرایهها هم
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
به روش ارجاع به متدها ارسال میشوند .در خطوط 1-1از حلقه forبرای دسترسی به اجزای اصلی آرایه که به عوان آرگومان به
متد ارسال کردهایم استفاده میکنیم .در زیر نحوه ارسال یک آرایه به روش ارجاع نشان داده شده است.
2
3
4
5
6
برنامه باال یک متد را نشان میدهد که یک آرایه را دریافت میکند و به هر یک از عناصر آن یک واحد اضافه میکند .در داخل متد
ما مقادیر هر یک از اجزای آرایه را افزایش دادهایم .سپس از متد خارج شده و نتیجه را نشان میدهیم .مشاهده میکنید که هر
یک از مقادیر اصلی متد هم اصالح شدهاند .میتوان دو یا چ ند آرایه را به عنوان آرگومان به متد ارسال کرد:
}
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
محدوده متغیر
متغیرها در C++دارای محدوده هستند .محدوده یک متغیر به شما میگوید که در کجای برنامه میتوان از متغیر استفاده کرد و
یا متغیر قابل د سترسی است .به عنوان مثال متغیری که در داخل یک متد تعریف میشود فقط در داخل بدنه متد قابل دسترسی
است .میتوان دو متغیر با نام یکسان در دو متد مختلف تعریف کرد .برنامه زیر این ادعا را اثبات میکند:
>#include <iostream
;using namespace std
)(void DemonstrateScope
{
;int number = 5
= )(cout << "number inside method DemonstrateScope ;" << number << endl
}
)(int main
{
;int number = 10
;)(DemonstrateScope
;cout << "number inside the Main method = " << number << endl
}
مشاهده میکنید که حتی اگر ما دو متغیر با نام یکسان تعریف کنیم که دارای محدودههای متفاوتی هستند ،میتوان به هر کدام
از آنها مقادیر مختلفی اختصاص داد .متغیر تعریف شده در داخل متد )( mainهیچ ارتباطی به متغیر داخل متد
)( DemonstrateScopeندارد .وقتی به مبحث کالسها رسیدیم در این باره بیشتر توضیح خواهیم داد.
پارامترهای اختیاری
پارامترهای اختیاری همانگونه که از اسمشان پیداست اختیاری هستند و میتوان به آنها آرگومان ارسال کرد یا نه .این پارامترها
دارا ی مقادیر پیشفرضی هستند.اگر به اینگونه پارامترها آرگومانی ارسال نشود از مقادیر پیشفرض استفاده میکنند .به مثال زیر
توجه کنید:
متد( )( PrintMessageخطوط )5-8یک پارامتر اختیاری دارد .برای تعریف یک پارامتر اختیاری میتوان به آسانی و با استفاده
از عالمت = یک مقدار را به یک پارامتر اختصاص داد (مثال باال خط .)5دو بار متد را فراخوانی میکنیم .در اولین فراخوانی (خط
)97ما آرگومانی به متد ارسال نمیکنیم بنابراین متد از مقدار پیشفرض )! (Welcome to Visual C# Tutorialsاستفاده
میکند .در دومین فراخوانی(خط )94یک پیغام (آرگومان) به متد ارسال میکنیم که جایگزین مقدار پیشفرض پارامتر میشود .ا گر
از چندین پارامتر در متد استفاده میکنید همه پارامترهای اختیاری باید در آخر بقیه پارامترها ذکر شوند .به مثالهای زیر توجه
کنید.
void SomeMethod(int opt1 = 10, int opt2 = 20, int req1, int req2) //ERROR
void SomeMethod(int req1, int opt1 = 10, int req2, int opt2 = 20) //ERROR
void SomeMethod(int req1, int req2, int opt1 = 10, int opt2 = 20) //Correct
وقتی متدهای با چندین پارامتر اختیاری فراخوانی میشوند باید به پارامترهایی که از لحاظ مکانی در آخر بقیه پارامترها نیستند
مقدار اختصاص داد .به یاد داشته باشید که نمیتوان برای نادیده گرفتن یک پارامتر به صورت زیر عمل کرد:
سربارگذاری متدها
سربارگذاری متدها ) (Method Overloadingبه شما اجازه میدهد که دو متد با نام یکسان تعریف کنید که دارای امضا و تعداد
پارامترهای مختلف هستند.برنامه از روی آرگومانهایی که شما به متد ارسال میکنید به صورت خودکار تشخیص میدهد که کدام
متد را فراخوانی کردهاید یا کدام متد مد نظر شماست .امضای یک متد نشان دهنده ترتیب و نوع پارامترهای آن است .به مثال
به این نکته توجه کنید که نوع برگشتی و نام پارامترها شامل امضای متد نمیشوند .در مثال زیر نمونه ای از سربارگذاری متدها
آمده است.
در برنامه باال دو متد با نام مشابه تعریف شدهاند .اگر سربارگذاری متد توسط C++پشتیبانی نمیشد برنامه زمان زیادی برای
انتخاب یک متد از بین متدهایی که فراخوانی میشوند الزم داشت .رازی در نوع پارامترهای متد نهفته است .کامپایلر بین دو یا
چند متد همنام در صورتی فرق میگذارد که پارامترهای متفاوتی داشته باشند .وقتی یک متد را فراخوانی میکنیم ،متد نوع
در فراخوانی اول (خط )91ما یک مقدار doubleرا به متد )( ShowMessageارسال کردهایم در نتیجه متد )(ShowMessage
(خطوط )4-9که دارای پارامتری از نوع doubleاجرا میشود .در بار دوم که متد فراخوانی میشود (خط )99ما یک مقدار int
را به متد )( ShowMessageارسال میکنیم متد )(( ShowMessageخطوط )1-97که دارای پارامتری از نوع intاست اجرا
میشود .معنای اصلی سربارگذاری متد همین است که توضیح داده شد .هدف اصلی از سربارگذاری متدها این است که بتوان
بازگشت )(Recursion
بازگشت) ، (Recursionفرایندی است که در آن متد مدام خود را فراخوانی میکند تا زمانی که به یک مقدار مورد نظر برسد.
بازگشت یک مبحث پیچیده در برنامه نویسی است و تسلط به آن کار را حتی نیست .به این نکته هم توجه کنید که بازگشت باید
در یک نقطه متوقف شود وگرنه برای بی نهایت بار ،متد ،خود را فراخوانی میکند .در این درس یک مثال ساده از بازگشت را برای
شما توضیح میدهیم .فاکتوریل یک عدد صحیح مثبت )! (nشامل حاصل ضرب همه اعداد مثبت صحیح کوچکتر یا مساوی
5! = 5 * 4 * 3 * 2 * 1 = 120
بنا براین برای ساخت یک متد بازگشتی باید به فکر توقف آن هم باشیم .بر اساس توضیح بازگشت ،فاکتوریل فقط برای اعداد مثبت
صحیح است .کوچکترین عدد صحیح مثبت 9است .در نتیجه از این مقدار برای متوقف کردن بازگشت استفاده میکنیم.
>#include <iostream
;using namespace std
)(int main
{
;)cout << Factorial(5
}
120
متد مقدار بزرگی را بر میگرداند چون محاسبه فاکتوریل میتواند خیلی بزرگ باشد .متد یک آرگومان که یک عدد است و میتواند
در محاسبه مورد استفاده قرار گیرد را میپذیرد .در داخل متد یک دستور ifمینویسیم و در خط 7می گوییم که اگر آرگومان
www.SourceSara.com ﺳﺎﯾﺖ ﺳﻮرس ﺳﺮا -آﻣﻮزش ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ و ﺳﻮرس ﮐﺪﻫﺎي آﻣﺎده
ارسال شده برابر 9باشد سپس مقدار 9را برگردان در غیر اینصورت به خط بعد برو .این شرط باعث توقف تکرارها نیز میشود.
در خط 1مقدار جاری متغیر numberدر عددی یک واحد کمتر از خودش ) (number – 1ضرب میشود.در این خط متد
Factorialخود را فراخوانی میکند و آرگومان آن در این خط همان number – 1است .مثالً اگر مقدار جاری number 10
باشد یعنی اگر ما بخواهیم فاکتوریل عدد 91را به دست بیاوریم آرگومان متد Factorialدر اولین ضرب 1خواهد بود .فرایند
ضرب تا زمانی ادامه مییابد که آرگومان ارسال شده با عدد 9برابر نشود .شکل زیر فاکتوریل عدد 5را نشان میدهد.
;factorial = 1
این کد از کد معادل بازگشتی آن آسان تر است .از بازگشت در زمینههای خاصی در علوم کامپیوتر استفاده میشود .استفاده از
بازگشت حافظه زیادی اشغال میکند پس اگر سرعت برای شما مهم است از آن استفاده نکنید.
www.w3-farsi.com