Information Technology

Download Report

Transcript Information Technology

‫برنامه سازی پیشرفته‬
‫ارائه دهنده‬
‫دکتر سید امین حسیني‬
E.mail: [email protected]
Home page: http://hosseini.staffcms.um.ac.ir
‫ارزشیابی‬
‫‪ ‬کار کالسی شامل تمرین‪ ،‬پروژه های برنامه نویسی و‬
‫نمره‬
‫‪10‬‬
‫فعالیت کالسی‬
‫‪4‬‬
‫‪ ‬امتحان میان ترم‬
‫نمره‬
‫‪8‬‬
‫‪ ‬امتحان پایان ترم‬
‫نمره‬
‫هفته اول‬
‫اصول و مباني شبکهها‬
‫‪3‬‬
‫مهر ‪85‬‬
‫فهرست مطالب‬
‫‪‬شكلهاي بكارگیري كامپیوتر‬
‫‪‬شبكه هاي كامپیوتري‪ ،‬مزایا – معایب‬
‫‪‬انواع شبکه‬
‫مقدمه‬
‫در اوايل دهه ‪ 1970‬ميالدی ‪ ،‬زبان‪ ، C‬توسط دنيس ريچي و به عنوان زبان برنامه‌نويس ي سيستم‬
‫ها طراحي شد‪.‬‬
‫اين زبان از دو زبان قديمي تر بنامهاي‪ BCPL‬و ‪ B‬حاصل شده است‪.‬‬
‫زبان‪ C‬تا سال ‪ 1978‬منحصر به استفاده در البراتوار كمپاني‪ BELL‬بود تا اينکه‬
‫توسط دو تن بنامهای ريچی و کرنيه نسخه نهايي اين زبان منتشر شد‬
‫‪5‬‬
‫مقدمه – فازهای تولید و اجرای برنامه های‬
‫‪–C++‬‬
‫فاز ‪1‬‬
‫برنامه ها در ویرایشگر نوشته شده و در دیسک دخیره می شوند‬
‫فاز‪ -2‬پیش چردازنده دستورات را پردازش می کند‬
‫فاز ‪ – 3‬کامپایلر کد مقصد را ایجاد می کند و آن را در دیسک ذخیره می کند‬
‫فاز ‪ – 4‬پیوند دهنده کد مقصد را به کتابخانه پیوند می دهد و یک فایل قابل اجرا‬
‫ایجاد کرده و آن را در دیسک ذخیره می کند‬
‫فاز ‪ – 5‬بارکننده فایل را در حافظه قرار می د هد‬
‫فاز ‪ – 6‬پردازشگر هر یک از دستورات را دریافت و اجرا می کند‬
‫‪6‬‬
‫مقدمه ‪ -‬ويژگيهاي مهم زبان ‪C‬‬
‫زبان‪ C‬به طور گستردهاي در دسترس است ‪.‬‬
‫‪ C‬زباني است همه منظوره‪ ،‬ساختيافته سطح باال و انعطافپذير كه برخي از خصوصيات‬
‫زبانهاي سطح پايین را نیز داراست‪.‬‬
‫برنامههاي نوشته شــده به زبان ‪ C‬به طور كلي مستقــل از ماشین يا نـوع كامپيوتر است و‬
‫ً‬
‫تقريبا تحت كنترل هر سيستم عاملي اجرا ميشود‪.‬‬
‫‪ C‬روش برنامهسازي ماژوالر را پشتيباني ميكند‪.‬‬
‫‪7‬‬
‫مقدمه ‪ -‬ويژگيهاي مهم زبان ‪C‬‬
‫کامپايلرهاي ‪ C‬فشرده و كم حجماند و برنامههاي هدف ايجاد شده با آنها خيلي كوچك و‬
‫كارآمدند‪.‬‬
‫برنامههاي‪ C‬در مقايسه با ساير زبانهاي برنامهسازي سطح باال‪ ،‬به راحتي قابل انتقالاند ‪.‬‬
‫به طور کلي جامعيت‪ ،‬عموميت‪ ،‬خوانايي‪ ،‬سادگي‪ ،‬کارآيي و پيمانهاي بودن که همگي از‬
‫مشخصات برنامهای ايدهآلاند در زبان‪ C‬پيادهسازي ميشوند ‪.‬‬
‫‪8‬‬
‫كاراكتر‬
‫زبـ ــان برنامـ ــهنويس ـ ـ ي ‪ C‬مجموعـ ــهاي خـ ــاا از كاراكترهـ ــا را شناسـ ــايي مـ ــيكنـ ــد‪ .‬ايـ ــن مجموعـ ــه‬
‫عبارتاند از‪:‬‬
‫حروف بزرگ و حروف كوچك‪ :‬زبان‪ C‬بین حروف بزرگ و كوچك تفاوت قائل مي‬
‫شود ‪(Case Sensitive) .‬‬
‫ارقام دهدهي ‪ :‬شامل ‪ 0‬تا ‪9‬‬
‫جاي خالي يا ‪Blank‬‬
‫كاراكترهااي مصواو‬
‫;‪& , .‬‬
‫‪ :‬شـامل * \ ‪? ( ) < > { } [ ] : ^ % $ # @ ! + - = /‬‬
‫كاراكترهاي فرمتدادن‪ :‬که براي بيان کردن حاالت ويژه اي‬
‫‪:‬‬
‫‪9‬‬
‫بکار مي روند و عبارتند از‬
‫…‪\t ,\v ,\n ,\b ,\f ,\r ,\0 ,‬‬
‫شناسه‬
‫يك شناسه‪ C‬دنبالهاي است از حروف ‪ ،‬ارقام يا عالمت زير خط که با هر ترتيبي ميتوانند‬
‫قرار گیرند‪ ،‬اما اولین کاراکتر بايد يک حرف باشد‪.‬‬
‫چند نمونه از شناسه هاي معتبر‪:‬‬
‫‪m1 , max , payam_noor , minimum‬‬
‫چند نمونه از شناسه هاي نامعتبر‪:‬‬
‫‪book-2 , 4s5 , $tax , "p" , computer science‬‬
‫‪10‬‬
‫قانون نامگذاري شناسهها‬
‫‪ -1‬حروف كوچك و بزرگ در نامگذاري شناسهها متفاوت ميباشند‪.‬‬
‫بنابراين ‪ xy ، xY ، XY ، Xy‬چهار شناسه متفاوت از نظر‬
‫‪ C++‬ميباشد‪.‬‬
‫ي شناسهها ‌از حروف الفباء‪ ،‬ارقام و ز ‌ير خط (‪ )underline‬استفاده ميشود ‌و‬
‫در نامگذار ‌‬
‫‪‌ )2‬‬
‫حداكثر طول‌ شناسه ‪ 31‬ميباشد ‌و شناسه بايستي با يك رقم شروع نگردد‪.‬‬
‫‌‬
‫قانون نامگذاري شناسهها‬
‫ بعض ي از كلمات كليدي‬.‫) براي نامگذاري شناسهها از كلمات كليدي نبايستي استفاده نمود‬3
.‫در زیر داده شده است‬
And
Sizeof
then
xor
Template
Float
False
Friend
While
continue
extern
Private
Switch
Default
Const
delete
typedef
if
this
Virtual
‫متغير‬
‫متغیر‪ ،‬مكاني در حافظه اصلي كامپيوتر مـيباشـد كـه در آنجـا يـك مقـدار را مـيتـ ‌وان ذخیـره‬
‫و در برنام ـ ــه از آن اس ـ ــتفاده نم ـ ــود‪ .‬ق ـ ــانون نامگ ـ ــذاري متغیره ـ ــا هم ـ ــان ق ـ ــانون نامگ ـ ــذاري‬
‫شناسهها ميباشد‪.‬‬
‫متغیرها در زبان‪ C‬شناسههايي هستند كه محلهايي از حافظه را به خود اختصاا‬
‫ميدهند ‪.‬‬
‫مقدار متغیر در طول اجراي برنامه مي تواند تغيیر کند ‪.‬‬
‫‪13‬‬
‫انواع داده ها‬
‫حافظه‬
‫الزم‬
‫مقادير‬
‫‪ 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 x=26‬را از نوع ‪ int‬با مقدار اوليه ‪ 26‬اعالن‬
‫;‪long a=67000 , b=260‬‬
‫‪ ‬در دستورالعمل‬
‫متغیرهاي ‪ b‬و ‪ a‬را از نوع ‪ long int‬تعريف نموده با مقادير بترتيب‬
‫‪ 260‬و ‪.67000‬‬
‫كراكترهاي مخصوص‬
‫در برنامه ميتوان ‌از آنها براي فرمت‬
‫كراكترهاي مخصوا كه ‌‬
‫كامپايلر ‪ C++‬بعض ي ‌از ‌‬
‫كراكترهاي مخصوا به همراه‬
‫بندي استفاده كرد را تشخي ميدهد‪ .‬تعدادي ‌از اين ‌‬
‫کاربرد آنها آورده شده است ‪.‬‬
‫كراكتر ‪ \a‬ميتوان براي ايجاد‬
‫بعنوان مثال از ‌‬
‫صداي ‪ beep‬استفاده نمود‪.‬‬
‫‪char‬‬
‫; ‪x = '\a‬‬
‫‪Newline‬‬
‫‪\n‬‬
‫‪Tab‬‬
‫‪\t‬‬
‫‪Backspace‬‬
‫‪\b‬‬
‫‪Beep sound‬‬
‫‪\a‬‬
‫‪Double quote‬‬
‫”\‬
‫‪Single quote‬‬
‫’\‬
‫‪Null character‬‬
‫‪\0‬‬
‫‪Question mark‬‬
‫?\‬
‫‪Back slash‬‬
‫\\‬
‫رشتهها‬
‫رشته يا ‪ string‬عبارتست از دنبالهاي از كا ‌راكترها كه بین " " قرار داده ميشود‪ .‬در‬
‫حافظه كامپيوتر انتهاي رشتهها بوسيله ‪ \0‬ختم ميگردد‪.‬‬
‫"‪ "BOOK STORE‬يك رشته ده كا ‌راكتري ميباشد كه با توجه به كركتر ‪ \0‬كـه بـه انتهـاي آن‬
‫ً‬
‫در حافظه اضافه مي شود جمعــا يازده بايت را اشغال ميكند‪.‬‬
‫در حالي ه‬
‫دقت نمایید که "‪ "w‬يك رشته ميباشد كه د ‌و بايت ‌از حافظه را اشغال ميكند ‌‬
‫كتر ميباشد كه يك بايت ‌از حافظه را اشغال مينمايد‪.‬‬
‫'‪ 'w‬يك كا ‌را ‌‬
‫نمایش مقادیر دادهها‬
‫براي نمايش دادهها بر روي صفحه مـانیتور از ‪ cout‬كـه بـدنبال آن عملگـر درع يع ـي <<‬
‫قيد شده باشد استفاده ميگردد‪ .‬بايستي توجه داشت كه دوكركتر < پشت سر هم توسـط‬
‫‪ C++‬بصورت يك كركتر تلقي ميگردد‪.‬‬
‫مثال ‪:‬‬
‫‪ ‬برای نمایش پيغام ‪ good morning‬بر روی صفحه نمایش ‪:‬‬
‫;"‪cout << "good morning‬‬
‫‪ ‬برای نمایش مقدار متغیر ‪ X‬بر روی صفحه نمایش ‪:‬‬
‫; ‪cout << x‬‬
‫دریافت مقادیر متغیرها‬
‫در ضمن اجراي برنامه ‌از صفحه كليد‪ ،‬از ‪ cin‬كه‬
‫مقادير براي متغیرها ‌‬
‫‌‬
‫به منظور‌ دريافت‬
‫عملگر استخراع يع ي >> قيد شده باشد ميتوان استفاده نمود‪.‬‬
‫‌‬
‫بدنبال آن‬
‫مثال ‪:‬‬
‫;‪int x‬‬
‫; "‪cout << "Enter a number:‬‬
‫;‪cin >> x‬‬
‫عملگر انتساب‬
‫عملگر ار ‌زيابي‬
‫‌‬
‫عملگر انتساب = ميباشد كه باعث ميگردد مقدار عبارت در طرف راست این‬
‫شده و در متغیر طرف چپ آن قرار گیرد‪.‬‬
‫از عملگرهاي انتساب چندگانه نیز ميتوان استفاده نمود‪ .‬که مقدار سه متغیر ‪ z‬و ‪ y‬و ‪ x‬برابر‬
‫با ‪ 26‬ميشود‪.‬‬
‫;‪x=a+b‬‬
‫; ‪x=35‬‬
‫; ‪x=y=z=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
‫عالمت توضيح‬
‫‪Comment‬‬
‫توضيحات در برنامه باعث خوانائي بيشتر و درك بهتر برنامه ميشود‪ .‬بنابراين توصيه بر آن است كه‬
‫حتي االمكان در برنامهها از توضيحات استفاده نمائيم‪ .‬در ‪ ،C++‬توضيحات بدو صورت انجام‬
‫ً‬
‫ميگیرد (‪ )1‬هر عبارتي كه بین دو عالمت‪ */‬و *‪ /‬قرار گیرد و یا (‪ )2‬ربا ‪ //‬شروع شود صرفا‬
‫بعنوان توضيحات محسوب ميگردد‬
‫مثال‪:‬‬
‫>‪#include<stdio.h‬‬
‫) ( ‪main‬‬
‫‪/* declare variables */‬‬
‫‪/* initialize */‬‬
‫‪/* outer loop */‬‬
‫‪{ int‬‬
‫;‪m,n‬‬
‫;‪m=1‬‬
‫) ‪while (m <= 10‬‬
‫; ) ‪{printf("%5d ", m‬‬
‫‪33‬‬
‫‪for ( n=1; n<=10 ; n+ +) // inner loop‬‬
‫; ) ‪printf("%5d", m * n‬‬
‫; )"‪printf("\n‬‬
‫;‪m++‬‬
‫} }‬
‫توابع كتابخانه‬
‫زبان ‪ C++‬مجهز به تعدادي توابع كتابخانه ميباشد‪ .‬بعنوان مثال تعدادي توابع كتابخانه‬
‫ً‬
‫براي عمليات ورودي و خروجي وجود دارند‪ .‬معموال توابع كتابخانه مشابه ‪ ،‬بصورت‬
‫برنامههاي هدف (برنامه ترجمه شده بزبان ماشین) در قالب فايلهاي كتابخانه دسته بندي و‬
‫مورد استفاده قرا رميگیرند‪ .‬اين فايلها را فايلهاي ‪ header‬مينامند و داراي پسوند ‪.h‬‬
‫ميباشند‪.‬‬
‫نحوه استفاده از توابع کتابخانه ای‬
‫براي استفاده از توابع كتابخانه خاص ي بايست ــي نام فايل ‪ header‬آنرا در ابتداي‬
‫برنامه در دستور ‪ #include‬قرار دهيم‪.‬‬
‫>اسم فايل ‪#include < header‬‬
‫چند تابع نمونه‬
abs(i)
int
i
stdlib.h
cos(d)
double
d
math.h
exp(d)
log(d)
log10(d)
double
double
double
sin(d)
double
sqrt(d)
double
strlen(s)
int
tan(d)
double
toascii( c)
int
tolower(c )
int
stdlib.h
toupper(c )
int
stdlib.h
ex
loge d
Log10 d
d
d
s
math.h
math.h
math.h
math.h
math.h
string.h
d
c
math.h
stdlib.h
‫برنامه در‬
‫‪C++‬‬
‫اكنــون باتوجــه بــه مطالــب گفتــه شــده قــادر خــواهيم بــود كــه تعــدادي برنامــه ســاده و كوچــك ب ـه زبــان‬
‫‪ C++‬بنويســيم‪ .‬بـراي نوشــتن برنامــه بايســتي دســتورالعملها را در تــابع ) (‪ main‬قـرار دهــيم و ب ـراي‬
‫اينكار مي‌توان به يكي از دو طريقی که در اسالیدهای بعد آمده است ‪ ،‬عمل نمود‪.‬‬
‫برنامه در‬
‫>‬
‫‪#include‬‬
‫<‬
‫) (‪void main‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫‪C++‬‬
‫>‬
‫‪#include‬‬
‫<‬
‫) (‪int main‬‬
‫}‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل‪n‬‬
‫; ‪return 0‬‬
‫}‬
1 ‫مثال‬
‫ را روي صفحه مانیتور نمايش‬C++ is an object oriented language ‫برنامه ای که پيغام‬
.‫مي دهد‬
#include <iostream.h>
int main( )
{
cout <<"C++ is an object oriented language \n" ;
return 0 ;
}
2 ‫مثال‬
.‫برنامه زير يك حرف انگليس ي كوچك را گرفته به حرف بزرگ تبديل مي‌نمايد‬
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; }
‫مثال ‪3‬‬
‫دو عدد از نوع اعشاري را گرفته مجموع و حاصلضرب آنها را محاسبه و نمايش ميدهد‪.‬‬
‫>‪#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‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫‪.‬‬
‫‪else‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫‪.‬‬
‫‪IF‬‬
: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
b
true
false
true
false
a
true
true
false
false
a && b
True
False
False
False
a
true
false
!a
False
True
b
true
false
true
false
a || b
True
True
True
False
‫مثال ‪:‬‬
‫اگر ‪ x‬برابر با ‪ 5‬يا ‪ y‬مصالف صفر باشد مقدار ‪ x‬نمايش داده شود ‪.‬‬
‫اگر مقدار ‪ x‬مصالف صفر باشد‪ ،‬آنگاه ‪ x‬برابر با صفر شود ‪.‬‬
‫))‪if ((x= = 5) ||(y != 0‬‬
‫; ‪cout << x << endl‬‬
‫)‪if(x‬‬
‫;‪x=0‬‬
: ‫مثال‬
‫برنامه زير طول سه چارهخط را از ورودي گرفته مشخص مينمايد كه آيا تشكيل يك مثلث ميدهد يا خير؟‬
#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‬‬
‫ارقام ‪ 0‬تا ‪ 9‬را روي ده خط نمايش ميدهد‬
‫دستورالعمل ‪break‬‬
‫اين دستورالعمل باعث توقف دستورالعملهاي تكرار( ‪ )for , while ,do while‬شده و كنترل به خارج‬
‫از اين دستورالعملها منتقل مينمايد‪.‬‬
: ‫مثال‬
#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 ; }
: 1 ‫مثال‬
: ‫مثال‬
:2 ‫مثال‬
#include <iostream.h>
int main( )
{
int count = 0 ;
while( 1 )
{
count ++ ;
if(count > 10 )
break ;
}
cout << "counter : " << count << "\n";
return 0 ;
}
: ‫مثال‬
#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 ; }
:3 ‫مثال‬
: ‫مثال‬
#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 ; }
:4 ‫مثال‬
‫دستورالعمل ‪continue‬‬
‫از دستورالعمل ‪ continue‬ميتوان در دستورالعملهاي تكرار ‪for ، while ، do while‬‬
‫اسااتفاده نمااود‪ .‬اياان دسااتورالعمل باعااث ماايشااود كااه كنتاارل بابتااداي دسااتورالعملهاي تكاارار منتقاال‬
‫گردد‪.‬‬
: ‫مثال‬
#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 ; }
: ‫مثال‬
#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 * /
}
: ‫مثال‬
#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;
}
}
‫تابع‬
‫)(‪: cin.get‬‬
‫اين تابع يك كركتر را از صفحه كليد ميگيرد‪ .‬براي استفاده از اين تابع در ابتداي برنامه بايستي‬
‫داشته باشيم‪:‬‬
‫>‪<iostream.h‬‬
‫قطعه برنامه ذيل يك كراكتر را از صفحه كليد گرفته و نمايش ميدهد‪.‬‬
‫‪char‬‬
‫;‪x‬‬
‫;) (‪x = cin.get‬‬
‫; ‪cout << x‬‬
‫‪#include‬‬
‫مثال ‪:‬‬
‫برنامة ذيل يك سطر متن انگليس ي كه به ‪ CTRL Z‬ختم ميشود را گرفته دقيقا سً نمايش ميدهد‪.‬‬
‫‪#include‬‬
‫>‪<iostream.h‬‬
‫) (‪int main‬‬
‫{‬
‫;‪char x‬‬
‫)‪while((x = cin.get( ) !=EOF‬‬
‫; ‪cout << x‬‬
‫; ‪return 0‬‬
‫}‬
‫معني ‪EOF‬‬
‫تعريف شده و مقدار آن برابر با ‪ -1‬ميباشد‪ .‬مقدار آن ‪ iostream.h‬ميباشد كه در ‪ End of File‬به‬
‫‪ ctrl z.‬عبارتست از ‪DOS‬در سيستم عامل‬
: ‫مثال‬
.‫ استفاده شده است‬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‬به نوع ديگر‬
‫استفاده ميشود‪ .‬اين عملگر يك عملگر يكتائي ميباشد‪.‬‬
‫مثال ‪:‬‬
‫; ‪int x = 25‬‬
‫; ‪float y‬‬
‫< ‪y = static_cast‬‬
‫; )‪float >(x‬‬
‫س‬
‫مقاادار ‪ x‬موقتااا بوااورت اعشاااري در‬
‫م اای آي ااد و در ن يج ااه مق اادار ‪ y‬براب اار ب ااا‬
‫‪ 25.0‬می شود‪ .‬بايستي توجاه داشات‬
‫كه نوع متغيار ‪ x‬عاو نماي شاود بلكاه‬
‫س‬
‫موقت ااا مق اادار آن بو ااورت اعش اااري در‬
‫آمده است‪.‬‬
‫مثال ‪:‬‬
‫; ‪float x = 14.75‬‬
‫‪cout << static_cast‬‬
‫;‪< int >(x) << endl‬‬
‫; ‪cout << x‬‬
‫ابتدا مقدار ‪ 14‬نمايش داده ميشاود و‬
‫سا ا ا ا ااپس مقا ا ا ا اادار ‪ 14.75‬نما ا ا ا ااايش داده‬
‫ميشود‪.‬‬
‫جدول اولویت عملگرها‬
‫(‬
‫چ پ به راس ت‬
‫راس ت به چ پ‬
‫)‬
‫‪sizeof‬‬
‫‪-‬‬
‫‪+‬‬
‫‪Static_cast < >( ) ++‬‬
‫‪--‬‬
‫چ پ به راس ت‬
‫‪* / %‬‬
‫چ پ به راس ت‬
‫‪+ -‬‬
‫چ پ به راس ت‬
‫چ پ به راس ت‬
‫<<‬
‫>>‬
‫=<‬
‫>‬
‫=>‬
‫چ پ به راس ت‬
‫=!‬
‫==‬
‫راس ت به چ پ‬
‫‪:‬‬
‫?‬
‫راس ت به چ پ‬
‫چ پ به راس ت‬
‫=‪-‬‬
‫=‪*= /= %‬‬
‫‪,‬‬
‫<‬
‫=‪+‬‬
‫=‬
‫فصل چهارم‬
‫اعداد تصادفی‬
‫فهرست مطالب فصل چهارم‬
‫‪.1‬‬
‫تولید اعداد توادگی‬
‫‪.2‬‬
‫تعریف نوع داده ( ‪) typedef‬‬
‫داده های از نوع شمارش ی‬
‫فرمت های مصتلفه مقادیر خروجی‬
‫‪.3‬‬
‫‪.4‬‬
‫اعداد تصادفی‬
‫مقادير توادگي يا شانس ي در اكثر برنامههاي كاربردي در زمينه شبيه سازي و بازيهاي كامپيوتري نقش مهماي‬
‫را ايفااا م ااينماين ااد‪ .‬ب ااراي ايج اااد ي ااك ع اادد تو ااادگي ص ااحيح ب ااين ‪ 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‬‬
‫آرایه یک بعدی‬
‫آرایه دو بعدی ( ماتریس ها )‬
‫آرایه یک بعدی‬
‫‪ .1‬آرايه يك فضاي چيوسته از حافظه اصلي كامپيوتر ميباشد كه ميتواند‬
‫چندين مقدا را در خود جاي دهد‪.‬‬
‫‪ .1‬كليه عناصر يك آرايه از يك نوع ميباشند‪.‬‬
‫عناصر آرايه بوسيله انديس آنها مشخص ميشوند‪.‬‬
‫در ‪ ، 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‬‬
‫ستون ‪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‬‬
‫ستون‬
‫‪3‬‬
‫تصویص مقادیر اولیه به عناصر آرایه ‪:‬‬
‫; } }‪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
‫احضار‬
‫‪ a‬در ‪main‬‬
‫بوسیله مقدار ( ‪Call By‬‬
‫‪) Value‬‬
‫‪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)
{
n= = 2) || if(n = = 1
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( )
{
int x=5, y=10;
cout << x << endl << vfunct(x) << endl << x << endl ;
cout << y << endl ;
rfunct(y) ;
cout << y << endl ;
return 0 ;
}
int vfunct(int a)
{
return a *= a ;
}
void rfunct(int &b)
{
b *= b ;
}
x
y
5
10
: ‫خروجی‬
.‫تغیير نمی هند‬x ‫مقدار آرگومان‬
5
25
5
10
x
y b
5
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 ;
‫ مقـ ــدار اوليـ ــه تخصـ ــي نـ ــدهيم مقـ ــدار صـ ــفر‬external
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 ;
}
‫ً‬
‫عمال درخواست ميشود كه به جاي‬
‫كامپيوتر ‌‬
‫‌‬
‫وقتي متغیري‌ ‌از نوع ‪ 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‬‬
‫رشته ها و توابع مربوطه‬
‫ساختارها‬
‫ر‬
‫داده گروهي است كه فضاي پيوسته ‌از‬
‫ساختارها شبيه آرايهها بوده بدين صو ت كه يك نوع ً‬
‫اما ‌از يك نوع نميباشند بل ه اعضاي‬
‫ساختار الز ‌‬
‫‌‬
‫عناصر‬
‫‌‬
‫حافظه اصلي را اشغال مينمايد‪ .‬اما‬
‫ساختار ميتوانند ‌از نوعهاي مختلفه ‌از قبيل ‪ … ، float ، int ، char‬باشند‪.‬‬
‫‌‬
‫يك‬
‫تعریف ساختار‬
‫نام ساختار‬
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 ‫ساختار‬
int ‫ شماره حساب از نوع‬acc_no
char ‫ نوع حساب از نوع‬acc_type
‫ كركتري‬80 ‫مشخصات صاحب حساب از نوع رشتة‬
name
float ‫ مانده حساب از نوع‬balance





: ‫به دو صورت می توان اعالن یک متغیر از نوع ساختار را نمایش داد‬
: ‫روش اول‬
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 ;
x.lastpay.day
x.lastpay.month
x.lastpay.year
‫ بوسيله‬lastpay ‫آنگاه عضو‬
.‫مشخص ميگردد‬
‫نکته ‪:‬‬
‫ميتوان آرايهاي تعريف نمود كه هر عضو آن يك ساختار باشد و حتي به آنها مقادير اوليه تخصي‬
‫نمود‪.‬‬
‫{ ‪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 ;
i2= -1 ‫بطوريكه‬
}
x = a + ib
y = c + id
x+y =(a+c) + i(b+d)
‫‪union‬‬
‫‪ union‬از نظ ــر س ــاختاري ش ــبيه ‪ struct‬م ــيباش ــد ‪ .‬ب ــا اي ــن تف ــاوت ك ــه عض ــوهائي ك ــه تشـ ـ يل‬
‫‪ union‬ميده ــد همگ ــي از حافظ ــه مش ــتركي در ك ــامپيوتر اس ــتفاده م ــينماين ــد‪ .‬بن ــابراين اسـ ـتفاده از‬
‫‪ union‬باعث صرفهجوئي در حافظه ميگردد‪.‬‬
‫مثال ‪:‬‬
‫يك رشته‬
‫هر كدام ‌از متغیرهاي ‪ x‬و ‪y‬‬
‫‌‬
‫كامپيوتر يك‬
‫‌‬
‫مقدار ‌از نوع ‪ int‬ميباشد ‌و‬
‫‌‬
‫‪ 10‬كركتري‌ يا يك‬
‫ادر خود جاي‬
‫ير ‌‬
‫بلوك حافظه كه بتواند رشته ‪ 10‬كركتر ‌‬
‫نظر ميگیرد‪.‬‬
‫در ‌‬
‫دهد ‪ ،‬براي‪ color‬و ‪‌ size‬‬
‫‪union id‬‬
‫{‬
‫;]‪char color [10‬‬
‫;‪int size‬‬
‫;‪} x , y‬‬
: ‫مثال‬
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‬‬
‫‪px‬‬
‫‪x‬‬
‫‪26‬‬
‫حال اگر دستور العمل ; ‪ x += 10‬را بدهيم ‪:‬‬
‫‪px‬‬
‫‪x‬‬
‫‪36‬‬
‫حال اگر دستورالعمل ; ‪ *px = *px + 7‬بدهيم‪.‬‬
‫‪px‬‬
‫‪x‬‬
‫‪43‬‬
‫; ‪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‬‬
.‫ ايجاد شده و مقادير عناصر آرايه را به چهار طريق نمايش ميدهد‬int ‫ عنصري از نوع‬5 ‫در برنامه زير يك آرايه‬
#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‬باشد يك‬
‫صفر ‌و ‌‬
‫مقدار ‌‬
‫‌‬
‫ابر با رشته ‪ s2‬باشد‬
‫‪ s1‬بر ‌‬
‫مقدار مثبت ‌بر ميگرداند‪.‬‬
‫‌‬
‫غیر اينصورت يك‬
‫در ‌‬
‫منفي ‌‬
‫تابع ) ‪strcmp(s1, s2‬‬
‫اگر‬
‫صفر ‌و ‌‬
‫مقدار ‌‬
‫‌‬
‫ابر با ‪ s2‬باشد‬
‫رشتههاي ‪ s1‬و ‪ s2‬را با هم مقايسه نموده اگر ‪ s1‬بر ‌‬
‫مقدار مثبت‬
‫‌‬
‫غیر اينصورت يك‬
‫در ‌‬
‫مقدار منفي ‌‬
‫‌‬
‫رشته ‪ s1‬كوچ ‌تر ‌از رشته ‪ s2‬باشد يك‬
‫برميگرداند‪.‬‬
‫تابع ) ‪strncmp(s1, s2,n‬‬
‫در صورتي ه ‪s1‬‬
‫كركتر ‌از رشتة ‪ s2‬مقايسه نموده ‌‬
‫‌‬
‫كركتر ‌از رشتة ‪ s1‬را با ‪n‬‬
‫‌‬
‫حداكثر ‪n‬‬
‫غیر‬
‫در ‌‬
‫صفر ‌‬
‫مقدار ‌‬
‫‌‬
‫ي با ‪ s2‬باشد‬
‫مقدار منفي‪ ،‬اگر ‪ s1‬مساو ‌‬
‫‌‬
‫كوچ ‌تر از ‪ s2‬باشد يك‬
‫مقدار مثبت برميگرداند‪.‬‬
‫‌‬
‫اينصورت يك‬
‫تابع (‪strcat(s1, s2‬‬
‫د ‌و رشتة ‪ s1‬و ‪ s2‬را بعنوان آرگومان گرفته رشتة ‪ s2‬را به انتهاي رشتة ‪ s1‬اضافه‬
‫ً‬
‫ونهايتا رشتة‬
‫‌‬
‫كركتر پاياني ‪ \0‬رشتة ‪ s1‬نوشته ميشود‬
‫‌‬
‫كركتر او ‌ل رشتة ‪ s2‬روي‬
‫‌‬
‫مينمايد‪.‬‬
‫‪ s1‬را برميگرداند‪.‬‬
‫تابع (‪strncat(s1, s2,n‬‬
‫كركتر ‌از‬
‫‌‬
‫ومقدار صحيح ‌و مثبت ‪ n‬را بعنوان آرگومان گرفته‪ ،‬حداكثر ‪n‬‬
‫‌‬
‫د ‌و رشته ‪ s1‬و ‪s2‬‬
‫كركتر رشته ‪ s2‬روي كركتر چاياني ‪ \0‬رشتة‬
‫‌‬
‫در انتهاي رشتة ‪ s1‬كپي مينمايد‪ .‬اولین‬
‫رشتة ‪ s2‬را ‌‬
‫س‬
‫‪ s1‬مينويسد ونهايتا مقدار رشتة ‪ s1‬را برميگرداند‪.‬‬
‫تابع (‪strlen(s‬‬
‫رشتة ‪ s‬را بعنوان آرگومان گرفته طول رشته را مشخ‬
‫مينمايد‪.‬‬
‫تابع (‪strlen(s‬‬
‫رشتة ‪ s‬را بعنوان آرگومان گرفته طول رشته را مشخ‬
‫مينمايد‪.‬‬
‫تابع‬
‫)‪strcpy(s1,s2‬‬
‫دو رشتة ‪ s1‬و ‪ s2‬را بعنوان آرگومان گرفته رشتة ‪ s2‬را در رشتة ‪ s1‬كپي مينمايد و‬
‫ً‬
‫نهايتا مقدار رشتة ‪ s1‬را بر ميگرداند‪.‬‬
‫تابع (‪strncpy(s1, s2,n‬‬
‫دو رشتة ‪ s1 , s2‬و مقدار صحيح و مثبت ‪ n‬را بعنوان آرگومان گرفته‪ ،‬حداكثر ‪ n‬كركتر‬
‫ً‬
‫نهايتا مقدار رشتة ‪ s1‬را برميگرداند‪.‬‬
‫را از رشتة ‪ s2‬در رشتة ‪ 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‬چند ریختی (‪)polymorphism‬‬
‫‪ .3‬خاصیت ارث بری‌‬
‫‪ .4‬پشته (‪)stack‬‬
‫‪ .5‬ایجاد ش ی‬
‫‪ .6‬ارث بری‌‬
‫‪ .7‬سازنده ها و نابود کننده ها‬
‫‪ .8‬توابع دوست‬
‫‪ .9‬کالس های دوست‬
‫‪ .10‬توابع سازنده پارامتر دار‬
‫‪ .11‬توابع سازنده یک پارامتری‌‬
‫‪.12‬‬
‫‪.13‬‬
‫‪.14‬‬
‫‪.15‬‬
‫‪.16‬‬
‫‪.17‬‬
‫‪.18‬‬
‫‪.19‬‬
‫‪.20‬‬
‫‪.21‬‬
‫عضوهای ‪static‬‬
‫کالسهای تودرتو‬
‫کالس های محلی‬
‫استفاده از ‪ object‬ها بعنوان پارامترهای تابع‬
‫برگشت اشیاء‬
‫انتساب اشیاء‬
‫آرایه اشیاء‬
‫اشاره گر به اشیاء‬
‫اشاره گر ‪this‬‬
‫توابع مجازی و پلی مرفیسم‬
‫نرم فزار‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫تعریف نرم فزار‪ :‬به مجموعه برنامه‪ ،‬ساختار داده ای و مستندات نرم‬
‫افزارگفته می شود‪.‬‬
‫تعاریف مهندسی نرم افزار‪:‬‬
‫‪-1‬مهندسی نرم افزار عبارتست از کاربرد عملی علم کامپیوتر‪ ،‬علم مدیریت و‬
‫سایرعلوم برای تحلیل‪ ،‬طراحی‪ ،‬ساخت‪ ،‬نگهداری نرم افزار و مستندسازی مورد‬
‫نیازبرای استفاده در اجرا و نگهداری نرم افزار تولید شده‬
‫‪-2‬مهندسی نرم افزار عبارتست از کاربرد اصول مهندسی برای بهینه سازی‬
‫روند تولید و نگهداری سیستم های نرم افزاری با هدف کاهش هزینه و افزایش‬
‫قابلیت اطمینان‬
‫‪: IEEE -3‬استفاده از روشهای سیستماتیک‪ ،‬با قاعده و قابل اندازه گیری برای‬
‫تولید‪ ،‬بکارگیری و نگهداری نرم افزار‬
‫‪-4‬تعریف و استفاده از قواعد و اصول صحیح مهندسی است برای دستیابی به‬
‫نرم افزاربصورت اقتصادی که دارای قابلیت اطمینان بوده و بصورت کارا روی‬
‫ماشین های واقعی کار کند‪.‬‬
‫منحنی نرخ خرابی سخت افزار‬
‫نسبت به نرم افزار‬
‫منحنی نرخ خرابی ایده ال نرم‬
‫افزار نسبت به زمان‬
‫منحنی نرخ خرابی واقعی نرم‬
‫افزار نسبت به زمان‬
‫سیستم‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫تعریف سیستم ‪:‬یک مجموعه از مولفه هایی که برای انجام دادن یک کار و یا‬
‫کنترل یک فرایند سازماندهی شده باشند‪.‬‬
‫تولید یک نرم افزار بطور کلی دارای سه فاز است‪:‬‬
‫‪-1‬تعریف‬
‫‪-2‬تولید‬
‫‪-3‬نگهداری‬
‫در فاز تعریف بررسی های زیر انجام می شود‪:‬‬
‫‪-1‬چه اطالعات و داده هایی باید پردازش شود‪.‬‬
‫‪-2‬چه عملیات و کارهایی الزم است‪.‬‬
‫‪-3‬چه واسط هایی )نرم افزاری یا سخت افزاری) الزم است‪.‬‬
‫‪-4‬چه محدودیت هایی وجود دارد‪.‬‬
‫‪-5‬ضوابط ارزیابی سیستم باید مشخص شود‪.‬‬
‫*در این فاز بر روی اینکه چه چیزی مورد نیاز است‪ ،‬تاکید می شود‪.‬‬
‫فاز تعریف‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫*به طور کلی در فاز تعریف سه قدم(گام) اصلی وجود دارد‪:‬‬
‫‪-1‬تجزیه و تحلیل سیستم ‪ :‬در این گام نقش هر مولفه در (سیستم سیستمی که‬
‫قرار است تولید شود) و نقش کل سیستم نیز تعیین می شود ‪.‬به عبارت دیگر‬
‫حوزه عمل سیستم و بستر الزم چه سخت افزاری و چه نرم افزاری تعیین می‬
‫شود ‪.‬به عالوه بررسی کالن در مورد کل سازمان و کارهای مربوطه در این گام‬
‫انجام می گیرد‪.‬‬
‫‪-2‬برنامه ریزی پروژه انجام می شود ‪.‬در این گام‪ ،‬برنامه ریزی انسانی و هزینه‬
‫و زمان و زمانبندی انجام کارها مشخص می شود‪.‬‬
‫‪-3‬تجزیه و تحلیل نیازهای سیستم مورد نظر ‪.‬در این مرحله عملیات مورد انتظار‬
‫از سیستم تعیین و پرونده های) بانکهای( اطالعاتی الزم تعریف و سپس فرمهای‬
‫ورودی و خروجی مشخص می شود‪.‬‬
‫گام سوم به یک تکه از کل نگاه می کند ولی گام یا قدم اول کل سیستم را می‬
‫بیند که در خیلی از پروژه ها‪،‬متاسفانه به کل توجهی نمی شود ‪.‬در نتیجه‬
‫سیستم بصورت وصله وصله در می آید نه یک تکه‪.‬‬
‫فاز تولید‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫فاز تولید ‪:‬در این فاز بر روی چگونگی تاکید می شود و چگونگی تبدیل مرحله تحلیل) گام ‪ ) 3‬به‬
‫نرم افزار(برنامه ها(‬
‫مورد توجه قرار می گیرد‪.‬‬
‫ساختار داده ها و معماری نرم افزار تعیین می شود‪.‬‬‫جزئیات رویه ها تعیین می شود‬
‫چگونگی تبدیل طراحی به برنامه کامپیوتری مشخص می شود‪.‬‬
‫ایجاد داده های آزمایشی برای تست نرم افزار‬‫سه گام اصلی در این فاز وجود دارد ‪:‬‬
‫‪-1‬طراحی نرم افزار ‪:‬در این گام نیازمندیهای نرم افزار به صورت مجموعه ای از نمایشها( مانند‬
‫گرافیکی‪ ،‬جدولی و غیره )که ساختمان داده ها و معماری والگوریتم ها را توضیح می دهد‪ ،‬تبدیل‬
‫می شود‪.‬‬
‫‪-2‬تولید کد ‪:‬در این گام‪ ،‬نتایج طراحی با کمک یک زبان برنامه سازی به برنامه ها تبدیل می‬
‫شود معموال از ‪4GL , 3GL‬استفاده می شود ‪.‬البته این به پارامترهای بسیاری از جمله موقعیت‬
‫مکانی و زمانی سازمان‪ ،‬تکنولوژی فعلی سازمان‪ ،‬روش طراحی ( مثال شئی گرا )و ‪ ...‬بستگی‬
‫دارد‪.‬‬
‫‪-3‬تست نرم افزار ‪:‬در این گام‪ ،‬نرم افزار تولید شده را جهت بر آورده شدن‬
‫نیازهای مشتری تست می کنیم ‪.‬‬
‫فاز تعمیر و نگهداری‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫فاز تعمیر و نگهداری ‪:‬در این فاز روی تغییراتی که پس از تحویل به‬
‫مشتری پیش می آید تاکید می شود ‪ .‬این تغییرات عبارتند از‪:‬‬
‫‪-1‬تعمیرات اصالحی )‪(corrective maintenance‬‬
‫‪-2‬تعمیرات تطبیقی )‪ (adaptive maintenance‬به عنوان مثال‬
‫سیستم عامل تغییر کرد یا زبان برنامه سازی جدید آمد و یا تغییراتی‬
‫سخت افزاری اعمال گردید یا در قوانین سازمانی تغییراتی داده شد‪.‬‬
‫‪-3‬تعمیرات تکمیلی )‪ (perfective maintenance‬به عنوان مثال‬
‫دانشجویان شبانه هم اضافه شود و‪...‬‬
‫فرایند تولید نرم افزار‬
‫تمام کارهای توسعه و ارايه يک نرم افزار را می توان يک حلقه حل مشکل‬
‫طبق شکل زير توصيف کرد‬
‫فرایند تولید نرم افزار‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫چهار مرحله در شکل فوق‪:‬‬
‫وضع موجود ‪ :‬نمایانگر وضعیت موجود امور است‪.‬‬‫تعریف مساله ‪:‬لیست نیازها و خواسته ها و مشکالت و کاستی ها‬‫مشکل یا مشکالتی که باید حل شود‬
‫توسعه فنی ‪:‬مشکل را از طریق بکارگیری فنآوری حل می کند‪.‬‬‫یکپارچه سازی راه حل ‪ :‬راه حل هایی که در طی فرایند توسعه‬‫بدست می آیند‪ ،‬یکپارچه کرده و نتایج حاصل( مثل اسناد‪ ،‬برنامه ها‪،‬‬
‫داده ها‪ ،‬عملکرد کسب و کار جدید‪ ،‬محصول جدید ) را به‬
‫کسانی که راه حل را در مرحله اول تقاضا کرده اند‪ ،‬ارایه میدهد‬
‫مدل آبشاری خطی‪ -‬ترتیبی‬
‫چرخه حیات نرم افزار بصورت کالسیک ‪.:‬‬
‫نمونه سازی‬
‫‪ ‬وقتی نمونه نهایی ساخته شد و اهداف الزمه مثل تعیین‬
‫لیست خواسته ها و نیازهای مشتری ‪ /‬کاربران حاصل گردید‪،‬‬
‫می توان از یک مدل فرایند‬
‫‪ ‬دیگر استفاده کرد و نرم افزار را بصورت مهندسی تولید کرد‬
‫‪.‬‬
‫مدل نمونه سازی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫معایب این روش‪:‬‬
‫مشتری یک نسخه کاری از نرم افزار را می بیند و نمی داند که این نمونه بدون در نظر گرفتن کیفیت‬‫کلی نرم افزار و یا قابلیت نگهداری دراز مدت ساخته شده ‪.‬وقتی به او بگوئیم که این محصول بایستی دوباره‬
‫ساخته شود مشتری ناراحت می شود‪.‬‬
‫تولید کننده اغلب برای اینکه نمونه را سریع به پایان برساند به خیلی از مسایل توجه نمی کند ‪.‬یک سیستم‬‫عامل نامناسب یا زبان برنامه نویسی نامناسب‪ ،‬چون در دسترس و شناخته شده هستند بکار می روند ‪.‬یک‬
‫الگوریتم ناکارامد فقط برای نمایش قابلیت انجام یک کار بکار می رود ‪.‬بعد از مدتی تولید کننده با این‬
‫انتخابها آشنا شده و دالیل نامناسب بودن آنها را فراموش می کند‪.‬‬
‫توقف این سیکل مشکل است ‪.‬مشتری دوست دارد دائم یکسری ویژگیها اضافه شود‪.‬‬‫مشتری فکر می کند تولید نرم افزار به سادگی همین نمونه( ماکت )می باشد ‪ .‬بنابراین در زمان تحویل نرم‬‫افزار و هزینه انجام پروژه‪ ،‬ممکن است با مشتری با مشکل مواجه شویم‪.‬‬
‫ممکن است مشتری وقت الزم را برای تعامل و ارزیابی نگذارد یا مشتری بسادگی در دسترس نباشد‪.‬‬‫•بنابراین با اینکه مدل فرایند نمونه سازی یک الگوی موثر در مهندسی نرم افزاراست بایستی مسایلی را در‬
‫نظر گرفت ‪.‬از ابتدا قوانینی را تعریف کرد ‪.‬مشتری و تولید کننده بایستی هر دو موافقت کنند که این نمونه به‬
‫عنوان مکانیزمی برای تعریف نیازها تعریف شده است ‪.‬پس از آن بایستی تمام آن یا قسمتی از آن دور‬
‫انداخته شود و نرم افزار مورد نظر با در نظر گرفتن کیفیت و قابلیت نگهداری تولید شود‪.‬‬
‫•از این مدل زمانی مناسب است استفاده کنیم که نیازهای مشتری واضح و مشخص نیست و ابهام در‬
‫خواسته های کاربر وجود دارد ‪.‬همچنین اگر می خواهیم واسط کاربر مناسبی داشته باشیم یا کارایی یک‬
‫الگوریتمی و ‪ ...‬را بررسی کبنم‪ ،‬نمونه سازی می تواند استفاده شود‪.‬‬
‫نمونه سازی‬
‫وقتی نمونه نهايی ساخته شد و اهداف الزمه مثل تعيين ليست خواسته ها ونيازهای مشتری ‪ /‬کاربران حاصل گرديد‪ ،‬می‬
‫توان از يک مدل فرايند ديگر استفاده هرد و نرم افزار را بوورت مهندس ی توليد هرد‪.‬‬
‫تعریف شی گرایی‬
‫برنامه نويس ي ش ئ گرا يا ‪ oop‬يك روش جديد برنامه نويس ي ميباشد كه در آن از ويژگي‬
‫ساختيافته همراه با چند ويژگيهاي قوي جديد استفاده ميشود‪ .‬زبان برنامه ن ‌ويس ي‬
‫‪ C++‬امكان استفاده از ‪ oop‬را به راحتي فراهم مينمايد‪.‬‬
‫در ‪ ، oop‬بطور كلي مساله به تعدادي زيرگروه قطعات مربوط بهم ش سته ميشود كه‬
‫ً‬
‫براي هر زير گروه ‪ code‬و ‪ data‬تهيه شده و نهايتا اين زيرگروهها تبديل به ‪ unit‬ها‬
‫يا واحدهائي ميشود كه ‪( objects‬يا اشياء) ناميده ميشوند‪.‬‬
‫انواع داده‬
‫‪ ‬انواع داده اي پايه‬
‫‪ ‬در همه زبانهاي برنامه نويس ي وجود دارند در زبان ‪C++‬و ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪int‬‬
‫‪float‬‬
‫‪Char‬‬
‫اشياي دنيا واقعي را بايد با مجموعه اي از اين متغیر ها نمايش داد‬
‫مثال ‪:‬صندلي داراي ويژگي هايي مانند وزن‪ ،‬ابعاد‪ ،‬رنگ‪ ،‬مالك‪ ،‬قيمت و ‪ ...‬است‬
‫انواع داده‬
‫‪• ‬در زبان هاي برنامه نويس ي ش ي گرا‪ ،‬مي توان انواع جديد را تعريف كرد •‬
‫‪ ‬انواع جديد‪ ،‬نوع داده انتزاعي (‪ )ADT‬ناميده مي شوند •‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫•ويژگي هاي (‪)ADT‬‬
‫–داراي مجموعه اي از ويژگي ها است‬
‫–مجموعه اي از عمليات دارد كه روي ويژگي ها كار مي كنند‬
‫–ويژگي ها بسته بندي مي شوند‬
‫•ويژگي ها تنها توسط عمليات تعريف شده براي ‪ ADT‬قابل دسترس هستند‬
‫• از بیرون ‪ ADT‬نمي توان به طور مستقيم به ويژگي ها دسترس ي داشت‬
‫•دسترس ي از بیرون‪ ،‬به صورت غیر مستقيم و از طريق عمليات تعريف شده براي ‪ ADT‬مم ن است‬
‫انواع داده‬
‫انواع داده‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫در زبان ‪ ،C++‬انواع داده انتزاعي با استفاده از كالس ها تعريف مي شوند‬
‫ويژگي هاي ‪ ،ADT‬داده هاي عضو كالس يا فيلد ها يا صفت ها گفته مي شوند‬
‫عمليات ‪ ADT‬توابع يا متدهاي كالس ناميده مي شوند ‪،‬‬
‫•كالس و ش ي‬
‫–كالس‪ ،‬تعريف كلي براي يك ‪ ADT‬است‬
‫–ش ي‪ ،‬نمونه اي از كالس است و در زبانهاي برنامه نويس ي يك نهاد زمان‬
‫اجرا است‬
‫تعریف کالس‬
‫‪• ‬داده ها و توابع خصوص ي تنها درون توابع‬
‫‪ ‬كالس در دسترس هستند‬
‫‪• ‬داده ها و توابع عمومي‪ ،‬هم درون كالس و هم‬
‫‪ ‬بیرون كالس در دسترس هستند‬
‫‪‬‬
‫داده ها و توابع خصوص ي‬
‫‪public:‬‬
‫داده ها و توابع عمومي‬
‫‪private:‬‬
‫‪ ‬ويژگي بخش ها حفاظت شده نیز در ار ثبري‌‬
‫‪ ‬بررس ي خواهد شد‬
‫‪ ‬داده ها و توابع حفاظت شده‬
‫‪‬‬
‫‪‬‬
‫{‪class ClassName‬‬
‫•تعريف اشيايي از نوع كالس‬
‫داده ها و توابع خصوص ي‬
‫‪protected:‬‬
‫داده ها و توابع حفاظت شده‬
‫;اشيايي از كالس{‬
‫;نام ش ي نام كالس‬
‫ کالس کارمند‬: ‫مثال‬











Class employee{
char name[26]; // ‫داده ها و توابع به صورت پیش فرض خصوصي هستند‬
public:
void PutName(char *s); // ‫توابع عمومي‬
void GetName(char *s);
void PutAge(double age);
double GetAge();
private:
double Age; // ‫داده خصوصي‬
} em1 , em2; // ‫تعریف شي هنگام تعریف كالس‬
Employee em3 , em4; // ‫تعریف شي پس از تعریف كالس‬
‫مثال ‪ :‬کالس کارمند‬
‫)‪ void employee::PutName(char *s‬‬
‫{ ‪‬‬
‫…‬
‫} ‪‬‬
‫‪‬‬
‫‪‬‬
‫هنگام تعریف توابع كالس‪ ،‬باید نام كالس‬
‫و عملگر تفكیك دامنه(‪ )::‬را قبل از نام تابع بیاوریم‬
‫)‪ void employee::GetName(char *s‬‬
‫{ ‪‬‬
‫…‬
‫} ‪‬‬
‫… ‪‬‬
‫سازنده های کالس‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫•اعضاي داده اي كالس را چگونه مي توان مقدار دهي اولیه كرد‬
‫–مي توان یك تابع با نام دلخواه و بدون پارامتر ورودي تعریف كرد‬
‫كه متغیر ها را مقدار دهي اولیه كند( مثال همه را صفر كند)‬
‫•سازنده‬
‫–كالس مي تواند تابع عضو ویژه اي به نام سازنده داشته باشد‬
‫–تابع سازنده همنام كالسي است كه در آن تعریف شده است‬
‫–هنگام ایجاد اشیایي از كالس به طور خودكار اجرا مي شود‬
‫سازنده های کالس‬
‫سازنده های کالس‬
‫سازنده با پارامتر ورودي‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫•سازنده با پارامتر ورودي‬
‫–سازنده ها مي توانند پارامتر ورودي داشته باشند‬
‫–معموال‪ ،‬این پارامترها براي مقدار اولیه دادن به اعضاي شي به‬
‫كار‬
‫مي روند‬
‫•چند نكته‬
‫–اگر هنگام تعریف یك شي‪ ،‬آن را با یك شي دیگر مقداردهي كنیم‪،‬‬
‫سازنده آن فراخواني نمي شود‬
‫سازنده کالس‬
‫سازنده کالس‬
‫سازنده با یک پارامتر‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫•اگر یك سازنده داراي یك پارامتر باشد‪ ،‬حالت ویژه اي از‬
‫سازنده است‬
‫تفسیر مي شود )‪ob(i‬به صورت ‪– ،ob = i‬در این حالت‬
‫–تابع سازنده با یك پارامتر‪ ،‬تبدیل نوعي از پارامتر به نوع كالس‬
‫انجام مي دهد‬
‫سازنده کپی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫•هنگامي كه شي یك كالس به تابع فرستاده مي شود‪ ،‬یك كپي از‬
‫شي محل فراخواني در شي داخل تابع ایجاد مي شود‬
‫این كار هنگام بازگرداندن )‪ (return‬نیز صورت مي گیرد‬
‫–ایجاد یك كپي از شي داخل تابع كه بازگردانده مي شود در شي‬
‫موقتي كه در محل فراخواني ایجاد مي شود‬
‫•چه موقع نوشتن سازنده كپي ضروري است؟‬
‫–كالس داراي آرایه پویا باشد( مانند كالالس رشته با طول متغیر )و‬
‫–توابعي وجود داشته باشند( عضو یا غیر عضو )كه اشیایي از نوع‬
‫كالس را به عنوان ورودي بگیرند یا به عنوان خروجي باز گردانند‬
‫مخربها‬
‫‪• ‬مخرب‬
‫‪– ‬یك تابع عضو ویژه از كالس است‬
‫‪– ‬همنام با كالس است و با یك كاراكتر ~شروع مي شود‬
‫‪– ‬هنگامي كه یك شي از بین مي رود به صورت خودكار فراخواني‬
‫مي شود‬
‫‪• ‬هنگام پایان یافتن عمر متغیرهاي محلي در انتهاي تابع‬
‫‪ • ‬هنگام بكار گرفتن عملگر ‪ delete‬براي از بین بردن یك متغیر با‬
‫فضاي پویا‬
‫‪• ‬نوشتن مخرب براي كالس زماني كه برخي اعضاي داده اي آن‬
‫حافظه پویا دارند‪ ،‬ضروري است‬
‫کالس رشته با طول متغیر‬
‫کالس رشته با طول متغیر‬
‫کالس رشته با طول متغیر‬
‫کالس رشته با طول متغیر‬
‫آرگومان های پیش فرض‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫•مي توان هنگام تعریف توابع‪ ،‬مقدارهاي پیش فرضي به ورودي ها‬
‫نسبت داد‬
‫–اگر هنگام فراخواني توابع‪ ،‬پارامتر مربوط قید نشود‪ ،‬مقدار پیش فرض به‬
‫آرگومان اختصاص مي یابد‬
‫•آرگومان هاي پیش فرض در سازنده ها‬
‫–سازنده ها مي توانند آرگومان هاي پیش فرض داشته باشند‬
‫–در این حالت‪ ،‬اگر هنگام فراخواني سازنده آرگوماني به آن داده نشود‪ ،‬ارزش‬
‫دهي اولیه به كالس با استفاده از مقدارهاي پیش فرض انجام مي شود‬
‫–سازنده اي كه برنامه نویس همه آرگومان هاي آن را به صورت پیش فرض‬
‫مشخص مي كند‪ ،‬سازنده پیش فرض نامیده مي شود‬
‫–در هر كالس تنها یك سازنده پیش فرض مي تواند وجود داشته باشد‬
‫آرگومان های پیش فرض‬
‫آرگومان های پیش فرض‬
‫آرگومان های پیش فرض‬
‫توابع دوست‬
‫‪• ‬گاهي الزم است‪ ،‬یك تابع غیر عضو به اعضاي خصوصي‬
‫‪ ‬كالالس دسترسي داشته باشد‬
‫‪• ‬دوستي ‪:‬هنگامي كه یك كالس دوست یك تابع غیر عضو یا‬
‫‪ ‬یك كالالس دیگر است‪ ،‬امكان دسترسي به اعضاي خصوصي آن‬
‫‪ ‬در تابع یا كالس دوست فراهم مي شود‬
‫‪• friend <function signature>; ‬‬
‫‪• Example: friend void Print(Myclass ,int ); ‬‬
‫توابع دوست‬
‫توابع دوست‬
‫کالس های دوست‬
‫‪• ‬كالس ها را نیز مي توان دوست كالس هاي دیگري‬
‫تعریف كرد‬
‫‪• ‬كالس دوست و همه توابع عضو آن به اعضاي خصوصي‬
‫‪ ‬كالالس دیگر دسترسي دارند‬
‫‪• friend class Circle; ‬‬
‫کالس های دوست‬
‫کالس های دوست‬
‫کالس های دوست‬
‫نکته مهم ‪:‬‬
‫تمام زبانهاي برنامه نويس ي ش يگرا داراي سه خصوصيت مشترك زير ميباشند ‪:‬‬
‫الف‪( encapsulation :‬محوورسازي)‬
‫ب‪( polymorphism :‬چندريصتي)‬
‫ج‪( inheritance :‬ارث بري)‬
‫محصورسازی (‪) Encapsulation‬‬
‫محصورســازي مكــانیزمي اســت كــه ‪ code‬و ‪ data‬را بهــم وصــل نمــوده و هــر دوي آنهــا‬
‫را از اسـتفادههـاي غیرمجـاز مصــون نگـه مـيدارد‪ .‬شـ ي يــك مهلفـه منطقـي اسـت كــه ‪data‬‬
‫و ‪ code‬را محصور نموده و ‪ code‬باعث دستكاري و پردازش ‪ data‬ميشود‪.‬‬
‫‪( polymorphism‬چند‬
‫ریختي)‬
‫چند ريختي مشخصهاي است كه بيك وسيله امكان ميدهد كه باتعدادي از سيستمها‬
‫يا عميات يا دستگاهها‪ ،‬مورد استفاده قرار گیرد‪.‬‬
‫‪( inheritance‬ارث‬
‫بري)‬
‫ارث بري فرآيندي است كه بوسيله آن يك ش ي (‪ )object‬ميتواند خاصيتهاي ش ي‬
‫ديگري را دارا شود‪.‬‬
‫پشته (‪)stack‬‬
‫پشته ساختاري است كه داراي خاصيت ‪ last in first out‬ميباشد‪ .‬پشته فضاي پيوسته در‬
‫حافظه اشغال مينمايد‪ .‬عملياتي كــه روي پشته انجام ميشوند عبارتند از ‪:‬‬
‫الف‪ ، push :‬كه باعث ميشود يك عنصر وارد پشته شده‪.‬‬
‫ب‪ ، pop :‬كه باعث ميشود يك عنصر از پشته خارع گردد‪.‬‬
‫ایجاد‬
‫شي (‪)object‬‬
‫ظاهر شبيه‬
‫نظر ‌‬
‫بمنظور‌ ايجاد يك ش ي بايستي ‌از كلمة رزروشده ‪ class‬استفاده نمود‪‌ class .‬از ‌‬
‫نظر گرفت كه ‪ data‬آن شامل يك‬
‫در ‌‬
‫ساختار يا ‪ struct‬ميباشد‪ .‬پشته را بعنوان يك ‪ object‬ميتوان ‌‬
‫‌‬
‫آرايه ‌و يك ‪‌ ، tos‬و عملياتي كه روي اين ‪ object‬انجام ميشود عبارتست از ‪، initialize ، push‬‬
‫‪ pop‬كردن پشته‪.‬‬
‫مثال ‪:‬‬
‫بدين مع ي است كه ‪ 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
:
#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 ++ ;
}
stack ‫کامل‬
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 ‫تمام اعضاي ش ي‬
‫ از ش ي‬house ‫ دراينجا عمال ش ي‬.‫اضافي و چهار تابع اضافي ميباشد‬
: ‫ ارث ميبرد‬building
‫نکته ‪:‬‬
‫در مثال قبل ‪ building‬را ‪ base class‬و ‪ house‬را ‪ derived class‬می نامند ‪ .‬ش ي ‪ house‬تمام‬
‫اعضاي ‪ building‬را دارا است بعالوه اين ه داراي متغیرهاي عضوي اضافي ‪ baths ، bedrooms‬و همچنین‬
‫توابع عضوي )(‪get_bedrooms() ،get_baths() ،set_bebrooms() ،set_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‬كالسهاي‬
‫محلي)‬
‫وقتي كه كالس ي در درون يك تابع تعريف ميشود اين ك ‌الس‬
‫فقط براي آن تابع شناخته شده است و براي توابع ديگر‬
‫ناشناخته ميباشد‪ .‬چنین كالس ي را كالس محلي‬
‫مينامند‪.‬‬
‫در مورد كالسهاي محلي رعايت نكات زير ضروري است ‪:‬‬
‫تمام توابع عضو بايستي در درون كالس تعريف گردند‪.‬‬
‫از متغیرهاي محلي‪ ،‬تابعي كه كالس در آن تعريف شده نميتواند استفاده نمايد‪.‬‬
‫از متغیرهاي عضوي ‪ 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)
{
b=base; this 
e=exp; this 
val =1; this 
if(exp = = 0) return;
) for(; exp > 0 ; exp 
b; val *this  val = this  this 
}
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