Transcript C++

‫برنامه سازی پیشرفته‬
‫نام درس ‪:‬‬
‫برنامه سازی پیشرفته‬
‫استاد ‪ :‬مهندس کاری‬
‫نمونه پروژه پایان ترم‬
‫‪ .1‬پروژه کتابخانه مجازی در ‪ C++‬بکمک ‪(structure‬ساختار)‬
‫امکانات این پروژه به شرح زیر می باشد‪:‬‬
‫‪ -1‬درج عضو و کتاب‬
‫‪ -2‬ویرایش عضو و کتاب‬
‫‪ -3‬جستجو‪...‬‬
‫‪ -4‬مرتب سازی‪......‬‬
‫‪ -5‬حذف عضو و کتاب‬
‫‪ -6‬امانت دادن کتاب‬
‫‪ -7‬تحویل کتاب با محاسبه دیر کرد و جریمه‬
‫‪ -8‬گزارشگیری‬
‫‪ -9‬ذخیره در فایل‬
‫نمونه پروژه پایان ترم‬
‫‪ .1‬پروژه کتابخانه مجازی در ‪ C++‬بکمک ‪(class‬کالس)‬
‫امکانات این پروژه به شرح زیر می باشد‪:‬‬
‫‪ -1‬درج عضو و کتاب‬
‫‪ -2‬ویرایش عضو و کتاب‬
‫‪ -3‬جستجو‪...‬‬
‫‪ -4‬مرتب سازی‪......‬‬
‫‪ -5‬حذف عضو و کتاب‬
‫‪ -6‬امانت دادن کتاب‬
‫‪ -7‬تحویل کتاب با محاسبه دیر کرد و جریمه‬
‫‪ -8‬گزارشگیری‬
‫‪ -9‬ذخیره در فایل‬
‫سازمان کامپیوتر‬
‫‪-1‬واحد ورودی‬
‫‪-2‬واحد خروجی‬
‫‪-3‬واحد حافظه‬
‫‪-4‬واحد محاسبه و منطق‬
‫‪-5‬واحد پردازش مرکزی‬
‫‪ -6‬واحد حافظه ثانویه‬
‫انواع زبانهای برنامه نویسی‬
‫• زبانهای ماشین‬
‫• زبانهای اسمبلی‬
‫• زبانهای سطح باال‬
‫زبانهای ماشین‬
‫•‬
‫•‬
‫•‬
‫•‬
‫وابسته بودن به سخت افزار‬
‫وجود مشکل در فهم و درک آن‬
‫دشوار بودن خطایابی‬
‫جمع دو متغیر و قراردادن نتیجه در متغیر سوم‬
‫زبانهای اسمبلی‬
‫• استفاده از کلمات بجای اعداد‬
‫• اسمبلر‬
‫• جمع دو متغیر و قراردادن نتیجه در متغیر سوم‬
‫زبانهای سطح باال‬
‫•‬
‫•‬
‫•‬
‫•‬
‫استفاده از کلمات‪ ،‬عالیم و نمادهای محاوره‬
‫کامپایلر‬
‫سهولت کارکردن و خطایابی‬
‫جمع دو متغیر و قراردادن نتیجه در متغیر سوم‬
‫الگوریتم‬
‫• لیست مرتبی از مراحل عملیاتی که اجرای مرتب آنها منجر به حل‬
‫مساله گردد‬
‫• الگوریتم تعویض چرخ پنچر‬
‫الگوریتم(ادامه)‬
‫مثال‪:‬الگوریتمی بنویسید که دو عدد را از ورودی دریافت نموده و مشخص نماید که مجموع دو عدد بزرگتر از ‪20‬میباشد‬
‫الگوریتم(ادامه)‬
‫•‬
‫مثال‪:‬الگوریتمی بنویسید که مجموع اعداد طبیعی مضرب ‪ 7‬و کوچکتر از ‪ 50‬را حساب نماید‬
‫الگوریتم(ادامه)‬
‫•‬
‫مثال‪:‬الگوریتمی بنویسید که ‪ 1000‬عدد را از ورودی دریافت نموده و کوچکترین را چاپ نماید‪.‬‬
‫الگوریتم(ادامه)‬
‫•‬
‫مثال‪:‬الگوریتمی بنویسید که سه عدد را دریافت نموده و مشخص نماید که این اعداد میتوانند اضالع مثلث باشند؟‬
‫فلوچارت‬
‫• روش تصویری و استاندارد نمایش الگوریتم‬
‫•‬
‫بیضی افقی برای نمایش شروع و پایان عملیات‬
‫•‬
‫مستطیل برای نمایش مراحل پردازشی‬
‫•‬
‫لوزی برای نمایش مراحل تصمیم گیری‬
‫•‬
‫متوازی االضالع برای نمایش ورودی و خروجی‬
‫فلوچارت(ادامه)‬
‫• مثال ‪ :‬فلوچارت الگوریتم اضالع مثلث‬
‫تمرینات‬
‫•‬
‫فلوچارتي رسم نمائيد كه ضرايب يك معادله درجه دوم را از ورودي دريافت كرده‪ ،‬ريشههاي‬
‫آن را محاسبه در خروجي چاپ كند‪.‬‬
‫•‬
‫فلوچارتي رسم كنيد كه سه عدد ‪ c , b, a‬را از ورودي دريافت كرده‪ ،‬محتويات آنها را جابجا‬
‫نموده‪ ،‬حاصل را در خروجي چاپ كند‪.‬‬
‫•‬
‫فلوچارتي رسم نمائيد كه ‪ ،n , x‬دو عدد صحيح مثبت را از ورودي دريافت كرده سپس ‪ x‬به‬
‫توان ‪ n‬را محاسبه كند‪.‬‬
‫•‬
‫فلوچارتي رسم نمائيد كه دو عدد از ورودي دريافت كرده‪ ،‬سپس محتويات دو عدد را بدون‬
‫استفاده از متغير كمكي جابجا كند‪.‬‬
‫•‬
‫فلوچارتي رسم كنيد كه عددي را از ورودي دريافت كرده سپس تعداد ارقام آن را شمرده در‬
‫خروجي چاپ نمايد‪.‬‬
‫فهرست مطالب‬
‫فصل اول ‪ :‬مقدمات زبان ‪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‬بايت‬
‫يك كاراكتر‬
‫‪char‬‬
‫‪ 1‬بايت‬
‫‪ 127‬تا ‪–128‬‬
‫‪unsigned char‬‬
‫‪ 4‬بايت‬
‫‪ 3.4e38‬تا ‪1.2e-38‬‬
‫‪ 8‬بايت‬
‫‪ 1.8e308‬تا ‪2.2e-308‬‬
‫‪int‬‬
‫‪unsigned int‬‬
‫‪long int‬‬
‫‪unsigned long int‬‬
‫‪float‬‬
‫‪double‬‬
‫اعالن متغیرها‬
‫قبل از آنكه در برنامه به متغيرها مقدداري تخصديص داده‬
‫شود و از آنها استفاده گردد بايستي آنها را در برنامه اعالن‬
‫نمود‪.‬‬
‫در اساليد بعد مثال هايي از اعالن متغير ذكر شده است‪.‬‬
‫چند مثال از اعالن متغیر ها ‪:‬‬
‫‪ ‬براي اعالن متغير‪ x‬از نوع ‪: int‬‬
‫;‪x‬‬
‫‪int‬‬
‫‪ ‬براي اعالن متغيرهاي ‪ p‬و ‪ q‬را از نوع ‪ float‬كه هر كدام چهار بايت از‬
‫حافظه را اشغال ميكنند ‪:‬‬
‫; ‪float p , q‬‬
‫‪ ‬براي اعالن متغير ‪ next‬از نوع كاراكتر كه ميتوان يكي از ‪ 256‬كاراكتر را‬
‫به آن تخصيص داد و يك بايت را اشغال ميكند‪.‬‬
‫; ‪Char next‬‬
‫تخصيص مقادير به متغيرها‬
‫با استفاده از عملگر = ميتوان به متغيرها مقدار اوليه تخصيص نمود‪.‬‬
‫در اساليد بعد مثال هايي از اعالن متغير ذكر شده است‪.‬‬
‫مثال ‪:‬‬
‫‪ ‬در دستورالعمل‬
‫‪ X‬را از نوع ‪ int‬با مقدار اوليه ‪ 26‬اعالن نموده ‪.‬‬
‫;‪int x=26‬‬
‫;‪long int 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‬‬
‫; ’‪cout << ‘x‬‬
‫مثال ‪:‬‬
‫مثال ‪:‬‬
‫دریافت مقادیر متغیرها‬
‫به منظور دریافت مقادیر برای متغیرها در ضمن اجرای برنامه از فحه کلید‪ ،‬از ‪cin‬‬
‫که بدنبال آن عملگر استخراج یعنی >> قید شده باشد میتوان استفاده نمود‪.‬‬
: ‫مثال‬
int x;
cout << "Enter a number:" ;
cin >> x;
‫عملگر انتساب‬
‫عملگر انتساب = ميباشد كه باعث ميگردد‬
‫مقدار عبارت در طرف راست اين عملگر ارزيابي‬
‫شده و در متغير طرف چپ آن قرار گيرد‪.‬‬
‫مثال ‪:‬‬
‫;‪x=a+b‬‬
‫; ‪x=35‬‬
‫; ‪x=y=z=26‬‬
‫از عملگرهای انتساب چندگانه نیطز مطی تطوان اسطتفاده‬
‫نمود‪ .‬کطه مقطدار سطه متغیطر ‪ z‬و ‪ y‬و ‪ x‬برابطر بطا ‪26‬‬
‫میشود‪.‬‬
‫تمرینات‬
‫‪ -1‬فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده‪ ،‬سري فيبونداچي قبدل از آندرا توليدد‬
‫نمايد‪.‬‬
‫‪ -2‬فلوچارتي رسم نمائيد كه دو عدد ‪ N , M‬را از ورودي خوانده‪ ،‬بزرگترين مقسومعليده مشدتر‬
‫دو عدد را محاسبه و چاپ كند‪.‬‬
‫‪ -3‬فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده مقلوب عدد را محاسبه و در خروجي‬
‫چاپ كند‪.‬‬
‫عملگرهای محاسباتی‬
‫در ‪ 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=10‬‬
‫عملگر ‪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
d
math.h
exp(d)
log(d)
log10(d)
double
double
double
math.h
math.h
math.h
sin(d)
double
ex
loge d
Log10 d
d
sqrt(d)
double
strlen(s)
int
tan(d)
double
toascii( c)
int
tolower(c )
int
stdlib.h
toupper(c )
int
stdlib.h
d
s
math.h
math.h
string.h
d
c
math.h
stdlib.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;
}//end of main
.‫دو عدد از نوع اعشاری را گرفته مجموع و حاصلضرب آنها را محاسبه و نمایش میدهد‬
#include <iostream.h>
int main( )
{
float
x,y,s,p ;
cout <<“Enter 2 float number\n”;
cin >> x >> y ;
s = x+y ;
p =x*y;
cout << s << endl << p;
return 0 ;
}
‫فصل دوم‬
‫ساختارهاي تصميم گيري و تكرار‬
‫فهرست مطالب فصل دوم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫عملگر هاي رابره اي‬
‫عملگر شرطي‬
‫دستورالعمل شرطي‬
‫عملگر هاي منرقي‬
‫دستورالعمل ‪For‬‬
‫عملگرهای رابطه ای‬
‫از اين عملگرها براي تعيين اينكه آيا دو عدد با‬
‫هم معادلند يا يكي از ديگري بزرگتر يا كوچكتر‬
‫ميباشد استفاده ميگردد‪ .‬عملگرهاي رابرهاي‬
‫عبارتند از‪:‬‬
‫مساوي‬
‫==‬
‫مخالف‬
‫=!‬
‫بزرگتر‬
‫>‬
‫بزرگتر يا مساوي‬
‫=>‬
‫كوچكتر‬
‫<‬
‫كوچكتر يا مساوي‬
‫=<‬
‫عملگرهای رابطه ای‬
‫عملگر شرطی‬
‫شكل كلي عملگر شرطي بصورت زير ميباشد‪:‬‬
‫عملگر شرطي تنها عملگري در ‪ C++‬ميباشد كه داراي سه عملوند ميباشد‪.‬‬
‫مثال ‪: 1‬‬
‫;‪int x=10, y=20, b‬‬
‫; ‪b=(x>y) ? x +1: y‬‬
‫اين دو دستور العمل باعث ميشوند كه ماكزيمم مقادير ‪ y‬و ‪ x‬در ‪ b‬قرار بگيرد‪.‬‬
‫مثال ‪: 2‬‬
‫; "‪x>=10 ? cout << "passed" : cout << "failed‬‬
‫رشته‬
‫اگر مقدار ‪ x‬بزرگتر يا مساوي ده باشد رشتة ‪ passed‬در غير اينصورت‬
‫‪ failed‬نمايش داده ميشود‪.‬‬
‫مثال ‪: 2‬‬
‫‪IF‬‬
‫دستورالعمل شرطی‬
‫توسط اين دستور شرطي را تست نموده و بسته به‬
‫آنكه شرط درست يا غلدط باشدد عكدس العمدل‬
‫خاصي را نشان دهيم‪.‬‬
‫)عبارت شرطي (‬
‫‪if‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫مثال ‪: 1‬‬
‫مثال ‪:3‬‬
‫دستورالعمل شرطی‬
‫‪IF-ELSE‬‬
‫توسط اين دستور شرطي را تست نموده و بسته به‬
‫آنكه شرط درست يا غلدط باشدد عكدس العمدل‬
‫خاصي را نشان دهيم‪.‬‬
‫)عبارت شرطي (‬
‫‪if‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫‪else‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
:1 ‫مثال‬
If (x != y)
{
cout << x ;
++ x ;
}
else
{
cout << y ;
--y;
}
:2 ‫مثال‬
‫مثال ‪:3‬‬
‫مثال‪:4‬‬
‫برنامه زير عددي را از ورودي دريافت نموده و مثبت‪ ،‬منفي و يا صفر بودن آن را مشخص مينمايد‪.‬‬
:5 ‫مثال‬
.‫برنامه زير يك عدد اعشاري را از ورودي گرفته جذر آنرا محاسبه مينمايد‬
#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;
}
‫عملگرهای منطقی‬
‫با استفاده از عملگرهاي منرقي ميتوان شرطهاي تركيبي در برنامه ايجاد نمود‪.‬‬
‫عملگرهاي منرقي عبارتست از ‪:‬‬
‫‪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 ;
}
‫اولویت عملگرهای رابطه ای‪،‬منطقی و شرطی‬
‫ارزيابي مقدار يك عبارت منرقي براساس جدول اولويت عملگرها انجام ميگردد‪ .‬در ذيل جدول اولويت‬
‫عملگرها براساس بترتيب از بيشترين اولويت به كمترين اولويت داده شده است‪.‬‬
‫) (‬
‫‪NOT‬‬
‫!‬
‫<‬
‫‪OR AND‬‬
‫=<‬
‫==‬
‫>‬
‫=!‬
‫&&‬
‫=>‬
‫||‬
‫‪:‬‬
‫اولویت عملگرهای رابطه ای‪،‬منطقی و شرطی(مثال)‬
‫دستورالعمل ‪For‬‬
‫از دستور العمل ‪ for‬براي تكرار دستورالعملها معموال زماني كه تعداد تكرار از قبل‬
‫مشخص باشد استفاده ميشود‪ .‬شكل كلي دستور ‪ for‬بصورت زير ميباشد‪:‬‬
‫( افزايش و يا كاهش مقدار شمارنده ; شرط حلقه ; تعريف متغير شمارنده و تعيين مقدار اوليه ) ‪for‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
for ‫عملكرد ساختار تكرار‬
(≠
)‫بعد‬0)‫اجرا ( از اجراي دوم به‬
)‫ فقط در شروع حلقه‬false
(true
‫=(? اجرا‬
for (<exp1>;<exp2>;<exp3>) {
<statement 1>
<statement 2>
…
<statement n>
}
<next statement>
‫برنامه زير ارقام ‪ 1‬تا ‪ 5‬را نمايش ميدهد‪.‬‬
‫مثال (ادامه)‬
.‫ را نمايش ميدهد‬9 ‫ تا‬0 ‫برنامه زير ارقام‬
#include <iostream.h>
int main( )
{
int j=0 ;
for( ; j <= 9 ; ) cout << j++ << endl;
return 0 ;
}
‫برنامه زير مجموع اعداد زوج ‪ 1‬تا ‪ 100‬را نمايش ميدهد‪.‬‬
‫برنامه زير عددي را از ورودي دريافت كرده و ‪ 2‬به توان آن عدد را محاسبه نموده و نمايش ميدهد‪.‬‬
‫برنامه زير يك جدول ضرب ‪ 5*5‬را نمايش ميدهد‪.‬‬
‫برنامه زير مجموع اعداد صحيح و متوالي بين ‪ 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‬‬
‫}‬
.‫ را از ورودي گرفته فاكتوريل آنرا محاسبه ونمايش ميدهد‬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 ;
}
.‫ ايجاد ميشوند را نمايش ميدهد‬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‬را حل نماید‪.‬‬
‫‪ .2‬برنامه ای بنویسید که یک عدد ‪ 5‬رقمی را از ورودی خوانده‪،‬‬
‫مجموع ارقام آن عدد را چاپ نماید‪.‬‬
‫فصل سوم‬
‫ساير ساختارهاي تكرار‬
‫فهرست مطالب فصل سوم‬
‫‪.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 ‫عملكرد ساختار تكرار‬
false(?(≠=00))
true
while (<expression>)
{
<statement 1>
<statement 2>
…
<statement n>
}
<next statement>
‫تفاوت دستورهای ‪while‬و ‪for‬‬
‫دسددتورالعمل ‪ for‬زمدداني اسددتفاده‬
‫ميشود كه تعداد دفعات تكرار از قبدل‬
‫مشخص و معدين باشدد‪ .‬در صدورتيكه‬
‫تعداد دفعات تكدرار مشدخص نباشدد‬
‫بايسددددتي از دسددددتورالعمل ‪while‬‬
‫استفاده نمود‪.‬‬
‫مثال ‪:‬‬
‫‪int x=0‬‬
‫)‪while(x<5‬‬
‫;‪cout << x ++<< endl‬‬
‫با اجراي قرعه برنامه فوق مقادير زير نمايش داده ميشود ‪:‬‬
‫‪0‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫مثال ‪ :‬برنامة زیر اولین توان ‪ 2‬بزرگتر از ‪ 1000‬را در خروجی نمایش می دهد‪.‬‬
‫نكته ‪ :‬چون در حلقه ‪ While‬تنها يك‬
‫دستور داشتيم‪ ،‬از {} استفاده نكرديم‪.‬‬
.‫ قرار میدهد‬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 ;
}
‫مثال ‪ :‬برنامة زیر مجموع اعداد ‪ 1‬تا ‪ 100‬را محاسبه می نماید‪.‬‬
‫مثال ‪ :‬برنامة زیر تعداد نامشخصی از اعداد مثبت را از ورودی دریافت نموده میانگین آنها را‬
‫محاسبه می نماید‪( .‬عدد ‪ -1‬برای مشخص نمودن انتهای لیست اعداد استفاده میشود)‬
‫خروجی مثال قبل‬
‫دستورالعمل ‪do while‬‬
‫این دستور العمل نیز برای تکرار یک دستورالعمل سطاده‬
‫یا ترکیبی استفاده میشود‪ .‬شکل کلی این دستورالعمل‬
‫بصورت زیر میباشد‪.‬‬
‫‪do‬‬
‫}‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫;)شرط (‪} while‬‬
do .. While
‫نحوه عملكرد حلقه‬
do {
<statement 1> ;
<statement 2> ;
…
<statement n> ;
} while (<expression>)
<next statement> ;
false
true
(≠
(= 0)
0)
?
‫تفاوت دستورهای ‪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‬شده و‬
‫كنترل به خارج از اين دستورالعملها منتقل مينمايد‪.‬‬
break ‫نحوه عملكرد دستور‬
while (<expression>)
{
<statements … >
true (? ≠ 0 )
…
if (<exp1>) break ;
…
}
<next statement>
: 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 ;
}
: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‬استفاده نمدود‪ .‬ايدن دسدتورالعمل‬
‫باعث مي شود كه كنترل بابتداي دستورالعملهاي تكدرار منتقدل‬
‫گردد‪ .‬يعني دستورات بعدي ساختار ناديد گرفته شده و بار ديگر‬
‫شرط حلقه كنترل ميگردد‪.‬‬
continue ‫نحوه عملكرد دستور‬
while (<expression>)
{
<statements … >
true (? ≠ 0 )
…
if (<exp1>) continue ;
…
}
<next statement>
‫مثال ‪ :‬برنامة زیر مجموع اعداد ‪ 1‬تا ‪ 20‬به استثناء ‪10‬را محاسبه و نمایش می دهد‪.‬‬
#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 ;
}//end of main
:1 ‫مثال‬
#include <iostream.h>
int main( )
{
int n , counter = 0 ;
float x, average, sum = 0 ;
cin >> n ; / * ‫ عبارت از تعداد اعداد ورودي‬n * /
for ( int count = 1 ; count <=n ; ++ count )
{
cin >> x ;
if (x < 0 )
continue ;
sum += x ;
++ counter ;
}
average = sum / counter;
cout << average << endl ;
return 0 ;
}
:2 ‫مثال‬
‫دستورالعمل ‪switch‬‬
‫همانرور كه مي دانيد از دستورالعمل شرطي( ‪ )if else‬مي توان بصورت تودرتو‬
‫استفاده نمود ولي از طرفي اگر عمق استفادة تو در تو از اين دستورالعمل زيداد‬
‫گردد‪ ،‬در آنها مشكل ميشود ‪ .‬براي حدل ايدن مشدكل ‪ ، C++‬دسدتورالعمل‬
‫‪ switch‬كه عمالً يك دستورالعمل چند انتخابي ميباشد را ارائه نموده است‪.‬‬
‫شكل کلی دستور العمل ‪Switch‬‬
‫) عبارت كه بايد مورد بررسي قرار گيرد( ‪Switch‬‬
‫{‬
‫‪ :‬مقدار ثابت ‪Case 1‬‬
‫;مجموعه دستورات ‪1‬‬
‫;‪break‬‬
‫‪ :‬مقدار ثابت ‪Case 2‬‬
‫;مجموعه دستورات‪2‬‬
‫;‪break‬‬
‫‪‬‬
‫;مجموعه دستورات‪n‬‬
‫;‪break‬‬
‫‪ :‬مقدار ثابت ‪n‬‬
‫‪Case‬‬
‫‪Default :‬‬
‫; مجموعه دستورات پیش فرض‬
‫}‬
#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 ‫مثال‬
switch / case ‫عملكرد ساختار‬
<expression> == <exp1> ?
false
switch (<expression>) {
case <exp1> : <statement 1> ;
<statement 2> ;
…
<statement n> ;
<expression> == <exp2> ?
case <exp2> : <statement 1> ;
<statement 2> ;
…
<statement n> ;
…
true
if there is no match
default : <statement 1> ;
<statement 2> ;
…
<statement n> ;
}
#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;
}//end of switch
}
: 2 ‫مثال‬
‫تابع )(‪: cin.get‬‬
‫اين تابع يك كاراكتر را از صفحه‬
‫كليد ميگيرد‪ .‬براي استفاده از اين‬
‫تابع در ابتداي برنامه بايستي داشته‬
‫باشيم‪:‬‬
‫‪#include‬‬
‫>‪<iostream.h‬‬
‫قرعه برنامه ذيل يك كاراكتر را از صفحه كليد گرفته و نمايش ميدهد‪.‬‬
‫‪char‬‬
‫;‪x‬‬
‫;) (‪x = cin.get‬‬
‫; ‪cout << x‬‬
‫برنامة ذيل يك سرر متن انگليسي كه به ‪ CTRL Z‬ختم ميشود را گرفته دقيقاً نمايش ميدهد‪.‬‬
‫‪#include‬‬
‫>‪<iostream.h‬‬
‫) (‪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 ;
}
‫تمرینات ‪:‬‬
‫‪-1‬برنامه ای بنویسید که یک ماشین حساب ساده را شبیه سازی‬
‫کند(دو عدد حیح و یک کاراکتر را خوانده و بر اساس آن کاراکتر‬
‫محاسبه را انجام دهد‪).‬‬
‫‪-2‬برنامه ای بنویسید که اعمال تقسیم و باقیمانده را بدون استفاده از‬
‫عملگرهای ‪ /‬و ‪ %‬پیاده سازی نماید‪.‬‬
‫‪-3‬برنامه ای بنویسید که عددی را از کاربر دریافت نموده و با استفاده‬
‫از یک حلقه ‪ while /for‬مجموع مربعات متوالی تا آن عدد را پیدا‬
‫کند‪.‬‬
‫‪-4‬برنامه ای بنویسید که عمل ضرب را بدون استفاده از عملگر * برای‬
‫اعداد حیح مثبت پیاده سازی نماید‪.‬‬
‫فصل چهارم‬
‫اعداد تصادفي‬
‫فهرست مطالب فصل چهارم‬
‫‪.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‬يك نوع داده شمارشي ميباشد‪.‬‬
: ‫چند مثال‬
enum 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‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫تعريف تابع‬
‫تابع بازگشتي‬
‫توابع درون خري‬
‫انتقال پارامترها از طريق ارجاع‬
‫كالس هاي حافظه ( ‪) storage classes‬‬
‫سربارگذاري توابع‬
‫تعریف توابع‬
‫استفاده از توابع در برنامهها به برنامهنويس اين امكان را ميدهدد كده‬
‫بتواند برنامههاي خدود را بده صدورت قرعده قرعده برنامده بنويسدد‪.‬‬
‫مديريت‪،‬خرايابي وتغييرات توابع كوچك ساده تر ميباشد‪ .‬تدا كندون‬
‫كليه برنامههدائي كده نوشدتهايدم فقدط از تدابع ) (‪ main‬اسدتفاده‬
‫نمودهايم ‪.‬‬
‫شكل کلی توابع بصورت زیر میباشند ‪:‬‬
‫نوع مقدار برگشتي‬
‫ليست پارامتر ها جهت انتقال اطالعات از تابع احضار كننده به تابع فراخوانده شده‬
‫) ‪( parameter-list‬‬
‫نام تابع‬
‫‪return-value-type function-name‬‬
‫{‬
‫‪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;
}
a
b
10
15
x
y
10
15
z
15
maximum ‫آرگومانهاي تابع‬a, b
‫اسامي پارامترها و آرگومانهاي يك تابع‬
‫ميتوانند همنام باشند‪.‬‬
.‫برنامه زير يك مقدار مثبت را گرفته فاكتوريل آنرا محاسيه نموده نمايش ميدهد‬
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‬تابع يعني پيش‬
‫نمونة تابع(پيش تعريف) كه شامل نوع مقدار‬
‫برگشتي تابع ‪ ،‬نام تابع ‪ ،‬تعداد پارامترهائي‬
‫ورودي به تابع و انواع پارامترها و ترتيب‬
‫قرارگرفتن اين پارامترها را به اطالع كامپايلر‬
‫برساند‪.‬‬
‫پيش تعريف )‪ (Prototype‬در ‪: C++‬‬
‫( نوع ‪ ،‬ترتيب و تعداد آرگومانهاي تابع ) نام تابع‬
‫در اساليد بعد مثالي در اين زمينه آورده شده است‪.‬‬
‫نوع داده خروجي تابع‬
#include <iostream.h>
#include <conio.h>
long int factorial (int); // function prototype
int main( )
{
int n;
cout << "Enter a positive integer:\t" << endl;
cin >> n;
cout << “factorial of your number is:\t”<<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;
}
‫مثال‪ Prototype :‬تابع مجذور‬
‫‪ Prototype‬تابع ماکزیمم‬
‫مثال‪ :‬برنامه ماكزيمم با معرفي‪ Prototype‬تابع مورد استفاده‬
‫تابع بازگشتی (‪)recursive functions‬‬
‫توابع بازگشتي يا ‪ recursive‬توابعي هستند كه‬
‫وقتي احضار شوند باعث ميشوند كه خود را‬
‫به صورت مستقيم و يا غير مستقيم فراخواني نمايند‪.‬‬
‫محاسبه يك دنباله ساده رياضي به كمك مفهوم توابع بازگشتي‬
‫… ‪d(n)= 2, 5, 11, 23, 47,‬‬
‫برور كلي توابع بازگشتي‬
‫يك حالت بازگشتي و‬
‫يك يا چند حالت پايه‬
‫دارند‪.‬‬
‫حالت پايه (ثابت)‬
‫اگر ‪n=1‬‬
‫در غير اينصورت‬
‫‪2‬‬
‫‪2 * d(n-1) + 1‬‬
‫حالت بازگشتي‬
‫در اساليد بعد تابع بازگشتي مورد نظر پياده سازي شده است‪.‬‬
‫= )‪d(n‬‬
‫تابع بازگشتي فوق به زبان ‪ C++‬بصورت زير ميباشد ‪:‬‬
‫مثال ‪ :‬برنامه زير با استفاده از تابع فوق ‪ 20‬جمله اول دنباله فوق را نمايش ميدهد‬
‫نحوه محاسبه فاکتوریل از طریق تابع بازگشتی‬
‫! ‪f (n) = n‬‬
‫‪n! = 1 * 2 * 3 * … * (n-2) * (n-1) * 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 << your number, N is:\t  ;
cin >> n ;
cout << endl <<  factorial of N= \t << 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( )
{
int n ;
cout <<  Enter an integer value  << endl ;
cin >> n ;
cout <<  Term  << n <<  'th fibonacci tail is :/t  <<fib(n)<< endl;
return 0 ;
}
long int fib (long int n)
{
if (n = = 1 || n= = 2)
return 1 ;
else
return ( fib(n-1) + fib(n-2) ) ;
}
‫فراخوانی های متوالی توابع بازگشتی‬
long int factorial (4) {
if (4 ==0) return(1) ;
else return(4 * factorial(3));
}
6
long int factorial (3) {
if (3 ==0) return(1) ;
else return(3 * factorial(2));
}
2
long int factorial (2) {
if (2 ==0) return(1) ;
else return(2 * factorial(1));
}
factorial(4) = 24
?
1
long int factorial (0) {
if (0 ==0) return(1) ;
else return(0 * factorial(-1));
}
1
long int factorial (1) {
if (1 ==0) return(1) ;
else return(1 * factorial(0));
}
‫فراخوانی های متوالی توابع بازگشتی‬
n=4
factorial(4)
factorial(3)
n=3
factorial(1)
factorial(0)
return (6)
n=2
factorial(2)
return (24)
return (2)
return (1)
n=1
n=0
return (1)
‫مساله كالسيك توابع بازگشتي ‪“ :‬برجهاي هانوي”‬
‫‪1‬‬
‫‪3‬‬
‫‪0‬‬
‫‪2‬‬
‫مساله كالسيك “برجهاي هانوي ” با ‪ 4‬پارامتر ‪ :‬تعداد ديسكها‪ ،‬ستون مبدا‪ ،‬ستون كمكي و ستون مقصد‬
‫به زبان ‪C++‬‬
‫روال فراخواني تابع هانوي براي ‪ 4‬ديسك‬
.‫برنامه زیر یك خط متن انگلیسی را گرفته آنرا وارون نموده نمایش میدهد‬
#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 ;
}
‫در صورتي كه تابع مقداري بر نگرداند نوع‬
‫مقدار برگشتي تابع را ‪ void‬اعالن ميكنيم‪ .‬و‬
‫در صورتيكه تابع مقداري را دريافت نكند بجاي‬
‫‪ parameter- list‬از ‪ void‬يا ( ) استفاده‬
‫ميگردد‪.‬‬
‫در اساليد بعد مثالي در اين زمينه آورده شده است‪.‬‬
‫تابع )(‪ ، main‬بدون خروجي (از نوع ‪)void‬‬
‫مثال‪ :‬بازنويسي مساله برجهاي هانوي با استفاده از شيوه ‪void‬‬
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;
}
.‫تابع مقداري بر نمي گرداند‬
.‫ را محاسبه نمايد‬k ‫ به‬n ‫ تابعي بنويسيد كه تركيب‬: ‫مثال‬
k  0 or n  k
1
n 
    n  1  n  1
  
 otherwise
 k  
 k  1  k 
int combination (int n, int k)
{
if (k==0 || n==k) return(1);
else return ( combination(n-1,k-1) + combination(n-1,k) ) ;
}
‫مثال‪ :‬تابعي بنويسيد كه دو عدد را دريافت و بزرگترين مقسوم عليه مشتر‬
‫‪y0‬‬
‫آن دو را بازگرداند‪.‬‬
‫‪y0‬‬
‫‪x‬‬
‫‪gcd ( x, y)  ‬‬
‫)‪gcd ( y , x % y‬‬
‫)‪int gcd (int x , int y‬‬
‫{‬
‫;)‪if (y == 0) return (x‬‬
‫;) )‪else return ( gcd ( y, x%y‬‬
‫}‬
‫توابع درون خطی (‪)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‬‬
‫‪ a‬در ‪main‬‬
‫‪20‬‬
‫‪ a‬در فراخواني‬
‫‪modify‬‬
‫‪20‬‬
‫‪ a‬در‪modify‬‬
‫‪40‬‬
‫خروجي برنامه ‪:‬‬
‫‪20‬‬
‫‪40‬‬
‫‪20‬‬
‫>‪#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 0‬‬
‫}‬
‫در اين نوع احضار تابع‪ ،‬حافظههاي مورد استفاده آرگومانها‬
‫و پارامترها از هم متمايزند و هرگونه تغيير در پارامترها‬
‫باعدددث تغيديددر در آرگومانهاي متناظر نميگردد‪.‬‬
‫انتقال پارامترها از طریق ارجاع‬
‫تاكنون وقتي تابعي را احضار ميكرديم يك كپي از مقادير آرگومانها درپارامترهاي متناظر‬
‫قرار ميگرفت ‪ .‬اين روش احضار بوسيله مقدار يا ‪ call by value‬ناميده شد‪.‬‬
‫در انتقال پارامترها از طريق ارجاع در حقيقت حافظه مربوط به آرگومانها و پارامترهاي متناظر‬
‫بصورت اشتراكي مورد استفاده قرار ميگيرد‪ .‬اين روش ‪call by reference‬‬
‫ناميده ميشود ‪.‬‬
‫انتقال پارامترها از طریق ارجاع‬
‫در اين روش پارامترهائي كه از طريق ‪ call by reference‬عمل مينمايند در‬
‫پيش نمونه تابع بعد از نوع چنين پارامترهائي از & استفاده ميشود و در تعريف‬
‫خود تابع نيز پس از نوع پارامتر و قبل از نام آن از عالمت & استفاده خواهد شد‪.‬‬
#include <iostream.h>
int vfunct (int);
// for call by value example
void rfunct (int &) ;
//for call by reference example
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
: ‫خروجي‬
5
25
5
.‫ تغيير نمي كند‬x ‫ مقدار متغير‬vfunct ‫ پس از فراخواني تابع‬:‫تذكر‬
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;
}
‫مثال‪ :‬برنامه زیر با استفاده از تابع ‪ duplicate‬و به شیوه ارسال با ارجاع‪ ،‬مقدار دو آرگومان‬
‫ورودی را ‪ 2‬برابر مینماید‪.‬‬
‫کالسهای حافظه (‪)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 << endl;
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‬آرايه دو بعدي ( ماتريس ها )‬
‫آرایه یك بعدی‬
‫آرايه يك فضاي پيوسته و متوالي از خانه هاي حافظه اصلي ميباشد‬
‫كه داراي يك نام و يك نوع ميباشند‪.‬‬
‫كليه عناصر يك آرايه از يك نوع ميباشند‪.‬‬
‫عناصر آرايه بوسيله انديس آنها مشخص ميشوند‪.‬‬
‫در ‪ ، 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‬‬
‫‪num‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪1‬‬
‫‪9‬‬
‫‪8‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪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‬‬
‫چند مثال از کار کردن با خانه های آرایه‬
‫•‬
‫با فرض مقدار ‪ 2‬برای متغیر ‪ a‬و مقدار ‪ 3‬برای متغیر ‪b‬‬
‫مثال ‪ :‬در برنامه زير طول آرايه توسط عدد ثابتي تعيين ميگردد و عناصر آرايه توسط حلقه ‪ for‬مقدار دهي‬
‫شده و سپس نمايش داده مي شود‪.‬‬
‫مثال ‪ :‬در برنامه زير ‪ 10‬عدد صحيح را از ورودي دريافت نموده ‪ ،‬در آرايه قرار ميدهد و سپس مجموع عناصر‬
‫آرايه را محاسبه نموده و نمايش ميدهد‪.‬‬
‫ عدد اعشاری را گرفته تشكیل یك آرایه داده سپس کوچكترین عنصر آرایه را‬20 ‫ برنامه زیر‬: ‫مثال‬
.‫مشخص و نمایش میدهد‬
#include <iostream.h>
#include <conio.h>
int main( )
{
clrscr( ) ;
float x[20], min;
int j ;
for ( j=0 ; j<20 ; ++j )
cin >> x[ j ] ;
min = x [ 0 ] ;
for ( j=1 ; j<20 ; ++j )
if ( x [ j ] < min )
min = x[ j ];
cout << min << endl;
return 0;
}
‫مثال‪ :‬برنامه اي بنويسيد كه توسط آرايه‪ ،‬نمودار ميله اي افقي براي اعداد { ‪،11 ،9 ،13 ،5 ،17 ،1‬‬
‫‪3 ،15 ،7‬و ‪ }19‬رسم نمايد‪.‬‬
‫مثال‪ :‬برنامه اي بنويسيد كه يك تاس را ‪ 6000‬بار پرتاب كرده و توسط آرايه اي ‪ ،‬تعداد آمدن هر‬
‫وجه را حساب كند (براي هر شماره‪ ،‬يك خانه از آرايه را در نظر بگيريد)‪.‬‬
.‫) بصورت صعودی مرتب مینماید‬Bubble sort( ‫ عدد اعشاری را گرفته به روش حبابی‬100 ‫برنامه زیر‬
#include <iostream.h>
#include <conio.h>
int main ( )
{
clrscr( );
float x[100] , temp;
int i,j ;
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++ )
total + = x [ i ][ j ];
cout << "total = " << total << endl;
return 0 ;
}
‫مثال‪ :‬در برنامه زیر مقادیر یك جدول ضرب ‪ 10*10‬در یك آرایه دوبعدی ذخیره شده سپس نمایش داده میشوند‪.‬‬
‫استفاده از آرايهها بعنوان پارامتر تابع مجاز است‪.‬‬
‫جهت اين امر‪،‬نام آرايه را بدون عالمت براكت( ] [ )‬
‫استفاده مينماييم‪:‬‬
‫شيوه رفتار توابع با آرايه ها بعنوان آرگومان در ‪C++‬‬
‫• ارسال کل آرایه بعنوان آرگومان تابع‬
‫ارسال از طریق ارجاع)‪(Call by reference‬‬
‫• ارسال عنصری از آرایه بعنوان آرگومان تابع‬
‫ارسال بوسیله مقدار )‪(Call by value‬‬
‫تذکر‪ :‬در این روش تغییر بر روی آرگومان ارسالی تاثیری بر روی عناصر آرایه ندارد‪.‬‬
‫نحوه تعريف يک تابع و پيش تعريف آن جهت دريافت يک آرايه بعنوان آرگومان‬
‫مثال‪ :‬در برنامه زیر که برای نشان دادن تفاوت ارسال یك عنصر آرایه به تابع و ارسال کل آرایه به تابع ارائه شده‪ ،‬در هر دو تابع‬
‫استفاده شده محتوای دریافتی در ‪ 2‬ضرب میگردد‪.‬‬
‫ادامه کد مثال قبل ‪:‬‬
.‫ را بعنوان پارامتر ميگيرد‬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 ;
}
: ‫خروجي‬
3
4
5
6
7
3
4
5
6
7
‫در صورتيكه آرايه بيش از يك بعد داشته باشد‬
‫بعدهاي دوم به بعد بايستي در تعريف تابع و پيش‬
‫نمونه تابع ذكر گردد‪.‬‬
‫در اساليد بعد به يك مثال توجه نماييد‪.‬‬
‫مثال (جستجو در آرایه)‪ :‬نمونه ای از یك برنامه جستجوی خطی در یك آرایه همراه با خروجی آن نمایش داده شده است‬
‫مثال (جستجو در آرایه)‪ :‬نمونه ای از یك برنامه جستجوی دودویی در یك آرایه مرتب شده ‪ ،‬همراه با خروجی آن‬
‫نمایش داده شده است‬
‫ادامه مثال برنامه جستجوی دودویی در یك آرایه مرتب شده ‪ ،‬همراه با خروجی‬
‫فصل هفتم‬
‫ساختار ها و اشاره گرها‬
‫فهرست مطالب فصل هفتم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫ساختارها‬
‫‪ Union‬ها‬
‫اشاره گرها ( ‪) Pointer‬‬
‫تعريف آرايه‬
‫آرايه هاي دو بعدي و اشاره گرها‬
‫تخصيص حافظه بصورت پويا ( عملگر ‪) new‬‬
‫رشته ها و توابع مربوطه‬
‫اشارهگرها (‪)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‬‬
‫متغيرهاي اشاره گر‪ ،‬آدرس خانه هاي حافظه را در خود نگهداري مي‬
‫كنند در حقيقت آدرس متغيرها را نگهداري ميكنند‪.‬‬
‫متغير برور مستقيم به يك مقدار اشاره مي كنند اما يك اشاره گر‬
‫برور غير مستقيم به يك مقدار اشاره ميكند‪.‬‬
‫با داشتن آدرس داده در حافظة اصلي ميتوان براحتي به آن داده‬
‫دسترسي پيدا نمود‬
‫‪X‬‬
‫‪7‬‬
‫‪Xptr‬‬
‫‪X‬‬
‫‪7‬‬
‫نحوه تعريف كردن اشاره گرها‬
‫نكته‪ :‬استفاده از ‪ ptr‬در نامگذاری اشاره گرها الزامی نمیباشد و صرفا جهت قابل درک و خوانا بودن برنامه هاست‬
‫عملگرهاي اشاره گر‬
‫عملگر آدرس ( & )‪ :‬آدرس خانه حافظه عملوند خود را بر میگرداند‬
‫مثال ‪:‬‬
‫; ‪int y , x , *px‬‬
‫‪x‬‬
‫‪px‬‬
‫‪26‬‬
‫حال اگر دستور العمل ; ‪ x += 10‬را بدهيم ‪:‬‬
‫‪x‬‬
‫‪px‬‬
‫‪36‬‬
‫حال اگر دستورالعمل ; ‪ *px = *px + 7‬بدهيم‪.‬‬
‫‪x‬‬
‫‪43‬‬
‫‪px‬‬
‫; ‪x = 26‬‬
‫; ‪px = &x‬‬
‫مثالي از نحوه استفاده از اشاره گرها‬
‫ارسال آرگومان به تابع توسط اشاره گر‬
‫•‬
‫از اشاره گرها میتوان برای تغییر متغیرهای ارسال شده‪ ،‬درون توابع مشابه روش ارسال با ارجاع استفاده نمود‬
.‫ جابهجا مينمايد‬swap ‫برنامه زير دو مقدار اعشاري را گرفته مقادير آنها را بكمك تابع‬
#include
<iostream.h>
#include
<conio.h>
void swap ( float * , float * );
int main( )
{
float a,b;
cin >> a >> b;
cout << “a is: “<< a<<“\n” <<“b is: ”<< b << endl;
swap( &a , &b);
cout << “a is: “<< a<<“\n” <<“b is: ”<< b << endl ;
return 0;
}
void swap ( float *px , float *py )
{
float t;
t = *px;
*px = *py;
*py = t ;
return;
}
‫آرایه ها و اشاره گرها‬
‫•‬
‫نکته ‪ :‬نام آرایه (بدون اندیس) معادل یک اشاره گر ثابت به عنصر اول آرایه میباشد لذا از طریق اشاره گر‬
‫میتوان به تک تک عنا ر آرایه دسترسی پیدا کرد‪:‬‬
‫;]‪Int b[5‬‬
‫;‪Int *bptr‬‬
‫;‪bptr = b‬‬
‫;]‪bptr = &b[0‬‬
‫برای دستیابی به عنصر ]‪ b[3‬توس اشاره گر ‪ bptr‬داریم‪:‬‬
‫•‬
‫) ‪*( bptr + 3‬‬
‫نکته ‪ :‬اشاره گرها را نیز میتوان مانند آرایه ها اندیس دار نمود‬
‫مثال‪ :‬مشابهت آرایه ها و اشاره گرها‬
‫خروجی برنامه ‪:‬‬
‫آرایههای دوبعدی و اشارهگرها‬
‫يك آرايه دوبعدي بصورت تعدادي آرايه يك بعدي ميتوان تعريف نمود‪.‬‬
‫اگر ‪ x‬يك ماتريس ‪ 5‬سرري و ‪ 4‬ستوني از نوع اعشاري باشد قبالً اين ماتريس را با‬
‫;]‪float x[5][4‬‬
‫معرفي كرديم‪ .‬حال با استفاده از اشارهگرها بصورت زير معرفي نمائيم‪:‬‬
‫;]‪float (*x)[4‬‬
‫آرایههای دوبعدی و اشارهگرها‬
‫;]‪float (*x)[4‬‬
‫آرايه يك بعدي اول‬
‫‪‬‬
‫‪x‬‬
‫آرايه يك بعدي دوم‬
‫‪‬‬
‫)‪(x+1‬‬
‫آرايه يك بعدي سوم‬
‫‪‬‬
‫)‪(x+2‬‬
‫آرايه يك بعدي چهارم‬
‫‪‬‬
‫)‪(x+3‬‬
‫آرايه يك بعدي پنجم‬
‫‪‬‬
‫)‪(x+4‬‬
‫رشتهها و توابع مربوطه‬
‫رشتهها در ‪ ، 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‬باشد مقدار صفر در غير‬
‫اينصورت يك مقدار مثبت برميگرداند‪.‬‬
strncmp() ‫ و‬strcmp() ‫ استفاده از توابع رشته ای‬:‫مثال‬
#include
<iostream.h>
#include
<string.h>
#include
<conio.h>
int main( )
{
char *s1= happy birthday ;
char *s2= happy holidays  ;
clrscr( );
cout << “ strcmp(s1, s2) is: ”<< strcmp(s1, s2) << endl;
cout << “ strncmp(s1, s2, 7) is: “<< strncmp(s1, s2, 7) << endl ;
return 0;
}
‫تابع (‪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‬را برميگرداند‪.‬‬
‫مثال‪ :‬استفاده از توابع رشته ای )(‪strcat‬و)(‪strncat‬‬
‫خروجی مثال قبل ‪:‬‬
‫تابع (‪strlen(s‬‬
‫رشتة ‪ s‬را بعنوان آرگومان گرفته طول رشته را مشخص مينمايد‪.‬‬
strlen() ‫ استفاده از تابع رشته ای‬:‫مثال‬
#include
<iostream.h>
#include
<string.h>
#include
<conio.h>
int main( )
{
char *s = sara;
clrscr( );
cout << strlen(s);
return 0;
}
: ‫مثال‬
‫تابع )‪strcpy(s1,s2‬‬
‫دو رشتة ‪ s1‬و ‪ s2‬را بعنوان آرگومان گرفته رشتة ‪ s2‬را در رشتة ‪ s1‬كپي مينمايد و‬
‫نهايتاً مقدار رشتة ‪ s1‬را بر ميگرداند‪.‬‬
‫تابع (‪strncpy(s1, s2,n‬‬
‫دو رشتة ‪ s1 , s2‬و مقدار صحيح و مثبت ‪ n‬را بعنوان آرگومان گرفته‪ ،‬حداكثر ‪ n‬كاراكتر‬
‫را از رشتة ‪ s2‬در رشتة ‪ s1‬كپي نموده‪ ،‬نهايتاً مقدار رشتة ‪ s1‬را برميگرداند‪.‬‬
‫مثال‪ :‬استفاده از توابع رشته ای )(‪strcpy‬و)(‪strncpy‬‬
‫براي استفاده از توابع مربوط به‬
‫رشتهها بايستي حتماً در ابتدا برنامه‬
‫>‪ #include <string.h‬را قرار‬
‫دهيم‪.‬‬
.‫ می باشد‬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] );
}
‫ساختارها‬
‫ساختارها يك نوع داده گروهي متشكل از تعدادي عضو (عنصر) است كه فضاي‬
‫پيوسته از حافظه اصلي را اشغال مينمايد‪ .‬اما عناصر ساختار الزاماً از يك نوع‬
‫نميباشند بلكه اعضاي يك ساختار ميتوانند از نوعهاي مختلفي از قبيل ‪، 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‬‬
‫‪ name‬مشخصات صاحب حساب از نوع رشتة ‪ 80‬كركتري‬
‫‪ balance‬مانده حساب از نوع ‪float‬‬
: ‫به دو صورت می توان اعالن یك متغیر از نوع ساختار را نمایش داد‬
: ‫روش اول‬
struct account {
int acc_no;
char acc_type;
char name[80];
float balance;
} cust1, cust2, cust3;
: ‫روش دوم‬
struct account {
int
Char
Char
float
acc_no ;
acc_type;
name[80];
balance;
};
account cust1, cust2, cust3;
‫به ساختارها ميتوان مقدار اوليه نيز تخصيص داد‬
‫;}‪account cust = {4236, r, Nader Naderi , 7252.5‬‬
‫دسترسي به عناصر يك ساختار‬
‫براي دستيابي به عناصر يك ساختار از عملگر نقره (‪ ) .‬و يا عملگر پيكان (<‪ )-‬استفاده ميكنيم‪ .‬عملگر نقره براي‬
‫دستيابي به عنصر يك ساختار از طريق نام يك متغير و عملگر پيكان براي دستيابي از طريق اشاره گر مورد استفاده‬
‫قرار ميگيرد‪.‬‬
‫بجاي استفاده از ‪ timePtr -> hour‬براي دستيابي به عنصر ‪ hour‬ميتوان از ‪ (*timePtr).hour‬استفاده نمود‪.‬‬
‫نكته‪ :‬استفاده از پرانتز در كنار شيء ساختار فوق الزامي است‪.‬‬
: ‫نكته‬
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‬‬
‫‪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‬ميباشد‪.‬‬
‫نكته ‪:‬‬
‫ميتوان آرايهاي تعريف نمود كه هر عضو آن يك ساختار باشد و حتي به آنها مقادير اوليه تخصيص نمود‪.‬‬
‫{ ‪struct struc1‬‬
‫;]‪char name[40‬‬
‫;‪int pay1‬‬
‫;‪int pay2‬‬
‫;}‬
‫‪struc1 cust[ ] = {nader, 3000 , 40000,‬‬
‫‪sara, 4200, 6000,‬‬
‫‪susan, 3700, 25000,‬‬
‫;} ‪saman, 4800 , 2000,‬‬
‫برنامه زير هر عدد مختلط را بصورت يك ساختار در نظر گرفته‪ ،‬دو عدد مختلط را ميگيرد و‬
‫مجموع آنها را مشخص و نمايش ميدهد‪.‬‬
‫ادامه کد مثال قبل‪:‬‬
‫در مبحث بعدی (کالسها) مشاهده خواهید نمود که امكان کنترل مقدار دهی به اعضاء وجود دارد‬
‫‪union‬‬
‫‪ union‬از نظر ساختاري شبيه ‪ struct‬مي باشد ‪ .‬با اين تفاوت كه عضدوهائي‬
‫كه تشكيل ‪ union‬ميدهد همگي از حافظه مشدتركي در كدامپيوتر اسدتفاده‬
‫مينمايند‪ .‬بنابراين استفاده از ‪ union‬باعث صرفهجوئي در حافظه ميگردد‪.‬‬
‫مثال ‪:‬‬
‫{ ‪union id‬‬
‫;]‪char color [10‬‬
‫;‪int size‬‬
‫;‪} x , y‬‬
‫هر كدام از متغيرهاي ‪ x‬و ‪ y‬يك رشدته‬
‫‪ 10‬كاراكتري يا يك مقددار از ندوع ‪int‬‬
‫ميباشد وكامپيوتر يك بلو حافظه كه‬
‫بتواند رشته ‪ 10‬كركتري رادر خود جداي‬
‫دهددد ‪ ،‬بددراي ‪ color‬و ‪ size‬در نظددر‬
‫ميگيرد‪.‬‬
: ‫مثال‬
union x {
int x ;
char y[2] ;
}p;
x
‫باي ت دوم‬
y[1]
‫باي ت اول‬
y[0]
‫تخصیص حافظه به صورت پویا یا (عملگر ‪)new‬‬
‫از عملگر ‪ new‬براي تخيصيص حافظه به صورت پويا‬
‫مي توان استفاده نمود ‪ ،‬در ضمن ميتوان براي‬
‫بلوكي از حافظه كه تخصيص يافته مقدار اوليه تعيين‬
‫نمود‪.‬‬
‫دو عملگر ‪ new‬و ‪ delete‬در فايل ‪ new.h‬قرار‬
‫دارند ‪ .‬لذا براي بكارگيري اين دو عملگر بايد از‬
‫دستور >‪ #include <new.h‬استفاده نماييم‪.‬‬
‫مثالهایی از بكارگیری دستورات ‪ new‬و‪delete‬‬
‫نكته‪ :‬برای آزادسازی حافطه تخصیص داده شده به یك آرایه از ][ ‪ delete‬استفاده نمایید‬
‫براي تخصيص حافظه باندازه ‪ 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 ;
delete[ ] ptr ; // in order to free the space use
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? ;
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 ;
}
‫فصل هشتم‬
‫برنامه نويس شي گرا‬
‫فهرست مطالب فصل هشتم‬
‫‪.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