Transcript C++

‫بـرنامـه سازی پیشـرفتـه‬
‫نام درس ‪:‬‬
‫برنامه سازی پیشرفته ( رشته مهندسـی کامپیوتر )‬
‫تعداد واحد درسی ‪:‬‬
‫‪ 3‬واحد‬
‫نام تهیه کننده اسالیدها ‪:‬‬
‫صـالح جـوان – علـی میـر‬
‫وب سایت گروه مهندسـی نرم افزار‪:‬‬
‫‪WWW.SOFTWARE-ZB.IR‬‬
‫فهرست مطالب‬
‫فصل اول ‪ :‬مقدمات زبان ‪C++‬‬
‫فصل دوم ‪ :‬ساختار های تصمیم گیری و تکرار‬
‫فصل سوم ‪ :‬سایر ساختار های تکرار‬
‫فصل چهارم ‪ :‬اعداد تصادفی‬
‫فصل پنجم ‪ :‬آرایه ها‬
‫فصل ششم ‪ :‬توابع‬
‫فصل هفتم ‪ :‬ساختارها و اشاره گرها‬
‫فصل هشتم ‪ :‬برنامه نویسی شی گرا‬
‫فصل اول‬
‫مقدمات ‪C++‬‬
‫فهرست مطالب فصل اول‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫‪.8‬‬
‫‪.9‬‬
‫‪.10‬‬
‫تاریخچه مختصر‬
‫قانون نامگذاری شناسه ها‬
‫متغیر ها‬
‫اعالن متغیر‬
‫تخصیص مقادیر به متغیر‬
‫داده های از نوع کرکتر‬
‫کرکتر های مخصوص‬
‫رشته ها‬
‫نمایش مقادیر داده ها‬
‫دریافت مقادیر‬
‫‪.11‬‬
‫‪.12‬‬
‫‪.13‬‬
‫‪.14‬‬
‫‪.15‬‬
‫‪.16‬‬
‫‪.17‬‬
‫‪.18‬‬
‫‪.19‬‬
‫عملگر انتساب‬
‫عملگر های محاسباتی‬
‫عملگرهای افزایش و کاهش‬
‫عملگر ‪sizeof‬‬
‫عملگرهای جایگزینی محاسباتی‬
‫اولویت عملگرها‬
‫توضیحات (‪)Comments‬‬
‫توابع کتابخانه‬
‫برنامه در ‪C++‬‬
‫تاریخچه مختصر ‪C++‬‬
‫این زبان در اوائل دهه ‪ 1980‬توسط ‪ Bjarne stroustrup‬در آزمایشطاا‬
‫بل طراحي شد ‪ .‬این زبان عمالً توسعه یافته زبان برنامه نویسي ‪ C‬مي باشد كه‬
‫امكان نوشتن برنامههاي ساخت یافته شئ گرا را ميدهد‪.‬‬
‫قانون نامگذاری شناسهها‬
‫‪(1‬‬
‫حروف کوچك و بزرگ در نامگذاری شناسهها متفاوت میباشند‪.‬‬
‫بنابراین ‪ xy ، xY ، XY ، Xy‬چهار شناسه متفاوت‬
‫از نظر ‪ C++‬میباشد‪.‬‬
‫قانون نامگذاری شناسهها‬
‫‪ )2‬در نامگذاری شناسهها از حروف الفباء‪ ،‬ارقام وزیر خط (‪)underscore‬‬
‫استفاده میشود و حداکثر طول شناسه ‪ 31‬میباشد و شناسه بایستی با‬
‫یك رقم شروع نگردد‪.‬‬
‫قانون نامگذاری شناسهها‬
‫ در زیر بعضي از كلمات‬.‫) براي ناماذاري شناسهها از كلمات كليدي نبایستي استفاد نمود‬3
.‫كليدي داد شد است‬
And
Sizeof
then
xor
Template
Float
False
Friend
While
continue
extern
Private
Switch
Default
Const
delete
typedef
if
this
Virtual
‫متغيرها‬
‫متغيططرم مكططاني در حافصططه ا ططلي‬
‫كامپيوتر ميباشد كطه در آناطا یطك‬
‫مقدار را ميتوان ذخير و در برنامطه‬
‫از آن استفاد نمود‪ .‬قانون ناماذاري‬
‫متغيرهططا همططان قططانون ناماططذاري‬
‫شناسهها ميباشد‪.‬‬
‫در اسالید بعد به انواع داده ها اشاره می شود‪.‬‬
‫انواع داده ها‬
‫حافظه الزم‬
‫مقادیر‬
‫‪ 2‬بایت‬
‫‪ 32767‬تا ‪–32768‬‬
‫‪2‬بایت‬
‫‪ 65535‬تا ‪0‬‬
‫‪ 4‬بایت‬
‫‪ 2147483647‬تا ‪–2147483648‬‬
‫‪ 4‬بایت‬
‫‪ 4294967295‬تا ‪0‬‬
‫‪1‬بایت‬
‫یك کارکتر‬
‫‪ 1‬بایت‬
‫‪ 127‬تا ‪–128‬‬
‫‪ 4‬بایت‬
‫‪ 3.4e38‬تا ‪1.2e-38‬‬
‫‪ 8‬بایت‬
‫‪ 1.8e308‬تا ‪2.2e-308‬‬
‫نوع داده‬
‫‪int‬‬
‫‪unsigned int‬‬
‫‪long int‬‬
‫‪unsigned long int‬‬
‫‪char‬‬
‫‪unsigned char‬‬
‫‪float‬‬
‫‪double‬‬
‫اعالن متغیرها‬
‫قبل از آنکه در برنامه به متغیرها مقدداری تخصدیص داده‬
‫شود و از آنها استفاده گردد بایستی آنها را در برنامه اعالن‬
‫نمود‪.‬‬
‫در اسالید بعد مثال هایی از اعالن متغیر ذکر شده است‪.‬‬
‫چند مثال از اعالن متغیر ها ‪:‬‬
‫‪ ‬برای اعالن متغیر‪ x‬از نوع ‪: int‬‬
‫;‪x‬‬
‫‪int‬‬
‫‪ ‬برای اعالن متغیرهای ‪ p‬و ‪ q‬را از نوع ‪ float‬که هر کدام چهار بایت از‬
‫حافظه را اشغال میکنند ‪:‬‬
‫; ‪float p , q‬‬
‫‪ ‬برای اعالن متغیر ‪ next‬از نوع کرکتر که میتوان یکی از ‪ 256‬کرکتر را به‬
‫آن تخصیص داد و یك بایت را اشغال میکند‪.‬‬
‫; ‪char next‬‬
‫تخصيص مقادير به متغيرها‬
‫با استفاده از عملگر = میتوان به متغیرها مقدار اولیه تخصیص نمود‪.‬‬
‫در اسالید بعد مثال هایی از اعالن متغیر ذکر شده است‪.‬‬
‫مثال ‪:‬‬
‫‪ ‬در دستورالعمل‬
‫‪ X‬را از نوع ‪ int‬با مقدار اولیه ‪ 26‬اعالن نموده ‪.‬‬
‫;‪int x=26‬‬
‫;‪long a=67000 , b=260‬‬
‫‪ ‬در دستورالعمل‬
‫متغیرهای ‪ b‬و ‪ a‬را از نوع ‪ long int‬تعریف نموده با مقادیر بترتیب‬
‫‪ 260‬و ‪.67000‬‬
‫دادههای از نوع کرکتر‬
‫برای نمایش دادههای از نوع ‪ char‬در حافظه کامپیوتر از جدول‬
‫‪ ASCII‬استفاده میشود‪ .‬جدول اسکی به هر یك از ‪ 256‬کرکتر‬
‫یك عدد منحصر بفرد بین ‪ 0‬تا ‪ 255‬تخصیص میدهد‪.‬‬
‫کرکترهای مخصوص‬
‫كامپيلر ‪ C++‬بعضي از كركترهاي مخصوص كه در برنامه ميتوان از‬
‫آنها براي فرمت بندي استفاد كرد را تشخيص ميدهد‪ .‬تعدادي از‬
‫این كركترهاي مخصوص به همرا كاربرد آنها در اسالید بعد آورد‬
‫شد است ‪.‬‬
‫کرکترهای مخصوص‬
\n
Newline
\t
Tab
\b
Backspace
\a
Beep sound
\”
Double quote
\’
Single quote
\0
Null character
\?
Question mark
\\
Back slash
‫\ میتوان برای ایجاد صدای‬a ‫بعنوان مثال از کرکتر‬
.‫ استفاده نمود‬beep
char
x = '\a ;
‫رشتهها‬
‫رشته یا ‪ string‬عبارتست از دنبالهاي از كركترها كه بين " " قرار داد‬
‫ميشود‪ .‬در حافصه كامپيوتر انتهاي رشتهها بوسيله ‪ \0‬ختم ميگردد‪.‬‬
‫در اسالید بعد به دو مثال دقت نمایید‪.‬‬
‫مثال ‪: 1‬‬
‫"‪ "BOOK STORE‬یك رشته د كركتري مطيباشطد‬
‫كه با توجه به كركتر ‪ \0‬كه به انتهاي آن در حافصه‬
‫اضافه مي شود جمعططاً یازد بایت را اشغال ميكند‪.‬‬
‫مثال ‪: 2‬‬
‫دقت نمایيد كه "‪ "w‬یك رشته ميباشد كه دو بایت از‬
‫حافصه را اشغال ميكند در حاليكه '‪ 'w‬یك كركتر‬
‫ميباشد كه یك بایت از حافصه را اشغال مينماید‪.‬‬
‫نمایش مقادیر دادهها‬
‫براي نمایش داد ها بر روي فحه مانتور از ‪ cout‬كطه بطدنبال آن عملاطر‬
‫درج یعني << قيد شد باشد استفاد ميگردد‪ .‬بایستي توجه داشطت كطه‬
‫دوكركتر < پشت سر هم توس ‪ C++‬بصورت یك كركتر تلقي ميگردد‪.‬‬
‫مثال ‪:‬‬
‫‪ ‬براي نمایش پيغام ‪ good morning‬بر روي فحه نمایش ‪:‬‬
‫;"‪cout << "good morning‬‬
‫‪ ‬براي نمایش مقدار متغير ‪ X‬بر روي فحه نمایش ‪:‬‬
‫; ‪cout << x‬‬
‫دریافت مقادیر متغیرها‬
‫به منصور دریافت مقادیر براي متغيرها در ضمن اجراي برنامه از فحه كليدم از ‪cin‬‬
‫كه بدنبال آن عملار استخراج یعني >> قيد شد باشد ميتوان استفاد نمود‪.‬‬
: ‫مثال‬
int x;
cout << "Enter a number:" ;
cin >> x;
‫عملگر انتساب‬
‫عملگر انتساب = میباشد که باعث میگردد‬
‫مقدار عبارت در طرف راست این عملگر ارزیابی‬
‫شده و در متغیر طرف چپ آن قرار گیرد‪.‬‬
‫مثال ‪:‬‬
‫;‪x=a+b‬‬
‫; ‪x=35‬‬
‫; ‪x=y=z=26‬‬
‫از عملارهاي انتساب چندگانه نيط مطي تطوان اسطتفاد‬
‫نمود‪ .‬كطه مقطدار سطه متغيطر ‪ z‬و ‪ y‬و ‪ x‬برابطر بطا ‪26‬‬
‫ميشود‪.‬‬
‫عملگرهای محاسباتی‬
‫در ‪ C++‬پنج عملگر محاسباتی وجود دارد که عبارتند از ‪:‬‬
‫‪+‬‬
‫جمع‬
‫‪-‬‬
‫تفریق‬
‫*‬
‫ضرب‬
‫‪/‬‬
‫تقسیم‬
‫‪%‬‬
‫باقیمانده‬
‫این عملگرها دو تائی میباشند زیرا روی دو عملوند عمل مینمایند‪ .‬از طرف‬
‫دیگر عملگرهای ‪ +‬و – رامیتوان بعنوان عملگرهای یکتائی نیز در نظر گرفت‪.‬‬
‫مثال ‪: 1‬‬
‫در حالتی که هر دو عملوند عملگرهای ‪ – ، + ، * ، / ، %‬از نوع صحیح باشد نتیجه‬
‫عمل از نوع صحیح میباشد‪.‬‬
‫نتیجه‬
‫عبارت‬
‫‪7‬‬
‫‪5+2‬‬
‫‪10‬‬
‫‪5*2‬‬
‫‪3‬‬
‫‪5–2‬‬
‫‪1‬‬
‫‪5%2‬‬
‫‪2‬‬
‫‪5/2‬‬
‫مثال ‪: 2‬‬
‫در صورتیکه حداقل یکی از عملوندهای عملگرهای ‪ + ، – ، * ، /‬از نوع اعشاری باشد‬
‫نتیجه عمل از نوع اعشاری میباشد‪.‬‬
‫نتیجه‬
‫عبارت‬
‫‪7. 0‬‬
‫‪5. 0 +2‬‬
‫‪10.0‬‬
‫‪5* 2. 0‬‬
‫‪2.5‬‬
‫‪5. 0 / 2‬‬
‫‪3. 0‬‬
‫‪5. 0 -2‬‬
‫‪2.5‬‬
‫‪5. 0 / 2. 0‬‬
‫عملگرهای افزایش و کاهش‬
‫در ‪ ، C++‬افزایش یك واحد به مقدار یك‬
‫متغیر از نوع صدحیح را افدزایش و بردور‬
‫مشابه کاهش یك واحدد از مقددار یدك‬
‫متغیر از نوع صحیح را کاهش مینامند‪..‬‬
‫عملگرهای افزایش و کاهش‬
‫عملگر کاهش را با ‪ - -‬و عملگر افزایش‬
‫را بددا ‪ ++‬نمددایش مددیدهنددد‪ .‬چددون‬
‫عملگرهددای ‪ ++‬و ‪ - -‬فقددط روی یددك‬
‫عملوند اثر دارند این دو عملگر نیز جدزء‬
‫عملگرهای یکتائی میباشند‪.‬‬
‫مثال ‪:‬‬
‫سه دستور العمل ‪:‬‬
‫;‪++x‬‬
‫;‪x++‬‬
‫;‪x=x+1‬‬
‫معادل میباشند و برریق مشابه سه دستورالعمل زیر نیز معادل می باشند‪.‬‬
‫;‪--y‬‬
‫;‪y=y-1‬‬
‫; ‪y- -‬‬
‫از عملگرهای ‪ ++‬و ‪ --‬میتوان بدو صورت پیشوندی و پسوندی استفاده نمود‪.‬‬
‫در دستورالعملهای پیچیده عملگر پیشوندی قبل از انتساب ارزیابی میشود و عملگر‬
‫پسوندی بعد از انتساب ارزیابی میشود‪.‬‬
‫مثال ‪:‬‬
‫;‪int x=5‬‬
‫;‪y=++x * 2‬‬
‫پس از اجرای دستورالعملهای فوق ‪:‬‬
‫‪y=12‬‬
‫;‪int x=5‬‬
‫;‪y=x++ * 2‬‬
‫پس از اجرای دستورالعملهای فوق ‪:‬‬
‫‪y=12‬‬
‫عملگر ‪sizeof‬‬
‫‪ Sizeof‬ازعملگرهای یکتائی می باشد و مشخص کننده تعداد بایت‬
‫هائی است که یك نوع داده اشغال میکند‪.‬‬
‫مثال ‪:‬‬
‫;‪int x‬‬
‫; ‪cout << sizeof x‬‬
‫مقدار ‪ 2‬نمایش داده میشود ‪.‬‬
‫; )‪cout << sizeof(float‬‬
‫مقدار ‪ 4‬نمایش داده می شود‪.‬‬
‫عملگرهای جایگزینی محاسباتی‬
‫برای سادهتر نوشتن عبارتها در ‪ ، C++‬میتوان از‬
‫عملگرهای جایگزینی محاسبددداتی استفاده نمود‪.‬‬
‫=‪+‬‬
‫=‪-‬‬
‫=*‬
‫=‪/‬‬
‫=‪%‬‬
‫اولویت عملگرها‬
‫ارزیابی مقدار یك عبارت ریاضی براساس جدول اولویت عملگرها انجام میگردد‪ .‬در ذیل جدول اولویت‬
‫عملگرها براساس بترتیب از بیشترین اولویت به کمترین اولویت داده شده است‪.‬‬
‫چ پ به راس ت‬
‫پرانتزها‬
‫راس ت به چ پ‬
‫عملگرهاي ي كتاي ي‬
‫چ پ به راس ت‬
‫عملگرهاي ضرب و تق سي م و باقيمان ده‬
‫‪%‬‬
‫چ پ به راس ت‬
‫عملگرهاي جم ع و تفريق‬
‫چ پ به راس ت‬
‫عملگرهاي درج و استخراج‬
‫‪‬‬
‫>>‬
‫راس ت به چ پ‬
‫عملگرهاي جايگزين ي و انت ساب‬
‫) (‬
‫‪sizeof‬‬
‫‪+ --‬‬
‫‪++‬‬
‫‪/‬‬
‫*‬
‫‪+‬‬
‫<<‬
‫=‪= += -= *= /= %‬‬
‫‪-‬‬
‫مثال ‪: 1‬‬
‫‪(5+2) *(6+2*2)/2‬‬
‫با توجه به جدول اولویت عملگرها داریم که‬
‫‪7 *(6+2*2)/2‬‬
‫‪7*(6+4)/2‬‬
‫‪7* 10 /2‬‬
‫‪70 /2‬‬
‫‪35‬‬
: 2 ‫مثال‬
int a=6 , b=2, c=8, d=12;
d=a++ * b/c ++;
cout << d << c << b << a;
: ‫خروجی‬
1
9
2
7
‫توضیحات (‪)Comments‬‬
‫توضیحات در برنامه باعث خوانائی بیشتر و درك بهتر برنامه میشود‪ .‬بنابراین‬
‫توصیه بر آن است که حتی االمکان در برنامهها از توضیحات استفاده نمائیم‪ .‬در‬
‫‪ ،C++‬توضیحات بدو صورت انجام میگیرد که در اسالیدهای بعد به آن اشاره‬
‫شده است‪.‬‬
‫توضیحات (‪)Comments‬‬
‫الف‪ :‬این نوع توضیح بوسیله ‪ //‬انجام میشود‪ .‬که کامپیوتر هر چیدزی را‬
‫که بعد از ‪ //‬قرار داده شود تا انتهای آن خط اغماض مینماید‪.‬‬
‫مثال ‪:‬‬
‫‪c=a+b;//c is equal to sum of a and b‬‬
‫ب‪:‬توضیح نوع دوم با *‪ /‬شروع شده و به ‪ */‬ختم میشود و هر چیزی که‬
‫بین* ‪ /‬و ‪ */‬قرار گیرد اغماض مینماید ‪.‬‬
‫مثال ‪:‬‬
‫‪/ * this is a program‬‬
‫‪to calcufate sum of‬‬
‫‪n integer numbers */‬‬
‫توابع کتابخانه‬
‫زبان ‪ C++‬مجهز به تعدادی توابع کتابخانه می باشد‪ .‬بعنوان مثدال‬
‫تعدادی توابع کتابخانه برای عملیات ورودی و خروجی وجود دارند‪.‬‬
‫معموالً توابع کتابخانه مشابه ‪ ،‬بصورت برنامدههدای هددف (برنامده‬
‫ترجمه شده بزبان ماشین) در قالب فایلهای کتابخانه دسته بنددی و‬
‫مورد استفاده قرا رمیگیرند‪ .‬این فایلها را فایلهای ‪ header‬مینامند‬
‫و دارای پسوند ‪ .h‬میباشند‪.‬‬
‫نحوه استفاده از توابع کتابخانه ای‬
‫برای استفاده از توابع کتابخانه خاصی بایستدددی‬
‫نام فایل ‪ header‬آنرا در ابتدای برنامه در دستور‬
‫‪ #include‬قرار دهیم‪.‬‬
‫> اسم فایل ‪< header‬‬
‫‪#include‬‬
‫تابع‬
‫نوع‬
‫شرح‬
‫فاي ل هي در‬
abs(i)
int
i ‫ق درمطل ق‬
stdlib.h
cos(d)
double
math.h
exp(d)
log(d)
log10(d)
double
double
double
sin(d)
double
d ‫ك سينوس‬
ex
loge d
Log10 d
d ‫سينوس‬
sqrt(d)
double
d ‫ج ذر‬
math.h
strlen(s)
int
s ‫تع داد كركترهاي رشته‬
string.h
tan(d)
double
d ‫تانژانت‬
math.h
toascii( c)
int
c‫ك داس ك ي كركتر‬
stdlib.h
tolower(c )
int
‫تب دي ل به حروف كوچ ك‬
stdlib.h
toupper(c )
int
‫تب دي ل به حرف بزرگ‬
stdlib.h
math.h
math.h
math.h
math.h
‫برنامه در ‪C++‬‬
‫اکنون باتوجه به مرالب گفته شده قادر خواهیم بود که تعدادی برنامه ساده و کوچدك بده زبدان‬
‫‪ C++‬بنویسیم‪ .‬برای نوشتن برنامه بایستی دستورالعملها را در تابع ) (‪ main‬قرار دهیم و بدرای‬
‫اینکار میتوان به یکی از دو طریقی که در اسالیدهای بعد آمده است ‪ ،‬عمل نمود‪.‬‬
‫روش اول ‪:‬‬
‫>‬
‫‪#include‬‬
‫<‬
‫) (‪int main‬‬
‫}‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫; ‪return 0‬‬
‫}‬
‫روش دوم ‪:‬‬
‫>‬
‫‪#include‬‬
‫<‬
‫) (‪void main‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫ را روی صفحه‬C++ is an object oriented language ‫برنامه ای که پیغام‬
.‫مانیتور نمایش می دهد‬
#include <iostream.h>
int main( )
{
cout <<"C++ is an object oriented language \n" ;
return 0 ;
}
.‫برنامه زیر یك حرف انگلیسی کوچك را گرفته به حرف بزرگ تبدیل مینماید‬
#include <iostream.h>
#include <stdlib. h>
int main( )
{
char c1 , c2;
cout << "Enter a lowercase letter:"
cin >> c1;
c2 = toupper(c1);
cout << c2 << endl;
return 0; }
.‫دو عدد از نوع اعشاری را گرفته مجموع و حاصلضرب آنها را محاسبه و نمایش میدهد‬
#include <iostream.h>
int main( )
{
float
x,y,s,p ;
cin >> x >> y ;
s= x+y ;
p=x*y;
cout << s <<endl << p;
return 0 ;
}
‫فصل دوم‬
‫ساختارهای تصمیم گیری و تکرار‬
‫فهرست مطالب فصل دوم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫عملگر های رابره ای‬
‫عملگر شرطی‬
‫دستورالعمل شرطی‬
‫عملگر کاما‬
‫عملگر های منرقی‬
‫دستورالعمل ‪For‬‬
‫عملگرهای رابطه ای‬
‫از این عملگرها برای تعیین اینکه آیا دو عدد با‬
‫هم معادلند یا یکی از دیگری بزرگتر یا کوچکتر‬
‫میباشد استفاده میگردد‪ .‬عملگرهای رابرهای‬
‫عبارتند از‪:‬‬
‫مساوي‬
‫==‬
‫مخالف‬
‫=!‬
‫بزرگتر‬
‫>‬
‫بزرگتر يا مساوي‬
‫=>‬
‫كوچكتر‬
‫<‬
‫كوچكتر يا مساوي‬
‫=<‬
‫عملگر شرطی‬
‫شکل کلی عملگر شرطی بصورت زیر میباشد‪:‬‬
‫‪expression _ test ? expression _ true : expression _ false‬‬
‫عملگر شرطی تنها عملگری در ‪ C++‬میباشد که دارای سه عملوند میباشد‪.‬‬
‫مثال ‪: 1‬‬
‫;‪int x=10,y=20,b‬‬
‫; ‪b=(x>y) ? x : y‬‬
‫این دو دستور العمل باعث میشوند که ماکزیمم مقادیر ‪ y‬و ‪ x‬در ‪ b‬قرار بگیرد‪.‬‬
‫مثال ‪: 2‬‬
‫; "‪x>=10 ? cout << "passed" : cout << "failed‬‬
‫رشته‬
‫اگر مقدار ‪ x‬بزرگتر یا مساوی ده باشد رشتة ‪ passed‬در غیر اینصورت‬
‫‪ failed‬نمایش داده میشود‪.‬‬
‫‪IF‬‬
‫دستورالعمل شرطی‬
‫توسط این دستور شرطی را تست نموده و بسته به‬
‫آنکه شرط درست یا غلدط باشدد عکدس العمدل‬
‫خاصی را نشان دهیم‪.‬‬
‫) عبارت‬
‫(‪if‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫‪else‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
: 1 ‫مثال‬
if(x != y)
{
cout << x ;
++ x ;
}
else
{
cout << y ;
--y;
}
:2 ‫مثال‬
.‫برنامه زیر یك عدد اعشاری را از ورودی گرفته جذر آنرا محاسبه مینماید‬
#include <iostream.h>
#include <math . h>
int main( )
{
float x,s;
cin >> x ;
if( x < 0 )
cout << " x is negative" << endl ;
else
{
s = sqrt(x) ;
cout << s << endl ;
}
return 0;
}
‫عملگر کاما‬
‫تعدادی عبارت را می توان با کاما بهدم متصدل نمدود و‬
‫تشکیل یك عبارت پیچیدهتری را داد‪ .‬این عبارتها بده‬
‫ترتیب از چپ به راست ارزیابی شدده و مقددار عبدارت‬
‫معادل عبارت ‪ n‬میباشد‪.‬‬
‫(عبارت ‪ , .… , n‬عبارت ‪ , 3‬عبارت ‪ , 2‬عبارت ‪)1‬‬
‫مثال ‪:‬‬
‫اگر داشته باشیم‬
‫; ‪ int a=2 , b=4 , c=5‬عبارت زیر را در نظر بگیرید‪:‬‬
‫)‪(++ a , a+b, ++ c, c+b‬‬
‫مقدار عبارت برابر است با ‪ b+c‬که معادل ‪ 10‬میباشد‪.‬‬
‫عملگرهای منطقی‬
‫با استفاده از عملگرهای منرقی میتوان شرطهای ترکیبی در برنامه ایجاد نمود‪.‬‬
‫عملگرهای منرقی عبارتست از ‪:‬‬
‫‪AND‬‬
‫‪OR‬‬
‫‪NOT‬‬
‫که در ‪ C++‬به ترتیب بصورت زیر نشان داده میشود‪.‬‬
‫&&‬
‫||‬
‫!‬
‫جدول درستی سه عملگر شرطی‬
a
true
true
false
false
a
true
true
false
false
b
true
false
true
false
b
true
false
true
false
a && b
True
False
False
False
a
true
false
!a
False
True
a || b
True
True
True
False
‫چند مثال ‪:‬‬
‫))‪if ((x= = 5) ||(y != 0‬‬
‫; ‪cout << x << endl‬‬
‫اگر ‪ x‬برابر با ‪ 5‬یا ‪ y‬مخالف صفر باشد مقدار ‪ x‬نمایش داده شود ‪.‬‬
‫)‪if(x‬‬
‫;‪x=0‬‬
‫اگر مقدار ‪ x‬مخالف صفر باشد‪ ،‬آنگاه ‪ x‬برابر با صفر شود ‪.‬‬
‫برنامه زیر طول سه پارهخط را از ورودی گرفته مشخص مینماید که آیا تشكیل یك مثلث میدهد یا خیر؟‬
#include
< iostream.h >
int main( )
{
float a, b, c;
cout << "Enter three real numbers" << endl ;
cin >> a >> b >> c; //
if(( a < b + c) &&(b < a+c) &&(c < a+b))
cout << "It is a triangle" ;
else
cout << "Not a triangle" ;
return 0 ;
}
‫دستورالعمل ‪For‬‬
‫از دستور العمل ‪ for‬برای تکرار دستورالعملها استفاده میشود‪ .‬شکل کلی دستور‬
‫‪ for‬بصورت زیر میباشد‪:‬‬
‫(عبارت ‪ ; 3‬عبارت ‪ ; 2‬عبارت ‪for )1‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
.‫ را از ورودی گرفته فاکتوریل آنرا محاسبه ونمایش میدهد‬n ‫برنامه زیر عدد صحیح و مثبت‬
#include
<iostream.h>
int
main( )
{
int n, i ;
long fact = 1 ;
cout << "Enter a positive integer number";
cin >> n;
for( i=1; i<=n; ++i) fact *= i;
cout << fact << endl;
return 0 ;
}
‫برنامه زیر مجموع اعداد صحیح و متوالی بین ‪ 1‬تا ‪ n‬را محاسبه نموده و نمایش میدهد‪.‬‬
‫‪#include‬‬
‫>‪<iostream.h‬‬
‫‪int‬‬
‫) (‪main‬‬
‫{‬
‫; ‪int n, i=1‬‬
‫; ‪long s = 0‬‬
‫; ‪cin >> n‬‬
‫;‪for(; i<=n; i++) s += i‬‬
‫; ‪cout << s‬‬
‫} ; ‪return 0‬‬
.‫ را نمایش میدهد‬9 ‫ تا‬0 ‫برنامه زیر ارقام‬
#include <iostream.h>
int main( )
{
int j=0 ;
for( ; j <= 9 ; ) cout << j++ << endl;
return 0 ;
}
.‫ ایجاد میشوند را نمایش میدهد‬3 ، 2 ، 1 ‫برنامه زیر کلیه اعداد سه رقمی که با ارقام‬
#include <iostream.h>
int main( )
{
int i,j,k,n;
for(i=1; i<=3; ++i)
for(j=1; j<=3; ++j)
for(k=1; k<=3; ++k)
{
n=i*100 + j*10+k;
cout << n << ‘\n’ ;
}
return 0 ;
}
‫فصل سوم‬
‫سایر ساختارهای تکرار‬
‫فهرست مطالب فصل سوم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫‪.8‬‬
‫دستورالعمل ‪while‬‬
‫دستورالعمل ‪do while‬‬
‫دستورالعمل ‪break‬‬
‫دستورالعمل ‪continue‬‬
‫دستورالعمل ‪switch‬‬
‫تابع )(‪cin.get‬‬
‫عملگر )(><‪static_cast‬‬
‫جدول اولویت عملگرها‬
‫دستورالعمل ‪while‬‬
‫از این دستور العمل مانند دستورالعمل ‪ for‬برای تکرار یك دستورالعمل ساده یا ترکیبی‬
‫استفاده میگردد‪ .‬شکل کلی این دستور العمل بصورت زیر میباشد‪.‬‬
‫)شرط (‪while‬‬
‫}‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫}‬
‫تفاوت دستورهای ‪while‬و ‪for‬‬
‫دسددتورالعمل ‪ for‬زمددانی اسددتفاده‬
‫میشود که تعداد دفعات تکرار از قبدل‬
‫مشخص و معدین باشدد‪ .‬در صدورتیکه‬
‫تعداد دفعات تکدرار مشدخص نباشدد‬
‫بایسددددتی از دسددددتورالعمل ‪while‬‬
‫استفاده نمود‪.‬‬
‫مثال ‪:‬‬
‫‪int x=0‬‬
‫)‪while(x<5‬‬
‫;‪cout << x ++<< endl‬‬
‫با اجرای قرعه برنامه فوق مقادیر زیر نمایش داده میشود ‪:‬‬
‫‪0‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
.‫ قرار میدهد‬avg ‫ مقدار از نوع اعشاری را گرفته میانگین آنها را محاسبه و در متغیر‬n ‫برنامة فوق‬
#inclode <iostream.h>
int main( )
{
int count = 0 , n;
float x, sum = 0 , avg ;
cin >> n ; /* ‫ تعداد مقادیر ورودی‬n*/
while(count < n){
cin >> x ;
sum += x ;
++ count ; }
avg = sum / n ;
cout << avg << endl;
return 0 ; }
‫دستورالعمل ‪do while‬‬
‫این دستور العمل ني براي تكرار یك دستورالعمل سطاد‬
‫یا تركيبي استفاد ميشود‪ .‬شكل كلي این دستورالعمل‬
‫بصورت زیر ميباشد‪.‬‬
‫‪do‬‬
‫}‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫;)شرط (‪} while‬‬
‫تفاوت دستورهای ‪do while‬و ‪while‬‬
‫در دستورالعمل ‪ while‬ابتدا مقدار شرط‬
‫ارزیابی شدده امدا در دسدتورالعمل ‪do‬‬
‫‪ while‬ابتدددا دسددتورالعمل اجددرا شددده‬
‫سپس مقدار شدرط ارزیدابی مدیگدردد‪.‬‬
‫بنابراین دستورالعمل ‪ do while‬حداقل‬
‫یك بار انجام میشود ‪.‬‬
: ‫مثال‬
#include <iostream.h>
int main( )
{
int count = 0;
do
cout << count ++<<endl ;
while(count <= 9);
return 0 ; }
‫ را روی ده خط نمایش میدهد‬9 ‫ تا‬0 ‫ارقام‬
‫دستورالعمل ‪break‬‬
‫این دستورالعمل باعث توقف دستورالعملهای تکرار( ‪ )for , while ,do while‬شده و‬
‫کنترل به خارج از این دستورالعملها منتقل مینماید‪.‬‬
: 1 ‫مثال‬
#include <iostream.h>
int main( )
{
float x, s=0.0 ;
cin >> x ;
while(x <= 1000.0) {
if(x < 0.0){
cout << "Error-Negative Value" ;
break;
}
s += x ;
cin >> x ;}
cout << s << endl ;
return 0 ; }
:2 ‫مثال‬
#include <iostream.h>
int main( )
{
int count = 0 ;
while( 1 )
{
count ++ ;
if(count > 10 )
break ;
}
cout << "counter : " << count << "\n";
return 0 ;
}
:3 ‫مثال‬
#include <iostream.h>
void main( )
{
int count;
float x, sum = 0;
cin >> x ;
for(count = 1; x < 1000 . 0; ++ count )
{
cin >> x ;
if(x < 0.0) {
cout << "Error – Negative value " <<endl;
break ;
}
sum += x ; }
cout << sum << \n ; }
:4 ‫مثال‬
#include <iostream.h>
int main( )
{
float x , sum = 0.0 ;
do
{
cin >> x ;
if(x < 0.0)
{
cout << "Error – Negative Value" << endl ;
break ;
}
sum += x ;
} while(x <= 1000.0);
cout << sum << endl ;
return 0 ; }
‫دستورالعمل ‪continue‬‬
‫از دستورالعمل ‪ continue‬می توان در دستورالعملهای تکرار‬
‫‪ for ، while ، do while‬استفاده نمدود‪ .‬ایدن دسدتورالعمل‬
‫باعث می شود که کنترل بابتدای دستورالعملهای تکدرار منتقدل‬
‫گردد‪.‬‬
:1 ‫مثال‬
#include <iostream.h>
int main( )
{
float x, sum = 0.0 ;
Do
{
cin >> x ;
if(x < 0 . 0)
{
cout << "Error" << endl ;
continue ;
}
sum += x ;
} while(x <= 1000.0 );
cout << sum ;
return 0 ; }
:2 ‫مثال‬
#include <iostream.h>
int main( )
{
int n , navg = 0 ;
float x, avg, sum = 0 ;
cin >> n ; / * ‫ عبارت از تعداد اعداد ورودی‬n * /
for(int count = 1 ; count <=n; ++ count )
{
cin >> x ;
if(x < 0 ) continue ;
sum += x ;
++ navg ;
}
avg = sum / navg;
cout << avg << endl ;
return 0 ;
}
‫دستورالعمل ‪switch‬‬
‫همانرور که می دانید از دستورالعمل شرطی(‪ )if else‬می توان بصورت تودرتو‬
‫استفاده نمود ولی از طرفی اگر عمق استفادة تو در تو از این دستورالعمل زیداد‬
‫گردد‪ ،‬درك آنها مشکل میشود ‪ .‬برای حدل ایدن مشدکل ‪ ، C++‬دسدتورالعمل‬
‫‪ switch‬که عمالً یك دستورالعمل چند انتخابی میباشد را ارائه نموده است‪.‬‬
Switch ‫شكل کلی دستور العمل‬
switch(‫)عبارت‬
{
case valueone : statement;
break;
case
valuetwo: statement;
break;

case
valuen : statement;
break;
default: statement ;
}
#include <iostream.h>
void main( )
{
unsigned int n ;
cin >> n;
switch(n)
{
case 0:
cout << "ZERO" << endl ;
break;
case 1:
cout << "one" << endl ;
break ;
case 2:
cout << "two" << endl ;
break;
default :
cout << "default" << endl;
}
/ * end of switch statement * /
}
: 1 ‫مثال‬
#include <iostream.h>
void main( )
{
unsigned int n;
cin >> n ;
switch(n) {
case 0 :
case 1:
case 2:
cout << "Less Than Three" << endl;
break;
case 3:
cout << "Equal To Three" << endl ;
break;
default:
cout << "Greater Than Three" << endl;
}
}
: 2 ‫مثال‬
‫تابع )(‪: cin.get‬‬
‫این تابع یك کرکتر را از صفحه‬
‫کلید میگیرد‪ .‬برای استفاده از این‬
‫تابع در ابتدای برنامه بایستی داشته‬
‫باشیم‪:‬‬
‫‪#include‬‬
‫>‪<iostream.h‬‬
‫قرعه برنامه ذیل یك کرکتر را از صفحه کلید گرفته و نمایش میدهد‪.‬‬
‫‪char‬‬
‫;‪x‬‬
‫;) (‪x = cin.get‬‬
‫; ‪cout << x‬‬
‫برنامة ذیل یك سرر متن انگلیسی که به ‪ CTRL Z‬ختم میشود را گرفته دقیقاً نمایش میدهد‪.‬‬
‫>‪<iostream.h‬‬
‫‪#include‬‬
‫) (‪int main‬‬
‫{‬
‫;‪char x‬‬
‫)‪while((x = cin.get( ) !=EOF‬‬
‫; ‪cout << x‬‬
‫; ‪return 0‬‬
‫}‬
‫‪ EOF‬به معنی ‪ End of File‬میباشد کده در‬
‫‪ iostream.h‬تعریف شده و مقدار آن برابر بدا‬
‫‪ -1‬میباشدد‪ .‬مقددار آن در سیسدتم عامدل‬
‫‪ DOS‬عبارتست از ‪. ctrl z‬‬
.‫ استفاده شده است‬switch ‫ و دستور‬cin.get() ‫در قطعه برنامه ذیل ازتابع‬
char
x;
x = cin.get( );
switch(x) {
case  r  :
case  R  :
cout << RED << \n ;
break ;
case  b  :
case  B  :
cout << BLUE << endl ;
break ;
case  y  :
case  Y  :
cout << YELLOW << endl;
}
.‫) آنرا حذف نموده و نمایش میدهد‬blank( ‫برنامة ذیل یك سرر متن انگلیسی را گرفته کرکترهای خالی‬
#include
<iostream.h>
int main( )
{
char next;
while((next = cin.get( ) ) !=EOF)
if(next !=   )
cout << next ;
return 0 ;
}
‫عملگر ‪static_cast‬‬
‫از این عملگر برای تبدیل موقت یك نوع ‪ data‬به نوع دیگر‬
‫استفاده میشود‪ .‬این عملگر یك عملگر یکتائی میباشد‪.‬‬
‫مثال ‪:1‬‬
‫; ‪int x = 25‬‬
‫; ‪float y‬‬
‫‪y = static_cast‬‬
‫; )‪< float >(x‬‬
‫مقدار ‪ x‬موقتاً بصورت اعشداری در‬
‫می آید و در نتیجه مقدار ‪ y‬برابدر بدا‬
‫‪ 25.0‬می شود‪ .‬بایستی توجه داشدت‬
‫که نوع متغیر ‪ x‬عوض نمی شود بلکده‬
‫موقتاً مقدار آن بصدورت اعشداری در‬
‫آمده است‪.‬‬
‫مثال ‪:2‬‬
‫; ‪float x = 14.75‬‬
‫<< ‪cout‬‬
‫‪static_cast < int‬‬
‫;‪>(x) << endl‬‬
‫; ‪cout << x‬‬
‫ابتدا مقدار ‪ 14‬نمایش داده میشود و‬
‫سددپس مقدددار ‪ 14.75‬نمددایش داده‬
‫میشود‪.‬‬
‫جدول اولویت عملگرها‬
‫(‬
‫چ پ به راس ت‬
‫راس ت به چ پ‬
‫)‬
‫‪sizeof‬‬
‫‪-‬‬
‫‪+‬‬
‫‪Static_cast < >( ) ++‬‬
‫‪--‬‬
‫چ پ به راس ت‬
‫‪* / %‬‬
‫چ پ به راس ت‬
‫‪+ -‬‬
‫چ پ به راس ت‬
‫چ پ به راس ت‬
‫<<‬
‫>>‬
‫=> > =<‬
‫چ پ به راس ت‬
‫=!‬
‫==‬
‫راس ت به چ پ‬
‫‪:‬‬
‫?‬
‫راس ت به چ پ‬
‫چ پ به راس ت‬
‫=‪-‬‬
‫=‪*= /= %‬‬
‫‪,‬‬
‫<‬
‫=‪+‬‬
‫=‬
‫فصل چهارم‬
‫اعداد تصادفی‬
‫فهرست مطالب فصل چهارم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫تولید اعداد تصادفی‬
‫تعریف نوع داده ( ‪) typedef‬‬
‫داده های از نوع شمارشی‬
‫فرمت های مختلفه مقادیر خروجی‬
‫اعداد تصادفی‬
‫مقادیر تصادفی یا شانسی در اکثر برنامدههدای کداربردی در زمینده شدبیه سدازی و بازیهدای‬
‫کامپیوتری نقش مهمی را ایفا مینمایند‪ .‬برای ایجاد یك عدد تصادفی صدحیح بدین ‪ 0‬و ‪32767‬‬
‫بایستی از تابع ‪ ) (rand‬استفاده نمائیم‪.‬‬
.‫ را ایجاد مینماید‬32767 ‫ و‬0 ‫ عدد تصادفی بین‬10 ‫برنامه زیر‬
#include
<stdlib.h>
#include
< iostream.h>
int main( )
{
for(int j=1; j<=10; ++j)
cout << rand( ) << \n ;
return 0 ;
}
‫نكته ‪:‬‬
‫اگر برنامة فوق را چندبار اجرا نمائیم جواب یکسانی را از کامپیوتریمی گیریم‪.‬‬
‫برای تصادفی کردن اعداد میبایستی از تابع ) (‪ srand‬استفاده نمائیم‪.‬‬
‫این تابع به یك آرگومان صحیح از نوع ‪ unsigned‬نیاز دارد‪.‬‬
‫به این آرگومان ‪ seed‬گفته میشود‪.‬‬
‫در اسالید بعد برنامه قبلی را با تابع ) (‪ srand‬نوشته ایم‪.‬‬
) srand( ) ( .‫ را ایجاد مینماید‬32767 ‫ و‬0 ‫ عدد تصادفی بین‬10 ‫برنامه زیر‬
#include
<stdlib.h>
#include
< iostream.h>
int main( )
{
unsigned seed;
cout << "Enter seed value : " ;
cin >> seed ;
srand(seed);
for(int j=1; j<=10; ++j)
cout << rand( ) <<  \n ;
return 0 ;
}
.‫برنامه زیر نتیجه پرتاب دو تاس را نمایش میدهد‬
#include
< iostream.h>
#include
<stdlib.h>
int main( )
{
unsigned seed, d1, d2;
cout << "Enter seed: " ;
cin >> seed ;
srand(seed) ;
d1= 1+rand( )% 6 ;
d2= 1+rand( )% 6 ;
cout << d1 << 
<< d2 ;
return 0 ;
}
.‫ را نمایش میدهد‬1 ‫ و‬0 ‫ اعداد شانسی بین‬10 ‫برنامه زیر‬
#include
<stdlib.h>
#include
< iostream.h>
int main( )
{
unsigned seed ;
cout << "Enter seed: " ;
cin >> seed ;
srand(seed) ;
for(int i=1; i<=10; ++i)
cout << rand( ) / 32768.0 << endl ;
return 0 ;
}
‫تعریف نوع داده (‪)typedef‬‬
‫از ‪ typedef‬میتوان برای تعریف نوع دادههای جدید که معادل نوع‬
‫دادههای موجود باشد استفاده نمود‪ .‬شکل کلی عبارتست از ‪:‬‬
‫;‪typedef type newtype‬‬
‫اسم جدید‬
‫نشاندهنده نوع داده موجود‬
‫مثال ‪:‬‬
‫;‪typedef int integer‬‬
‫حال میتوان ‪ y‬و ‪ x‬را بصورت زیر تعریف نمود ‪:‬‬
‫;‪integer x,y‬‬
‫دادههای از نوع شمارشی‬
‫بمنظور معرفی دادههای از نوع شمارشی از کلمه ‪ enum‬استفاده میگردد‪.‬‬
‫مثال ‪:‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫; }‪enum color {red, blue, green, yellow, brown‬‬
‫‪ color‬یك نوع داده شمارشی میباشد‪.‬‬
: ‫چند مثال‬
emum status {married, devorced, vidow, single};
status a ;
a= single ;
enum days {sat, sun, mon, tue, wed, thr,
fri};
enum bread {lavash, fantezi, taftoon, barbari};
enum color { yellow, red=2, brown, white };
color x=brown;
0
3
4
‫توجه ‪:‬‬
‫بایستی در نظر داشت که داده های از‬
‫نوع شمارشدی در عملیدات ورودی و‬
‫خروجی شرکت نمی نمایندد‪ .‬بعبدارت‬
‫دیگر مقادیر دادههای از نوع شمارشی‬
‫بایسددتی در برنامدده تعیددین نمددود‪.‬‬
‫دستورالعلهای ورودی و خروجی مانند‬
‫‪ cin‬و ‪ cout‬در مدددورد دادههددددای‬
‫شمارشی نمیتوان استفاده نمود‪.‬‬
‫فرمتهای مختلفه مقادیر خروجی‬
‫مقدار ‪ x‬برور غیر علمی با نقره اعشار ثابت نمایش‬
‫داده می شود‪.‬‬
‫; ‪double x=1050‬‬
‫)‪cout << setiosflags(ios : : fixed | ios: : showpoint ) << setw(23‬‬
‫; ‪<< setprecision(2) << x << endl‬‬
‫مقدار ‪ x‬با طول میدان ‪ 23‬نمایش داده می شود‪.‬‬
‫مقدار ‪ x‬با دو رقم اعشار نمایش داده می شود‪.‬‬
‫بنابراین مقدار ‪ x‬بصورت زیر نمایش داده می شود ‪:‬‬
‫‪ 1050.00‬شانزده ستون خالی‬
‫فصل پنجم‬
‫آرایه ها‬
‫فهرست مطالب فصل پنجم‬
‫‪ .1‬آرایه یك بعدی‬
‫‪ .2‬آرایه دو بعدی ( ماتریس ها )‬
‫آرایه یك بعدی‬
‫آرایه یك فضای پیوسته از حافظه اصلی کامپیوتر میباشد که میتواند‬
‫چندین مقدا را در خود جای دهد‪.‬‬
‫کلیه عناصر یك آرایه از یك نوع میباشند‪.‬‬
‫عناصر آرایه بوسیله اندیس آنها مشخص میشوند‪.‬‬
‫در ‪ ، C++‬اندیس آرایه از صفر شروع میشود‪.‬‬
‫کاربرد آرایه ها‬
‫آرایهها در برنامهنویسی در مواردی کاربرد دارند که‬
‫بخواهیم اطالعات و دادهها را در طول اجرای‬
‫برنامه حفظ نمائیم‪.‬‬
‫; ]‪int x[5‬‬
‫‪x‬‬
‫‪4‬‬
‫پنجمین عنصر ]‪x[4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫اولین عنصر ]‪x[0‬‬
‫تخصیص مقادیر اولیه به عناصر آرایه ‪:‬‬
‫;}‪int x[5]= {4, 2, 5, 17, 30‬‬
‫‪30‬‬
‫‪17‬‬
‫‪4‬‬
‫‪3‬‬
‫‪x‬‬
‫‪5‬‬
‫‪2‬‬
‫‪4‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫دریافت مقادیر عناصر آرایه ‪:‬‬
‫;]‪int x[5‬‬
‫)‪for(int i=0; i<=4; ++i‬‬
‫; ] ‪cin >> x[ i‬‬
‫نمایش مقادیر عناصر آرایه ‪:‬‬
‫; ] ‪for(int i=0; i<=5; ++i) cout << x[ i‬‬
‫اگر تعداد مقادیر اولیه کمتر از تعداد عضوهای آرایه باشد عضوهای باقیمانده بطور اتوماتیك‪ ،‬مقدار اولیه صفر میگیرند‪.‬‬
‫;}‪int x[5] = {12, 5, 7‬‬
‫‪0‬‬
‫‪0‬‬
‫‪4‬‬
‫‪3‬‬
‫‪x‬‬
‫‪7‬‬
‫‪5‬‬
‫‪12‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫بایستی توجه داشت که آرایهها به صورت ضمنی مقدار اولیه صفر نمیگیرند‪ .‬برنامه نویس باید به عضو اول آرایه‪،‬‬
‫مقدار اولیه صفر تخصیص دهد تا عضوهای باقیمانده بطور اتوماتیك‪ ،‬مقدار اولیه صفر بگیرند‪.‬‬
‫; }‪int x[5] = {0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪4‬‬
‫‪3‬‬
‫‪x‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫دستور زیر یك آرایه یك بعدی شش عنصری از نوع ‪ float‬ایجاد مینماید‪.‬‬
‫; }‪float x[ ] = {2.4, 6.3, -17.1, 14.2, 5.9, 16.5‬‬
‫‪16.5‬‬
‫‪5.9‬‬
‫‪14.2‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪x‬‬
‫‪-17.1‬‬
‫‪6.3‬‬
‫‪2.4‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫ عدد اعشاری و مثبت را گرفته تشکیل یك آرایه میدهد سپس مجموع عناصر آرایه را مشخص‬100 ‫برنامه ذیل‬
.‫نموده نمایش میدهد‬
#include <iostream.h>
#include <iomanip.h>
int main( )
{
const int arrsize = 100 ;
float x[ arrsize], tot = 0.0 ;
for(int j=0; j<arrsize; j++)
cin >> x[ j ];
for(j=0; j<arrsize; j++)
cout << setiosflags(ios::fixed ios :: showpoint ) << setw(12) <<
setprecision(2) << x[ j ] << endl;
for(j=0; j<arrsize; j++)
tot += x[ j ] ;
cout << tot ;
return 0 ;
}
‫ عدد اعشاری را گرفته تشكیل یك آرایه داده سپس کوچكترین عنصر آرایه را‬20 ‫برنامه ذیل‬
.‫مشخص و نمایش میدهد‬
#include <iostream.h>
#include <conio.h>
int main( )
{
float x[20], s;
int j ;
clrscr( ) ;
for(j=0; j<20 ; ++j) cin >> x[ j ];
s = x[0 ] ;
for(j=1; j<20; ++j)
if(x[ j] <s) s = x[ j ];
cout << s << endl;
return 0;
}
.‫) بصورت صعودی مرتب مینماید‬Bubble sort( ‫ عدد اعشاری را گرفته بروش حبابی‬100 ‫برنامه زیر‬
#include <iostream.h>
#include <conio.h>
int main ( )
{
float x[100] , temp;
int i,j ;
clrscr( );
for(i=0; i<100; ++i) cin >> x[i ];
for(i=0; i<99; i++)
for(j=i+1 ; j<100; j++)
if(x[ j ] < x[i ]{
temp = x[ j ] ;
x[ j ] = x[ i ];
x[ i ] = temp ;
}
for(i=0; i<=99; i++)
cout << x[ i ] << endl;
return 0 ;
}
‫آرایههای دوبعدی (ماتریسها)‬
‫ماتریسها بوسیله آرایههای دوبعدی در کامپیوترنمایش داده میشوند‪.‬‬
‫;]‪int a[3][4‬‬
‫ستون‬
‫‪3‬‬
‫ستون‬
‫‪2‬‬
‫ستون‬
‫‪1‬‬
‫ستون‬
‫‪0‬‬
‫]‪a[0][3‬‬
‫]‪a[0][2‬‬
‫]‪a[0][1‬‬
‫]‪a[0][0‬‬
‫سرر‬
‫‪0‬‬
‫]‪a[1][3‬‬
‫]‪a[1][2‬‬
‫]‪a[1][1‬‬
‫]‪a[1][0‬‬
‫سرر‬
‫‪1‬‬
‫]‪a[2][3‬‬
‫]‪a[2][2‬‬
‫]‪a[2][1‬‬
‫]‪a[2][0‬‬
‫سرر‬
‫‪2‬‬
‫تخصیص مقادیر اولیه به عناصر آرایه ‪:‬‬
‫; } }‪int a[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪8‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪1‬‬
‫‪12‬‬
‫‪11‬‬
‫‪10‬‬
‫‪9‬‬
‫‪2‬‬
int a[3][4]= { {1}, {2,3} , {4,5,6} } ;
0
1
2
3
0
1
0
0
0
1
2
3
0
0
2
4
5
6
0
int a[3][4]= {1, 2, 3, 4,5 } ;
0
1
2
3
0
1
2
3
4
1
5
0
0
0
2
0
0
0
0
‫در یك آرایة دواندیسی‪ ،‬هر سرر‪ ،‬در حقیقت آرایهای یك اندیسی است‪ .‬در‬
‫اعالن آرایههای دواندیسی ذکر تعداد ستونها الزامی است‪.‬‬
‫;}‪int a[ ][4]={1,2,3,4,5‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪5‬‬
‫‪1‬‬
.‫ را گرفته مجموع عناصر آن را مشخص نموده و نمایش میدهد‬3*4 ‫برنامه زیر یك ماتریس‬
#include <iostream.h>
#include <conio.h>
int main( )
{
float x[3][4], total= 0.0;
int i, j ;
// generate matrix x.
for(i=0; i<3; ++i)
for (j=0; j<3; j++)
cin >> x[ i ][ j ];
// calculate the sum of elements.
for(i=0; i<3; ++i)
for(j=0; j<4; j++)
tot + = x [ i ][ j ];
cout << "total = " << total << endl;
return 0 ;
}
‫فصل ششم‬
‫توابع‬
‫فهرست مطالب فصل ششم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫تعریف تابع‬
‫تابع بازگشتی‬
‫توابع درون خری‬
‫انتقال پارامترها از طریق ارجاع‬
‫کالس های حافظه ( ‪) storage classes‬‬
‫سربارگذاری توابع‬
‫تعریف توابع‬
‫استفاده از توابع در برنامهها به برنامهنویس این امکان را میدهدد کده‬
‫بتواند برنامههای خود را به صورت قرعه قرعه برنامه بنویسد‪ .‬تا کندون‬
‫کلیه برنامههدائی کده نوشدتهایدم فقدط از تدابع ) (‪ main‬اسدتفاده‬
‫نمودهایم ‪.‬‬
‫نوع مقدار برگشتی‬
‫شكل کلی توابع بصورت زیر میباشند ‪:‬‬
‫لیست پارامتر ها جهت انتقال اطالعات از تابع احضار کننده به تابع فراخوانده شده‬
‫)‪return-value-type function-name (parameter-list‬‬
‫{‬
‫‪declaration and statements‬‬
‫نام تابع‬
‫}‬
‫تعریف اعالنهای تابع و دستورالعملهای اجرائی‬
‫تابع زیر یك حرف کوچك را به بزرگ تبدیل مینماید‪.‬‬
‫نوع مقدار برگشتی‬
‫پارامتری از نوع ‪char‬‬
‫نام تابع‬
‫)‪char low_to_up (char c1‬‬
‫{‬
‫;‪char c2‬‬
‫;‪c2 = (c1>=  a  && c1<=  z )?( A  + c1-  a ): c1‬‬
‫; )‪return (c2‬‬
‫}‬
.‫برنامه کامل که از تابع قبل جهت تبدیل یك حرف کوچك به بزرگ استفاده مینماید‬
#include <iostream.h>
char low_to_up(char c1)
{
char c2;
c2=(c1 >=  a  && c1 <=  z )?( A  +c1 - a ) : c1;
return c2;
}
int main( )
{
char x;
x=cin.get( );
cout << low_to_up(x) ;
return 0;
}
x
‘d’
c1
‘d’
c2
‘D’
‫آرگومان‬
‫تابع ‪ maximum‬دو مقدار صحیح را گرفته بزرگترین آنها را برمیگرداند‪.‬‬
‫)‪int maximum(int x, int y‬‬
‫{‬
‫; ‪int z‬‬
‫;‪z=(x >= y)? x : y‬‬
‫;‪return z‬‬
‫}‬
.‫ جهت یافتن ماکزیمم دو مقدار صحیح استفاده می نماید‬maximum ‫برنامه کامل که از تابع‬
#include <iostream.h>
int maximum(int x , int y)
{
int z ;
z=(x > y)? x : y ;
return z;
}
int main( )
{
int a, b ;
cin >> a >> b ;
cout << maximum(a,b);
return 0;
}
maximum ‫آرگومانهای تابع‬a, b
a
b
10
15
x
y
10
15
z
15
‫اسامی پارامترها و آرگومانهای یك تابع‬
‫میتوانند همنام باشند‪.‬‬
.‫برنامه زیر یك مقدار مثبت را گرفته فاکتوریل آنرا محاسیه نموده نمایش میدهد‬
x!=1*2*3*4*…*(x-1)*x
#include <iostream.h>
long int factorial(int n)
{
long int prod=1;
if(n>1)
for(int i=2; i<=n; ++i)
prod *=i;
return(prod);
}
int main( )
{
int n;
cin >> n ;
cout << factorial(n) ;
return 0 ;
}
main ‫ در‬n
3
factorial ‫ در‬n
3
factorial ‫ در‬i
2,3,4
factorial ‫ در‬prod
6
‫وقتی در تابعی‪ ،‬تابع دیگر احضار میگردد‬
‫بایستی تعریف تابع احضار شونده قبل از‬
‫تعریف تابع احضار کننده در برنامه ظاهر گردد‪.‬‬
‫اگر بخواهیم در برنامهها ابتدا تابع ‪ main‬ظاهر‬
‫گردد بایستی ‪ prototype‬تابع یعنی پیش‬
‫نمونة تابع که شامل نام تابع‪ ،‬نوع مقدار‬
‫برگشتی تابع‪ ،‬تعداد پارامترهائی را که تابع‬
‫انتظار دریافت آنرا دارد و انواع پارامترها و‬
‫ترتیب قرارگرفتن این پارامترها را به اطالع‬
‫کامپیلر برساند‪.‬‬
‫در اسالید بعد مثالی در این زمینه آورده شده است‪.‬‬
#include <iostream.h>
#include <conio.h>
long int factorial(int); // function prototype
int main( )
{
int n;
cout << "Enter a positive integer" << endl;
cin >> n;
cout << factorial(n) << endl;
return 0 ;
}
long int factorial(int n)
{
long int prod = 1;
if(n>1)
for(int i=2; i<=n; ++i)
prod *= i;
return(prod);
}
‫در صورتی که تابع مقداری بر نگرداند نوع‬
‫مقدار برگشتی تابع را ‪ void‬اعالن میکنیم‪ .‬و‬
‫در صورتیکه تابع مقداری را دریافت نکند بجای‬
‫‪ parameter- list‬از ‪ void‬یا ( ) استفاده‬
‫میگردد‪.‬‬
‫در اسالید بعد مثالی در این زمینه آورده شده است‪.‬‬
#include <iostream.h>
#include <conio.h>
void maximum(int , int) ;
int main( )
{ int x, y;
clrscr( )
cin >> x >> y;
maximum(x,y);
return 0;
}
void maximum(int x, int y)
{
int z ;
z=(x>=y) ? x : y ;
cout << "max value \n" << z<< endl;
return ;
}
.‫تابع مقداری بر نمی گرداند‬
) Call By Value ( ‫احضار بوسیله مقدار‬
#include <iostream.h>
int modify(int)
int main( )
{
int a=20;
cout << a << endl;
modify(a) ;
cout << a << endl;
return 0 ;
}
int modify(int a)
{
a *= 2;
cout << a << endl;
return ;
}
main ‫ در‬a
20
modify‫ در‬a
20
modify‫ در‬a
40
: ‫خروجی برنامه‬
20
40
20
‫احضار بوسیله مقدار ( ‪) Call By Value‬‬
‫‪ a‬در ‪main‬‬
‫‪20‬‬
‫‪ a‬در‪modify‬‬
‫‪20‬‬
‫‪ a‬در‪modify‬‬
‫‪40‬‬
‫در این نوع احضدار تدابع حافظده هدای مدورد‬
‫اسدددددتفاده آرگومانهدددددا و پارامترهدددددا‬
‫از هم متمایزند و هرگونه تغییدر در پارامترهدا‬
‫باعددددددددددددددث تغیددددددددددددددر‬
‫در آرگومانهای متناظر نمیگردد‪.‬‬
‫>‪#include <iostream.h‬‬
‫)‪int modify(int‬‬
‫) (‪int main‬‬
‫{‬
‫;‪int a=20‬‬
‫;‪cout << a << endl‬‬
‫; )‪modify(a‬‬
‫;‪cout << a << endl‬‬
‫; ‪return 0‬‬
‫}‬
‫)‪int modify(int a‬‬
‫{‬
‫;‪a *= 2‬‬
‫;‪cout << a << endl‬‬
‫; ‪return‬‬
‫}‬
‫هر زمان که نوع مقدار برگشتی تابع ‪int‬‬
‫میباشد نیازی به ذکر آن نیست و همچنین‬
‫نیازی به تعریف پیش نمونه تابع نمیباشد‪.‬‬
‫تابع بازگشتی (‪)recursive functions‬‬
‫توابع بازگشتی یا ‪ recursive‬توابعی هستند که‬
‫وقتی احضار شوند باعث میشوند که خود را احضار نمایند‪.‬‬
‫نحوه محاسبه فاکتوریل از طریق تابع بازگشتی‬
‫‪n != 1*2*3*…*(n-1) *n‬‬
‫! ‪f(n) = n‬‬
‫اگر ‪n=0‬‬
‫در غير اينصورت‬
‫‪1‬‬
‫)‪n *f(n-1‬‬
‫= )‪f(n‬‬
‫‪n!= 1* 2* 3* … *(n-2) *(n-1) *n‬‬
‫‪n!=(n-1)! *n‬‬
‫در اسالید بعد تابع بازگشتی مورد نظر پیاده سازی شده است‪.‬‬
‫تابع بازگشتی محاسبه فاکتوریل‬
#include <iostream.h>
long int factorial(int) ;
int main( )
{
int n ;
cout <<  n=  ;
cin >> n ;
cout << endl <<  factorial =  << factorial(n) << endl;
return 0 ;
}
long int factorial(int n)
{
if(n<=1)
return(1);
else
return(n *factorical(n-1) ) ;
}
‫نحوه محاسبه ‪ n‬امین مقدار دنباله فیبناکی از طریق تابع بازگشتی‬
‫… ‪0 , 1, 1, 2, 3, 5, 8, 13, 21 , 34,‬‬
‫دنباله فیبناکی ‪:‬‬
‫اگر ‪n=1‬‬
‫‪0‬‬
‫اگر ‪n=2‬‬
‫‪1‬‬
‫=)‪ =fib(n‬جمله ‪ n‬ام‬
‫در غیر اینصورت‬
‫)‪fib(n-1)+fib(n-2‬‬
‫در اسالید بعد تابع بازگشتی مورد نظر پیاده سازی شده است‪.‬‬
.‫) را مشخص و نمایش میدهد‬fibonacci( ‫ امین مقدار دنبالة فیبناکی‬n ‫برنامهزیر‬
#include <iostream.h>
long int fib(long int); // forward declaration
int main( )
{
long int r ;
int n ;
cout <<  Enter an integer value  << endl ;
cin >> n ;
r = fib(n) ;
cout << r << endl ;
return 0 ;
}
long int fib(long int n)
{
if(n = = 1 || n= = 2)
return 1 ;
else
return(fib(n-1) + fib(n-2) ) ;
}
.‫برنامه زیر یك خط متن انگلیسی را گرفته آنرا وارون نموده نمایش میدهد‬
#include <iostream.h>
void reverse(void) ; // forward declaration
int main( )
{
reverse( ) ;
return 0 ;
}
void reverse(void)
// read a line of characters and reverse it
{
char c ;
if(( c=cin.get( )) !=  \n ) reverse( );
cout << c ;
return ;
}
‫استفاده از آرایهها بعنوان پارامتر تابع مجاز است‪.‬‬
‫در اسالید بعد به یك مثال توجه نمایید‪.‬‬
.‫ را بعنوان پارامتر میگیرد‬a ‫ آرایه‬modify ‫در برنامه زیر تابع‬
#include <iostream.h>
void modify(int [ ] ); // forward declaration
int main( )
{
int a[5] ;
for(int j=0; j<=4; ++j)
a[ j ] = j+1 ;
modify(a) ;
for(j=0; j<5; ++j)
cout << a[ j ] << endl ;
return 0 ;
}
void modify(int a[ ]) // function definition
{
for(int j=0; j<5; ++j)
a[ j ] += 2 ;
for(j=0; j<5; ++j)
cout << a[ j ] << endl ;
return ;
}
: ‫خروجی‬
1
2
3
4
5
3
4
5
6
7
‫در صورتیکه آرایه بیش از یك بعد داشته باشد‬
‫بعدهای دوم به بعد بایستی در تعریف تابع و پیش‬
‫نمونه تابع ذکر گردد‪.‬‬
‫در اسالید بعد به یك مثال توجه نمایید‪.‬‬
#include <iostream.h>
void printarr(int [ ][ 3 ]);
int main( )
{
int arrl [2][3] = { {1,2,3}, {4,5,6} };
arr2 [2][3]= {1,2,3,4,5};
arr3 [2][3]={ {1,2}, {4} };
printarr(arr1);
cout << endl ;
printarr(arr2);
cout << endl ;
printarr(arr3);
return 0 ;
}
void printarr(int a[ ][3] )
{
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
cout << a[ i ][ j ] << 
;
cout << endl ;
}
}
: ‫خروجی‬
1
4
1
4
1
4
2
5
2
5
2
0
3
6
3
0
0
0
‫توابع درون خطی (‪)inline‬‬
‫کلمه ‪ inline‬بدین معنی است که به کامپیلر دستور میدهد که‬
‫یك کپی از دستورالعلمهای تابع در همان جا (در زمان مقتضی)‬
‫تولید نماید تا از احضار تابع ممانعت بعمل آورد‪.‬‬
‫اشكال توابع ‪inline‬‬
‫بجای داشتن تنها یك کپی از تابع ‪ ،‬چند کپی از دستورالعملهای تابع در‬
‫برنامه اضافه میشود که باعث بزرگ شدن اندازه یا طول برنامه میشود‪.‬‬
‫بنابراین از ‪ inline‬برای توابع کوچك استفاده میگردد‪.‬‬
‫مثالی از توابع درون خطی‬
#include <iostream.h>
inline float cube(const float s) {return s*s*s; }
int main( )
{
float side ;
cin >> side ;
cout << side << cube(side) << endl ;
return 0 ;
}
‫انتقال پارامترها از طریق ارجاع‬
‫تاکنون وقتی تابعی را احضار میکردیم یك کپی از مقادیر آرگومانها درپارامترهای متناظر‬
‫قرار میگرفت ‪ .‬این روش احضار بوسیله مقدار یا ‪ call by value‬نامیده شد‪.‬‬
‫در انتقال پارامترها از طریق ارجاع در حقیقت حافظه مربوط به آرگومانها و پارامترهای متناظر‬
‫بصورت اشتراکی مورد استفاده قرار میگیرد‪ .‬این روش ‪call by reference‬‬
‫نامیده میشود ‪.‬‬
‫انتقال پارامترها از طریق ارجاع‬
‫در این روش پارامترهائی که از طریق ‪ call by reference‬عمل مینمایند در‬
‫پیش نمونه تابع قبل از نام چنین پارامترهائی از & استفاده میشود‪.‬واضح است‬
‫که در تعریف تابع نیز بهمین طریق عمل میشود‪.‬‬
#include <iostream.h>
int vfunct(int); // for
void rfunct (int &) ;
int main( )
x
{
int x=5, y=10;
5
cout << x << endl << vfunct(x) << endl << x << endl ;
cout << y << endl ;
rfunct(y) ;
cout << y << endl ;
.‫تغییر نمی کند‬x ‫مقدار آرگومان‬
return 0 ;
}
int vfunct(int a)
{
return a *= a ;
}
x
void rfunct(int &b)
5
{
b *= b ;
}
: ‫مثال‬
y
10
: ‫خروجی‬
5
25
5
10
y b
10 100
: ‫ادامه خروجی‬
100
‫نكته ‪:‬‬
‫وقتی پارامتری بصورت ‪call by reference‬‬
‫اعالن میگردد این بدان معنی است که با تغییر‬
‫مقدار این پارامتر در تابع احضار شده مقدار‬
‫آرگومان متناظر نیز تغییر مینماید‪.‬‬
.‫ دو مقدار اعشاری را مبادله مینماید‬fswap ‫برنامهزیر با استفاده از‬
#include <iostream.h>
void fswap(float & , float & );
int main( )
{
float a=5.2, b=4.3;
cout << a << endl << b ;
fswap( a , b) ;
cout << a << endl << b ;
return 0 ;
}
void fswap(float &x , float & y)
{
float t;
t=x;
x=y;
y=t;
}
‫کالسهای حافظه (‪)storage classes‬‬
‫متغیرها بدو طریق متمایز مشخص میشوند یکی بوسیله نوع (‪ )type‬آنها و دیگری بوسیله‬
‫کالس حافظه آنها‪ .‬نوع متغیر قبالً اشاره شده بعنوان مثال ‪ . . . ، double ، float ، int‬ولی‬
‫کالس حافظة یك متغیر در مورد طول عمر و وسعت و دامنة متغیر بحث مینماید‪.‬‬
‫در اسالید بعد به انواع کالس حافظه می پردازیم‪.‬‬
‫بطور کلی کالس حافظه متغیرها به چهار دستة تقسیم میگردد ‪:‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪automatic‬‬
‫‪static‬‬
‫‪external‬‬
‫‪register‬‬
‫متغیرهای ‪ automatic‬در درون یك تابع تعریف مدیشدوند و در تدابعی کده‬
‫اعالن میشود بصورت متغیرهای محلی برای آن تابع میباشند‪ .‬حافظه تخصدیص‬
‫داده شده به متغیرهای ‪ automatic‬پس از اتمام اجرای تابع از بدین مدی رود‬
‫بعبارت دیگر وسعت و دامنة متغیرهای از نوع ‪ automatic‬تابعی میباشدد کده‬
‫متغیر در آن اعالن گردیده است‪.‬‬
‫متغیرهای ‪ static‬نیز در درون توابع تعریف میشوند و از نظر وسعت و دامنه شبیه‬
‫متغیرهای ‪ automatic‬هستند ولی در خاتمة اجرای تابع‪ ،‬حافظه وابسته به این نوع‬
‫متغیرهدددا از بین نمیرود بلکه برای فراخوانی بعدی تابع باقی میماند‪.‬‬
‫در اسالید بعد به یك مثال از کاربرد این نوع کالس حافظه می پردازیم‪.‬‬
: ‫مثال‬
#include <iostream.h>
// program to calculate successive fibonacci numbers
long int fib(int) ;
int main( )
{
int n ;
cout <<  how many fibonacci numbers? ;
cin >> n ;
cout << endl ;
for(int j=1; j<=n; ++j )
cout << j <<   << fib(j) << endl ;
return 0 ;
}
long int fib(int count)
{
static long int t1 = 1, t2=1;
long int t ;
t =(count <3) ?1 : t1 + t2 ;
t2 = t1 ;
t1 = t ;
return(t) ;
}
‫بایستی توجه داشت که اگر در‬
‫توابددع بدده متغیرهددای از نددوع‬
‫ مقدار اولیه تخصدیص‬static
‫ندهیم مقددار صدفر بصدورت‬
‫اتوماتیك برای آنهدا در نظدر‬
.‫گرفته میشود‬
‫متغیرهای از نوع ‪ external‬متغیرهائی هستند که در بیرون از توابع اعالن‬
‫میشوند و وسعت و دامنه فعالیت آنها کلیه توابعی میباشد که در زیر دستور‬
‫اعالن متغیر قرار دارد‪.‬‬
‫در اسالید بعد به یك مثال از کاربرد این نوع کالس حافظه می پردازیم‪.‬‬
#include <iostream.h>
int w; // external variable
functa(int x, int y)
{
cout << w ;
w=x+y;
cout << endl << w << enld;
return x%y ;
}
int main( )
{
int a, b, c, d;
cin >> a >> b ;
c=functa(a, b) ;
d=functa(w, b+1);
cout << endl << c << endl << d << endl << w ;
return 0 ;
}
: ‫مثال‬
‫بایستی توجه داشت که اگر در‬
‫توابددع بدده متغیرهددای از نددوع‬
‫ مقدددددار اولیدددده‬external
‫تخصیص ندهیم مقددار صدفر‬
‫بصورت اتوماتیك برای آنها در‬
.‫نظر گرفته میشود‬
‫وقتی متغیری از نوع ‪ register‬اعالن میشود از کامپیوتر عمالً درخواست‬
‫میشود که به جای حافظه از یکی از رجیسترهای موجود استفاده نماید‪.‬‬
‫کاربرد کالس ‪register‬‬
‫معموالً از نوع رجیستر برای شاخصهای دستور تکرار و یا اندیسهای آرایهها‬
‫استفاده میشود‪ .‬بایستی توجه داشت که متغیرهای از نوع رجیستر قابل استفاده‬
‫دردستور ‪ cin‬نمیباشند‬
‫سربارگذاری توابع (‪)function overloading‬‬
‫در ‪ C++‬این امکان وجود دارد که دریك برنامه بتوانیم از چند توابع هم نام‬
‫استفاده نمائیم مشروط بر این که پارامترهای این توابع متفاوت باشند‪( .‬از‬
‫نظر تعداد پارامتر و یا نوع پارامترها و ترتیب آنها)‬
: ‫مثال‬
#include <iostream.h>
float addf(float , int);
int addf(int , int);
int main( )
{
int a=5, b=10 ;
float d=14.75 ;
cout << addf(a , b) << endl;
cout << addf(d , b) << endl;
return 0 ;
}
int addf(int x, int y)
{
return x+y ;
}
float addf(float x, int y)
{
return x+y ;
}
‫فصل هفتم‬
‫ساختار ها و اشاره گرها‬
‫فهرست مطالب فصل هفتم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫ساختارها‬
‫‪ Union‬ها‬
‫اشاره گرها ( ‪) Pointer‬‬
‫تعریف آرایه‬
‫آرایه های دو بعدی و اشاره گرها‬
‫تخصیص حافظه بصورت پویا ( عملگر ‪) new‬‬
‫رشته ها و توابع مربوطه‬
‫ساختارها‬
‫ساختارها شبیه آرایهها بوده بدین صورت که یك نوع داده گروهی است که فضای‬
‫پیوسته از حافظه اصلی را اشغال مینماید‪ .‬اما عناصر ساختار الزاماً از یك نوع‬
‫نمیباشند بلکه اعضای یك ساختار میتوانند از نوعهای مختلفه از قبیل ‪، char‬‬
‫‪ … ، float ، int‬باشند‪.‬‬
‫تعریف ساختار‬
‫نام ساختار‬
struct time
{
int hour ; // 0 – 23
int minute ; // 0 – 59
int second; //
};
‫اعضا ساختار‬
‫مثال ‪:‬‬
‫{ ‪struct account‬‬
‫; ‪int acc_no‬‬
‫;‪char acc_type‬‬
‫; ]‪char name[80‬‬
‫; ‪float balance‬‬
‫;}‬
‫ساختار ‪ account‬دارای چهار عضو میباشد‪.‬‬
‫‪ acc_no‬شماره حساب از نوع ‪int‬‬
‫‪ acc_type‬نوع حساب از نوع ‪char‬‬
‫مشخصات صاحب حساب از نوع رشتة ‪ 80‬کرکتری‬
‫‪name‬‬
‫‪ balance‬مانده حساب از نوع ‪float‬‬
: ‫به دو صورت می توان اعالن یك متغیر از نوع ساختار را نمایش داد‬
: ‫روش اول‬
struct account {
int acc_no;
char acc_type;
char name[80];
float balance;
} cust1, cust2, cust3;
: ‫روش دوم‬
struct account {
int acc_no ;
char acc_type;
char name[80];
float balance;
};
account cust1, cust2, cust3;
‫به ساختارها میتوان مقدار اولیه نیز تخصیص داد‬
‫;}‪account cust = {4236, r, Nader Naderi , 7252.5‬‬
‫دسترسی به عناصر یك ساختار‬
‫‪.‬‬
‫بمنظور دسترسی به عناصر یك ساختار از عملگر استفاده‬
‫میگردد ‪ .‬عملگر‪ .‬جزء عملگرهای یکتائی میباشد‪.‬‬
: ‫مثال‬
cust .acc_no = 4236
cust .acc_type = r
cust . name = Nader Naderi
cust . balance = 7252.5
: ‫نكته‬
.‫عضو یك ساختار خود میتواند یك ساختار دیگر باشد‬
struct date {
int month;
int day;
int year;
};
struct account {
int acc_no ;
char acc_typer;
char name[80];
float balance ;
date lastpay ; };
‫اگرداشته باشیم‬
account x, y ;
‫ بوسیله‬lastpay ‫آنگاه عضو‬
x.lastpay.day
x.lastpay.month
x.lastpay.year
.‫مشخص میگردد‬
‫نكته ‪:‬‬
‫میتوان آرایهای تعریف نمود که هر عضو آن یك ساختار باشد و حتی به آنها مقادیر اولیه تخصیص نمود‪.‬‬
‫{ ‪struct struc1‬‬
‫;]‪char name[40‬‬
‫;‪int pay1‬‬
‫; } ;‪int pay2‬‬
‫‪strucl cust[ ]= {nader, 3000 , 40000,‬‬
‫‪sara, 4200, 6000,‬‬
‫‪susan, 3700, 25000,‬‬
‫;} ‪saman, 4800 , 2000,‬‬
‫ دو عدد مختلط را میگیرد و‬،‫برنامه زیر هر عدد مختلط را بصورت یك ساختار در نظر گرفته‬
.‫مجموع آنها را مشخص و نمایش میدهد‬
#include <iostream.h>
int main( )
{
struct complex{
float a;
float b; } x, y, z;
cout << enter 2 complex numbers << endl ;
cin >> x.a>>x.b ;
cout << endl;
cin >> y.a >> y.b;
z.a = x.a + y.a ;
z.b = x.b + y.b ;
cout << endl << z.a <<  << z.b;
return 0 ;
}
x = a + ib
i2= -1 ‫بروریکه‬
y = c + id
x+y =(a+c) + i(b+d)
‫‪union‬‬
‫‪ union‬از نظر ساختاری شبیه ‪ struct‬می باشد ‪ .‬با این تفاوت که عضدوهائی‬
‫که تشکیل ‪ union‬میدهد همگی از حافظه مشدترکی در کدامپیوتر اسدتفاده‬
‫مینمایند‪ .‬بنابراین استفاده از ‪ union‬باعث صرفهجوئی در حافظه میگردد‪.‬‬
‫مثال ‪:‬‬
‫‪union id‬‬
‫{‬
‫;]‪char color [10‬‬
‫;‪int size‬‬
‫;‪} x , y‬‬
‫هر کدام از متغیرهای ‪ x‬و ‪ y‬یك رشته‬
‫‪ 10‬کرکتری یا یك مقدار از نوع ‪int‬‬
‫میباشد وکامپیوتر یك بلوك حافظه که‬
‫بتواند رشته ‪ 10‬کرکتری رادر خود جای‬
‫دهد ‪ ،‬برای‪ color‬و ‪ size‬در نظر‬
‫میگیرد‪.‬‬
: ‫مثال‬
union xpq
{
int x ;
char y[2] ;
}p;
x
‫باي ت دوم‬
y[1]
‫باي ت اول‬
y[0]
‫اشارهگرها (‪)Pointers‬‬
‫دادههائی که در کامپیوتر در حافظه اصلی ذخیره میشوند‬
‫بایتهای متوالی از حافظه بسته به نوع ‪ data‬اشغال میکنند‪.‬‬
‫نوع داده‬
‫حافظه الزم‬
‫مقادیر‬
‫‪ 2‬بایت‬
‫‪ 32767‬تا ‪–32768‬‬
‫‪ 4‬بایت‬
‫‪ 2147483647‬تا ‪–2147483648‬‬
‫‪1‬بایت‬
‫یك کارکتر‬
‫‪char‬‬
‫‪ 4‬بایت‬
‫‪ 3.4e38‬تا ‪1.2e-38‬‬
‫‪float‬‬
‫‪ 8‬بایت‬
‫‪ 1.8e308‬تا ‪2.2e-308‬‬
‫‪int‬‬
‫‪long int‬‬
‫‪double‬‬
‫اشارهگرها (‪)Pointers‬‬
‫با داشتن آدرس داده در حافظة اصلی میتوان براحتی به آن داده‬
‫دسترسی پیدا نمود و از طرف دیگر آدرس هر داده در حافظه آدرس‬
‫بایت شروع آن داده میباشد‪.‬‬
‫;‪int x = 613‬‬
‫‪0‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪613‬‬
‫نكته ‪:‬‬
‫در کامپیوتر آدرسها معموالً دو بایت اشغال مینمایند‪ .‬اگر آدرس ‪ x‬را در ‪ px‬قرار دهیم آنگاه میگوئیم که ‪px‬‬
‫به ‪ x‬اشاره مینماید‪.‬‬
‫‪x‬‬
‫‪px‬‬
‫آدرس متغیر ‪ x‬را بوسیله ‪ &x‬نشان میدهیم و عملگر & را عملگر آدرس مینامند‪.‬‬
‫‪int x , *px‬‬
‫; ‪px = &x‬‬
‫مثال ‪:‬‬
‫; ‪int y , x , *px‬‬
‫‪x‬‬
‫‪px‬‬
‫‪26‬‬
‫حال اگر دستور العمل ; ‪ x += 10‬را بدهیم ‪:‬‬
‫‪x‬‬
‫‪px‬‬
‫‪36‬‬
‫حال اگر دستورالعمل ; ‪ *px = *px + 7‬بدهیم‪.‬‬
‫‪x‬‬
‫‪43‬‬
‫‪px‬‬
‫; ‪x = 26‬‬
‫; ‪px = &x‬‬
‫آرایه یك بعدی و اشاره گرها‬
‫‪x‬‬
‫اولین عنصر آرایه بوسیله ]‪ x[0‬مشخص میشود‪.‬‬
‫آدرس اولین عنصر آرایه بوسیله ]‪ &x[0‬یا بوسیله ‪ x‬مشخص میشود‪.‬‬
‫آدرس ‪ i‬امین عنصر آرایه بوسیله ]‪ &x[i-1‬یا بوسیله )‪ x(i-1‬مشخص میشود‪.‬‬
‫دو دستورالعمل زیر با هم معادلند ‪.‬‬
‫; ‪x[ i ] = 82.5‬‬
‫; ‪*(x + i) = 82.5‬‬
‫از طرف دیگر اگر داشته باشیم‬
‫;]‪float x[10‬‬
‫;‪float *p‬‬
‫دو دستورالعمل زیر معادلند‪.‬‬
‫; ]‪p = &x[2‬‬
‫; ‪p= x + 2‬‬
‫‪26.5‬‬
‫‪24.7‬‬
‫‪5.8‬‬
‫‪-73.2‬‬
‫‪69.0‬‬
‫‪100.5‬‬
‫‪-13.24‬‬
‫‪424.3‬‬
‫‪187.8‬‬
‫‪358.2‬‬
‫‪0‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪8‬‬
‫‪9‬‬
‫ساختارها و اشاره گرها‬
‫میتوان اشارهگری را تعریف نمود که به اولین بایت یك ساختار )‪ (struct‬اشاره نماید‪.‬‬
‫‪struc1‬‬
‫‪x‬‬
‫‪int‬‬
‫‪float‬‬
‫‪char‬‬
‫‪int‬‬
‫‪px‬‬
‫‪a‬‬
‫‪b‬‬
‫‪c‬‬
‫‪d‬‬
‫‪struct‬‬
‫{‬
‫; ‪int a‬‬
‫; ‪float b‬‬
‫;‪char c‬‬
‫; ‪int d‬‬
‫; ‪} x, *px‬‬
‫; ‪px = &x‬‬
‫عبارت ‪ x.a‬معادل ‪ pxa‬معادل ‪ (*px).a‬میباشد‪.‬‬
‫آرایههای دوبعدی و اشارهگرها‬
‫یك آرایه دوبعدی بصورت تعدادی آرایه یك بعدی میتوان تعریف نمود‪.‬‬
‫اگر ‪ x‬یك ماتریس ‪ 5‬سرری و ‪ 4‬ستونی از نوع اعشاری باشد قبالً این ماتریس را با‬
‫;]‪float x[5][4‬‬
‫معرفی کردیم‪ .‬حال با استفاده از اشارهگرها بصورت زیر معرفی نمائیم‪:‬‬
‫;]‪float (*x)[4‬‬
‫آرایههای دوبعدی و اشارهگرها‬
‫;]‪float (*x)[4‬‬
‫آرايه يك بعدي اول‬
‫‪‬‬
‫‪x‬‬
‫آرايه يك بعدي دوم‬
‫‪‬‬
‫)‪(x+1‬‬
‫آرايه يك بعدي سوم‬
‫‪‬‬
‫)‪(x+2‬‬
‫آرايه يك بعدي چهارم‬
‫‪‬‬
‫)‪(x+3‬‬
‫آرايه يك بعدي پنجم‬
‫‪‬‬
‫)‪(x+4‬‬
‫در برنامه زیر یك آرایه‬5 ‫ عنصری از نوع‬int ‫ایجاد شده و مقادیر عناصر آرایه را به چهار طریق نمایش‬
.‫میدهد‬
#include
<iostream.h>
#include
<conio.h>
int main( )
{
int x[ ]={12, 25, 6, 19, 100};
clrscr( );
int *px=x;
// ‫ اشاره به عنصر اول آرایه مینماید‬،‫نام آرایه بدون اندیس‬
for(int i=0; i<=4; i++)
cout << *(x+i) << endl;
//the second method
for(i=0; i<5; i++)
cout << x[ i ] <<  \n;
//the third method
for(i=0; i<=4; i++)
cout << px[ i ]<<endl;
//the forth method
for(i=0; i<=4; i++)
cout << *(px+i)<<endl;
return 0; }
‫تخصیص حافظه به صورت پویا یا (عملگر ‪)new‬‬
‫از عملگر ‪ new‬برای تخیصیص حافظه به صورت پویا‬
‫می توان استفاده نمود ‪ ،‬در ضمن میتوان برای‬
‫بلوکی از حافظه که تخصیص یافته مقدار اولیه تعیین‬
‫نمود‪.‬‬
‫برای تخصیص حافظه باندازه ‪ 20‬مقدار از نوع ‪ int‬که اشارهگر ‪ ptx‬به آن اشاره نماید بصورت زیر عمل میشود‪.‬‬
‫;‪int *ptx‬‬
‫;]‪ptx = new int [20‬‬
‫‪ ptx‬به اولین داده از نوع ‪ int‬اشاره مینماید ‪.‬‬
‫‪ ptx+i‬به ‪ i+1‬امین عنصر از فضای پیوسته اشاره مینماید‪.‬‬
‫ سپس آنرا مقدار داده و مجموع مقادیر‬،‫ عنصری از نوع اعشاری در حافظه ایجاد نموده‬n ‫برنامه زیر یك فضای‬
.‫رامشخص و نمایش میدهد‬
#include
<iostream.h>
int main( )
{
int n;
float *ptr, tot = 0.0;
cout << enter a value for n  << endl;
cin >> n;
ptr=new float [n];
for(int j=0; j<n; ++j)
{
cin >> *(ptr + j);
cout <<  \n ;
}
for(j=0; j<=n-1; ++j)
tot += *(ptr + j);
cout << tot ;
// in order to free the space use
delete[ ] ptr ;
return 0;
}
.‫ عنصری از ساختار را ایجاد مینماید‬n ‫برنامه زیر آرایههای‬
#include
<iostream.h>
#include
<conio.h>
int main( )
{
struct rec {
float a;
int b; } ;
int n;
rec *ptr;
clrscr( );
cout <<  how many records? \n
cin >> n ;
ptr = new rec[n];
for(int i=0; i<n; ++i) {
cout <<((ptr+i) b=i) <<  ;
cout <<((*(ptr +i)).a = i+0.5) << endl ;
delete [ ] ptr;
return 0 ; }
.‫ جابهجا مینماید‬swap ‫برنامه زیر دو مقدار اعشاری را گرفته مقادیر آنها را بکمك تابع‬
#include
<iostream.h>
#include
<conio.h>
void swap(float *, float *);
int main( )
{
float a,b;
cin >> a >> b;
cout << a << endl << b << endl ;
return 0;
}
void swap(float *px , float *py)
{
float t;
t = *px;
*px = *py;
*py = t ;
return;
}
‫رشتهها و توابع مربوطه‬
‫رشتهها در ‪ ، C++‬آرایهای از کرکترها میباشند که با کرکتر ‪  \0‬ختم میشوند‪.‬‬
‫;‪char name[ ]=  sara‬‬
‫‪s‬‬
‫‪a‬‬
‫‪r‬‬
‫‪a‬‬
‫‪\0‬‬
‫رشته و اشاره گر‬
‫هر رشته از طریق اشارهگری به اولین کرکتر آن در دسترس قرار میگیرد‪ .‬آدرس یك رشته‪ ،‬آدرس کرکتر‬
‫اول آن میباشد‪ .‬به رشتهها میتوان مقدار اولیه تخصیص داد‪.‬‬
‫;‪char *name =  sara‬‬
.‫ رشته در نظر گرفته آنها را بترتیب حروف الفباء مرتب نموده نمایش میدهد‬5 ‫برنامه ذیل پنج اسم را بصورت‬
#include
<iostream.h>
#include
<string.h>
void sort(char *[ ]);
int main( )
{
char *name[5] = {sara, afsaneh, babak, saman, naser };
sort(name);// display sorted strings
for(int i=0; i<5; ++i)
cout << name[ i ] << endl;
return 0; }
sort(char *name[ ])
{
char *t;
for(int i=0; i<4; ++i)
for(int j=i+1; j<5; ++j)
if(strcmpi(name[ i ], name[ j ]> 0)
{// interchange the two strings
t= name[ i ];
name[ j ] = name[ i ];
name[ i ] = t ;}
return ; }
‫تابع )‪strcmpi(s1, s2‬‬
‫رشتههای ‪ s1‬و ‪ s2‬را با هم مقایسه نموده (بدون توجه به حروف کوچك و بزرگ) اگر رشته‬
‫‪ s1‬برابر با رشته ‪ s2‬باشد مقدار صفر و اگر رشته ‪ s1‬کوچکتر از رشته ‪ s2‬باشد یك مقدار‬
‫منفی در غیر اینصورت یك مقدار مثبت بر میگرداند‪.‬‬
‫تابع ) ‪strcmp(s1, s2‬‬
‫رشتههای ‪ s1‬و ‪ s2‬را با هم مقایسه نموده اگر ‪ s1‬برابر با ‪ s2‬باشد مقدار صفر و اگر رشته‬
‫‪ s1‬کوچکتر از رشته ‪ s2‬باشد یك مقدار منفی در غیر اینصورت یك مقدار مثبت‬
‫برمیگرداند‪.‬‬
‫تابع ) ‪strncmp(s1, s2,n‬‬
‫حداکثر ‪ n‬کرکتر از رشتة ‪ s1‬را با ‪ n‬کرکتر از رشتة ‪ s2‬مقایسه نموده در صورتیکه ‪s1‬‬
‫کوچکتر از ‪ s2‬باشد یك مقدار منفی‪ ،‬اگر ‪ s1‬مساوی با ‪ s2‬باشد مقدار صفر در غیر‬
‫اینصورت یك مقدار مثبت برمیگرداند‪.‬‬
‫تابع (‪strcat(s1, s2‬‬
‫دو رشتة ‪ s1‬و ‪ s2‬را بعنوان آرگومان گرفته رشتة ‪ s2‬را به انتهای رشتة ‪ s1‬اضافه‬
‫مینماید‪ .‬کرکتر اول رشتة ‪ s2‬روی کرکتر پایانی ‪ \0‬رشتة ‪ s1‬نوشته میشود ونهایتاً‬
‫رشتة ‪ s1‬را برمیگرداند‪.‬‬
‫تابع (‪strncat(s1, s2,n‬‬
‫دو رشته ‪ s1‬و ‪ s2‬ومقدار صحیح و مثبت ‪ n‬را بعنوان آرگومان گرفته‪ ،‬حداکثر ‪ n‬کرکتر‬
‫از رشتة ‪ s2‬را در انتهای رشتة ‪ s1‬کپی مینماید‪ .‬اولین کرکتر رشته ‪ s2‬روی کرکتر‬
‫پایانی ‪ \0‬رشتة ‪ s1‬مینویسد ونهایتاً مقدار رشتة ‪ s1‬را برمیگرداند‪.‬‬
‫تابع (‪strlen(s‬‬
‫رشتة ‪ s‬را بعنوان آرگومان گرفته طول رشته را مشخص مینماید‪.‬‬
‫تابع (‪strlen(s‬‬
‫رشتة ‪ s‬را بعنوان آرگومان گرفته طول رشته را مشخص مینماید‪.‬‬
‫تابع )‪strcpy(s1,s2‬‬
‫دو رشتة ‪ s1‬و ‪ s2‬را بعنوان آرگومان گرفته رشتة ‪ s2‬را در رشتة ‪ s1‬کپی مینماید و‬
‫نهایتاً مقدار رشتة ‪ s1‬را بر میگرداند‪.‬‬
‫تابع (‪strncpy(s1, s2,n‬‬
‫دو رشتة ‪ s1 , s2‬و مقدار صحیح و مثبت ‪ n‬را بعنوان آرگومان گرفته‪ ،‬حداکثر ‪ n‬کرکتر‬
‫را از رشتة ‪ s2‬در رشتة ‪ s1‬کپی نموده‪ ،‬نهایتاً مقدار رشتة ‪ s1‬را برمیگرداند‪.‬‬
‫برای استفاده از توابع مربوط به‬
‫رشتهها بایستی حتماً در ابتدا برنامه‬
‫>‪ #include <string.h‬را قرار‬
‫دهیم‪.‬‬
: ‫مثال‬
#include
<iostream.h>
#include
<string.h>
#include
<conio.h>
int main( )
{
char *s1= happy birthday;
char *s2= happy holidays ;
clrscr( );
cout << strcmp(s1, s2) << endl;
cout << strncmp(s1, s2, 7) << endl ;
return 0;
}
: ‫مثال‬
#include
<iostream.h>
#include
<string.h>
#include
<conio.h>
int main( )
{
char *s = sara;
clrscr( );
cout << strlen(s);
return 0; }
.‫ می باشد‬strcmp ‫تابع زیر معادل تابع کتابخانه‬
int nikstrcmp(char s[] , char t[] )
{
int i=0;
while (s[i]==t[i] )
if ( s[i++]=‘\0’ )
return 0;
return (s[i]-t[i]);
}
‫فصل هشتم‬
‫برنامه نویس شی گرا‬
‫فهرست مطالب فصل هشتم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫‪.8‬‬
‫‪.9‬‬
‫‪.10‬‬
‫‪.11‬‬
‫تعریف شی گرایی‬
‫چند ریختی (‪)polymorphism‬‬
‫خاصیت ارث بری‬
‫پشته (‪)stack‬‬
‫ایجاد شی‬
‫ارث بری‬
‫سازنده ها و نابود کننده ها‬
‫توابع دوست‬
‫کالس های دوست‬
‫توابع سازنده پارامتر دار‬
‫توابع سازنده یك پارامتری‬
‫‪.12‬‬
‫‪.13‬‬
‫‪.14‬‬
‫‪.15‬‬
‫‪.16‬‬
‫‪.17‬‬
‫‪.18‬‬
‫‪.19‬‬
‫‪.20‬‬
‫‪.21‬‬
‫عضوهای ‪static‬‬
‫کالسهای تودرتو‬
‫کالس های محلی‬
‫استفاده از ‪ object‬ها بعنوان‬
‫پارامترهای تابع‬
‫برگشت اشیاء‬
‫انتساب اشیاء‬
‫آرایه اشیاء‬
‫اشاره گر به اشیاء‬
‫اشاره گر ‪this‬‬
‫توابع مجازی و پلی مرفیسم‬
‫تعریف شی گرایی‬
‫برنامه نویسی شئ گرا یا ‪ oop‬یك روش جدید برنامه‬
‫نویسی میباشد که در آن از ویژگی‬
‫ساختیافته همراه با چند ویژگیهای قوی جدید استفاده‬
‫میشود‪ .‬زبان برنامه نویسی ‪ C++‬امکان استفاده از ‪oop‬‬
‫را به راحتی فراهم مینماید‪.‬‬
‫تعریف شی گرایی‬
‫در ‪ ، oop‬برور کلی مساله به تعدادی زیرگروه قرعات‬
‫مربوط بهم شکسته میشود که برای هر زیر گروه ‪ code‬و‬
‫‪ data‬تهیه شده و نهایتاً این زیرگروهها تبدیل به ‪ unit‬ها‬
‫یا واحدهائی میشود که ‪( objects‬یا اشیاء) نامیده‬
‫میشوند‪.‬‬
‫نكته مهم ‪:‬‬
‫تمام زبانهای برنامه نویسی شیگرا دارای سه‬
‫خصوصیت مشترك زیر میباشند ‪:‬‬
‫الف‪( encapsulation :‬محصورسازی)‬
‫ب‪( polymorphism :‬چندریختی)‬
‫ج‪( inheritance :‬ارث بری)‬
‫محصورسازی (‪) Encapsulation‬‬
‫محصورسازی مکانیزمی است که ‪ code‬و ‪ data‬را بهم وصل نموده و هر دوی آنها را از استفادههای‬
‫غیرمجاز مصون نگه میدارد‪ .‬شی یك مؤلفه منرقی اسدت کده ‪ data‬و ‪ code‬را محصدور نمدوده و‬
‫‪ code‬باعث دستکاری و پردازش ‪ data‬میشود‪.‬‬
‫‪( polymorphism‬چند ریختی)‬
‫چند ریختی مشخصهای است که بیك وسیله امکان میدهد که باتعدادی‬
‫از سیستمها یا عمیات یا دستگاهها‪ ،‬مورد استفاده قرار گیرد‪.‬‬
‫‪( inheritance‬ارث بری)‬
‫ارث بری فرآیندی است که بوسیله آن یك شی (‪ )object‬میتواند‬
‫خاصیتهای شی دیگری را دارا شود‪.‬‬
‫پشته (‪)stack‬‬
‫پشته ساختاری است که دارای خاصیت ‪last in first out‬‬
‫میباشد‪ .‬پشته فضای پیوسته در حافظه اشغال مینماید‪ .‬عملیاتی‬
‫کدده روی پشته انجام میشوند عبارتند از ‪:‬‬
‫الف‪ ، push :‬که باعث میشود یك عنصر وارد پشته شده‪.‬‬
‫ب‪ ، pop :‬که باعث میشود یك عنصر از پشته خارج گردد‪.‬‬
‫ایجاد شی (‪)object‬‬
‫بمنظور ایجاد یك شی بایستی از کلمة رزروشده‬
‫‪ class‬استفاده نمود‪ class .‬از نظر ظاهر شبیه‬
‫ساختار یا ‪ struct‬میباشد‪ .‬پشته را بعنوان یك‬
‫‪ object‬میتوان در نظر گرفت که ‪ data‬آن شامل‬
‫یك آرایه و یك ‪ ، tos‬و عملیاتی که روی این‬
‫‪ object‬انجام میشود عبارتست از ‪، push‬‬
‫‪ pop ، initialize‬کردن پشته‪.‬‬
‫در اسالید بعد مثالی از نحوه ایجاد شی آورده شده است‪.‬‬
‫مثال ‪:‬‬
‫بدین معنی است که ‪ stck‬و ‪tos‬‬
‫بوسیله توابعی که عضو ‪object‬‬
‫نباشند غیر قابل دسترسی‬
‫هستند‪ .‬و این یکی از روشهای‬
‫محصور سازی اقالم دادههاست‪.‬‬
‫بدین معنی است که بوسیله سایر‬
‫قرعات برنامه قابل دسترسی‬
‫میباشد‪.‬‬
‫‪#define SIZE 100‬‬
‫‪// this creates the class stack.‬‬
‫{ ‪class stack‬‬
‫‪private :‬‬
‫;]‪int stck[SIZE‬‬
‫;‪int tos‬‬
‫‪public:‬‬
‫;) (‪void init‬‬
‫;)‪void push(int i‬‬
‫;) (‪int pop‬‬
‫;}‬
‫نكته ‪:‬‬
‫فقط توابع عضو میتوانند به متغیرهای عضو از نوع ‪private‬‬
‫دسترسی داشته باشند‪ .‬بایستی توجه داشت که اگر نوع عضوی‬
‫مشخص نگردد آن عضو به صورت اتوماتیك ‪ private‬می باشد‪.‬‬
‫نحوه تعریف تابع عضو یك کالس‬
‫)‪void stack : : push(int i‬‬
‫{‬
‫{ ) ‪if(tos = = SIZE‬‬
‫;‪cout << stack is full.‬‬
‫;‪return‬‬
‫}‬
‫; ‪stck[tos]= i‬‬
‫; ‪tos ++‬‬
‫}‬
‫عملگر‪ : :‬مشخص مینماید که تابع متعلق به کدام ‪ object‬میباشد‪ .‬عملگر ‪ : :‬عملگر‬
‫‪ scope resolution‬نامیده میشود‪.‬‬
: stack ‫برنامه کامل‬
#include <iostream.h>
#define SIZE 100
// this creates the class stack.
class stack {
int stck[SIZE];
int tos;
public:
void init(int i);
int pop( );
void push(int i);
};
void stack : : init( )
{
tos = 0 ;
}
void stack : : push(int i)
{
if(tos = = size) {
cout << stack is full. ;
return ;
}
stck[tos] = i ;
tos ++ ;
}
int stack : : pop( )
{
if(tos = = 0) {
cout << stack underflow. ;
return 0 ; }
tos - - ;
return stck[tos];
}
int main( )
{
stack st1, st2; // create two objects
st1. init( );
st2.init( );
st1.push(1);
st2.push(2);
st1.push(3);
st2.push(4);
cout << st1.pop( ) << endl;
cout << st1.pop( ) << endl;
cout << st2. pop( ) << endl;
cout << st2. pop( ) << endl;
return 0; }
‫ارث بری‬
‫ارث بری فرآیندی است که بوسیله آن یك شی (‪ )object‬میتواند‬
‫خاصیتهای شی دیگری را دارا شود‪.‬‬
‫در اسالید بعد مثالی از ارث بری آورده شده است‪.‬‬
: ‫مثال‬
class building {
int rooms;
int floors;
int area;
public:
void set_rooms(int num);
int get_rooms( );
void set_floors(int num);
int get_floors( );
void set_area(int num);
int get_area( );
};
// house is derived from building
class house : public building {
int bedrooms;
int baths;
public:
void set_bedrooms(int num);
int get_bedrooms( );
void set_baths(int num);
int get_baths( );
};
‫ تعریف گردیده‬building ‫ ای بنام ساختمان یا‬object ‫در روبرو‬
‫ تعدادی طبقه و سرح زیر‬،‫ هر ساختمان دارای تعدادی اطاق‬.‫است‬
: ‫ از طرف دیگرتوابعی که برای شی تعریف شده‬.‫بنا نیز میباشد‬
‫ تعریف مینمائیم که نه تنها‬house ‫دیگری بنام‬object ‫حال‬
‫ میباشد بلکه دارای دو اقالم‬building ‫دارای تمام اعضای شی‬
‫ دراینجا عمالً شی‬.‫داده اضافی و چهار تابع اضافی میباشد‬
: ‫ ارث میبرد‬building ‫ از شی‬house
‫نكته ‪:‬‬
‫در مثال قبل ‪ building‬را ‪ base class‬و ‪ house‬را ‪ derived class‬می نامند ‪ .‬شی‬
‫‪ house‬تمام اعضای ‪ building‬را دارا است بعالوه اینکه دارای متغیرهای عضوی اضافی‬
‫‪ baths ، bedrooms‬و همچنین توابع عضوی )(‪،set_bebrooms() ،set_baths‬‬
‫)(‪get_bedrooms() ،get_baths‬نیز میباشد‪. .‬‬
‫سازندهها و نابودکنندهها (‪)constructors and destructors‬‬
‫‪ Initialization‬یا مقدار اولیه دادن بصورت اتوماتیك از طریق تابعی انجام میشود‬
‫بنام تابع ‪ constructor‬یا تابع سازنده‪ .‬تابع سازنده تابع مخصوصی است که‬
‫عضوی از کالس بوده و همنام با کالس میباشد‪.‬‬
‫سازندهها و نابودکنندهها (‪)constructors and destructors‬‬
‫تابع نابود کننده یا ‪ ، destructor‬عکس عمل تابع سازنده را انجام‬
‫میدهد‪ .‬وقتی که شیای از بین میرود بصورت اتوماتیك تابع نابود کننده‬
‫آن فراخوانی میگردد‪.‬‬
‫توابع دوست (‪)friend functions‬‬
‫با استفاده از کلمة ‪ friend‬این امکان وجود دارد که به تابعی که عضو کالس‬
‫نمیباشد اجازه دسترسی به متغیرهای ‪ private‬کالس را داد‪ .‬برای آنکه‬
‫تابعی را دوست اعالن نمائیم از کلمه ‪ friend‬قبل از تعریف تابع استفاده‬
‫مینمائیم‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
#include <iostream.h>
#include <conio.h>
class myclass {
int a,b;
public :
friend int sum(myclass x);
void set_ab(int i, int j);
};
void myclass :: set_ab(int i, int j)
{
a=i;
b=j;
}
//sum is not a member function
int sum(myclass x)
{
return s.a + x.b;
}
int main( )
{myclass n;
clrscr( );
n. set_ab(5,8);
cout << sum(n);
return 0 ; }
: ‫مثال‬
‫نكته ‪:‬‬
‫‪-1‬کالسی که از کالس دیگر ارث میبرد ‪ ،‬توابع دوست آن کالس را‬
‫به ارث نمیبرند‪ .‬بعبارت دیگر یك ‪ ، derived class‬توابع دوست‬
‫را به ارث نمیبرد‪.‬‬
‫‪-2‬توابع دوست دارای مشخصه نوع ذخیره نمیباشند یعنی توابع‬
‫دوست را نمیتوان بصورت ‪ static‬یا ‪ external‬تعریف نمود‪.‬‬
‫کالسهای دوست (‪)friend classes‬‬
‫این امکان وجود دارد که یك کالس دوست کالس دیگری باشد ‪ .‬در چنین وضعیتی تابع دوست به‬
‫کلیه اسامی ‪ private‬تعریف شده در کالس دیگر دسترسی دارد‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
#include <iostream.h>
class coins {
enum units {penny, nickel, dime, quarter, half_ dollar};
friend class amount;
};
class amount {
coins :: units money;
public:
void setm( );
int getm( );
} ob;
void amount :: setm( )
{
money = coins :: dime;
}
int amount :: getm( )
{
return money;
}
int main( )
{
ob.setm( );
cout << ob.getm( );
return 0 ;
}
: ‫مثال‬
‫توابع سازنده پارامتردار‬
‫امکان انتقال آرگومانها به توابع سازنده وجود دارد‪ .‬معموالً از این‬
‫آرگومانها برای ‪ initialize‬نمودن شی در زمان ایجاد آن استفاده‬
‫میگردد‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
: ‫مثال‬
#include <iostream.h>
#include <conio.h>
class myclass {
int x, y;
public :
myclass(int i, int j) {x = i; y=j; }
void show( ) {cout << x << endl << y; }
};
int main( )
{
myclass obj( 3 , 5);
clrscr( );
obj.show( );
return 0;
}
‫توابع سازنده یك پارامتری‬
#include <iostream.h>
#include <conio.h>
class myclass{
int x;
public:
myclass(int i) {x=i;}
int getx( ) {return x;}
};
int main( )
{
clrscr( );
myclass obj=126; // ‫ منتقل کن‬i ‫ را به‬126
cout << obj.getx( );
return 0 ;
}
‫عضوهای ‪static‬‬
‫اگر عضو دادهای بصورت ‪ static‬اعالن گردد این بدین معنی است که‬
‫کامپیلر فقط یك کپی از متغیر مذکور را نگهداری نموده و تمام ‪ object‬ها‬
‫بایستی بصورت اشتراکی از آن کپی استفاده نمایند‪ .‬برای اینکار میبایستی‬
‫از کلمه ‪ static‬قبل از اعالن عضو استفاده نمود‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
: ‫مثال‬
#include <iostream.h>
class shared{
static int a;
int b;
public :
void set(int i, int j) {a=i; b=j; }
void show( );
};
int shared :: a ;
// define a
void shared :: show( )
{
cout << static a:  << a << endl;
cout << nonstatic b: << b << endl;
}
int main( )
{
shared x,y;
x.set(1,1); // set a to 1
x.show( );
y.set(4,4); // change a to 4
y.show( );
x.show( );
return 0;
}
‫‪( nested classes‬کالسهای تودرتو)‬
‫میتوان یك کالس را در یك کالس دیگر تعریف نمود‪.‬‬
‫اما بعلت اینکه در ‪ C++‬برای کالسها خاصیت ارث‬
‫بری وجود دارد نیازی معموالً به تعریف نمودن یك‬
‫کالس در کالس دیگر نیست‬
‫‪( local classes‬کالسهای محلی)‬
‫وقتی که کالسی در درون یك تابع تعریف میشود این‬
‫کالس فقط برای آن تابع شناخته شده است و برای‬
‫توابع دیگر ناشناخته میباشد‪ .‬چنین کالسی را کالس‬
‫محلی مینامند‪.‬‬
‫در مورد کالسهای محلی رعایت نكات زیر ضروری است ‪:‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫تمام توابع عضو بایستی در درون کالس تعریف گردند‪.‬‬
‫از متغیرهای محلی‪ ،‬تابعی که کالس در آن تعریف شده نمیتواند استفاده نماید‪.‬‬
‫از متغیرهای عضوی ‪ static‬نمیتوان استفاده نمود‪.‬‬
‫استفاده از‬
‫‪ object‬ها بعنوان پارامترهای توابع‬
‫از ‪ object‬ها میتوان بعنوان پارامترهای توابع استفاده نمود و مکانیزم انتقال آرگومانها و پارامترها‬
‫بصورت ‪ call by value‬میباشد‪.‬‬
‫برگشت اشیاء (‪)returning objects‬‬
‫مقدار برگشتی یك تابع میتواند یك ‪ object‬باشد‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
#include <iostream.h>
class myclass {
int i ;
public :
void set_ i(int n) { i=n;}
int get_i( ) {return i;}
};
myclass funct( ); // return an object
int main( )
{
myclass ob;
ob=funct( );
cout << ob.get_i( ) << endl;
return 0;
}
myclass funct( )
{
myclass x ;
x.set_i(1);
return x;
}
: ‫مثال‬
‫انتساب اشیاء (‪)object assignment‬‬
‫در صورتیکه دو تا ‪ object‬از یك نوع باشند‬
‫میتوان یك ‪ object‬را بدیگری انتساب نمود‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
: ‫مثال‬
#include <iostream.h>
#include <conio.h>
class myclass{
int i;
public:
void set_i(int n) {i=n;}
int get_i( ) {return i;}
};
int main( )
{
myclass ob1, ob2;
obl.set_i(126);
ob2= ob1; // assign data from ob1 to ob2
clrscr( );
cout << ob2.get_i( );
retrun 0 ;
}
‫آرایه اشیاء (‪)array of objects‬‬
‫امکان استفاده از آرایه در مورد اشیاء میباشد‪.‬‬
‫بعبارت دیگر میتوان در برنامه ها آرایهای از ‪ object‬ها‬
‫داشته باشیم‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
: ‫مثال‬
#include <iostream.h>
#include <conio.h>
class myclass{
int i;
public:
void set_i(int j) {i=j;}
int get_i( ) {return i;}
};
int main( )
{
clrscr( );
myclass ob[3];
int i;
for(i=0; i<3; i++) ob[ i ].set_i(i+1);
for(i=0; i<3; i++)
cout << ob[ i ].get_i( ) << endl;
return 0;
}
‫اشارهگر به اشیاء ( ‪)pointers to objects‬‬
‫در مورد اشیاء نیز از اشارهگرها نیز میتوان استفاده نمود‪.‬‬
‫از عملگر ‪ ‬در این مورد استفاده میشود‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
: ‫مثال‬
#include <iostream.h>
#include <conio.h>
class myclass{
int i ;
public:
myclass( ) {i=0;}
myclass(int j) {i=j;}
int get_i( ) {return i;}
};
int main( )
{
myclass ob[3]= {1, 2, 3};
myclass *p;
int i;
p=ob; // get start of array
for(i=0; i<3; i++)
{
cout << p  get_i( ) << endl;
p++; // point to next object
}
return 0;
}
‫اشارهگر ‪)this pointer( this‬‬
‫هر تابع عضو یك کالس دارای یك پارامتر مخفی‬
‫بنام ‪ this pointer‬میباشد‪ this .‬اشاره به ‪object‬‬
‫خاصی مینماید‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
#include <iostream.h>
class pwr {
double b;
int e;
double val;
public:
pwr(double base, int exp);
double get_pwr( ) {return val;}
};
pwr :: pwr(double base, int exp)
{
this  b=base;
this  e=exp;
this  val =1;
if(exp = = 0) return;
for(; exp > 0 ; exp  )
this  val = this  val *this  b;
}
int main( )
{pwr x(4.0, 2) , y(2.5, 1), z(5.7,0);
cout << x.get_pwr( ) <<  ;
cout << y.get_pwr( ) <<  ;
cout << z.get_pwr( ) <<  \n ;
return 0; }
: ‫مثال‬
‫توابع مجازی و پلی مرفیسم (‪)virtual functions‬‬
‫تابع مجازی‪ ،‬تابعی است که در ‪ base class‬تعریف شد و‬
‫بوسیله ‪ derived class‬تغیر داده میشود‪ .‬برای اعالن یك‬
‫تابع مجازی بایستی از کلمه ‪ virtual‬استفاده نمائیم‪.‬‬
‫تغیر تابع در کالس مشتق روی تابعی که در کالس پایه (‪) base class‬‬
‫تعریف شده انجام میشود‪.‬‬
‫در اسالید بعد مثالی آورده شده است‪.‬‬
#include <iostream.h>
class base {
public :
virtual void vfunc( ){cout <<  this is base s vfunc( ) \n ;}
};
class derived1 : public base {
public:
void vfunc( ) {cout <<  this is derived1 s vfunc( ) " << endl ; }
};
class derived2: public derived1 {
public:
/*vfunc( ) not overridden by derived2.In this case, since derived2 is derived
from derived1, derived1 s vfunc( ) is used */ } ;
int main( )
{
base *p, b;
derived1 d1;
derived2 d2;
//point to base
p = &b;
p  vfunc( ); // access base's vfunc
// point to derived1
p=&d1;
p  vfunc( ); //access derived1's vfunc( )
//point to derived2
p = &d2;
p  vfunc( ); // use derived1 s vfunc( )
return 0 ; }
: ‫مثال‬
keywords and alternative tokens.
asm
enum
protected
typedef
auto
explicit
public
typeid
bool
extern
register
typename
break
false
reinterpret_cast
union
case
float
return
unsigned
catch
for
short
using
char
friend
signed
virtual
class
goto
sizeof
void
const
if
static
volatile
const_cast
inline
static_cast
wchar_t
continue
int
struct
while
default
long
switch
xor
delete
mutable
template
xor_eq
do
namespace
this
or_eq
double
new
throw
not
dynamic_cast
operator
true
bitand
else
private
try
and_eq
bitor
not_eq
compl
And
--
or