Transcript C++

‫دانشگاه آزاد اسالمی واحد گرگان‬
‫گروه مهندسی كامپيوتر و فناوري اطالعات‬
‫برنامه نويسي‪C++‬‬
‫محمد رضا ملک شاهکویی‬
‫‪[email protected]‬‬
‫‪WWW.MrMalek.Ir‬‬
‫منابع‪:‬‬
‫• برنامه نویسی به زبان ‪ ، C ++‬نویسنده‪ :‬جعفرنژاد قمی‬
‫• کتاب آموزش زبان برنامه نویسی ‪ C ++‬دایتل دایتل‬
‫ابزارها و نرم افزارهاي مورد نياز‪:‬‬
‫نرم افزارهاي آفيس و ویژوال استودیو ‪Borland c++,2008‬‬
‫آدرس پست الکترونيکی‪:‬‬
‫‪[email protected]‬‬
‫‪2‬‬
‫‪Course Evaluation Scheme‬‬
‫امتحان پایان ترم‪ 14 :‬نمره‬
‫امتحان ميان ترم‪ 5 :‬نمره‬
‫تمرین هاي کالسی و شرکت در بحث کالس‪ 1 :‬نمره‬
‫‪3‬‬
‫جايگاه اين درس در رشته مهندسي کامپيوتر و مهندسي ‪IT‬‬
‫• این درس اولين درس دانشگاهی رشته می باشد و نقطه شروعی براي ورود به‬
‫دنياي جالب برنامه نویسی و علم و فن كامپيوتر هست‪ .‬بنابراین یاد گيري اصول‬
‫اوليه برنامه نویسی در این درس از جایگاه ویژه اي برخوردار است‪.‬‬
‫• این درس پایه و اساس برنامه نویسی است كه جزء اصول این رشته می باشد و‬
‫این اصول را به فرگيران یاد می دهد ‪ .‬بنابراین یادگيري دقيق این درس به‬
‫همراه ارائه پروژه هاي عملی كه الزمه این درس می باشد جزء اهم مسائل می‬
‫باشد ‪.‬‬
‫اهداف درس‬
‫•‬
‫الگوریتمی براي حل مسئله ارائه دهد‪.‬‬
‫•‬
‫اصول و مبانی اوليه نرم افزار و سخت افزار را بشناسد‪.‬‬
‫•‬
‫اهداف و مفاهيم زبانهاي برنامه نویسی را بداند‪.‬‬
‫•‬
‫مفاهيم اوليه برنامه نویسی ساخت یافته را بداند و اصول الزم را در مرحله اجراء بکار ببرد ‪.‬‬
‫•‬
‫دستورات زبان ‪C++‬را در برنامه ها بکار ببرد‪.‬‬
‫•‬
‫از توابع و روال هاي استاندارد زبان ‪ C++‬در صورت لزوم استفاده نماید‪.‬‬
‫•‬
‫از توابع ‪ ،‬روال ها براي جدا كردن قطعات برنامه استفاده كند‪.‬‬
‫زبان هاي برنامهنويسي‬
‫• نرمافزارها توسط زبان هاي برنامهنویسی نوشته میشوند‪ .‬زبان هاي برنامهنویسی‪،‬‬
‫یک سيستم ارتباطی هستند كه توسط آن ها میتوان دستورات الزم را به ماشين‬
‫انتقال داد‪.‬‬
‫• هر زبان برنامهنویسی به مجموعهأي از عالیم‪ ،‬قواعد و دستورالعملها گفته میشود‬
‫كه امکان ارتباط با كامپيوتر را جهت بيان كاري یا حل مسئلهاي فراهم میكند‪.‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫در حالت كلی زبان هاي برنامهنویسی را به سه دسته زیر تقسيمبندي میكنند‪:‬‬
‫زبان هاي سطح باال‬
‫زبان هاي سطح پایين‬
‫زبان هاي سطح ميانی‬
‫كامپایلر برنامه نوشته در یک زبان سطح باال را به برنامه مقصد تبدیل میكند‪.‬‬
‫جلسه اول‪ :‬الگوريتم ها‬
‫هدفهاي كلي‬
‫شناخت حل مسئله و ارائه الگوريتم‬
‫شناخت اجزاء الزم براي حل مسئله‬
‫بررسي صحت الگوريتم‬
‫هدفهاي رفتاري‬
‫دانشجو پس از مطالعه این فصل باید بتواند‪:‬‬
‫‪ ‬الگوريتمي را براي حل مسئله ارائه دهد‪.‬‬
‫‪‬‬
‫الگوريتم هاي مختلف براي يک مسئله را مقايسه کند‪.‬‬
‫‪‬‬
‫شرط ها و حلقه ها را در الگوريتم بکار ببرد ‪.‬‬
‫مقدمه‬
‫در زندگي روزمره‪ ،‬انسان با مسائل مختلفي روبروست و براي هر کددام از ايد‬
‫مسائل (حل مشکالت) راه حلي و روشي را بر ميگزيند‪ .‬مسائلي از قبيل راه رفت ‪،‬‬
‫غذا خوردن‪ ،‬خوابيدن و غيره که بشر تقريباً هر روز آنها را پيش روي خود دارد‪.‬‬
‫همه اي مسائل نياز به روشي براي حل کردن دارند مثال راه رفت بايد با ترتيد‬
‫خاصي و مراحل معيني انجام شود‪ .‬تا مسدئله راه رفدت‬
‫بدراي بشدر حدل شدود‪.‬‬
‫اصطالحاً روش انجام کار يا حل مسئله را الگوريتم آن مسئله مينامند‪.‬‬
‫تعریف الگوریتم‬
‫هر دستورالعملي که مراحل انجام کاري را با زباني دقيق و با جزئيات کافي‬
‫بيان نمايد بطوريکه ترتي مراحل و شدرط خاتمده لمليدات در آن کدامال“‬
‫مشخص شده باشدد را الگدوريتم گويندد‪ .‬بده لبدارتي ديگدر‪ :‬الگدوريتم‬
‫مجمولهاي از دستورالعمل ها‪ ،‬براي حل مسئله ميباشد که شدراي زيدر را‬
‫بايد دارا باشد‪:‬‬
‫‪ ‬دقيق باشد‬
‫‪ ‬جزئيات کامل حل مسئله را داشته باشد‪.‬‬
‫‪ ‬پايانپذير باشد‪.‬‬
‫مراحل الگوریتم‬
‫براي حل يك مسئله بايد الگوريتم آن مسئله را مشخص نيخ م (يخا ب خاب م)‪ .‬نخه‬
‫اصطالحاً طراحي الگوريتم براي آن مسئله نام ده ميشخو ‪ .‬ر طراحخي الگخوريتم‬
‫معموالً سه مرحله زير را از هم جدا مينييد‪:‬‬
‫‪ ‬خواندن دادهها‬
‫‪ ‬انجام محاسبات‬
‫‪ ‬خروجيها‬
‫مثال ‪ :‬الگوريتمي بنويسيد كه دو عدد از ورودي دريافت كرده مجموع‬
‫دو عدد را محاسبه و چاپ نمايد‪.‬‬
‫خروجیها‬
‫مجموع دو عدد‬
‫انجام محاسبات‬
‫ورودي ها‬
‫جمع دو عدد‬
‫‪a , b‬‬
‫‪0‬ـ شروع‬
‫‪1‬ـ ‪ b ,a‬را بخوان‪.‬‬
‫‪2‬ـ مجموع ‪ b , a‬را محاسبه و در ‪ sum‬قرار بده‪.‬‬
‫‪3‬ـ ‪ sum‬را در خروجی چاپ کن‬
‫‪4‬ـ پایان‬
‫مثال‪ :‬الگوريتمي بنويسيد که سه لدد از ورودي دريافت کرده مجموع و ميانگي‬
‫سه لدد را محاسبه و چاپ کند‪.‬‬
‫خروجيها‬
‫چاپ مجموع‬
‫چاپ ميانگي‬
‫انجام محاسبات‬
‫محاسبه مجموع‬
‫محاسبه ميانگي‬
‫‪0‬د شروع‬
‫‪1‬د سه لدد از ورودي بخوان‬
‫‪2‬د مجموع سه لدد را محاسبه و در ‪ sum‬قرار بده‪.‬‬
‫‪3‬د ‪ sum‬را بر سه تقسيم کرده‪،‬در ‪ ave‬قرار بده‪.‬‬
‫‪4‬د ‪ ave , sum‬را در خروجي چاپ ک ‪.‬‬
‫‪5‬د پايان‪.‬‬
‫ورودي ها‬
‫‪a‬‬
‫‪b‬‬
‫‪c‬‬
‫معموال درك يک الگوريتم با شکل راحت تر از نوشت آن بصورت مت‬
‫ميباشد‪ .‬لذا الگوريتم را با فلوچارت(‪ )flowchart‬نمايش ميدهند‪.‬‬
‫فلوچارت از شکلهاي زير تشکيل ميشود‪.‬‬
‫لالمتهاي شروع و پايان‪ :‬که معموال از يک بيضي استفاده ميکنند‪:‬‬
‫‪End‬‬
‫‪Begin‬‬
‫لالمتهاي ورودي و خروجي‪ :‬که معموال از متوازياالضالع استفاده ميشود‪:‬‬
‫چاپ کردن‬
‫‪write‬‬
‫خواندن يا‬
‫‪Read‬‬
‫عالمتهاي محاسباتی و جایگزینی‪ :‬براي نمایش دستورات جایگزینی و‬
‫محاسباتی از مستطيل استفاده میکنند‪:‬‬
‫جایگزین یا‬
‫محاسبات‬
‫لالمت شرط‪:‬‬
‫براي نمايش شرط از لوزي‬
‫استفاده ميشود‪.‬‬
‫لالمت اتصال‪:‬‬
‫شرط‬
‫براي اتصال شکلهاي مختلف بهم از فلشهاي جهتدار استفاده ميکنند‪.‬‬
‫فلوچارت مجموع سه لدد‬
Begin
Read(a,b,c)
Sum
a+b+c
Ave
sum/3
Write(sum,ave)
End
‫مثال‪ :‬فلوچارتي رسم نمائيد که دو لدد از ورودي دريافت کرده سپس‬
‫محتويات دو لدد را با هم جابجا نمايد‪.‬‬
‫براي حل اي مسئله ‪ b , a‬را دو متغير که در آنها دو لدد خواندده شدده‪ ،‬قدرار‬
‫ميگيرند در نظر ميگيريم‪ .‬سپس با استفاده از يک متغير کمکي محتويدات ايد‬
‫دو لدد را جابجا ميکنيم ‪:‬‬
a
b
a
b
12
15
12
15
temp
12
temp
a
b
a
b
15
15
15
12
12
12
temp
temp
:‫فلوچارت مسئله باال بصورت زير خواهد بود‬
Begin
Read(a,b)
temp
a
a
b
b
temp
Write(a,b)
End
‫تمرين‬
‫‪1‬ـ فلوچارتی رسم نمائيد كه طول و عرض مستطيل را از ورودي دریافت كرده‬
‫محيط و مساحت آنرا محاسبه و چاپ كند‪.‬‬
‫‪2‬ـ فلوچارتی رسم نمائيد كه شعاع دایرهاي را از ورودي دریافت كرده‪ ،‬محيط و‬
‫مساحت آنرا محاسبه و چاپ نماید‪.‬‬
‫‪3‬ـ فلوچارتی رسم كنيد كه سه عدد ‪ Third , second, first‬را از ورودي‬
‫دریافت كرده‪ ،‬محتویات آن ها را جابجا نموده‪ ،‬حاصل را در خروجی چاپ كند‪.‬‬
‫‪4‬ـ فلوچارتی رسم نمائيد كه دو عدد از ورودي دریافت كرده‪ ،‬سپس محتویات دو‬
‫عدد را بدون استفاده از متغير كمکی جابجا كند‪.‬‬
‫‪5‬ـ فلوچارتی رسم نمائيد كه عددي (درجه حرارت برحسب سانتيگراد) را از‬
‫ورودي دریافت كرده سپس آن را به درجه فارنهایت تبدیل كند‪.‬‬
‫دستورالعملهاي شرطي‬
‫در حل بسياري از مسائل يا تقريباً تمام مسائل نيداز بده اسدتفاده از شدروط‬
‫جزء‪ ،‬نيازهاي اساسي محسوب ميشود‪ .‬همانطور که ما خودمان در زندگي‬
‫روزمره با اي شرطها سرکار داريم‪ .‬بطور مثال اگر هوا ابري باشد ممکد‬
‫است چني سخ بگوييم‪:‬‬
‫اگر هوا باراني باشد سپس چتري برميدارم‪ .‬در غير اينصورت چتر برنميدارم‪.‬‬
‫در حالت كلي شرط را بصورت زير نمايش ميدهند‪:‬‬
‫لمل يا المال‬
‫‪yes‬‬
‫شرط يا شروط ‪If‬‬
‫‪then‬‬
‫‪NO‬‬
‫لمل يا المال بعدي‬
‫مثال ‪ :‬فلوچارتی رسم نمائيد كه عددي را از ورودي دریافت‬
‫كرده‪ ،‬فرد یا زوج بودن آن را تشخيص دهد‪.‬‬
‫مثال ‪ :‬فلوچارتی رسم کنيد که دو عدد از ورودي دریافت کرده بزرگترین عدد را پيدا کرده در‬
‫خروجی چاپ نماید‪.‬‬
‫مثال ‪ :‬فلوچارتي رسم نمائيد که سه لدد از ورودي دريافت کرده‪،‬‬
‫کوچکتري لدد را يافته در خروجي چاپ نمايد‪:‬‬
‫نمونه اجراي فلوچارت باال بصورت زير ميباشد‪:‬‬
‫خروج‬
‫‪Min‬‬
‫‪11‬‬
‫‪12‬‬
‫‪11‬‬
‫‪11‬‬
‫‪11‬‬
‫‪c‬‬
‫‪b‬‬
‫‪a‬‬
‫‪17‬‬
‫‪11‬‬
‫‪12‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫تمرين‬
‫‪ -1‬فلوچارتی رسم كنيد كه عددي را از ورودي دریافت كرده‪ ،‬قدر مطلق عدد را در‬
‫خروجی چاپ كند‪.‬‬
‫‪ -2‬فلوچارتی رسم نمائيد كه عددي از ورودي دریافت كرده مثبت‪ ،‬منفی یا صفر‬
‫بودن عدد را تشخيص داده‪ ،‬در خروجی با پيغام مناسب چاپ كند‪.‬‬
‫‪ -3‬فلوچارتی رسم نمائيد كه عددي را از ورودي دریافت كرده‪ ،‬بخش پذیري آن بر ‪3‬‬
‫و ‪ 5‬را بررسی نماید‪.‬‬
‫‪4‬ـ فلوچارتی رسم نمائيد كه ضرایب یک معادله درجه دوم را از ورودي دریافت‬
‫كرده‪ ،‬ریشههاي آن را محاسبه در خروجی چاپ كند‪.‬‬
‫حلقهها‬
‫در حل بسياري از مسائل با عملياتی روبرو میشویم ‪ ،‬که نياز به تکرار دارند‬
‫و عمل تکرار آن ها به تعداد مشخصی انجام میگيرد‪ .‬فرض کنيد‪ ،‬بخواهيم‬
‫ميانگين ‪ 100‬عدد را محاسبه کنيم‪ ،‬در اینصورت منطقی بنظر نمیرسد که‬
‫‪ 100‬متغير مختلف را از ورودي دریافت کنيم سپس آن ها را جمع کنيم‪.‬‬
‫انواع حلقه ها‬
‫حلقه هاي با تکرار مشخص‬
‫حلقه هاي با تکرار نامشخص‬
‫حلقه هاي با تکرار مشخص‬
‫در اي نوع حلقهها تعداد تکرار مشخص ميباشد اي حلقه از اجزاء زير‬
‫تشکيل ميشود‪:‬‬
‫‪1‬د انديس حلقه‬
‫‪2‬د مقدار اوليه براي انديس حلقه‬
‫‪ -3‬مقدار افزاينده براي انديس حلقه (معموال يک واحد در هر مرحله)‬
‫‪4‬د مقدار نهايي (تعداد تکرار حلقه)‬
‫‪5‬د شرطي براي کنترل تعداد تکرار حلقه‬
‫اين حلقهها را غالباً با فلوچارت بصورت زير نمايش ميدهند‪:‬‬
‫مقدار اوليه براي انديس حلقه ‪1 :‬‬
‫انديس حلقه ‪i :‬‬
‫مقدار نهايي (تعداد تکرار حلقه)‪n :‬‬
‫مقدار افزاينده براي انديس حلقه (معموال‬
‫يک واحد در هر مرحله) ‪+1 :‬‬
‫شرطي براي‬
‫کنترل تعداد‬
‫تکرار حلقه‪:‬‬
‫‪i<=n‬‬
‫مثال ‪ :‬فلوچارتي رسم نمائيد که لدد ‪ n‬را از ورودي دريافت کرده‪ ،‬مجموع‬
‫الداد از يک تا ‪ n‬را محاسبه کند‪.‬‬
‫‪n‬‬
‫مقدار نهایی‬
‫‪i‬‬
‫اندیس حلقه‬
‫نمونه اجراي فلوچارت باال بصورت زیر است‪:‬‬
‫خروجی‬
‫‪15‬‬
‫‪sum‬‬
‫‪0‬‬
‫‪1‬‬
‫‪3‬‬
‫‪6‬‬
‫‪10‬‬
‫‪15‬‬
‫‪i‬‬
‫‪N‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪5‬‬
‫مثال ‪ :‬فلوچارتي رسم کنيد که ‪ n‬لدد از ورودي دريافت کرده‪ ،‬بزرگتري مقدار از‬
‫بي ‪ n‬لدد را پيدا کرده در خروجي چاپ نمايد‪.‬‬
‫‪i‬‬
‫انديس حلقه‬
‫مقدار نهایی‬
‫بزرگترین مقدار‬
‫‪n‬‬
‫‪Max‬‬
‫مثال ‪ :‬فلوچارتي رسم نمائيد که ‪ ،n , x‬دو لددد صدحيم مثبدت را از‬
‫ورودي دريافت کرده سپس ‪ x‬به توان ‪ n‬را محاسبه کند‪.‬‬
‫انديس حلقه‬
‫مقدار نهايي‬
‫لدد به توان ‪n‬‬
‫‪i‬‬
‫‪n‬‬
‫‪pow‬‬
‫حلقههایی که تعداد تکرار آن ها مشخص نيست‪.‬‬
‫در اي حلقهها با توجه به ورودي‪ ،‬تعداد تکرار مشخص ميشود‪ .‬و دقيقاً‬
‫نميتوان تعداد تکرار حلقه را بدون ورودي معي کرد‪ .‬اي حلقه ها فق‬
‫شامل شرطي هستند که تا زمانيکه برقرار باشد حلقه اجرا ميشود‪.‬‬
‫در حالت كلی این نوع حلقهها بصورت زیر نمایش داده میشوند‪:‬‬
‫مثال‪ :‬فلوچارتي رسم کنيد که لددي را از ورودي دريافدت کدرده سدپس‬
‫تعداد ارقام آن را شمرده در خروجي چاپ نمايد‪.‬‬
‫عد خوانده شده‬
‫تعدا ارقام‬
‫‪N‬‬
‫‪count‬‬
‫مثال ‪ :‬فلوچارتي رسم نمائيدد کده لدددي از ورودي دريافدت کدرده‪ ،‬سدري‬
‫فيبوناچي قبل از آن را توليد نمايد‪.‬‬
‫در حالت کلي جمالت سري بصورت‪:‬‬
‫‪fk=fk-1+fk-2‬‬
‫‪N‬‬
‫لدد خوانده شده‬
‫‪f1‬‬
‫جمله اول سري‬
‫‪f2‬‬
‫جمله دوم سري‬
‫‪f3‬‬
‫جمله سوم سري‬
‫تمري‬
‫‪ -1‬فلوچارتی رسم نمائيد كه عددي از ورودي دریافت كرده‪ ،‬كامل بودن آن را‬
‫بررسی نماید‪( .‬عدد كامل‪ ،‬عددي است كه مجموع مقسومعليههاي آن با خودش‬
‫برابر باشد‪).‬‬
‫‪ -2‬فلوچارتی رسم كنيد كه ‪ N‬را از ورودي دریافت كرده‪ N ،‬جمله سري‬
‫فيبوناچی را توليد نماید‪.‬‬
‫‪3‬ـ فلوچارتی رسم نمائيد كه دو عدد ‪ N , M‬را از ورودي خوانده‪ ،‬بزرگترین‬
‫مقسومعليه مشترك دو عدد را محاسبه و چاپ كند‪.‬‬
‫حلقههاي تودرتو‬
‫الگوريتمهايي که تا حال بکار برديم‪ ،‬فق شامل يک حلقه بودند‪ .‬در صورتي که در‬
‫بسياري از مسائل ممک است نياز به استفاده از چند حلقه در داخل هم باشيم‪ .‬در اي‬
‫نوع حلقهها بايد دقت بيشتري به خرج دهيم‪ ،‬تا مشکلي پيش نيايد‪ .‬اگر از حلقههاي‬
‫نوع اول بصورت تودرتو استفاده کنيم در اينصورت براي هر حلقه شرط نهايي و‬
‫انديس اوليه جداگانه بايد تعريف کنيم ‪.‬‬
‫در حلقههاي تودرتو به ازاي يکبار تکرار حلقه اوليه‪ ،‬حلقه داخلي به اندازه‬
‫مقدار نهايي خود تکرار ميشود‪ .‬در کل اگر حلقه اوليه ‪ n‬بار تکرار شود و‬
‫حلقه داخلي ‪ m‬بار‪ ،‬در اينصورت کل حلقه ‪:‬‬
‫‪n m‬‬
‫‪ n‬بار‬
‫بار تکرار خواهد شد‪.‬‬
‫‪ m‬بار‬
‫فلوچارت حلقههاي تودرتو را ميتوان بصورت زير نشان داد‪:‬‬
‫‪ n‬بار‬
‫‪ m‬بار‬
‫مثال ‪ :‬فلوچارتي رسم نمائيد که ‪ N‬را از ورودي دريافت کرده‪ ،‬مجموع سري زيدر‬
‫را محاسبه نمايد‪:‬‬
‫‪N‬‬
‫!‪N‬‬
‫‪ ....‬‬
‫انديس حلقه اول‬
‫ورودي‬
‫محاسبه فاكتوريل‬
‫انديس حلقه داخلي‬
‫مجموع‬
‫‪3‬‬
‫!‪3‬‬
‫‪‬‬
‫‪i‬‬
‫‪N‬‬
‫‪fact‬‬
‫‪j‬‬
‫‪Sum‬‬
‫‪2‬‬
‫!‪2‬‬
‫‪S  1‬‬
‫ایا راه ساده تري وجود دارد؟‬
‫‪Sum ← Sum + i/fact‬‬
‫تمرينات آخر فصل‬
‫‪ -1‬فلوچارتی رسم نمائيد كه ‪ N‬عدد از ورودي دریافت كرده تعداد اعداد اول و كامل را شمرده در خروجی‬
‫چاپ نماید‪.‬‬
‫‪ -2‬فلوچارتی رسم نمائيد كه ‪ N , X‬را از ورودي خوانده مقدار سري زیر را محاسبه كند‪:‬‬
‫‪+2‬‬
‫‪2‬‬
‫‪4‬‬
‫‪n‬‬
‫‪x‬‬
‫‪x‬‬
‫‪x‬‬
‫‪S  1‬‬
‫‪‬‬
‫‪ ....‬‬
‫!‪2! 4‬‬
‫!‪N‬‬
‫‪ -3‬فلوچارتی رسم نمائيد كه عددي را از ورودي دریافت كرده مقلوب عدد را محاسبه و در خروجی چاپ‬
‫كند‪.‬‬
‫‪4‬ـ فلوچارتی رسم كنيد كه تاریخ تولد شخصی را از ورودي خوانده‪ ،‬سن شخص را با تاریخ روز‪ ،‬محاسبه‬
‫نموده در خروجی چاپ كند‪.‬‬
‫‪ -5‬فلوچارتی رسم نمائيد كه ‪ (m>n) N ,M‬را از ورودي دریافت كرده سري فيبوناچی بين ‪ N ,M‬را‬
‫توليد كرده‪ ،‬در خروجی چاپ كند‪.‬‬
‫برنامه نويسي به زبان ‪C++‬‬
‫فهرست مطالب‬
‫فصل اول ‪ :‬مقدمات زبان ‪C++‬‬
‫فصل دوم ‪ :‬ساختار هاي تصميم گيري و تکرار‬
‫فصل سوم ‪ :‬سایر ساختار هاي تکرار‬
‫فصل چهارم ‪ :‬اعداد تصادفی‬
‫فصل پنجم ‪ :‬آرایه ها‬
‫فصل ششم ‪ :‬توابع‬
‫فصل هفتم ‪ :‬ساختارها و اشاره گرها‬
‫فصل اول‬
‫مقدمات ‪C++‬‬
‫فهرست مطالب فصل اول‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫‪.8‬‬
‫‪.9‬‬
‫‪.10‬‬
‫تاریخچه مختصر‬
‫قانون نامگذاري شناسه ها‬
‫متغير ها‬
‫اعالن متغير‬
‫تخصيص مقادیر به متغير‬
‫داده هاي از نوع کرکتر‬
‫کرکتر هاي مخصوص‬
‫رشته ها‬
‫نمایش مقادیر داده ها‬
‫دریافت مقادیر‬
‫‪.11‬‬
‫‪.12‬‬
‫‪.13‬‬
‫‪.14‬‬
‫‪.15‬‬
‫‪.16‬‬
‫‪.17‬‬
‫‪.18‬‬
‫‪.19‬‬
‫عملگر انتساب‬
‫عملگر هاي محاسباتی‬
‫عملگرهاي افزایش و کاهش‬
‫عملگر ‪sizeof‬‬
‫عملگرهاي جایگزینی محاسباتی‬
‫اولویت عملگرها‬
‫توضيحات (‪)Comments‬‬
‫توابع کتابخانه‬
‫برنامه در ‪C++‬‬
‫تاريخچه مختصر ‪C++‬‬
‫این زبان در اوائل دهه ‪ 1980‬توسـط ‪ Bjarne stroustrup‬در آزمایشـگاه‬
‫بل طراحی شده‪ .‬این زبان عمالً توسعه یافته زبان برنامه نویسی ‪ C‬می باشد كه‬
‫امکان نوشتن برنامههاي ساخت یافته شئ گرا را میدهد‪.‬‬
‫قانون نامگذاري شناسهها‬
‫‪(1‬‬
‫حروف کوچك و بزرگ در نامگذاري شناسهها متفاوت میباشند‪.‬‬
‫بنابراین ‪ xy ، xY ، XY ، Xy‬چهار شناسه متفاوت‬
‫از نظر ‪ C++‬میباشد‪.‬‬
‫قانون نامگذاري شناسهها‬
‫‪ )2‬در نامگذاري شناسهها از حروف الفباء‪ ،‬ارقام وزیر خط (‪)underscore‬‬
‫استفاده میشود و حداکثر طول شناسه ‪ 31‬میباشد و شناسه بایستی با‬
‫یك رقم شروع نگردد‪.‬‬
‫قانون نامگذاري شناسهها‬
‫ در زیر بعضی از كلمات‬.‫) براي نامگذاري شناسهها از كلمات كليدي نبایستی استفاده نمود‬3
.‫كليدي داده شده است‬
And
Sizeof
then
xor
Template
Float
False
Friend
While
continue
extern
Private
Switch
Default
Const
delete
typedef
if
this
Virtual
‫متغيرها‬
‫متغيــر‪ ،‬مکــانی در حافصــه اصــلی‬
‫كامپيوتر میباشد كـه در آنجـا یـک‬
‫مقدار را میتوان ذخيره و در برنامـه‬
‫از آن استفاده نمود‪ .‬قانون نامگذاري‬
‫متغيرهــا همــان قــانون نامگــذاري‬
‫شناسهها میباشد‪.‬‬
‫در اسالید بعد به انواع داده ها اشاره می شود‪.‬‬
‫انواع داده ها‬
‫حافظه الزم‬
‫مقادير‬
‫‪ 2‬بایت‬
‫‪ 32767‬تا ‪–32768‬‬
‫‪2‬بایت‬
‫‪ 65535‬تا ‪0‬‬
‫‪ 4‬بایت‬
‫‪ 2147483647‬تا ‪–2147483648‬‬
‫‪ 4‬بایت‬
‫‪ 4294967295‬تا ‪0‬‬
‫‪1‬بایت‬
‫یك کارکتر‬
‫‪ 1‬بایت‬
‫‪ 127‬تا ‪–128‬‬
‫‪ 4‬بایت‬
‫‪ 3.4e38‬تا ‪1.2e-38‬‬
‫‪ 8‬بایت‬
‫‪ 1.8e308‬تا ‪2.2e-308‬‬
‫نوع داده‬
‫‪int‬‬
‫‪unsigned int‬‬
‫‪long int‬‬
‫‪unsigned long int‬‬
‫‪char‬‬
‫‪unsigned char‬‬
‫‪float‬‬
‫‪double‬‬
‫اعالن متغيرها‬
‫قبل از آنکه در برنامه به متغيرها مقـداري تخصـيص داده‬
‫شود و از آنها استفاده گردد بایستی آنها را در برنامه اعالن‬
‫نمود‪.‬‬
‫در اسالید بعد مثال هایی از اعالن متغير ذکر شده است‪.‬‬
‫چند مثال از اعالن متغير ها ‪:‬‬
‫‪ ‬براي اعالن متغير‪ x‬از نوع ‪: int‬‬
‫;‪x‬‬
‫‪int‬‬
‫‪ ‬براي اعالن متغيرهاي ‪ p‬و ‪ q‬را از نوع ‪ float‬که هر کدام چهار بایت از‬
‫حافظه را اشغال میکنند ‪:‬‬
‫; ‪float p , q‬‬
‫‪ ‬براي اعالن متغير ‪ next‬از نوع کرکتر که میتوان یکی از ‪ 256‬کرکتر را به‬
‫آن تخصيص داد و یك بایت را اشغال میکند‪.‬‬
‫; ‪char next‬‬
‫تخصيص مقادير به متغيرها‬
‫با استفاده از عملگر = میتوان به متغيرها مقدار اوليه تخصيص نمود‪.‬‬
‫در اسالید بعد مثال هایی از اعالن متغير ذکر شده است‪.‬‬
‫مثال ‪:‬‬
‫‪ ‬در دستورالعمل‬
‫‪ X‬را از نوع ‪ int‬با مقدار اوليه ‪ 26‬اعالن نموده ‪.‬‬
‫;‪int x=26‬‬
‫‪ ‬در دستورالعمل‬
‫;‪b=260‬‬
‫متغيرهاي ‪ b‬و ‪ a‬را از نوع ‪ long int‬تعریف نموده با مقادیر بترتيب‬
‫‪long int a=67000 ,‬‬
‫‪ 260‬و ‪.67000‬‬
‫دادههاي از نوع کرکتر‬
‫براي نمایش دادههاي از نوع ‪ char‬در حافظه کامپيوتر از جدول‬
‫‪ ASCII‬استفاده میشود‪ .‬جدول اسکی به هر یك از ‪ 256‬کرکتر‬
‫یك عدد منحصر بفرد بين ‪ 0‬تا ‪ 255‬تخصيص میدهد‪.‬‬
‫کرکترهاي مخصوص‬
‫كامپيلر ‪ C++‬بعضی از كركترهاي مخصوص كه در برنامه میتوان از‬
‫آنها براي فرمت بندي استفاده كرد را تشخيص میدهد‪ .‬تعدادي از‬
‫این كركترهاي مخصوص به همراه كاربرد آنها در اسالید بعد آورده‬
‫شده است ‪.‬‬
‫کرکترهاي مخصوص‬
\n
Newline
\t
Tab
\b
Backspace
\a
Beep sound
\”
Double quote
\’
Single quote
\0
Null character
\?
Question mark
\\
Back slash
‫\ میتوان براي ایجاد صداي‬a ‫بعنوان مثال از کرکتر‬
.‫ استفاده نمود‬beep
char
x = '\a ;
‫رشتهها‬
‫رشته یا ‪ string‬عبارتست از دنبالهاي از كركترها كه بين " " قرار داده‬
‫میشود‪ .‬در حافصه كامپيوتر انتهاي رشتهها بوسيله ‪ \0‬ختم میگردد‪.‬‬
‫در اسالید بعد به دو مثال دقت نمایيد‪.‬‬
‫مثال ‪: 1‬‬
‫"‪ "BOOK STORE‬یک رشته ده كركتري مـیباشـد‬
‫كه با توجه به كركتر ‪ \0‬كه به انتهاي آن در حافصه‬
‫اضافه می شود جمعــاً یازده بایت را اشغال میكند‪.‬‬
‫مثال ‪: 2‬‬
‫دقت نمایيد كه "‪ "w‬یک رشته میباشد كه دو بایت از‬
‫حافصه را اشغال میكند در حاليکه '‪ 'w‬یک كركتر‬
‫میباشد كه یک بایت از حافصه را اشغال مینماید‪.‬‬
‫نمايش مقادير دادهها‬
‫براي نمایش دادهها بـر روي صـفحه مـانتور از ‪ cout‬كـه‬
‫بدنبال آن عملگر درج یعنـی <<قيـد شـده باشـد اسـتفاده‬
‫میگردد‪ .‬بایستی توجه داشت كه دوكركتر <پشت سـر هـم‬
‫توسط ‪ C++‬بصورت یک كركتر تلقی میگردد‪.‬‬
‫مثال ‪:‬‬
‫‪ ‬براي نمایش پيغام ‪ good morning‬بر روي صفحه نمایش ‪:‬‬
‫;"‪cout << "good morning‬‬
‫‪ ‬براي نمایش مقدار متغير ‪ X‬بر روي صفحه نمایش ‪:‬‬
‫; ‪cout << x‬‬
‫دريافت مقادير متغيرها‬
‫به منصور دریافت مقادیر براي متغيرها در ضمن اجراي برنامه از‬
‫صفحه كليد‪ ،‬از ‪ cin‬كه بدنبال آن عملگر استخراج یعنی >>‬
‫قيد شده باشد میتوان استفاده نمود‪.‬‬
: ‫مثال‬
int x;
cout << "Enter a number:" ;
cin >> x;
‫عملگر انتساب‬
‫عملگر انتساب = میباشد که باعث میگردد‬
‫مقدار عبارت در طرف راست این عملگر ارزیابی‬
‫شده و در متغير طرف چپ آن قرار گيرد‪.‬‬
‫مثال ‪:‬‬
‫;‪x=a+b‬‬
‫; ‪x=35‬‬
‫; ‪x=y=z=26‬‬
‫از عملگرهـــاي انتســـاب‬
‫چندگانــه نيــز مــیتــوان‬
‫استفاده نمـود‪ .‬كـه مقـدار‬
‫سه متغير ‪ z‬و ‪ y‬و ‪ x‬برابر‬
‫با ‪ 26‬می شود‪.‬‬
‫عملگرهاي محاسباتي‬
‫در ‪ C++‬پنج عملگر محاسباتی وجود دارد که عبارتند از ‪:‬‬
‫‪+‬‬
‫جمع‬
‫‪-‬‬
‫تفریق‬
‫*‬
‫ضرب‬
‫‪/‬‬
‫تقسيم‬
‫‪%‬‬
‫باقيمانده‬
‫این عملگرها دو تائی میباشند زیرا روي دو عملوند عمل مینمایند‪ .‬از طرف‬
‫دیگر عملگرهاي ‪ +‬و – رامیتوان بعنوان عملگرهاي یکتائی نيز در نظر گرفت‪.‬‬
‫مثال ‪: 1‬‬
‫در حالتی که هر دو عملوند عملگرهـاي ‪ – ، + ، * ، / ، %‬از نـوع‬
‫صحيح باشد نتيجه عمل از نوع صحيح میباشد‪.‬‬
‫نتيجه‬
‫عبارت‬
‫‪7‬‬
‫‪5+2‬‬
‫‪10‬‬
‫‪5*2‬‬
‫‪3‬‬
‫‪5–2‬‬
‫‪1‬‬
‫‪5%2‬‬
‫‪2‬‬
‫‪5/2‬‬
‫مثال ‪: 2‬‬
‫در صورتيکه حداقل یکی از عملوندهاي عملگرهاي ‪ + ، – ، * ، /‬از‬
‫نوع اعشاري باشد نتيجه عمل از نوع اعشاري میباشد‪.‬‬
‫نتيجه‬
‫عبارت‬
‫‪7. 0‬‬
‫‪5. 0 +2‬‬
‫‪10.0‬‬
‫‪5* 2. 0‬‬
‫‪2.5‬‬
‫‪5. 0 / 2‬‬
‫‪3. 0‬‬
‫‪5. 0 -2‬‬
‫‪2.5‬‬
‫‪5. 0 / 2. 0‬‬
‫عملگرهاي افزايش و کاهش‬
‫در ‪ ، C++‬افزایش یك واحد به مقدار یك‬
‫متغير از نوع صـحيح را افـزایش و بطـور‬
‫مشابه کاهش یك واحـد از مقـدار یـك‬
‫متغير از نوع صحيح را کاهش مینامند‪..‬‬
‫عملگرهاي افزايش و کاهش‬
‫عملگر کاهش را با ‪ - -‬و عملگر افزایش‬
‫را بــا ‪ ++‬نمــایش مــیدهنــد‪ .‬چــون‬
‫عملگرهــاي ‪ ++‬و ‪ - -‬فقــط روي یــك‬
‫عملوند اثر دارند این دو عملگر نيز جـزء‬
‫عملگرهاي یکتائی میباشند‪.‬‬
‫مثال ‪:‬‬
‫سه دستور العمل ‪:‬‬
‫;‪++x‬‬
‫;‪x++‬‬
‫;‪x= x+1‬‬
‫معادل میباشند و بطریق مشابه سه دستورالعمل زیر نيز معادل می باشند‪.‬‬
‫;‪--y‬‬
‫;‪y= y-1‬‬
‫;‪y--‬‬
‫از عملگرهاي ‪ ++‬و ‪ --‬میتوان بدو صورت پيشوندي و پسوندي استفاده نمود‪.‬‬
‫در دستورالعملهاي پيچيده عملگر پيشوندي قبل از انتساب ارزیابی می شود و عملگر‬
‫پسوندي بعد از انتساب ارزیابی میشود‪.‬‬
‫مثال ‪:‬‬
‫;‪int x=5‬‬
‫;‪y=++x * 2‬‬
‫پس از اجراي دستورالعملهاي فوق ‪:‬‬
‫‪y=12‬‬
‫‪X=6‬‬
‫;‪int x=5‬‬
‫;‪y=x++ * 2‬‬
‫پس از اجراي دستورالعملهاي فوق ‪:‬‬
‫‪y=10‬‬
‫‪X=6‬‬
‫عملگر ‪sizeof‬‬
‫‪ Sizeof‬ازعملگرهاي یکتائی می باشد و مشخص کننده‬
‫تعداد بایت هائی است که یك نوع داده اشغال میکند‪.‬‬
‫مثال ‪:‬‬
‫;‪int x‬‬
‫; ‪cout << sizeof x‬‬
‫مقدار ‪ 2‬نمایش داده میشود ‪.‬‬
‫; )‪cout << sizeof(float‬‬
‫مقدار ‪ 4‬نمایش داده می شود‪.‬‬
‫عملگرهاي جايگزيني محاسباتي‬
‫براي سادهتر نوشتن عبارتها در ‪ ، C++‬میتوان از عملگرهاي‬
‫جایگزینی محاسبـــاتی استفاده نمود‪.‬‬
‫=‪+‬‬
‫مثال‪:‬‬
‫=‪-‬‬
‫;‪int a=1‬‬
‫;‪a += 1‬‬
‫=*‬
‫=‪/‬‬
‫=‪%‬‬
‫;‪int a=1‬‬
‫;‪a = a +1‬‬
‫اولويت عملگرها‬
‫ارزیابی مقدار یك عبارت ریاضی براساس جدول اولویت عملگرها انجام میگردد‪ .‬در ذیل جدول اولویت‬
‫عملگرها براساس بترتيب از بيشترین اولویت به کمترین اولویت داده شده است‪.‬‬
‫چ پ به راس ت‬
‫پرانتزها‬
‫راس ت به چ پ‬
‫عملگرهاي ي كتاي ي‬
‫چ پ به راس ت‬
‫عملگرهاي ضرب و تق سي م و باقيمان ده‬
‫‪%‬‬
‫چ پ به راس ت‬
‫عملگرهاي جم ع و تفريق‬
‫چ پ به راس ت‬
‫عملگرهاي درج و استخراج‬
‫‪‬‬
‫>>‬
‫راس ت به چ پ‬
‫عملگرهاي جايگزين ي و انت ساب‬
‫) (‬
‫‪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 is equal to sum of a and b‬‬
‫;‪c=a+b‬‬
‫ب‪ :‬توضيح نوع دوم با *‪ /‬شروع شده و به ‪ */‬ختم میشود و هر چيزي که بين* ‪ /‬و ‪ */‬قـرار گيـرد‬
‫اغماض مینماید ‪.‬‬
‫مثال ‪:‬‬
‫‪/ * this is a program‬‬
‫‪to calcufate sum of‬‬
‫‪n integer numbers */‬‬
‫توابع کتابخانه‬
‫زبان ‪ C++‬مجهز به تعدادي توابع کتابخانه میباشـد‪ .‬بعنـوان‬
‫مثال تعدادي توابع کتابخانه بـراي عمليـات ورودي و خروجـی‬
‫وجود دارند‪ .‬معموالً توابع کتابخانه مشابه ‪ ،‬بصورت برنامـههـاي‬
‫هدف (برنامه ترجمه شـده بزبـان ماشـين) در قالـب فایلهـاي‬
‫کتابخانه دسته بندي و مورد استفاده قرا رمیگيرند‪ .‬این فایلهـا‬
‫را فایلهاي ‪ header‬مینامند و داراي پسوند ‪ .h‬میباشند‪.‬‬
‫نحوه استفاده از توابع کتابخانه اي‬
‫براي استفاده از توابع کتابخانه خاصی بایستـــی‬
‫نام فایل ‪ header‬آنرا در ابتداي برنامه در دستور‬
‫‪ #include‬قرار دهيم‪.‬‬
‫> اسم فایل ‪< header‬‬
‫‪#include‬‬
‫تابع‬
‫نوع‬
‫شرح‬
‫فاي ل هي در‬
abs(i)
int
i ‫ق درمطل ق‬
stdlib.h
cos(d)
double
math.h
exp(d)
log(d)
log10(d)
double
double
double
sin(d)
double
d ‫ك سينوس‬
ex
loge d
Log10 d
d ‫سينوس‬
sqrt(d)
double
d ‫ج ذر‬
math.h
strlen(s)
int
s ‫تع داد كركترهاي رشته‬
string.h
tan(d)
double
d ‫تانژانت‬
math.h
toascii( c)
int
c‫ك داس ك ي كركتر‬
stdlib.h
tolower(c )
int
‫تب دي ل به حروف كوچ ك‬
stdlib.h
toupper(c )
int
‫تب دي ل به حرف بزرگ‬
stdlib.h
math.h
math.h
math.h
math.h
‫برنامه در ‪C++‬‬
‫اکنون باتوجه به مطالب گفته شده قادر خواهيم بود که تعدادي برنامه ساده و‬
‫کوچك به زبان ‪ C++‬بنویسيم‪ .‬براي نوشتن برنامه بایستی دستورالعملها را در‬
‫تابع ) (‪ main‬قرار دهيم و براي اینکار میتوان به یکی از دو طریقـی کـه در‬
‫اسالیدهاي بعد آمده است ‪ ،‬عمل نمود‪.‬‬
‫روش اول ‪:‬‬
‫>‬
‫‪#include‬‬
‫<‬
‫) (‪int main‬‬
‫}‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫; ‪return 0‬‬
‫}‬
‫روش دوم ‪:‬‬
‫>‬
‫‪#include‬‬
‫<‬
‫) (‪void main‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫‪:error ‬‬
‫•‬
‫•‬
‫•‬
‫به خطاهاي برنامه نویسی ‪ error‬می گویند‪ .‬ما در برنامه نویسی دو نوع خطا داریم‪:‬‬
‫خطاهاي دستوري (‪)syntax error‬‬
‫خطاهاي منطقی (‪.)logical error‬‬
‫ را روي صفحه‬C++ is an object oriented language ‫برنامه اي که پيغام‬
.‫مانيتور نمايش مي دهد‬
#include <iostream.h>
int main( )
{
cout <<"C++ is an object oriented language \n" ;
return 0 ;
}
.‫برنامه زير يك حرف انگليسي کوچك را گرفته به حرف بزرگ تبديل مينمايد‬
#include <iostream.h>
#include <stdlib. h>
int main( )
{
char c1 , c2;
cout << "Enter a lowercase letter:"
cin >> c1;
c2 = toupper(c1);
cout << c2 << endl;
return 0; }
.‫دو عدد از نوع اعشاري را گرفته مجموع و حاصلضرب آنها را محاسبه و نمايش ميدهد‬
#include <iostream.h>
int main( )
{
float
x,y,s,p ;
cin >> x >> y ;
s= x+y ;
p=x*y;
cout << s <<endl << p;
return 0 ;
}
‫فصل دوم‬
‫ساختارهاي تصميم گيري و تکرار‬
‫فهرست مطالب فصل دوم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫عملگر هاي رابطه اي‬
‫عملگر شرطی‬
‫دستورالعمل شرطی‬
‫عملگر کاما‬
‫عملگر هاي منطقی‬
‫دستورالعمل ‪For‬‬
‫عملگرهاي رابطه اي‬
‫از این عملگرها براي تعيين اینکه آیا دو عدد با‬
‫هم معادلند یا یکی از دیگري بزرگتر یا کوچکتر‬
‫میباشد استفاده میگردد‪ .‬عملگرهاي رابطهاي‬
‫عبارتند از‪:‬‬
‫مساوي‬
‫==‬
‫مخالف‬
‫=!‬
‫بزرگتر‬
‫>‬
‫بزرگتر يا مساوي‬
‫=>‬
‫كوچكتر‬
‫<‬
‫كوچكتر يا مساوي‬
‫=<‬
‫عملگر شرطي‬
‫شکل کلی عملگر شرطی بصورت زیر میباشد‪:‬‬
‫‪expression _ test ? expression _ true : expression _ false‬‬
‫عملگر شرطی تنها عملگري در ‪ C++‬میباشد که داراي سه عملوند میباشد‪.‬‬
‫مثال ‪: 1‬‬
‫;‪int x=10,y=20,b‬‬
‫; ‪b=(x>y) ? x : y‬‬
‫این دو دستور العمل باعث می شوند که ماکزیمم مقادیر ‪ y‬و ‪ x‬در ‪ b‬قرار بگيرد‪.‬‬
‫مثال ‪: 2‬‬
‫; "‪x>=10 ? cout << "passed" : cout << "failed‬‬
‫اگر مقدار ‪ x‬بزرگتر یا مساوي ده باشد رشتة ‪ passed‬در غير اینصورت رشته‬
‫‪failed‬نمایش داده می شود‪.‬‬
‫‪IF‬‬
‫دستورالعمل شرطي‬
‫توسط این دستور شرطی را تست نموده و بسته به‬
‫آنکه شرط درست یا غلـط باشـد عکـس العمـل‬
‫خاصی را نشان دهيم‪.‬‬
‫) عبارت(‬
‫‪if‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫‪else‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
: 1 ‫مثال‬
if(x != y)
{
cout << x ;
++ x ;
}
else
{
cout << y ;
--y;
}
:2 ‫مثال‬
.‫برنامه زیر یك عدد اعشاري را از ورودي گرفته جذر آن را محاسبه مینماید‬
#include <iostream.h>
#include <math . h>
int main( )
{
float x,s;
cin >> x ;
if ( x < 0 )
cout << " x is negative" << endl ;
else
{
s = sqrt(x) ;
cout << s << endl ;
}
return 0;
}
‫عملگر کاما‬
‫تعدادي عبارت را می توان با کاما بهـم متصـل نمـود و تشـکيل یـك عبـارت‬
‫پيچيدهتري را داد‪ .‬این عبارتها به ترتيب از چپ به راست ارزیابی شده و مقـدار‬
‫عبارت معادل عبارت ‪ n‬میباشد‪.‬‬
‫(عبارت ‪ , .… , n‬عبارت ‪ , 3‬عبارت ‪ , 2‬عبارت ‪)1‬‬
‫مثال ‪:‬‬
‫اگر داشته باشيم‬
‫; ‪ int a=2 , b=4 , c=5‬عبارت زیر را در نظر بگيرید‪:‬‬
‫)‪(++ a , a+b, ++ c, c+b‬‬
‫مقدار عبارت برابر است با ‪ b+c‬که معادل ‪ 10‬میباشد‪.‬‬
‫عملگرهاي منطقي‬
‫با استفاده از عملگرهاي منطقی میتوان شرط هاي ترکيبی در برنامه ایجاد نمود‪.‬‬
‫عملگرهاي منطقی عبارتست از ‪:‬‬
‫‪AND‬‬
‫‪OR‬‬
‫‪NOT‬‬
‫که در ‪ C++‬به ترتيب بصورت زیر نشان داده می شود‪.‬‬
‫&&‬
‫||‬
‫!‬
‫جدول درستي سه عملگر شرطي‬
a
true
true
false
false
a
true
true
false
false
b
true
false
true
false
b
true
false
true
false
a && b
True
False
False
False
a
true
false
!a
False
True
a || b
True
True
True
False
‫چند مثال ‪:‬‬
‫))‪if ((x= = 5) ||(y != 0‬‬
‫; ‪cout << x << endl‬‬
‫اگر ‪ x‬برابر با ‪ 5‬یا ‪ y‬مخالف صفر باشد مقدار ‪ x‬نمایش داده شود ‪.‬‬
‫)‪if(x‬‬
‫;‪x=0‬‬
‫اگر مقدار ‪ x‬مخالف صفر باشد‪ ،‬آنگاه ‪ x‬برابر با صفر شود ‪.‬‬
‫برنامه زير طول سه پارهخط را از ورودي گرفته مشخص مينمايد که آيا تشكيل يك مثلث مي دهد يا خير؟‬
#include
< iostream.h >
int main( )
{
float a, b, c;
cout << "Enter three real numbers" << endl ;
cin >> a >> b >> c;
if(( a < b + c) &&(b < a+c) &&(c < a+b))
cout << "It is a triangle" ;
else
cout << "Not a triangle" ;
return 0 ;
}
‫دستورالعمل ‪For‬‬
‫از دستور العمل ‪ for‬براي تکرار دستورالعمل ها استفاده می شود‪ .‬شکل کلی دستور‬
‫‪ for‬بصورت زیر میباشد‪:‬‬
‫(عبارت ‪3‬‬
‫; عبارت ‪2‬‬
‫; عبارت ‪for )1‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫;دستورالعمل ‪n‬‬
‫}‬
‫ساختار ‪for‬‬
‫;معرفی کنترل گر حلقه‬
‫) گام حرکت‬
‫;شرط حلقه ;مقداردهی اوليه کنترل گر حلقه( ‪for‬‬
‫}‬
‫; مجموعه دستورات بدنه حلقه‬
‫;‪int i‬‬
‫)‪for (i=1; i<=3; i++‬‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫{‬
‫{‬
‫مثال‬
void main()
{
cout << “hello \n”;
cout << “hello \n”;
cout << “hello \n”;
}
void main()
{
int i;
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
}
for ‫نحوه اجراي دستور‬
int i;
i=
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
for ‫نحوه اجراي دستور‬
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
for ‫نحوه اجراي دستور‬
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
hello
2
for ‫نحوه اجراي دستور‬
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
hello
hello
2
3
for ‫نحوه اجراي دستور‬
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
hello
hello
hello
2
3
4
for ‫نحوه اجراي دستور‬
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
hello
hello
hello
2
3
4
‫نكته‬
‫• لزومی ندارد كه كنترل گر حلقه حتماً از ‪ 1‬شروع شود‪.‬‬
‫;‪int i‬‬
‫)‪for (i=5; i<=7; i++‬‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫}‬
‫نكته‬
‫• مقدار دهی اوليه كنترل گر حلقه می تواند خارج از دستور ‪for‬‬
‫باشد‪.‬‬
‫;‪int i =1‬‬
‫)‪for ( i ; i<=3; i++‬‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫}‬
‫نكته‬
‫• مقدار دهی اوليه كنترل گر حلقه می تواند خارج از دستور ‪for‬‬
‫باشد‪ .‬در این صورت می توان جمله اول موجود در عبارت ‪ for‬را‬
‫خالی گذاشت‪.‬‬
‫;‪int i=1‬‬
‫;‪int i=1‬‬
‫)‪for ( ; i<=3; i++‬‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫}‬
‫=‬
‫)‪for ( i; i<=3; i++‬‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫}‬
‫نكته‬
‫• گام حركت می تواند در بدنه دستور ‪ for‬تعریف شود‪.‬‬
‫;‪int i=1‬‬
‫;‪for ( i; i<=3‬‬
‫)‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫;‪i++‬‬
‫}‬
‫نكته‬
‫• معرفی كنترل گر حلقه می تواند در داخل دستور ‪ for‬باشد‪.‬‬
‫)‪for (int i= 1; i<=3; i++‬‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫}‬
‫نكته‬
‫• در دستور ‪ for‬اگر قسمت شرط خالی باشد‪ ،‬حلقه هميشه اجرا‬
‫خواهد شد‪ .‬به عبارتی هيچ شرطی براي توقف نداریم‬
‫;‪for (int i= 1‬‬
‫)‪; i++‬‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫}‬
‫• وقتی هيچ شرطی نداریم‪ ،‬دو قسمت دیگر دستور ‪ for‬نيز می توانند‬
‫خالی باشند‪.‬‬
‫)‬
‫( ‪for‬‬
‫;‬
‫;‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫}‬
‫نكته‬
‫• لزومی ندارد كه گام حركت بصورت افزایشی باشد بلکه می تواند‬
‫بصورت كاهشی نيز باشد‪.‬‬
‫)‪for (int i= 3; i >= 1; i--‬‬
‫{‬
‫;”‪cout << “hello \n‬‬
‫}‬
‫• تمرین‪ :‬اعداد ‪ 100‬تا ‪ 1‬را به صورت نزولی چاپ نمایيد‪ ( .‬با گام‬
‫حركت افزایشی و كاهشی جداگانه بنویسيد)‬
‫نكته‬
‫• گام حركت می تواند افزایش یا كاهش بيش از ‪ 1‬واحد را داشته‬
‫باشد‪.‬‬
‫• مثال‪ :‬چاپ اعداد فرد بين ‪ 1‬تا ‪100‬‬
‫)‪for (int i= 1; i <= 100; k=k+2‬‬
‫{‬
‫;”‪cout << k << “\n‬‬
‫}‬
‫نكته‬
‫• كنترل گر حلقه می تواند اعشاري یا كاراكتري باشد‪ ،‬لزومی ندارد‬
‫كه حتما عدد صحيح در نصر بگيریم‪.‬‬
‫)‪for (char ch= ‘a’; ch <= ‘z’; ch++‬‬
‫{‬
‫;”‪cout << ch << “\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‬تا ‪ 1000‬را چاپ كند‪.‬‬
‫برنامه اي كه ‪ 100‬عدد را خوانده‪ ،‬مجموع را محاسبه و چاپ كند‪.‬‬
‫برنامه اي كه حاصلضرب اعداد ‪ 1‬تا ‪ 50‬را چاپ كند‪.‬‬
‫برنامه اي كه ‪ 50‬كاراكتر از صفحه كليد خوانده و تعيين كند كه‬
‫كدام یک حرف كوچک است‪.‬‬
‫برنامه اي كه ‪ 100‬عدد صحيح را خوانده ‪ max‬و ‪ min‬را چاپ‬
‫كند‪.‬‬
‫برنامه اي كه كاراكتر هایی كه كد آن ها بين ‪ 100‬تا ‪ 200‬هست‪ ،‬را‬
‫چاپ نماید‪.‬‬
‫کاربرد دستور ‪ break‬در دستور ‪for‬‬
‫• اگر در بدنه ‪ for‬از جمله ي ;‪ break‬استفاده شود‪ ،‬ادامه ي اجراي‬
‫حلقه متوقف شده و حلقه خاتمه می یابد‪.‬‬
‫;‪int i , x‬‬
‫)‪for(i=1;i<=100;i++‬‬
‫;‪{cin>>x‬‬
‫;‪if(x==50) break‬‬
‫}‬
‫• قطعه كد فوق حداكثر ‪ 100‬عدد صحيح از ورودي می گيرد‪ ،‬ولی اگر در بين‬
‫اعداد ورودي عدد ‪ 50‬وارد شود بدون بررسی شرط حلقه از ادامه اجراي‬
‫دستورات ‪ for‬اجتناب كرده و از حلقه خارج می شود‪.‬‬
‫مثال‬
‫• قطعه كدي كه تعدادي كاراكتر از صفحه كليد خوانده‪ ،‬بعد از‬
‫فشردن دكمه ي ‪ E‬تعداد آن ها را مشخص كند‪:‬‬
‫;‪char ch‬‬
‫;‪int i‬‬
‫)‪for(i=0; ;i++‬‬
‫;‪{cin>>ch‬‬
‫;‪if (ch==‘E’) break‬‬
‫}‬
‫;‪cout<<i‬‬
‫حلقه ‪ for‬تودرتو‬
‫• می توان داخل بدنه ي دستور ‪ for‬هر دستور دلخواه دیگري نوشت‪ .‬به عنوان‬
‫مثال می توان از یک دستور ‪ for‬در بدنه دستور ‪ for‬استفاده كرد‪.‬‬
‫• قطعه كد زیر عبارت ‪ Hello‬را ‪ 15‬بار اجرا می كند‪:‬‬
‫‪15‬‬
‫بار‬
‫)‪for(int i=1; i<=5; i++‬‬
‫{‬
‫)‪for(int j=1; j<=3; j++‬‬
‫‪ 3‬بار‬
‫;”‪cout<<“Hello \n‬‬
‫}‬
‫‪ 5‬بار‬
‫ چاپ جدول ضرب اعداد‬:‫مثال‬
int main()
{int i,j;
for(int i=1; i<=10; i ++)
for(int j=1; j<=10; j++)
{ cout<<i*j<<“ “;
if (j==10) cout<<‘\n’;
}
return 0;
}
‫ عدد را خوانده و براي هرکدام‬20 ‫ برنامه اي که‬:‫مثال‬
.‫ تا آن عدد را محاسبه کند‬1 ‫مجموع اعداد‬
int main()
{
int i,j,x,sum;
for(int i=1; i<=20; i++)
{sum=0; cin>>x;
for(int j=1; j<=x; j++)
sum+=j;
cout<<“sum of 1 to “<<x<<“ :“<<sum<<endl;
}
return 0;
}
‫کاربرد حلقه ‪ for‬با دو انديس‬
‫برنامه اي بنویسيد كه ستون اعداد زیر را چاپ كند‪:‬‬
‫‪1, 20‬‬
‫‪2, 19‬‬
‫‪3, 18‬‬
‫‪4, 17‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪20, 1‬‬
‫روش اول‪:‬‬
‫)‪for(int i=1; i<=20; i++‬‬
‫;‪cout<<i<<“, “<<21-i<<endl‬‬
‫روش دوم‪:‬‬
‫)‪for(int i=1, j=20; i<=20; i++, j--‬‬
‫;‪cout<<i<<“, “<<j<<endl‬‬
‫دستور ;‪ continue‬در ‪for‬‬
‫• اگر دستور ;‪ continue‬در حلقه ‪ for‬استفاده شود‪ ،‬جمالتی از‬
‫حلقه كه هنوز اجرا نشده اند‪ ،‬بدون اجرا مانده و ادامه اجرا از انتهاي‬
‫حلقه اغاز خواهد شد‪.‬‬
‫برنامه فوق ‪ 20‬عدد از ورودي خوانده و‬
‫حاصلضرب اعداد غير صفر را در متغير ‪p‬‬
‫محاسبه كرده و در نهایت نمایش می دهد‪.‬‬
‫)(‪int main‬‬
‫{‬
‫;‪int x, p=1‬‬
‫)‪for(int i=1; i<=20; i++‬‬
‫;‪{cin>>x‬‬
‫;‪if (!x) continue‬‬
‫;‪p*=x‬‬
‫}‬
‫;‪cout<<p‬‬
‫;‪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 ; }
‫نكته‬
‫• همانند دستور ‪ for‬اگر داخل بدنه دستور ‪ while‬فقط یک جمله‬
‫باشد می توان { و } را حذف كرد‪.‬‬
‫• مثال‪ :‬نمایش اعداد ‪ 0‬تا ‪:100‬‬
‫) (‪int main‬‬
‫{‬
‫;‪int j = 0‬‬
‫)‪while(j<=100‬‬
‫;‪cout<<j++<<endl‬‬
‫; ‪return 0‬‬
‫}‬
:‫برنامه زير را تفسير کنيد‬
int main( )
{
int j = 0;
while(j<10)
J++;
cout<<j;
return 0 ;
}
‫دستورالعمل ‪do while‬‬
‫این دستور العمل نيز براي تکرار یک دستورالعمل سـاده‬
‫یا تركيبی استفاده میشود‪ .‬شکل كلی این دستورالعمل‬
‫بصورت زیر میباشد‪.‬‬
‫;معرفی کنترل گر حلقه‬
‫;مقدار دهی اوليه کنترل گر حلقه‬
‫‪do‬‬
‫; دستورالعمل ‪{ 1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫;گام حرکت‬
‫;)شرط (‪} while‬‬
‫‪do‬‬
‫}‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫;)شرط (‪} while‬‬
‫تفاوت دستورهاي ‪do while‬و ‪while‬‬
‫در دستورالعمل ‪ while‬ابتدا مقـدار شـرط‬
‫ارزیابی شده اما در دستورالعمل ‪do while‬‬
‫ابتدا دستورالعمل اجرا شده سـپس مقـدار‬
‫شرط ارزیابی میگردد‪ .‬بنابراین دستورالعمل‬
‫‪ do while‬حداقل یك بار انجام می شود ‪.‬‬
: ‫مثال‬
#include <iostream.h>
int main( )
{
int count = 0;
do
cout << count ++<<endl ;
while(count <= 9);
return 0 ; }
‫ را روي ده خط نمایش میدهد‬9 ‫ تا‬0 ‫ارقام‬
‫دستورالعمل ‪break‬‬
‫این دستورالعمل باعث توقف دستورالعمل هاي تکرار( ‪ )for , while ,do while‬شده‬
‫و کنترل به خارج از این دستورالعمل ها منتقل مینماید‪.‬‬
‫مثال ‪: 1‬‬
‫>‪#include <iostream.h‬‬
‫) (‪int main‬‬
‫{‬
‫; ‪float x, s=0.0‬‬
‫; ‪cin >> x‬‬
‫{ )‪while(x <= 1000.0‬‬
‫{)‪if(x < 0.0‬‬
‫; "‪cout << "Error-Negative Value‬‬
‫;‪break‬‬
‫}‬
‫; ‪s += x‬‬
‫}; ‪cin >> x‬‬
‫; ‪cout << s << endl‬‬
‫جمع تعدادی عدد که بین ‪ 0‬و ‪ 1000‬هستند‪ .‬اگر بین‬
‫; ‪return 0‬‬
‫اعداد وارد شده عدد منفی وارد شود‪ ،‬بواسطه دستور‬
‫}‬
‫;‪ break‬حلقه خاتمه می یابد‪.‬‬
‫اگر عدد وارد شده بزرگتر از ‪ 1000‬باشد نیز شرط‬
‫حلقه برآورده نشده و حلقه خاتمه می یابد‬
:2 ‫مثال‬
#include <iostream.h>
int main( )
{
int count = 0 ;
while( 1 )
{
count ++ ;
if(count > 10 )
break ;
}
cout << "counter : " << count << "\n";
return 0 ;
}
counter : 11
‫مثال ‪:3‬‬
‫>‪#include <iostream.h‬‬
‫) (‪void main‬‬
‫{‬
‫;‪int count‬‬
‫;‪float x, sum = 0‬‬
‫; ‪cin >> x‬‬
‫) ‪for(count = 1; x < 1000 . 0; ++ count‬‬
‫{‬
‫; ‪cin >> x‬‬
‫{ )‪if(x < 0.0‬‬
‫;‪cout << "Error – Negative value " <<endl‬‬
‫; ‪break‬‬
‫}‬
‫جمع تعدادی عدد اعشاری که بیشتر از ‪ 0‬و کمتر‬
‫; ‪sum += x‬‬
‫از ‪1000‬هستند را محاسبه می کند‪ .‬اگر بین اعداد‬
‫; ‪cin >> x‬‬
‫وارد شده عدد منفی وارد شود‪ ،‬بواسطه دستور‬
‫}‬
‫;‪ break‬حلقه خاتمه می یابد‪.‬‬
‫; ‪cout << sum << \n‬‬
‫اگر عدد وارد شده بزرگتر یا مساوی ‪ 1000‬باشد‬
‫}‬
‫نیز شرط حلقه برآورده نشده و حلقه خاتمه می یابد‬
‫مثال ‪:4‬‬
‫>‪#include <iostream.h‬‬
‫) (‪int main‬‬
‫{‬
‫; ‪float x , sum = 0.0‬‬
‫{ ‪do‬‬
‫; ‪cin >> x‬‬
‫)‪if(x < 0.0‬‬
‫{‬
‫; ‪cout << "Error – Negative Value" << endl‬‬
‫; ‪break‬‬
‫جمع تعدادی عدد که بین ‪ 0‬و ‪ 1000‬هستند‪ .‬اگر بین اعداد‬
‫}‬
‫وارد شده عدد منفی وارد شود‪ ،‬بواسطه دستور ;‪break‬‬
‫حلقه خاتمه می یابد‪.‬‬
‫اگر عدد وارد شده بزرگتر از ‪ 1000‬باشد نیز شرط حلقه‬
‫برآورده نشده و حلقه خاتمه می یابد‪.‬‬
‫نکته‪ :‬اين حلقه حداقل يک بار اجرا می شود‪ ....‬حتی اگر‬
‫عدد اول بزرگتر از ‪ 1000‬باشد نيز در مجموع شرکت‬
‫داده خواهد شد‪ .‬سپس از حلقه خارج خواهيم شد‪.‬‬
‫; ‪sum += x‬‬
‫;)‪} while(x <= 1000.0‬‬
‫; ‪cout << sum << endl‬‬
‫; ‪return 0‬‬
‫}‬
‫دستورالعمل ‪continue‬‬
‫از دستورالعمل ‪ continue‬میتوان در دستورالعمل هـاي تکـرار ‪، do while‬‬
‫‪ for ، while‬استفاده نمود‪ .‬این دستورالعمل باعث میشود که کنترل به ابتـداي‬
‫دستورالعمل هاي تکرار منتقل گردد‪.‬‬
‫(تذکر‪ :‬در ابتداي حلقه بایستی شرط حلقه نيز بررسی شود)‬
‫پس بهتر است بگویيم به انتهاي بدنه حلقه تکرار رفته و از آن جا ادامه می دهد‪.‬‬
‫مثال ‪:1‬‬
‫جمع تعدادی عدد که کوچکتر و مساوی ‪1000‬‬
‫هستند را بدست می اورد‪ .‬اگر بین اعداد وارد‬
‫شده عدد منفی وارد شود‪ ،‬در حاصل جمع‬
‫شرکت نخواهد کرد و اجرای دستورالعمل ها به‬
‫انتهای حلقه هدایت خواهد شد‪.‬‬
‫اگر عدد وارد شده بزرگتر از ‪ 1000‬باشد نیز‬
‫شرط حلقه برآورده نشده و حلقه خاتمه می یابد‪.‬‬
‫نکته‪ :‬اين حلقه حداقل يک بار اجرا می شود‪....‬‬
‫حتی اگر عدد اول بزرگتر از ‪ 1000‬باشد نيز در‬
‫مجموع شرکت داده خواهد شد سپس از حلقه‬
‫خارج خواهيم شد‪.‬‬
‫>‪#include <iostream.h‬‬
‫) (‪int main‬‬
‫{‬
‫; ‪float x, sum = 0.0‬‬
‫{ ‪Do‬‬
‫; ‪cin >> x‬‬
‫)‪if(x < 0 . 0‬‬
‫{‬
‫; ‪cout << "Error" << endl‬‬
‫; ‪continue‬‬
‫}‬
‫; ‪sum += x‬‬
‫;) ‪} while(x <= 1000.0‬‬
‫; ‪cout << sum‬‬
‫} ; ‪return 0‬‬
‫مثال ‪:2‬‬
‫‪ n‬عدد از ورودی خوانده‪ .‬در صورتیکه صفر نباشد ان را‬
‫در مجموع اعداد شرکت می دهد‪.‬‬
‫در نهایت میانگین اعداد غیر صفر را محاسبه می کند‬
‫>‪#include <iostream.h‬‬
‫) (‪int main‬‬
‫{‬
‫; ‪int n , navg = 0‬‬
‫; ‪float x, avg, sum = 0‬‬
‫‪ n * /‬عبارت از تعداد اعداد ورودي * ‪cin >> n ; /‬‬
‫) ‪for(int count = 1 ; count <=n; ++ count‬‬
‫{‬
‫; ‪cin >> x‬‬
‫; ‪if(x == 0 ) continue‬‬
‫; ‪sum += x‬‬
‫; ‪++ navg‬‬
‫}‬
‫;‪avg = sum / navg‬‬
‫; ‪cout << avg << endl‬‬
‫; ‪return 0‬‬
‫}‬
‫دستورالعمل ‪switch‬‬
‫همانطور که می دانيد از دستورالعمل شرطی(‪ )if else‬می توان بصورت تودرتو‬
‫استفاده نمود ولی از طرفی اگر عمق استفادة تو در تو از این دستورالعمل زیـاد‬
‫گردد‪ ،‬درك آن ها مشکل می شود ‪ .‬براي حل این مشکل ‪ ، C++‬دسـتورالعمل‬
‫‪ switch‬که عمالً یك دستورالعمل چند انتخابی میباشد را ارائه نموده است‪.‬‬
Switch ‫شكل کلي دستور العمل‬

switch(‫)عبارت‬
{
case valueone : statement;
break;
case
valuetwo: statement;
break;
case
valuen : statement;
break;
default: statement ;
}
#include <iostream.h>
void main( )
{
unsigned int n ;
cin >> n;
switch(n)
{
case 0:
cout << "ZERO" << endl ;
break;
case 1:
cout << "one" << endl ;
break ;
case 2:
cout << "two" << endl ;
break;
default :
cout << "default" << endl;
}
/ * end of switch statement * /
}
: 1 ‫مثال‬
#include <iostream.h>
void main( )
{
unsigned int n;
cin >> n ;
switch(n) {
case 0:
case 1:
case 2:
cout << "Less Than Three" << endl;
break;
case 3:
cout << "Equal To Three" << endl ;
break;
default:
cout << "Greater Than Three" << endl;
}
}
: 2 ‫مثال‬
‫تابع )(‪: cin.get‬‬
‫این تابع یك کرکتر را از صفحه‬
‫کليد میگيرد‪ .‬براي استفاده از این‬
‫تابع در ابتداي برنامه بایستی داشته‬
‫باشيم‪:‬‬
‫‪#include‬‬
‫>‪<iostream.h‬‬
‫قطعه برنامه ذیل یك کرکتر را از صفحه کليد گرفته و نمایش میدهد‪.‬‬
‫‪char‬‬
‫;‪x‬‬
‫;) (‪x = cin.get‬‬
‫; ‪cout << x‬‬
‫برنامة ذیل یك سطر متن انگليسی که به ‪ CTRL Z‬ختم می شود را گرفته دقيقاً نمایش میدهد‪.‬‬
‫>‪<iostream.h‬‬
‫‪#include‬‬
‫) (‪int main‬‬
‫{‬
‫;‪char x‬‬
‫)‪while((x = cin.get( )) !=EOF‬‬
‫; ‪cout << x‬‬
‫; ‪return 0‬‬
‫}‬
‫‪ EOF‬بـه معنـی ‪ End of File‬مـیباشـد کـه در‬
‫‪ iostream.h‬تعریف شده و مقـدار آن برابـر بـا ‪-1‬‬
‫مــیباشــد‪ .‬مقــدار آن در سيســتم عامــل ‪DOS‬‬
‫عبارتست از ‪. ctrl z‬‬
.‫ استفاده شده است‬switch ‫ و دستور‬cin.get() ‫در قطعه برنامه ذيل ازتابع‬
char
x;
x = cin.get( );
switch(x) {
case  r  :
case  R  :
cout << RED << \n ;
break ;
case  b  :
case  B  :
cout << BLUE << endl ;
break ;
case  y  :
case  Y  :
cout << YELLOW << endl; break;
}
.‫) آن را حذف نموده و نمایش می دهد‬blank( ‫برنامة ذیل یك سطر متن انگليسی را گرفته کرکترهاي خالی‬
#include
<iostream.h>
int main( )
{
char next;
while((next = cin.get( ) ) !=EOF)
if(next !=   )
cout << next ;
return 0 ;
}
‫تمرین ‪ :‬برنامه اي با استفاده از ساخنار ‪ switch case‬که یك عملگر و‬
‫دو عملوند را از ورودي خوانده ‪ ،‬عملگر را بر روي عملوند اجرا نمایيد‪.‬‬
‫عملگر ‪static_cast‬‬
‫از این عملگر براي تبدیل موقت یك نوع ‪ data‬به نوع دیگر‬
‫استفاده میشود‪ .‬این عملگر یك عملگر یکتائی میباشد‪.‬‬
‫مثال ‪:1‬‬
‫; ‪int x = 25‬‬
‫; ‪float y‬‬
‫; )‪y = static_cast < float >(x‬‬
‫مقدار ‪ x‬موقتاً بصورت اعشاري در می آید و در نتيجـه مقـدار ‪ y‬برابـر بـا‬
‫‪ 25.0‬می شود‪ .‬بایستی توجه داشت که نوع متغير ‪ x‬عوض نمی شـود بلکـه‬
‫موقتاً مقدار آن بصورت اعشاري در آمده است‪.‬‬
‫مثال ‪:2‬‬
‫; ‪float x = 14.75‬‬
‫;‪cout << static_cast < int >(x) << endl‬‬
‫; ‪cout << x‬‬
‫ابتدا مقدار ‪ 14‬نمایش داده می شـود‬
‫و ســپس مقــدار ‪ 14.75‬نمــایش داده‬
‫ميشود‪.‬‬
‫جدول اولويت عملگرها‬
‫(‬
‫چ پ به راس ت‬
‫راس ت به چ پ‬
‫)‬
‫‪sizeof‬‬
‫‪-‬‬
‫‪+‬‬
‫‪Static_cast < >( ) ++‬‬
‫‪--‬‬
‫چ پ به راس ت‬
‫‪* / %‬‬
‫چ پ به راس ت‬
‫‪+ -‬‬
‫چ پ به راس ت‬
‫چ پ به راس ت‬
‫<<‬
‫>>‬
‫=> > =<‬
‫چ پ به راس ت‬
‫=!‬
‫==‬
‫راس ت به چ پ‬
‫‪:‬‬
‫?‬
‫راس ت به چ پ‬
‫چ پ به راس ت‬
‫=‪-‬‬
‫=‪*= /= %‬‬
‫‪,‬‬
‫<‬
‫=‪+‬‬
‫=‬
‫تمرين‬
‫‪ .1‬برنامه اي كه یک سکه ‪ 100‬ریالی را به سکه هاي ‪2‬و‪ 5‬و‪10‬و‪ 20‬و ‪50‬‬
‫ریالی خرد كند‪.‬‬
‫‪ .2‬برنامه اي كه خروجی زیر را چاپ كند‪:‬‬
‫‪ .3‬برنامه اي كه حاصل عبارت زیر را بدست اورد‪:‬‬
‫‪N‬‬
‫!‪N‬‬
‫‪S  1  22!  33!  ....‬‬
‫فصل چهارم‬
‫اعداد تصادفی‬
‫فهرست مطالب فصل چهارم‬
‫‪ .1‬توليد اعداد تصادفی‬
‫‪ .2‬تعریف نوع داده ( ‪) typedef‬‬
‫‪ .3‬داده هاي از نوع شمارشی‬
‫اعداد تصادفي‬
‫مقادیر تصادفی یا شانسی در اکثر برنامـههـاي کـاربردي در زمينـه شـبيه سـازي و بازیهـاي‬
‫کامپيوتري نقش مهمی را ایفا مینمایند‪ .‬براي ایجاد یك عدد تصادفی صـحيح بـين ‪ 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 ;
}
‫تعريف نوع داده (‪)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‬‬
‫‪:‬‬
‫توجه ‪:‬‬
‫بایستی در نظر داشت که داده هاي از نوع شمارشـی‬
‫در عمليات ورودي و خروجـی شـرکت نمـینماینـد‪.‬‬
‫بعبارت دیگـر مقـادیر داده هـاي از نـوع شمارشـی‬
‫بایستی در برنامه تعيـين نمـود‪ .‬دسـتورالعمل هـاي‬
‫ورودي و خروجی مانند ‪ cin‬و ‪ cout‬در مورد دادههاي‬
‫شمارشی نمیتوان استفاده نمود‪.‬‬
‫فصل پنجم‬
‫آرایه ها‬
‫فهرست مطالب فصل پنجم‬
‫‪ .1‬آرایه یك بعدي‬
‫‪ .2‬آرایه دو بعدي ( ماتریس ها )‬
‫آرايه يك بعدي‬
‫آرایه یك فضاي پيوسته از حافظه اصلی کامپيوتر میباشد که میتواند‬
‫چندین مقدا را در خود جاي دهد‪.‬‬
‫کليه عناصر یك آرایه از یك نوع میباشند‪.‬‬
‫عناصر آرایه بوسيله اندیس آن ها مشخص میشوند‪.‬‬
‫در ‪ ، C++‬اندیس آرایه از صفر شروع میشود‪.‬‬
‫کاربرد آرايه ها‬
‫آرایهها در برنامهنویسی در مواردي کاربرد دارند که‬
‫بخواهيم اطالعات و دادهها را در طول اجراي‬
‫برنامه حفظ نمائيم‪.‬‬
‫; ]‪int x[5‬‬
‫‪x‬‬
‫‪4‬‬
‫پنجمين عنصر ]‪x[4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫اولين عنصر ]‪x[0‬‬
‫تخصيص مقادير اوليه به عناصر آرايه ‪:‬‬
‫;}‪int x[5]= {4, 2, 5, 17, 30‬‬
‫‪30‬‬
‫‪17‬‬
‫‪4‬‬
‫‪3‬‬
‫‪x‬‬
‫‪5‬‬
‫‪2‬‬
‫‪4‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫دریافت مقادیر عناصر آرایه ‪:‬‬
‫;]‪int x[5‬‬
‫)‪for(int i=0; i<=4; ++i‬‬
‫; ] ‪cin >> x[ i‬‬
‫نمایش مقادیر عناصر آرایه ‪:‬‬
‫)‪for(int i=0; i<5; ++i‬‬
‫; ] ‪cout << x[ i‬‬
‫اگر تعداد مقادير اوليه کمتر از تعداد عضوهاي آرايه باشد عضوهاي باقيمانده بطور اتوماتيك‪ ،‬مقدار اوليه صفر ميگيرند‪.‬‬
‫;}‪int x[5] = {12, 5, 7‬‬
‫‪0‬‬
‫‪0‬‬
‫‪4‬‬
‫‪3‬‬
‫‪x‬‬
‫‪7‬‬
‫‪5‬‬
‫‪12‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫بايستي توجه داشت که آرايهها به صورت ضمني مقدار اوليه صفر نميگيرند‪ .‬برنامه نويس بايد به عضو اول آرايه‪،‬‬
‫مقدار اوليه صفر تخصيص دهد تا عضوهاي باقيمانده بطور اتوماتيك‪ ،‬مقدار اوليه صفر بگيرند‪.‬‬
‫; }‪int x[5] = {0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪4‬‬
‫‪3‬‬
‫‪x‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫دستور زير يك آرايه يك بعدي شش عنصري از نوع ‪ float‬ايجاد مينمايد‪.‬‬
‫; }‪float x[ ] = {2.4, 6.3, -17.1, 14.2, 5.9, 16.5‬‬
‫‪16.5‬‬
‫‪5.9‬‬
‫‪14.2‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪x‬‬
‫‪-17.1‬‬
‫‪6.3‬‬
‫‪2.4‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫ عدد اعشاري و مثبت را گرفته تشکيل یك آرایه می دهد سپس مجموع عناصر آرایه را‬100 ‫برنامه ذیل‬
.‫مشخص نموده نمایش میدهد‬
#include <iostream.h>
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++)
tot += x[ j ] ;
cout << tot ;
return 0 ;
}
‫ عدد اعشاري را گرفته تشكيل يك آرايه داده سپس کوچكترين عنصر آرايه را‬20 ‫برنامه ذيل‬
.‫مشخص و نمايش ميدهد‬
#include <iostream.h>
#include <conio.h>
int main( )
{
float x[20], s;
int j ;
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 ;
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<4; 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 ;
}
‫برنامه که عناصر ماتریس ‪ 3*2‬را از ورودي خوانده و بزرگترین عنصر هر سطر را پيدا کرده و به‬
‫همراه شماره سطر آن جاپ نماید‪.‬‬
‫ضدحال‪!...‬‬
‫فصل ششم‬
‫توابع‬
‫فهرست مطالب فصل ششم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫تعریف تابع‬
‫تابع بازگشتی‬
‫توابع درون خطی‬
‫انتقال پارامترها از طریق ارجاع‬
‫کالس هاي حافظه ( ‪) storage classes‬‬
‫سربارگذاري توابع‬
‫تعريف توابع‬
‫استفاده از توابع در برنامهها به برنامهنویس این امکان را میدهـد کـه‬
‫بتواند برنامههاي خود را به صورت قطعه قطعه برنامه بنویسد‪ .‬تا کنـون‬
‫کليه برنامههـائی کـه نوشـتهایـم فقـط از تـابع ) (‪ main‬اسـتفاده‬
‫نمودهایم ‪.‬‬
‫شكل کلي توابع بصورت زير ميباشند ‪:‬‬
‫نوع مقدار برگشتی‬
‫ليست پارامتر ها جهت انتقال اطالعات از تابع احضار کننده به تابع فراخوانده شده‬
‫)‪return-value-type function-name (parameter-list‬‬
‫{‬
‫‪declaration and statements‬‬
‫نام تابع‬
‫}‬
‫تعریف اعالنهاي تابع و دستورالعمل هاي اجرائی‬
‫تابع زیر یك حرف کوچك را به بزرگ تبدیل مینماید‪.‬‬
‫نوع مقدار برگشتی‬
‫پارامتري از نوع ‪char‬‬
‫کد حرف بزرگ‪ = 32 +‬کد حرف کوچک ‪//‬‬
‫یا‬
‫نام تابع‬
‫)‪char low_to_up (char c1‬‬
‫{‬
‫;‪char c2‬‬
‫;‪c2 = (c1>=  a  && c1<=  z )?(c1 - 32): c1‬‬
‫; )‪return (c2‬‬
‫}‬
‫)‪if (c1>=  a  && c1<=  z ‬‬
‫;‪c2=c1-32‬‬
‫;‪else c2=c1‬‬
.‫برنامه کامل که از تابع قبل جهت تبدیل یك حرف کوچك به بزرگ استفاده مینماید‬
#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;
// if (x>=y) z=x; else z=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;
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 0;
}
main ‫ در‬a
20
modify‫ در‬a
20
modify‫ در‬a
40
: ‫خروجی برنامه‬
20
40
20
‫احضار بوسيله مقدار ( ‪) Call By Value‬‬
‫‪ a‬در ‪main‬‬
‫‪20‬‬
‫‪ a‬در‪modify‬‬
‫‪20‬‬
‫‪ a‬در‪modify‬‬
‫‪40‬‬
‫>‪#include <iostream.h‬‬
‫;)‪int modify(int‬‬
‫) (‪int main‬‬
‫{‬
‫;‪int a=20‬‬
‫;‪cout << a << endl‬‬
‫; )‪modify(a‬‬
‫;‪cout << a << endl‬‬
‫; ‪return 0‬‬
‫}‬
‫)‪int modify(int a‬‬
‫{‬
‫;‪a *= 2‬‬
‫;‪cout << a << endl‬‬
‫در این نوع احضـار تـابع حافظـه هـاي مـورد‬
‫;‪return 0‬‬
‫اســـتفاده آرگومـــان هـــا و پارامترهـــا‬
‫}‬
‫از هم متمایزند و هرگونه تغييـر در پارامترهـا‬
‫باعــــــــــــــث تغيــــــــــــــر‬
‫در آرگومان هاي متناظر نمیگردد‪.‬‬
‫تابع بازگشتي (‪)recursive functions‬‬
‫توابع بازگشتی یا ‪ recursive‬توابعی هستند که‬
‫وقتی احضار شوند باعث میشوند که خود را احضار نمایند‪.‬‬
‫نحوه محاسبه فاکتوريل از طريق تابع بازگشتي‬
‫‪n != 1*2*3*…*(n-1) *n‬‬
‫! ‪f(n) = n‬‬
‫اگر ‪n=1/ 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‬‬
‫‪1‬‬
‫اگر ‪n=2‬‬
‫‪1‬‬
‫در غير اینصورت‬
‫)‪fib(n-1)+fib(n-2‬‬
‫در اسالید بعد تابع بازگشتی مورد نظر پياده سازي شده است‪.‬‬
‫=)‪ = fib(n‬جمله ‪ n‬ام‬
.‫) را مشخص و نمایش میدهد‬fibonacci( ‫ امين مقدار دنبالة فيبوناچی‬n ‫برنامهزیر‬
#include <iostream.h>
long int fib(long int); // forward declaration
int main( )
{
long int r ;
int n ;
cout <<  Enter an integer value  << endl ;
cin >> n ;
r = fib(n) ;
cout << r << endl ;
return 0 ;
}
long int fib(long int n)
{ if (n==0) return 0;
else
if(n = = 1 || n= = 2)
return 1 ;
else
return(fib(n-1) + fib(n-2) ) ;
}
.‫برنامه زير يك خط متن انگليسي را گرفته آن را وارون نموده نمايش ميدهد‬
# include <iostream>
# include <conio.h>
using namespace std;
void reverse(void) ; // forward declaration
int main( )
{
reverse( ) ;
getch();
return 0 ;
}
void reverse(void)
// read a line of characters and reverse it
{
char c ;
if( (c=cin.get()) != '\n')
reverse( );
cout << c ;
return ;
}
‫انتقال پارامترها از طريق ارجاع‬
‫تاکنون وقتی تابعی را احضار میکردیم یك کپی از مقادیر آرگومان ها درپارامترهاي متناظر‬
‫قرار میگرفت ‪ .‬این روش احضار بوسيله مقدار یا ‪ call by value‬ناميده شد‪.‬‬
‫در انتقال پارامترها از طریق ارجاع در حقيقت حافظه مربوط به آرگومان ها و پارامترهاي متناظر‬
‫بصورت اشتراکی مورد استفاده قرار میگيرد‪ .‬این روش ‪call by reference‬‬
‫ناميده میشود ‪.‬‬
‫انتقال پارامترها از طريق ارجاع‬
‫در این روش پارامترهائی که از طریق ‪ call by reference‬عمل مینمایند در‬
‫پيش نمونه تابع قبل از نام چنين پارامترهائی از & استفاده میشود‪.‬واضح است‬
‫که در تعریف تابع نيز بهمين طریق عمل میشود‪.‬‬
#include <iostream.h>
int vfunct(int);
void rfunct (int &) ;
int main( )
x
{
int x=5, y=10;
5
cout << x << endl << vfunct(x) << endl << x << endl ;
cout << y << endl ;
rfunct(y) ;
cout << y << endl ;
.‫تغيير نمی کند‬x ‫مقدار آرگومان‬
return 0 ;
}
int vfunct(int a)
{
return a *= a ;
}
void rfunct(int &b)
{
x
y b
b *= b ;
}
5
10 100
: ‫مثال‬
y
10
: ‫خروجی‬
5
25
5
10
: ‫ادامه خروجی‬
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;
}
‫توابع درون خطي (‪)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 ;
}
‫کالسهاي حافظه (‪)storage classes‬‬
‫متغيرها بدو طریق متمایز مشخص میشوند یکی بوسيله نوع (‪ )type‬آن ها و دیگري بوسيله‬
‫کالس حافظه آن ها‪ .‬نوع متغير قبالً اشاره شده بعنوان مثال ‪ . . . ، double ، float ، int‬ولی‬
‫کالس حافظة یك متغير در مورد طول عمر و وسعت و دامنة متغير بحث مینماید‪.‬‬
‫در اسالید بعد به انواع کالس حافظه می پردازیم‪.‬‬
‫بطور کلي کالس حافظه متغيرها به چهار دستة تقسيم ميگردد ‪:‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪automatic‬‬
‫‪static‬‬
‫‪external‬‬
‫‪register‬‬
‫متغيرهاي ‪ automatic‬در درون یك تابع تعریف مـیشـوند و در تـابعی کـه‬
‫اعالن میشود بصورت متغيرهاي محلی براي آن تابع میباشند‪ .‬حافظه تخصـيص‬
‫داده شده به متغيرهاي ‪ automatic‬پس از اتمام اجراي تابع از بـين مـی رود‬
‫بعبارت دیگر وسعت و دامنة متغيرهاي از نوع ‪ automatic‬تابعی میباشـد کـه‬
‫متغير در آن اعالن گردیده است‪.‬‬
‫متغيرهاي ‪ static‬نيز در درون توابع تعریف می شوند و از نظر وسعت و دامنه شبيه‬
‫متغيرهاي ‪ automatic‬هستند ولی در خاتمة اجراي تابع‪ ،‬حافظه وابسته به این نوع‬
‫متغيرهـــا از بين نمیرود بلکه براي فراخوانی بعدي تابع باقی میماند‪.‬‬
‫و به دودسته تقسيم می شوند‬
‫‪1‬متغير هاي استاتيک محلی‬‫‪2‬متغير هاي استاتيک عمومی‬‫مقدار اوليه متغيرهاي استاتيک محلی و عمومی صفر است‪.‬‬
‫در اسالید بعد به یك مثال از کاربرد این نوع کالس حافظه می پردازیم‪.‬‬
‫• فقط در همان تابعی که تعریف می شوند قابل استفاده اند‪.‬‬
‫• هنگام فراخوانی تابع ایجاد می شوند و به هنگام خروج تابع ‪ ،‬آخرین مقدار‬
‫خودشان را حفظ می کنند‪.‬‬
‫•فقط یك با مقدار اوليه می گيرند‪.‬‬
‫در اسالید بعد به یك مثال از کاربرد این نوع کالس حافظه می پردازیم‪.‬‬
: ‫مثال‬
#include <iostream.h>
#include <conio.h>
Void test(void);
int main( )
{
Int i;
For (i=0 ; i<5; i++)
test();
return 0 ;
}
Void test(void)
{
Static int y=0;
Int x=0;
Cout<<“\n outo x= “<<x<<“, static y=“<<y;
X++;
Y++;
}
: ‫مثال‬
#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>
External int w; // external variable
functa(int x, int y)
{
cout << w ;
w=x+y;
cout << endl << w << enld;
return x%y ;
}
int main( )
{
int a, b, c, d;
cin >> a >> b ;
c=functa(a, b) ;
d=functa(w, b+1);
cout << endl << c << endl << d << endl << w ;
return 0 ;
}
: ‫مثال‬
‫بایستی توجه داشت که اگر در‬
‫توابــع بــه متغيرهــاي از نــوع‬
‫ مقــــدار اوليــــه‬external
‫تخصيص ندهيم مقـدار صـفر‬
‫بصورت اتوماتيك براي آنها در‬
.‫نظر گرفته میشود‬
‫وقتی متغيري از نوع ‪ register‬اعالن میشود از کامپيوتر عمالً درخواست‬
‫میشود که به جاي حافظه از یکی از رجيسترهاي موجود استفاده نماید‪.‬‬
‫کاربرد کالس ‪register‬‬
‫معموالً از نوع رجيستر براي شاخصهاي دستور تکرار و یا اندیس هاي آرایهها‬
‫استفاده میشود‪ .‬بایستی توجه داشت که متغيرهاي از نوع رجيستر قابل استفاده‬
‫دردستور ‪ cin‬نمیباشند‬
‫;‪register int i‬‬
‫)‪for(i=1;i<=10;i++‬‬
‫;”‪cout<<“hi‬‬
‫سربارگذاري توابع (‪)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 ;
}
‫برنامه اي که با استفاده ار تابعي به نام )(‪، Square‬‬
‫مربع يك عدد را محاسبه مي کند‬
‫دقت شود این برنامه باید بتواند مربع یك عدد صحيح و اعشاري را با استفاده‬
‫از توابع سرباگذاري محاسبه نمایيد‪.‬‬
‫تمرين‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫برنامه اي بنویسيد كه ‪ 3‬عدد اعشاري را خوانده و به تابعی ارسال كند و تابع‬
‫ميانگين آن ها را محاسبه كرده و برگرداند‪.‬‬
‫برنامه اي كه ضرایب معادله ي درجه دومی را خوانده‪ ،‬آن ها را به تابعی‬
‫ارسال كند‪ .‬تابع معادله را حل كند و جواب ها را در خروجی چاپ كند‪( .‬تابع‬
‫جواب ها را به تابع اصلی برنمی گرداند‪).‬‬
‫برنامه اي بنویسيد كه عددي را از ورودي خوانده و هریک از ارقام آن را در‬
‫یک سطر چاپ كند‪ .‬تفکيک و چاپ ارقام توسط تابع بازگشتی صورت گيرد‪.‬‬
‫برنامه اي بنویسيد كه حاصلضرب دو عدد صحيح را به كمک جمع كردن‬
‫محاسبه كند‪ .‬براي این كار از تابع بازگشتی استفاده كنيد‪.‬‬
‫‪= a×b‬‬
‫‪a‬‬
‫‪a×(b-1)+a‬‬
‫اگر ‪b=1‬‬
‫اگر ‪b>1‬‬
1
# include <iostream>
# include <conio.h>
using namespace std;
float average(float a, float b, float c){return ((a+b+c)/3);}
void main()
{
float x, y, z;
cin>>x>>y>>z;
cout<<average(x,y,z);
getch();
}
# include <iostream>
# include <conio.h>
# include <math.h>
using namespace std;
void f(int a, int b, int c){
float delta = (b*b)-(4*a*c);
if(delta == 0)
cout<<"The only answer:n"<<"x= "<<(-b)/(2*a);
else if(delta > 0)
{
cout<<"Two answers:n"<<"x1= "<<(-b+sqrt(delta))/(2*a);
cout<<"x2= "<<(-b-sqrt(delta))/(2*a);
}
}
void main() {
2
float x, y, z;
cin>>x>>y>>z;
f(x,y,z);
getch();
}
# include <iostream>
# include <conio.h>
# include <math.h>
using namespace std;
void f(int a)
{if (a>10) f(a/10);
cout<<(a%10)<<endl;
}
void main()
{
int n;
cin>>n;
f(n);
getch();
}
3
4
# include <iostream>
# include <conio.h>
# include <math.h>
using namespace std;
int f(int a,int b)
{if (b==1) return a;
return (f(a,b-1)+a);
}
void main()
{
int n,m;
cin>>n>>m;
cout<<f(n,m);
getch();
}
‫فصل هفتم‬
‫ساختار ها و اشاره گرها‬
‫فهرست مطالب فصل هفتم‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫ساختارها‬
‫‪ Union‬ها‬
‫اشاره گرها ( ‪) Pointer‬‬
‫تعریف آرایه‬
‫آرایه هاي دو بعدي و اشاره گرها‬
‫تخصيص حافظه بصورت پویا ( عملگر ‪) new‬‬
‫رشته ها و توابع مربوطه‬
‫ساختارها‬
‫ساختارها شبيه آرایهها بوده بدین صورت که یك نوع داده گروهی است که فضاي‬
‫پيوسته از حافظه اصلی را اشغال مینماید‪ .‬اما عناصر ساختار الزاماً از یك نوع‬
‫نمیباشند بلکه اعضاي یك ساختار میتوانند از نوعهاي مختلف از قبيل ‪، char‬‬
‫‪ … ، float ، int‬باشند‪.‬‬
‫تعريف ساختار‬
‫نام ساختار‬
struct time
{
int hour ; // 0 – 23
int minute ; // 0 – 59
int second; //
};
‫اعضا ساختار‬
‫مثال ‪:‬‬
‫{ ‪struct account‬‬
‫; ‪int acc_no‬‬
‫;‪char acc_type‬‬
‫; ]‪char name[80‬‬
‫; ‪float balance‬‬
‫;}‬
‫ساختار ‪ account‬داراي چهار عضو میباشد‪.‬‬
‫‪ acc_no‬شماره حساب از نوع ‪int‬‬
‫‪ acc_type‬نوع حساب از نوع ‪char‬‬
‫مشخصات صاحب حساب از نوع رشتة ‪ 80‬کرکتري‬
‫‪name‬‬
‫‪ balance‬مانده حساب از نوع ‪float‬‬
: ‫به دو صورت مي توان اعالن يك متغير از نوع ساختار را نمايش داد‬
: ‫روش اول‬
struct account
{
int acc_no;
char acc_type;
char name[80];
float balance;
} cust1, cust2, cust3;
: ‫روش دوم‬
struct account
{
int acc_no ;
char acc_type;
char name[80];
float balance;
};
account cust1, cust2, cust3;
‫به ساختارها میتوان مقدار اوليه نيز تخصيص داد‬
‫;}‪account cust = {4236, r, Nader Naderi , 7252.5‬‬
‫دسترسی به عناصر یك ساختار‬
‫‪.‬‬
‫بمنظور دسترسی به عناصر یك ساختار از عملگر استفاده‬
‫میگردد ‪ .‬عملگر‪ .‬جزء عملگرهاي یکتائی میباشد‪.‬‬
: ‫مثال‬
cust .acc_no = 4236;
cust .acc_type = r;
cust . name = Nader Naderi;
cust . balance = 7252.5;
: ‫نكته‬
struct date {
int month;
int day;
int year;
};
struct account {
int acc_no ;
char acc_typer;
char name[80];
float balance ;
date lastpay ;
};
.‫عضو یك ساختار خود میتواند یك ساختار دیگر باشد‬
‫اگرداشته باشيم‬
account x, y ;
‫ بوسيله‬lastpay ‫آنگاه عضو‬
x.lastpay.day
x.lastpay.month
x.lastpay.year
.‫مشخص میگردد‬
‫نكته ‪:‬‬
‫میتوان آرایهاي تعریف نمود که هر عضو آن یك ساختار باشد و حتی به آنها مقادیر اوليه تخصيص نمود‪.‬‬
‫{ ‪struct struc1‬‬
‫;]‪char name[40‬‬
‫;‪int pay1‬‬
‫;‪int pay2‬‬
‫;}‬
‫‪struc1 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 ;
}
‫‪union‬‬
‫‪ union‬از نظر ساختاري شبيه ‪ struct‬می باشد ‪ .‬با این تفاوت که عضـوهائی‬
‫که تشکيل ‪ union‬ميدهد همگی از حافظه مشـترکی در کـامپيوتر اسـتفاده‬
‫مینمایند‪ .‬بنابراین استفاده از ‪ union‬باعث صرفهجوئی در حافظه میگردد‪.‬‬
‫مثال ‪:‬‬
‫‪union id‬‬
‫{‬
‫;]‪char color [10‬‬
‫;‪int size‬‬
‫;‪} x , y‬‬
‫هر کدام از متغيرهاي ‪ x‬و ‪ y‬یك رشته‬
‫‪ 10‬کرکتري یا یك مقدار از نوع ‪int‬‬
‫میباشد وکامپيوتر یك بلوك حافظه که‬
‫بتواند رشته ‪ 10‬کرکتري رادر خود جاي‬
‫دهد ‪ ،‬براي‪ color‬و ‪ size‬در نظر‬
‫میگيرد‪.‬‬
: ‫مثال‬
union xpq
{
int x ;
char y[2] ;
}p;
x
y[1]
y[0]
‫تمرين‪:‬‬
‫برنامه اي بنویسيم که یك دفترچه تلفن ‪ 20‬تایی (ظرفيت پذیرش ‪ 20‬نام و شماره تلفن را‬
‫داشته باشد)و امکان جستجو در آن را بر اساس نام فرد ایجاد نماید‪.‬‬
‫اشارهگرها (‪)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‬‬
‫;‪X=54‬‬
‫; ‪px = &x‬‬
‫مثال ‪:‬‬
‫; ‪int y , x , *px‬‬
‫‪x‬‬
‫‪px‬‬
‫‪26‬‬
‫حال اگر دستور العمل ; ‪ x += 10‬را بدهيم ‪:‬‬
‫‪x‬‬
‫‪px‬‬
‫‪36‬‬
‫حال اگر دستورالعمل ; ‪ *px = *px + 7‬بدهيم‪.‬‬
‫‪x‬‬
‫‪43‬‬
‫‪px‬‬
‫; ‪x = 26‬‬
‫; ‪px = &x‬‬
‫آرايه يك بعدي و اشاره گرها‬
‫‪x‬‬
‫اولين عنصر آرایه بوسيله ]‪ x[0‬مشخص میشود‪.‬‬
‫آدرس اولين عنصر آرایه بوسيله ]‪ &x[0‬یا بوسيله ‪ x‬مشخص میشود‪.‬‬
‫آدرس ‪ i‬امين عنصر آرایه بوسيله ]‪ &x[i‬یا بوسيله )‪ (x+i‬مشخص میشود‪.‬‬
‫دو دستورالعمل زیر با هم معادلند ‪.‬‬
‫; ‪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‬اشاره نماید‪.‬‬
‫‪x‬‬
‫‪int‬‬
‫‪float‬‬
‫‪char‬‬
‫‪int‬‬
‫‪px‬‬
‫‪a‬‬
‫‪b‬‬
‫‪c‬‬
‫‪d‬‬
‫‪struc1‬‬
‫‪struct‬‬
‫{‬
‫; ‪int a‬‬
‫; ‪float b‬‬
‫;‪char c‬‬
‫; ‪int d‬‬
‫; ‪} x, *px‬‬
‫; ‪px = &x‬‬
‫عبارت ‪ x.a‬معادل ‪ pxa‬معادل ‪ (*px).a‬میباشد‪.‬‬
‫استفاده از آرایهها بعنوان پارامتر تابع مجاز است‪.‬‬
‫در اسالید بعد به یك مثال توجه نمایيد‪.‬‬
‫در برنامه زیر تابع ‪ modify‬آرایه ‪ a‬را بعنوان پارامتر میگيرد‪.‬‬
‫>‪#include <iostream.h‬‬
‫‪void modify(int [ ] ); // forward declaration‬‬
‫خروجی ‪:‬‬
‫) (‪int main‬‬
‫{‬
‫‪1‬‬
‫‪3‬‬
‫; ]‪int a[5‬‬
‫‪2‬‬
‫‪4‬‬
‫)‪for(int j=0; j<=4; ++j‬‬
‫‪3‬‬
‫; ‪a[ j ] = j+1‬‬
‫‪5‬‬
‫; )‪modify(a‬‬
‫‪4‬‬
‫‪6‬‬
‫)‪for(int j=0; j<5; ++j‬‬
‫‪5‬‬
‫‪7‬‬
‫; ‪cout << a[ j ] << endl‬‬
‫; ‪return 0‬‬
‫‪3‬‬
‫}‬
‫‪void modify(int a[ ]) // function definition‬‬
‫‪4‬‬
‫{‬
‫‪5‬‬
‫)‪for(int j=0; j<5; ++j‬‬
‫‪6‬‬
‫; ‪a[ j ] += 2‬‬
‫‪7‬‬
‫)‪for(int j=0; j<5; ++j‬‬
‫; ‪cout << a[ j ] << endl‬‬
‫; ‪return‬‬
‫نکته‪ :‬در این مثال از فراخوانی با مقدار استفاده نشده است‪ .‬براي همين‬
‫}‬
‫تغييرات انجام شده در تابع )(‪ modify‬باعث تغيير در مقادیر ارایه در‬
‫تابع اصلی یا )(‪ main‬شده است‪ .‬این مبحث‪ ،‬تحت عنوان فراخوانی از‬
‫طریق ارجاع در ادامه توضيح داده می شود‪.‬‬
‫در صورتيکه آرایه بيش از یك بعد داشته باشد‬
‫بعدهاي دوم به بعد بایستی در تعریف تابع و پيش‬
‫نمونه تابع ذکر گردد‪.‬‬
‫در اسالید بعد به یك مثال توجه نمایيد‪.‬‬
#include <iostream.h>
void printarr(int [ ][ 3 ]);
int main( )
{
,
int arr1 [2][3] = { {1,2,3}, {4,5,6} } arr2 [2][3]= {1,2,3,4,5}
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 ;
}
}
, arr3 [2][3]={ {1,2}, {4} };
1
4
2
5
3
6
1
4
2
5
3
0
1
4
2
0
0
0
: ‫خروجی‬
‫آرايههاي دوبعدي و اشارهگرها‬
‫یك آرایه دوبعدي بصورت تعدادي آرایه یك بعدي میتوان تعریف نمود‪.‬‬
‫اگر ‪ 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>
int main( )
{
int x[ ]={12, 25, 6, 19, 100}, i;
int *px=x; // ‫ اشاره به عنصر اول آرایه مینماید‬،‫نام آرایه بدون اندیس‬
for(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
#include
int main( )
{
struct rec
{
<iostream.h>
<conio.h>
float a;
int b;
};
int n;
rec *ptr;
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;
getch();
return 0;
}
.‫ جابهجا مینماید‬swap ‫برنامه زیر دو مقدار اعشاري را گرفته مقادیر آن ها را به کمك تابع‬
#include
<iostream.h>
#include
<conio.h>
void swap(float *, float *);
int main( )
{
float a,b,*ptb,*pta;
cin >> a >> b;
pta=&a;
ptb=&b;
swap(pta,ptb); ///////swap(a,b);
cout << a << endl << b << endl ;
return 0;
}
void swap(float *px , float *py)
{
float t;
t = *px;
*px = *py;
*py = t ;
return;
}
‫برنامه اي که تعداد ‪ n‬عدد را از ورودي خوانده ‪ ،‬در آرایه اي قرار می دهد و سپس آرایه را‬
‫به تابعی ارسال می کند ‪.‬تابع تعداد اعداد زوج و فرد را نمایش دهد‪.‬‬
‫رشتهها و توابع مربوطه‬
‫رشتهها در ‪ ، C++‬آرایهاي از کرکترها میباشند که با کرکتر ‪  \0‬ختم می شوند‪.‬‬
‫;‪char name[ ]=  sara‬‬
‫‪s‬‬
‫‪a‬‬
‫‪r‬‬
‫‪a‬‬
‫‪\0‬‬
‫مقداردهي اوليه به رشته‬
‫رشته و اشاره گر‬
‫هر رشته از طریق اشارهگري به اولين کرکتر آن در دسترس قرار میگيرد‪ .‬آدرس یك رشته‪ ،‬آدرس کرکتر‬
‫اول آن میباشد‪ .‬به رشتهها میتوان مقدار اوليه تخصيص داد‪.‬‬
‫;‪char *name =  sara‬‬
‫تابع )‪strcmpi(s1, s2‬‬
‫رشتههاي ‪ s1‬و ‪ s2‬را با هم مقایسه نموده (بدون توجه به حروف کوچك و بزرگ) اگر رشته‬
‫‪ s1‬برابر با رشته ‪ s2‬باشد مقدار صفر و اگر رشته ‪ s1‬کوچکتر از رشته ‪ s2‬باشد یك مقدار‬
‫منفی در غير اینصورت یك مقدار مثبت بر میگرداند‪.‬‬
‫;"‪char *s1= "ALI"; // char s1[10] = "ALI‬‬
‫;"‪char *s2="ali"; //char s2[10]="ali‬‬
‫;‪cout << strcmpi(s1, s2) << endl‬‬
‫‪0‬‬
‫تابع ) ‪strcmp(s1, s2‬‬
‫رشتههاي ‪ s1‬و ‪ s2‬را با هم مقایسه نموده اگر ‪ s1‬برابر با ‪ s2‬باشد مقدار صفر و اگر رشته‬
‫‪ s1‬کوچکتر از رشته ‪ s2‬باشد یك مقدار منفی در غير اینصورت یك مقدار مثبت‬
‫برمیگرداند‪.‬‬
‫;"‪char *s1= "ALI‬‬
‫;"‪char *s2="ali‬‬
‫;"‪char s1[10]= "ALI‬‬
‫;"‪char s2[10]="ali‬‬
‫‪-1‬‬
‫;‪cout << strcmp(s1, s2) << endl‬‬
‫تابع ) ‪strncmp(s1, s2,n‬‬
‫حداکثر ‪ n‬کرکتر از رشتة ‪ s1‬را با ‪ n‬کرکتر از رشتة ‪ s2‬مقایسه نموده در صورتيکه ‪s1‬‬
‫کوچکتر از ‪ s2‬باشد یك مقدار منفی‪ ،‬اگر ‪ s1‬مساوي با ‪ s2‬باشد مقدار صفر در غير‬
‫اینصورت یك مقدار مثبت برميگرداند‪.‬‬
‫‪0‬‬
‫‪32‬‬
‫;"‪*s1= "ali reza‬‬
‫;"‪*s2="ali‬‬
‫;"‪s1[10]= "ali reza‬‬
‫;"‪s2[10]="ali‬‬
‫;‪<< strncmp(s1, s2,3) << endl‬‬
‫‪char‬‬
‫‪char‬‬
‫‪char‬‬
‫‪char‬‬
‫‪cout‬‬
‫;"‪*s1= "ali reza‬‬
‫;"‪*s2="ali‬‬
‫;"‪s1[10]= "ali reza‬‬
‫;"‪s2[10]="ali‬‬
‫;‪<< strncmp(s1, s2,4) << endl‬‬
‫‪char‬‬
‫‪char‬‬
‫‪char‬‬
‫‪char‬‬
‫‪cout‬‬
‫تابع (‪strcat(s1, s2‬‬
‫دو رشتة ‪ s1‬و ‪ s2‬را بعنوان آرگومان گرفته رشتة ‪ s2‬را به انتهاي رشتة ‪ s1‬اضافه‬
‫مینماید‪ .‬کرکتر اول رشتة ‪ s2‬روي کرکتر پایانی ‪ \0‬رشتة ‪ s1‬نوشته میشود ونهایتاً‬
‫رشتة ‪ s1‬را برميگرداند‪.‬‬
‫‪ali reza‬‬
‫;" ‪s1[20]= "ali‬‬
‫;"‪*s2="reza‬‬
‫;"‪s2[20]="reza‬‬
‫;‪<< strcat(s1, s2) << endl‬‬
‫‪char‬‬
‫‪char‬‬
‫‪char‬‬
‫‪cout‬‬
‫تابع (‪strncat(s1, s2,n‬‬
‫دو رشته ‪ s1‬و ‪ s2‬ومقدار صحيح و مثبت ‪ n‬را بعنوان آرگومان گرفته‪ ،‬حداکثر ‪ n‬کرکتر‬
‫از رشتة ‪ s2‬را در انتهاي رشتة ‪ s1‬کپی مینماید‪ .‬اولين کرکتر رشته ‪ s2‬روي کرکتر‬
‫پایانی ‪ \0‬رشتة ‪ s1‬مینویسد ونهایتاً مقدار رشتة ‪ s1‬را برميگرداند‪.‬‬
‫‪ali re‬‬
‫;" ‪s1[20]= "ali‬‬
‫;"‪*s2="reza‬‬
‫;"‪s2[20]="reza‬‬
‫;‪<< strncat(s1, s2,2) << endl‬‬
‫‪char‬‬
‫‪char‬‬
‫‪char‬‬
‫‪cout‬‬
strlen(s( ‫تابع‬
.‫ را بعنوان آرگومان گرفته طول رشته را مشخص مینماید‬s ‫رشتة‬
char *s1= "ali";
char s1[10]= "ali";
cout << strlen(s1);
3
char *s1= "ali ";
char s1[10]= "ali ";
cout << strlen(s1);
4
strcpy(s1,s2) ‫تابع‬
‫ کپی مینماید و‬s1 ‫ را در رشتة‬s2 ‫ را بعنوان آرگومان گرفته رشتة‬s2 ‫ و‬s1 ‫دو رشتة‬
.‫ را بر میگرداند‬s1 ‫نهایتاً مقدار رشتة‬
char
char
char
cout
s1[20]= "ali ";
*s2="reza";
s2[10]="reza";
<< strcpy(s1, s2) << endl;
char
char
char
cout
s1[20];
*s2=“ali";
s2[10]=“ali";
<< strcpy(s1, s2) << endl;
reza
ali
strncpy(s1, s2,n( ‫تابع‬
‫ کرکتر‬n ‫ حداکثر‬،‫ را بعنوان آرگومان گرفته‬n ‫ و مقدار صحيح و مثبت‬s1 , s2 ‫دو رشتة‬
.‫ را برميگرداند‬s1 ‫ نهایتاً مقدار رشتة‬،‫ کپی نموده‬s1 ‫ در رشتة‬s2 ‫را از رشتة‬
char
char
char
cout
char
char
char
cout
s1[20]= "ali ";
*s2="reza";
s2[10]="reza";
<< strncpy(s1, s2,3) << endl;
s1[20];
*s2=“amir ali";
s2[10]=“amir ali";
<< strncpy(s1, s2,4) << endl;
rez
amir
‫براي استفاده از توابع مربوط به‬
‫رشتهها بایستی حتماً در ابتدا برنامه‬
‫>‪ #include <string.h‬را قرار‬
‫دهيم‪.‬‬
.‫ رشته در نظر گرفته آن ها را بترتيب حروف الفباء مرتب نموده نمایش میدهد‬5 ‫برنامه ذیل پنج اسم را بصورت‬
using namespace std;
#include<iostream>
#include<conio.h>
#include<string.h>
void sort(char name[][10])
{char t[10];
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
strcpy(t,name[i]);
strcpy(name[i] , name[j]);
strcpy(name[j] , t) ;
}
}
void main()
{
char name[5][10] = {"sara", "afsaneh", "babak", "saman", "naser" };
sort(name);
// display sorted strings
for(int i=0; i<5; ++i)
cout << name[i] << endl;
getch();
}
: ‫مثال‬
using namespace std;
#include<iostream>
#include<conio.h>
#include<string.h>
int main( )
{
char s1[20]= "happy birthday";
char s2[20]= "happy holidays";
cout << strcmp(s1, s2) << endl;
cout << strncmp(s1, s2, 7) << endl ;
getch();
}
-1
-6
: ‫مثال‬
using namespace std;
#include<iostream>
#include<conio.h>
#include<string.h>
int main( )
{
char s[10] = "sara";
cout << strlen(s);
getch();
}
4
.‫ مي باشد‬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]);
}
‫برنامه اي بنويسيد که رشته اي را از ورودي خوانده‪ ،‬تمام حروف کوچك آن‬
‫رشته را به حروف بزرگ تبديل کرده و چاپ مي کند‪.‬‬
‫• توضيح‪ :‬در این برنامه از تابعی به نام )(‪ upper‬استفاده كنيد كه‬
‫در این تابع باید عمليات تبدیل را انجام دهد‬
‫• نکته ‪ :‬تفاوت كد اسکی حروف كوچک و بزرگ‪ 32‬واحد است براي‬
‫تبدیل ’‪ ‘a‬به ’‪ ‘A‬كافی است از ’‪ ‘a‬به اندازه ‪ 32‬واحد كم كنيد‪.‬‬
‫برنامه اي بنويسيد که رشته اي را که به نقطه ختم مي شود را از ورودي‬
‫خوانده ‪ ،‬کاراکتر هاي موجود در رشته را به همراه تعداد دفعات تكرار آنها‬
‫به خروجي ببرد‬
‫فصل هشتم‬
‫برنامه نویس شی گرا‬
‫فهرست مطالب فصل هشتم‬
‫‪.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‬‬
‫را به راحتی فراهم مینماید‪.‬‬
‫نوع داده انتزاعي‬
‫•برنامه ها براي حل مسائل دنياي واقعی نوشته می شـوند ‪ ،‬مثـل نگهـداري‬
‫اطالعات مربوط به دانشجویان ‪ ،‬نگهداري اطالعات مشتریان بانك ها‪.‬‬
‫•گر چه می توان بسياري از مسئله هاي دنياي واقعی را با اسـتفاده از انـواع‬
‫اوليه حل کرد ‪ ،‬اما با تعریف انواع جدیدي که بتوان اشياي دنياي واقعی ‪ ،‬مثل‬
‫دانشجویان را مدلسازي کنند ‪ ،‬حل مسائل راحتر خواهد بود‬
‫•در زبان برنامه نویسی شی گرا امکان تعریف انواع جدید وجود دارد‬
‫•در زبان برنامه نویسی ‪ C++‬براي تعریف نوع جدید ‪ ،‬از کالس ها اسـتفاده‬
‫می شود‬
‫کالس ها و اشيا‬
‫•کالس ها نوع جدیدي است که برنامه نویس آن را براي حـل مسـئله هـاي‬
‫دنياي واقعی تعریف می کند ‪،‬‬
‫•کالس ها حاوي داده ها و تعریف عمليات است‬
‫•داده هاي عضو کالس را فيلد یا صفت می گویند‪.‬‬
‫•عمليات کالس ها را تابع یا متد می نامند‪.‬‬
‫•شی یك نمونه از کالس است که در تکنيك برنامه نویسی شی گرا یك نهاد‬
‫زمان اجرا می باشد‪.‬‬
‫نكته مهم ‪:‬‬
‫تمام زبانهاي برنامه نویسی شیگرا داراي سه‬
‫خصوصيت مشترك زیر میباشند ‪:‬‬
‫الف‪( encapsulation :‬محصورسازي)‬
‫ب‪( polymorphism :‬چندریختی)‬
‫ج‪( inheritance :‬ارث بري)‬
‫محصورسازي (‪) Encapsulation‬‬
‫محصور سازي یا بسته بندي به معناي این است که تمام جنبه هاي یك نهاد در داخل یـك کـالس جمـع‬
‫آوري و از سایر نهاد ها تفکيك می شود ‪.‬بسته بندي ‪ ،‬مانع از این می شود کـه داده هـا یـك شـی‪،‬‬
‫توسط متد هاي شی دیگري دستيابی شود‪.‬‬
‫‪( polymorphism‬چند ريختي)‬
‫چند ریختی به معناي این است که نهادي مثل متغير ‪ ،‬تابع ‪ ،‬شی‪ ،‬معانی‬
‫یا کاربردهاي مختلفی داشته باشند ‪.‬به عنوان مثال توابع همنام نوعی‬
‫چند ریختی محسوب می شوند‪.‬‬
‫‪( inheritance‬ارث بري)‬
‫ارث بري فرآیندي است که بوسيله آن یك شی (‪ )object‬میتواند‬
‫خاصيتهاي شی دیگري را دارا شود‪.‬‬
‫تعريف کالس و اشيادر‪c++‬‬
‫نام کالس ‪Class‬‬
‫{‬
‫داده ها توابع اختصاصی‬
‫‪Public :‬‬
‫داده ها و عمومی‬
‫‪Private :‬‬
‫داده ها و توابع اختصاصی‬
‫‪Protected:‬‬
‫داده ها و توابع محافظت شده‬
‫;اشایی از کالس}‬
‫مثال‬
‫دستيابي به اعضاي يك کالس‬
‫براي دستيابی به اعضاي یک كالس از (نقطه) به صورت زیر استفاده می شود‪.‬‬
‫نام عضو كالس‪ .‬نام شی كالس‬
‫امکان پذیر نيست ‪em1.name‬‬
‫)(‪Em1.putname‬‬
‫امکان پذیر نيست )(‪Em1.age‬‬
‫برنامه اي که طول و عرض مستطيلي را از ورودي خوانده ‪ ،‬مساحت و محيط آن را به‬
‫خروجي مي برد‬
‫برنامه اي با استفاده از کالس ها بنویسيد که عددي را از ورودي گرفته و فاکتوریل آن را محاسبه‬
‫ونمایش میدهد‪.‬‬
‫پشته (‪)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 empty. ;
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; }
‫سازندهها و نابودکنندهها (‪)constructors and destructors‬‬
‫‪ Initialization‬یا مقدار اوليه دادن بصورت اتوماتيك از طریق تابعی انجام میشود‬
‫بنام تابع ‪ constructor‬یا تابع سازنده‪ .‬تابع سازنده تابع مخصوصی است که‬
‫عضوي از کالس بوده و همنام با کالس میباشد‪.‬‬
‫سازندهها و نابودکنندهها (‪)constructors and destructors‬‬
‫تابع نابود کننده یا ‪ ، destructor‬عکس عمل تابع سازنده را انجام‬
‫میدهد‪ .‬وقتی که شیاي از بين میرود بصورت اتوماتيك تابع نابود کننده‬
‫آن فراخوانی میگردد‪.‬‬
)constructors( ‫سازندهها‬
‫سازندهها با پارامتر (‪)constructors‬‬
‫مثال از سازنده با يك پارامتر‬
‫توابع دوست کالس‬
‫همانطوركه گفته شد تابعی كه عضو كالس نباشد ‪ ،‬نمی تواند به‬
‫اعضاي اختصاصی آن كالس دستيابی داشته باشند‬
‫براي اعالن تابع دوست ‪ ،‬باید الگوي آن را در داخل كالس قرار دهيد و‬
‫كلمه كليدي ‪ Friend‬را قبل از آن ذكر كنيد‪.‬‬
‫برنامه اي که با استفاده از تابع دوست دوعدد را با هم جمع و تفریق می کند‬
‫مثال ‪:‬تابع دوست دو کالس‬
‫مثال ‪:‬کالس هاي دوست‬
‫کالس هاي را می توان دوست کالس هاي‬
‫دیگر معرفی کرد ‪.‬دراین حالت ‪ ،‬کالس‬
‫دوست و تمام توابع عضو آن به اعضاي‬
‫اختصاصی کالس دیگر دسترسی دارند‬
‫برنامه اي که با استفاده از کالس دوست ‪،‬‬
‫بين دو عدد کوچکترین را پيدا می کند‪.‬‬
‫اعضاي کالس با ويژگي ‪static‬‬
‫در بعضی از مواقع ‪ ،‬فقط یک كپی از یک متغير باید بين تمام اشياي‬
‫یک كالس مشترك باشد ‪ .‬كلمه كليدي ‪ static‬براي این منصور به‬
‫كار می رود‪.‬‬
‫وقتی كلمه كليدي ‪ static‬را با اعضاي داده اي كالس به كار می بریم‬
‫‪ ،‬به كامپایلر می گویيم كه فقط یک كپی از آن متغير وجود خواهد‬
‫داشت و تمام اشياي آن كالس ‪ ،‬آن متغير را به اشتراك می گذارند‪.‬‬
‫مثال ‪:‬اعضاي کالس با ویژگی ‪static‬‬
‫برنامه اي که کاربرد و اثر عضو داده اي‬
‫‪static‬را نشان می دهد‪.‬‬
‫انتساب اشياء (‪)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 ;
}
‫مثال ‪:‬آرایه اي از اشيا‬
‫اشاره گر به کالس ‪Pointers to Classes‬‬
‫• اشاره گرها همانطور كه می توانند به متغيرها اشاره كنند‪ ،‬می توانند‬
‫به اشياء یک كالس نيز اشاره كنند و چون شی نمونه اي از كالس‬
‫است پس به كالس اشاره می كنند ‪.‬‬
‫• در حالت ساده براي دسترسی به اعضاي كالس توسط شی تعریفی‪،‬‬
‫از نقطه (‪ ).‬استفاده كردیم‪ .‬اما در اشاره گر به شی باید از تركيب ‪2‬‬
‫كاراكتر خط و بزرگتر (<‪ )-‬استفاده كنيم‪ .‬با هم مثالی كامل از‬
‫اشاره گر به شی یا همان كالس را بررسی می كنيم ‪:‬‬
‫مثال ‪:‬اشاره گر به کالس‬
‫برنامه اي که نام ‪ ،‬شماره دانشحویی و معدل تعداد ‪ 15‬دانشجو را از ورودي خوانده در آرایه اي از‬
‫اشيا قرار داده و سپس دانشجویی که بيشترین معدل را دارد نمایش دهد‪.‬‬
‫ارث بري‬
‫ارث بري فرآیندي است که بوسيله آن یك شی (‪ )object‬میتواند‬
‫خاصيتهاي شی دیگري را دارا شود‪.‬‬
‫کالس هاي پايه و مشتق شده‬
‫• چند كالس ممکن است خصوصيات و رفتارهاي مشتركی داشته باشند‬
‫اما هریک شامل خواص و توابع دیگري هم باشد‪ .‬وراثت اجازه می دهد‬
‫یک كالس عمومی تعریف شود كه اشيا درخصوصيات آن مشترك‬
‫هستند و این كالس می تواند توسط سایر كالس ها ارث برده شود و‬
‫خواص جدیدي به آن اضافه شود بدون اینکه تاثيري روي كالس عمومی‬
‫داشته باشد‪.‬‬
‫• وراثت شباهت بين دو كالس را با استفاده از مفاهيم كالس پایه‬
‫‪base‬و كالس مشتق شده ‪derived‬بيان می كند‪ .‬كالسی كه از‬
‫آن ارث بري می شود كالس پایه یا مبنا و كالس وارث كه خصوصيات‬
‫كالس پایه را به ارث می برد را كالس مشتق شده می نامند‪ .‬كالس پایه‬
‫شامل كليه خواص و رفتارهائی است كه بين كالس هاي مشتق شده‬
‫مشترك است‪.‬‬
‫مثال‪:‬‬
‫• مثال‪ .‬كالس پایه ‪shape‬را درنصر بگيرید كه داراي خاصيت هاي‬
‫اندازه‪ ،‬رنگ و موقعيت است‪ .‬هر شکل می تواند رسم شود‪ ،‬پاك شود‪،‬‬
‫حركت كند و رنگ شود‪ .‬هر كدام از اشکال داراي خواص و رفتارهاي‬
‫اضافه تري هستند‪ .‬براي یک شکل معين بعضی رفتارها ممکن است‬
‫متفاوت باشد مثال محاسبه مساحت‪.‬‬
‫• نکته‪ .‬یک كالس متشق شده به نوبه خود می تواند كالس پایه براي‬
‫سایر كالس ها باشد‪.‬‬
‫نکته‪ .‬اگر كالس پایه تغيير كند كالس مشتق شده نيز تحت تاثير این‬
‫تغييرات قرار می گيرد‪.‬‬
‫تعريف کالس مشتق شده‬
‫• فرم كلی تعریف یک كالس مشتق شده به صورت زیر است‪:‬‬
‫‪class derived : access base‬‬
‫{‬
‫;‪//members of new class‬‬
‫}‬
‫‪derived‬نام كالس جدید است كه از كالس پایه ‪base‬مشتق شده‬
‫است‪ .‬قسمت ‪access‬اختياري است ولی می تواند ‪،public‬‬
‫‪private‬یا ‪protected‬باشد و براي تعيين مجوز دسترسی اعضاي‬
‫كالس پایه در كالس جدید بکار می رود‪ .‬اگر مجوز دسترسی ذكر نشود به‬
‫این معنی است كه كليه اعضاي عمومی كالس پایه در كالس مشتق شده‬
‫به صورت خصوصی خواهند بود‪.‬‬
‫مثال‪ .‬کالس جديد ‪Derived‬از کالس ‪Base‬مشتق شده است‪ .‬در برنامه اصلي تابع‬
‫‪change‬از کالس ‪Derived‬فراخواني شده که خود دو تابع ‪set‬و ‪read‬از کالس‬
‫‪Base‬را صدا مي زند‪.‬‬
‫مثال‪:‬‬
‫پروژه‬
‫كالسی به نام ‪ tictac‬تعریف كنيد كه با آن بتوانيد دوزبازي انجام‬
‫دهيد این كالس حاوي یک آرایه دوبعدي ‪ 3 *3‬از نوع صحيح است‬
‫‪.‬سازنده كالس باید عناصر آرایه را برابر صفر قرار دهد‪ .‬دو بازیکن ‪،‬‬
‫بازي می كنند ‪ .‬بازیکن اول عدد ‪ 1‬را در قرار می دهد و بازیکن دوم‬
‫عدد ‪ 2‬را در مربعی قرار می دهد ‪ .‬حركت ها باید در خانه هاي‬
‫خالی انجام شود ‪.‬پس از هر حركت كنترل می كنيد كه آیا كسی‬
‫برنده شده است یا خير ‪ .‬برنامه باید نوبت را رعایت كند مشخص‬
‫كند كه كدام بازیکن باید اول شروع كند‪.‬‬
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