برنامه نويسي C++ محمد رضا ملک شاهکویی mamad.malek@gmail.com دانشگاه آزاد اسلامی واحد گرگان گروه مهندسي كامپيوتر و فناوري اطلاعات برنامه نويسي C++ محمد رضا ملک شاهکویی mamad.malek@gmail.com WWW.MrMalek.Ir سایت و انجمن علمی تخصصی مهندسی شیمی SUTCHE.COM
نرم افزارهاي آفيس و ويژوال استوديو 2008 Borland c++, منابع: برنامه نویسی به زبان ++ C ، نویسنده: جعفرنژاد قمی کتاب آموزش زبان برنامه نویسی ++ C دایتل دایتل ابزارها و نرم افزارهاي مورد نياز: نرم افزارهاي آفيس و ويژوال استوديو 2008 Borland c++, آدرس پست الکترونيکي: mamad.malek@gmail.com
Course Evaluation Scheme امتحان پايان ترم: 14 نمره امتحان ميان ترم: 5 نمره تمرین های کلاسی و شرکت در بحث کلاس: 1 نمره
جايگاه اين درس در رشته مهندسي کامپيوتر و مهندسي IT اين درس اولين درس دانشگاهي رشته مي باشد و نقطه شروعي براي ورود به دنياي جالب برنامه نويسي و علم و فن کامپيوتر هست. بنابراين ياد گيري اصول اوليه برنامه نويسي در اين درس از جايگاه ويژه اي برخوردار است. اين درس پايه و اساس برنامه نويسي است که جزء اصول اين رشته مي باشد و اين اصول را به فرگيران ياد مي دهد . بنابراين يادگيري دقيق اين درس به همراه ارائه پروژه هاي عملي که لازمه اين درس مي باشد جزء اهم مسائل مي باشد .
اهداف درس الگوريتمي براي حل مسئله ارائه دهد. اصول و مباني اوليه نرم افزار و سخت افزار را بشناسد. اهداف و مفاهيم زبانهاي برنامه نويسي را بداند. مفاهيم اوليه برنامه نويسي ساخت يافته را بداند و اصول لازم را در مرحله اجراء بکار ببرد . دستورات زبان C++ را در برنامه ها بکار ببرد. از توابع و روال هاي استاندارد زبان C++ در صورت لزوم استفاده نمايد. از توابع ، روال ها براي جدا کردن قطعات برنامه استفاده کند.
زبان هاي برنامهنويسي نرمافزارها توسط زبان هاي برنامهنويسي نوشته ميشوند. زبان هاي برنامهنويسي، يك سيستم ارتباطي هستند كه توسط آن ها ميتوان دستورات لازم را به ماشين انتقال داد. هر زبان برنامهنويسي به مجموعهأي از علايم، قواعد و دستورالعملها گفته ميشود كه امكان ارتباط با كامپيوتر را جهت بيان كاري يا حل مسئلهاي فراهم ميكند.
در حالت كلي زبان هاي برنامهنويسي را به سه دسته زير تقسيمبندي ميكنند: زبان هاي سطح بالا زبان هاي سطح پايين زبان هاي سطح مياني كامپايلر برنامه نوشته در يك زبان سطح بالا را به برنامه مقصد تبديل ميكند.
جلسه اول: الگوریتم ها
هدفهاي كلي شناخت حل مسئله و ارائه الگوريتم شناخت اجزاء لازم براي حل مسئله بررسي صحت الگوريتم
دانشجو پس از مطالعه اين فصل بايد بتواند: هدفهاي رفتاري دانشجو پس از مطالعه اين فصل بايد بتواند: الگوريتمي را براي حل مسئله ارائه دهد. الگوريتم هاي مختلف براي يک مسئله را مقايسه کند. شرط ها و حلقه ها را در الگوريتم بکار ببرد .
مقدمه در زندگي روزمره، انسان با مسائل مختلفي روبروست و براي هر كدام از اين مسائل (حل مشكلات) راه حلي و روشي را بر ميگزيند. مسائلي از قبيل راه رفتن، غذا خوردن، خوابيدن و غيره كه بشر تقريباً هر روز آنها را پيش روي خود دارد. همه اين مسائل نياز به روشي براي حل كردن دارند مثلا راه رفتن بايد با ترتيب خاصي و مراحل معيني انجام شود. تا مسئله راه رفتن براي بشر حل شود. اصطلاحاً روش انجام كار يا حل مسئله را الگوريتم آن مسئله مينامند.
تعريف الگوريتم دقيق باشد جزئيات كامل حل مسئله را داشته باشد. هر دستورالعملی که مراحل انجام کاری را با زبانی دقیق و با جزئیات کافی بیان نماید بطوریکه ترتیب مراحل و شرط خاتمه عملیات در آن کاملا“ مشخص شده باشد را الگوریتم گویند. به عبارتي ديگر: الگوريتم مجموعهاي از دستورالعمل ها، براي حل مسئله ميباشد كه شرايط زير را بايد دارا باشد: دقيق باشد جزئيات كامل حل مسئله را داشته باشد. پايانپذير باشد.
مراحل الگوريتم براي حل يك مسئله بايد الگوريتم آن مسئله را مشخص كنيم (يا بيابيم). كه اصطلاحاً طراحي الگوريتم براي آن مسئله ناميده ميشود. در طراحي الگوريتم معمولاً سه مرحله زير را از هم جدا ميكنند: خواندن دادهها انجام محاسبات خروجيها
مثال : الگوريتمي بنويسيد كه دو عدد از ورودي دريافت كرده مجموع مثال : الگوريتمي بنويسيد كه دو عدد از ورودي دريافت كرده مجموع دو عدد را محاسبه و چاپ نمايد. خروجيها انجام محاسبات ورودي ها مجموع دو عدد جمع دو عدد a , b 0ـ شروع 1ـ b ,a را بخوان. 2ـ مجموع b , a را محاسبه و در sum قرار بده. 3ـ sum را در خروجي چاپ كن 4ـ پايان
مثال: الگوريتمي بنويسيد كه سه عدد از ورودي دريافت كرده مجموع و ميانگين سه عدد را محاسبه و چاپ كند. خروجيها انجام محاسبات ورودي ها چاپ مجموع محاسبه مجموع a چاپ ميانگين محاسبه ميانگين b c 0ـ شروع 1ـ سه عدد از ورودي بخوان 2ـ مجموع سه عدد را محاسبه و در sum قرار بده. 3ـ sum را بر سه تقسيم كرده،در ave قرار بده. 4ـ ave , sum را در خروجي چاپ كن. 5ـ پايان.
Begin End خواندن يا Read چاپ کردن write معمولا درك يك الگوريتم با شكل راحت تر از نوشتن آن بصورت متن ميباشد. لذا الگوريتم را با فلوچارت(flowchart) نمايش ميدهند. فلوچارت از شكلهاي زير تشكيل ميشود. علامتهاي شروع و پايان: كه معمولا از يك بيضي استفاده ميكنند: Begin End علامتهاي ورودي و خروجي: كه معمولا از متوازيالاضلاع استفاده ميشود: خواندن يا Read چاپ کردن write
شرط علامت شرط: علامت اتصال: جايگزين يا محاسبات علامتهاي محاسباتي و جايگزيني: براي نمايش دستورات جايگزيني و محاسباتي از مستطيل استفاده ميكنند: جايگزين يا محاسبات علامت شرط: براي نمايش شرط از لوزي استفاده ميشود. شرط علامت اتصال: براي اتصال شكلهاي مختلف بهم از فلشهاي جهتدار استفاده ميكنند.
فلوچارت مجموع سه عدد 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 Write(a,b) End b temp
تمرين 1ـ فلوچارتي رسم نمائيد كه طول و عرض مستطيل را از ورودي دريافت كرده محيط و مساحت آنرا محاسبه و چاپ كند. 2ـ فلوچارتي رسم نمائيد كه شعاع دايرهاي را از ورودي دريافت كرده، محيط و مساحت آنرا محاسبه و چاپ نمايد. 3ـ فلوچارتي رسم كنيد كه سه عدد Third , second, first را از ورودي دريافت كرده، محتويات آن ها را جابجا نموده، حاصل را در خروجي چاپ كند. 4ـ فلوچارتي رسم نمائيد كه دو عدد از ورودي دريافت كرده، سپس محتويات دو عدد را بدون استفاده از متغير كمكي جابجا كند. 5ـ فلوچارتي رسم نمائيد كه عددي (درجه حرارت برحسب سانتيگراد) را از ورودي دريافت كرده سپس آن را به درجه فارنهايت تبديل كند.
اگر هوا باراني باشد سپس چتري برميدارم. در غير اينصورت چتر برنميدارم. دستورالعملهاي شرطي در حل بسياري از مسائل يا تقريباً تمام مسائل نياز به استفاده از شروط جزء، نيازهاي اساسي محسوب ميشود. همانطور كه ما خودمان در زندگي روزمره با اين شرطها سركار داريم. بطور مثال اگر هوا ابري باشد ممكن است چنين سخن بگوييم: اگر هوا باراني باشد سپس چتري برميدارم. در غير اينصورت چتر برنميدارم.
در حالت كلي شرط را بصورت زير نمايش ميدهند: If شرط يا شروط then yes عمل يا اعمال NO عمل يا اعمال بعدي
مثال : فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده، فرد يا زوج بودن آن را تشخيص دهد.
مثال : فلوچارتي رسم كنيد كه دو عدد از ورودي دريافت كرده بزرگترين عدد را پيدا كرده در خروجي چاپ نمايد.
مثال : فلوچارتي رسم نمائيد كه سه عدد از ورودي دريافت كرده، كوچكترين عدد را يافته در خروجي چاپ نمايد:
نمونه اجراي فلوچارت بالا بصورت زير ميباشد: خروج a b c Min 11 12 11 17 12 1 2 3 4 5
تمرين 1- فلوچارتي رسم كنيد که عددي را از ورودي دريافت كرده، قدر مطلق عدد را در خروجي چاپ كند. 2- فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده مثبت، منفي يا صفر بودن عدد را تشخيص داده، در خروجي با پيغام مناسب چاپ كند. 3- فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده، بخش پذيري آن بر 3 و 5 را بررسي نمايد. 4ـ فلوچارتي رسم نمائيد كه ضرايب يك معادله درجه دوم را از ورودي دريافت كرده، ريشههاي آن را محاسبه در خروجي چاپ كند.
حلقهها در حل بسياري از مسائل با عملياتي روبرو ميشويم ، كه نياز به تكرار دارند و عمل تكرار آن ها به تعداد مشخصي انجام ميگيرد. فرض كنيد، بخواهيم ميانگين 100 عدد را محاسبه كنيم، در اينصورت منطقي بنظر نميرسد كه 100 متغير مختلف را از ورودي دريافت كنيم سپس آن ها را جمع كنيم.
انواع حلقه ها حلقه هاي با تکرار مشخص حلقه هاي با تکرار نامشخص
حلقه هاي با تکرار مشخص در اين نوع حلقهها تعداد تكرار مشخص ميباشد اين حلقه از اجزاء زير تشكيل ميشود: 1ـ انديس حلقه 2ـ مقدار اوليه براي انديس حلقه 3- مقدار افزاينده براي انديس حلقه (معمولا يك واحد در هر مرحله) 4ـ مقدار نهايي (تعداد تكرار حلقه) 5ـ شرطي براي كنترل تعداد تكرار حلقه
اين حلقهها را غالباً با فلوچارت بصورت زير نمايش ميدهند: مقدار اوليه براي انديس حلقه : 1 انديس حلقه : i شرطي براي كنترل تعداد تكرار حلقه: i<=n مقدار نهايي (تعداد تكرار حلقه): n مقدار افزاينده براي انديس حلقه (معمولا يك واحد در هر مرحله) : +1
n مقدار نهايي i انديس حلقه مثال : فلوچارتي رسم نمائيد كه عدد n را از ورودي دريافت كرده، مجموع اعداد از يك تا n را محاسبه كند. n مقدار نهايي i انديس حلقه
15 نمونه اجراي فلوچارت بالا بصورت زير است: خروجي N i sum 5 1 0 2 1 3 3 5 1 0 2 1 3 3 4 6 5 10 6 15
مثال : فلوچارتي رسم كنيد كه n عدد از ورودي دريافت كرده، بزرگترين مقدار از بين n عدد را پيدا كرده در خروجي چاپ نمايد. انديس حلقه i مقدار نهايي n بزرگترين مقدار Max
مثال : فلوچارتي رسم نمائيد كه n , x ، دو عدد صحيح مثبت را از ورودي دريافت كرده سپس x به توان n را محاسبه كند. انديس حلقه i مقدار نهايي n عدد به توان n pow
حلقههايي كه تعداد تكرار آن ها مشخص نيست. در اين حلقهها با توجه به ورودي، تعداد تكرار مشخص ميشود. و دقيقاً نميتوان تعداد تكرار حلقه را بدون ورودي معين كرد. اين حلقه ها فقط شامل شرطي هستند كه تا زمانيكه برقرار باشد حلقه اجرا ميشود.
در حالت كلي اين نوع حلقهها بصورت زير نمايش داده ميشوند:
مثال: فلوچارتي رسم كنيد كه عددي را از ورودي دريافت كرده سپس تعداد ارقام آن را شمرده در خروجي چاپ نمايد. عدد خوانده شده N تعداد ارقام count
fk=fk-1+fk-2 عدد خوانده شده N جمله دوم سري f2 جمله سوم سري f3 مثال : فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده، سري فيبوناچي قبل از آن را توليد نمايد. در حالت كلي جملات سري بصورت: fk=fk-1+fk-2 عدد خوانده شده N جمله اول سري f1 جمله دوم سري f2 جمله سوم سري f3
تمرين 1- فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده، كامل بودن آن را بررسي نمايد. (عدد كامل، عددي است كه مجموع مقسومعليههاي آن با خودش برابر باشد.) 2- فلوچارتي رسم كنيد كه N را از ورودي دريافت كرده، N جمله سري فيبوناچي را توليد نمايد. 3ـ فلوچارتي رسم نمائيد كه دو عدد N , M را از ورودي خوانده، بزرگترين مقسومعليه مشترك دو عدد را محاسبه و چاپ كند.
حلقههاي تودرتو الگوريتمهايي كه تا حال بكار برديم، فقط شامل يك حلقه بودند. در صورتي كه در بسياري از مسائل ممكن است نياز به استفاده از چند حلقه در داخل هم باشيم. در اين نوع حلقهها بايد دقت بيشتري به خرج دهيم، تا مشكلي پيش نيايد. اگر از حلقههاي نوع اول بصورت تودرتو استفاده كنيم در اينصورت براي هر حلقه شرط نهايي و انديس اوليه جداگانه بايد تعريف كنيم .
در حلقههاي تودرتو به ازاي يكبار تكرار حلقه اوليه، حلقه داخلي به اندازه مقدار نهايي خود تكرار ميشود. در كل اگر حلقه اوليه n بار تكرار شود و حلقه داخلي m بار، در اينصورت كل حلقه : n بار بار تكرار خواهد شد. m بار
فلوچارت حلقههاي تودرتو را ميتوان بصورت زير نشان داد: n بار m بار
مثال : فلوچارتي رسم نمائيد كه N را از ورودي دريافت كرده، مجموع سري زير را محاسبه نمايد: انديس حلقه اول i ورودي N محاسبه فاكتوريل fact انديس حلقه داخلي j مجموع Sum
ایا راه ساده تری وجود دارد؟ Sum ← Sum + i/fact
تمرينات آخر فصل 1- فلوچارتي رسم نمائيد كه N عدد از ورودي دريافت كرده تعداد اعداد اول و كامل را شمرده در خروجي چاپ نمايد. 2- فلوچارتي رسم نمائيد كه N , X را از ورودي خوانده مقدار سري زير را محاسبه كند: 3- فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده مقلوب عدد را محاسبه و در خروجي چاپ كند. 4ـ فلوچارتي رسم كنيد كه تاريخ تولد شخصي را از ورودي خوانده، سن شخص را با تاريخ روز، محاسبه نموده در خروجي چاپ كند. 5- فلوچارتي رسم نمائيد كه (m>n) N ,M را از ورودي دريافت كرده سري فيبوناچي بين N ,M را توليد كرده، در خروجي چاپ كند. +2
برنامه نویسی به زبان C++
فهرست مطالب فصل اول : مقدمات زبان C++ فصل دوم : ساختار های تصمیم گیری و تکرار فصل سوم : سایر ساختار های تکرار فصل چهارم : اعداد تصادفی فصل پنجم : آرایه ها فصل ششم : توابع فصل هفتم : ساختارها و اشاره گرها
فصل اول مقدمات C++
فهرست مطالب فصل اول عملگر انتساب عملگر های محاسباتی عملگرهای افزایش و کاهش عملگر sizeof عملگرهای جایگزینی محاسباتی اولویت عملگرها توضیحات (Comments) توابع کتابخانه برنامه در C++ تاریخچه مختصر قانون نامگذاری شناسه ها متغیر ها اعلان متغیر تخصیص مقادیر به متغیر داده های از نوع کرکتر کرکتر های مخصوص رشته ها نمایش مقادیر داده ها دریافت مقادیر
تاریخچه مختصر C++ این زبان در اوائل دهه 1980 توسط Bjarne stroustrup در آزمايشگاه بل طراحي شده. اين زبان عملاً توسعه يافته زبان برنامه نويسي C می باشد كه امكان نوشتن برنامههاي ساخت يافته شئ گرا را ميدهد.
قانون نامگذاري شناسهها حروف كوچك و بزرگ در نامگذاري شناسهها متفاوت ميباشند. بنابراين 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 لیست کامل کلمات کلیدی
متغيرها متغير، مكاني در حافظه اصلي كامپيوتر ميباشد كه در آنجا يك مقدار را ميتوان ذخيره و در برنامه از آن استفاده نمود. قانون نامگذاري متغيرها همان قانون نامگذاري شناسهها ميباشد. در اسلاید بعد به انواع داده ها اشاره می شود.
انواع داده ها نوع داده مقادير حافظه لازم يك كاركتر int 32767 تا –32768 2 بايت unsigned int 65535 تا 0 2بايت long int 2147483647 تا –2147483648 4 بايت unsigned long int 4294967295 تا 0 char يك كاركتر 1بايت unsigned char 127 تا –128 1 بايت float 3.4e38 تا 1.2e-38 double 1.8e308 تا 2.2e-308 8 بايت
اعلان متغیرها در اسلاید بعد مثال هایی از اعلان متغیر ذکر شده است. قبل از آنكه در برنامه به متغيرها مقداري تخصيص داده شود و از آنها استفاده گردد بايستي آنها را در برنامه اعلان نمود. در اسلاید بعد مثال هایی از اعلان متغیر ذکر شده است.
چند مثال از اعلان متغیر ها : براي اعلان متغيرx از نوع int : int x; برای اعلان متغيرهاي p و q را از نوع float كه هر كدام چهار بايت از حافظه را اشغال ميكنند : float p , q; برای اعلان متغير next از نوع كركتر كه ميتوان يكي از 256 كركتر را به آن تخصيص داد و يك بايت را اشغال ميكند. char next;
تخصيص مقادير به متغيرها با استفاده از عملگر = ميتوان به متغيرها مقدار اوليه تخصيص نمود. در اسلاید بعد مثال هایی از اعلان متغیر ذکر شده است.
مثال : در دستورالعمل int x=26; X را از نوع int با مقدار اوليه 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 ;
دریافت مقادیر متغیرها به منظور دريافت مقادير براي متغيرها در ضمن اجراي برنامه از صفحه كليد، از cin كه بدنبال آن عملگر استخراج يعني >> قيد شده باشد ميتوان استفاده نمود.
مثال : int x; cout << "Enter a number:" ; cin >> x;
عملگر انتساب عملگر انتساب = ميباشد كه باعث ميگردد مقدار عبارت در طرف راست این عملگر ارزيابي شده و در متغير طرف چپ آن قرار گيرد.
x=a+b; مثال : x=35 ; x=y=z=26 ; از عملگرهاي انتساب چندگانه نيز ميتوان استفاده نمود. که مقدار سه متغير z و y و x برابر با 26 مي شود.
عملگرهاي محاسباتي - + / % در C++ پنج عملگر محاسباتي وجود دارد كه عبارتند از : اين عملگرها دو تائي ميباشند زيرا روي دو عملوند عمل مينمايند. از طرف ديگر عملگرهاي + و – راميتوان بعنوان عملگرهاي يكتائي نيز در نظر گرفت. جمع + تفريق - ضرب * تقسيم / باقيمانده %
مثال 1 : در حالتي كه هر دو عملوند عملگرهاي % ، / ، * ، + ، – از نوع صحيح باشد نتيجه عمل از نوع صحيح ميباشد. عبارت نتیجه 5 + 2 7 5 * 2 10 5 – 2 3 5 % 2 1 5 / 2 2
مثال 2 : در صورتيكه حداقل يكي از عملوندهاي عملگرهاي / ، * ، – ، + از نوع اعشاري باشد نتيجه عمل از نوع اعشاري ميباشد. عبارت نتیجه 5. 0 +2 7. 0 5* 2. 0 10.0 5. 0 / 2 2.5 5. 0 -2 3. 0 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 = a +1; int a=1; a += 1;
اولويت عملگرها ارزيابي مقدار يك عبارت رياضي براساس جدول اولويت عملگرها انجام ميگردد. در ذيل جدول اولويت عملگرها براساس بترتيب از بيشترين اولويت به كمترين اولويت داده شده است.
مثال 1 : با توجه به جدول اولويت عملگرها داريم كه (5+2) *(6+2*2)/2 7 *(6+2*2)/2 7*(6+4)/2 7* 10 /2 70 /2 35
مثال 2 : خروجی : 1 9 2 7 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 الف: اين نوع توضيح بوسيله // انجام ميشود. كه كامپيوتر هر چيزي را كه بعد از // قرار داده شود تا انتهاي آن خط اغماض مينمايد. مثال : 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#
برنامه در C++ اكنون باتوجه به مطالب گفته شده قادر خواهيم بود كه تعدادي برنامه ساده و كوچك به زبان C++ بنويسيم. براي نوشتن برنامه بايستي دستورالعملها را در تابع main( ) قرار دهيم و براي اينكار ميتوان به يكي از دو طريقی که در اسلایدهای بعد آمده است ، عمل نمود.
روش اول : دستورالعمل 1 ; دستورالعمل 2 ; #include < > int main( ) } دستورالعمل 1 ; دستورالعمل 2 ; . n دستورالعمل ; return 0 ;
روش دوم : دستورالعمل 1 ; دستورالعمل 2 ; #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 ; }
ساختارهای تصمیم گیری و تکرار فصل دوم ساختارهای تصمیم گیری و تکرار
فهرست مطالب فصل دوم عملگر های رابطه ای عملگر شرطی دستورالعمل شرطی عملگر کاما عملگر های منطقی دستورالعمل For
عملگرهای رابطه ای مساوي = = مخالف = ! بزرگتر > بزرگتر يا مساوي از این عملگرها براي تعيين اينكه آيا دو عدد با هم معادلند يا يكي از ديگري بزرگتر يا كوچكتر ميباشد استفاده ميگردد. عملگرهاي رابطهاي عبارتند از: مساوي = = مخالف = ! بزرگتر > بزرگتر يا مساوي = > كوچكتر < كوچكتر يا مساوي <=
expression _ test ? expression _ true : expression _ false عملگر شرطی شكل كلي عملگر شرطي بصورت زير ميباشد: عملگر شرطي تنها عملگري در C++ ميباشد كه داراي سه عملوند ميباشد. expression _ test ? expression _ true : expression _ false
مثال 1 : مثال 2 : int x=10,y=20,b; b=(x>y) ? x : y ; مثال 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 دستورالعمل ;
مثال 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 , …. , عبارت 3 , عبارت 2 , عبارت 1) عملگر كاما تعدادي عبارت را ميتوان با كاما بهم متصل نمود و تشكيل يك عبارت پيچيدهتري را داد. اين عبارتها به ترتيب از چپ به راست ارزيابي شده و مقدار عبارت معادل عبارت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++ به ترتيب بصورت زير نشان داده مي شود. && || !
جدول درستی سه عملگر شرطی Or And Not
چند مثال : 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 (عبارت 3 ; عبارت ; 2 عبارت 1) for { 1 دستورالعمل ; } 2 دستورالعمل ; . n دستورالعمل ; }
{ ساختار for } int i; for (i=1; i<=3; i++) { معرفی کنترل گر حلقه; for (مقداردهی اولیه کنترل گر حلقه; شرط حلقه; گام حرکت ) } مجموعه دستورات بدنه حلقه ; { int i; for (i=1; i<=3; i++) { cout << “hello \n”;
مثال void main() { cout << “hello \n”; } void main() { int i; for (i=1; i<=3; i++) cout << “hello \n”; }
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i =
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1 2 hello
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1 2 3 hello hello
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1 2 3 4 hello hello hello
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1 2 3 4 hello hello hello
نکته لزومی ندارد که کنترل گر حلقه حتماً از 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; for ( i; i<=3; i++) { cout << “hello \n”; } int i=1; for ( ; 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 واحد را داشته باشد. مثال: چاپ اعداد فرد بین 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 ; }
برنامه زير ارقام 0 تا 9 را نمايش ميدهد. #include <iostream.h> int main( ) { int j=0 ; for( ; j <= 9 ; ) cout << j++ << endl; return 0 ; }
برنامه زير كليه اعداد سه رقمي كه با ارقام 1 ، 2 ، 3 ايجاد ميشوند را نمايش ميدهد. #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(int i=1; i<=5; i++) { می توان داخل بدنه ی دستور for هر دستور دلخواه دیگری نوشت. به عنوان مثال می توان از یک دستور for در بدنه دستور for استفاده کرد. قطعه کد زیر عبارت Hello را 15 بار اجرا می کند: for(int i=1; i<=5; i++) { for(int j=1; j<=3; j++) cout<<“Hello \n”; } 15 بار 5 بار 3 بار
مثال: چاپ جدول ضرب اعداد 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 با دو اندیس برنامه ای بنویسید که ستون اعداد زیر را چاپ کند: روش اول: for(int i=1; i<=20; i++) cout<<i<<“, “<<21-i<<endl; 1, 20 2, 19 3, 18 4, 17 . 20, 1 روش دوم: for(int i=1, j=20; i<=20; i++, j--) cout<<i<<“, “<<j<<endl;
دستور continue; در for اگر دستور continue; در حلقه for استفاده شود، جملاتی از حلقه که هنوز اجرا نشده اند، بدون اجرا مانده و ادامه اجرا از انتهای حلقه اغاز خواهد شد. int main() { int x, p=1; for(int i=1; i<=20; i++) {cin>>x; if (!x) continue; p*=x; } cout<<p; return 0; برنامه فوق 20 عدد از ورودی خوانده و حاصلضرب اعداد غیر صفر را در متغیر p محاسبه کرده و در نهایت نمایش می دهد.
فصل سوم سایر ساختارهای تکرار
فهرست مطالب فصل سوم دستورالعمل 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; با اجراي قطعه برنامه فوق مقادير زير نمايش داده ميشود : 1 2 3 4
برنامة فوق n مقدار از نوع اعشاري را گرفته ميانگين آن ها را محاسبه و در متغير avg قرار ميدهد. #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 ; } ارقام 0 تا 9 را روي ده خط نمايش ميدهد
Break دستورالعمل break اين دستورالعمل باعث توقف دستورالعمل هاي تكرار( for , while ,do while) شده و كنترل به خارج از اين دستورالعمل ها منتقل مينمايد. Break
مثال 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 ; جمع تعدادی عدد که بین 0 و 1000 هستند. اگر بین اعداد وارد شده عدد منفی وارد شود، بواسطه دستور 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 ) if(x < 0.0) { cout << "Error – Negative value " <<endl; break ; } sum += x ; cout << sum << \n ; جمع تعدادی عدد اعشاری که بیشتر از 0 و کمتر از 1000هستند را محاسبه می کند. اگر بین اعداد وارد شده عدد منفی وارد شود، بواسطه دستور break; حلقه خاتمه می یابد. اگر عدد وارد شده بزرگتر یا مساوی 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 ; } sum += x ; } while(x <= 1000.0); cout << sum << endl ; return 0 ; جمع تعدادی عدد که بین 0 و 1000 هستند. اگر بین اعداد وارد شده عدد منفی وارد شود، بواسطه دستور break; حلقه خاتمه می یابد. اگر عدد وارد شده بزرگتر از 1000 باشد نیز شرط حلقه برآورده نشده و حلقه خاتمه می یابد. نکته: این حلقه حداقل یک بار اجرا می شود.... حتی اگر عدد اول بزرگتر از 1000 باشد نیز در مجموع شرکت داده خواهد شد. سپس از حلقه خارج خواهیم شد.
Continue دستورالعمل continue از دستورالعمل continue ميتوان در دستورالعمل هاي تكرار do while ، while ، for استفاده نمود. اين دستورالعمل باعث ميشود كه كنترل به ابتدای دستورالعمل هاي تكرار منتقل گردد. (تذکر: در ابتدای حلقه بایستی شرط حلقه نیز بررسی شود) پس بهتر است بگوییم به انتهای بدنه حلقه تکرار رفته و از آن جا ادامه می دهد. Continue
مثال 1: #include <iostream.h> int main( ) { float x, sum = 0.0 ; Do { cin >> x ; if(x < 0 . 0) cout << "Error" << endl ; continue ; } sum += x ; } while(x <= 1000.0 ); cout << sum ; return 0 ; } جمع تعدادی عدد که کوچکتر و مساوی 1000 هستند را بدست می اورد. اگر بین اعداد وارد شده عدد منفی وارد شود، در حاصل جمع شرکت نخواهد کرد و اجرای دستورالعمل ها به انتهای حلقه هدایت خواهد شد. اگر عدد وارد شده بزرگتر از 1000 باشد نیز شرط حلقه برآورده نشده و حلقه خاتمه می یابد. نکته: این حلقه حداقل یک بار اجرا می شود.... حتی اگر عدد اول بزرگتر از 1000 باشد نیز در مجموع شرکت داده خواهد شد سپس از حلقه خارج خواهیم شد.
در نهایت میانگین اعداد غیر صفر را محاسبه می کند مثال 2: n عدد از ورودی خوانده. در صورتیکه صفر نباشد ان را در مجموع اعداد شرکت می دهد. در نهایت میانگین اعداد غیر صفر را محاسبه می کند #include <iostream.h> int main( ) { int n , navg = 0 ; float x, avg, sum = 0 ; cin >> n ; / * عبارت از تعداد اعداد ورودي n * / for(int count = 1 ; count <=n; ++ count ) cin >> x ; if(x == 0 ) continue ; sum += x ; ++ navg ; } avg = sum / navg; cout << avg << endl ; return 0 ;
switch case دستورالعمل switch همانطور که می دانید از دستورالعمل شرطی(if else) می توان بصورت تودرتو استفاده نمود ولي از طرفي اگر عمق استفادة تو در تو از اين دستورالعمل زياد گردد، درك آن ها مشكل مي شود . براي حل اين مشكل C++ ، دستورالعمل switch كه عملاً يك دستورالعمل چند انتخابي ميباشد را ارائه نموده است. switch case
شکل کلی دستور العمل Switch { case valueone : statement; break; case valuetwo: statement; case valuen : statement; break; default: statement ; }
مثال 1 : #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 ; default : cout << "default" << endl; } / * end of switch statement * / }
مثال 2 : #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 ; default: cout << "Greater Than Three" << endl; }
تابع 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 .
در قطعه برنامه ذيل ازتابع cin.get() و دستور switch استفاده شده است. char x; x = cin.get( ); switch(x) { case r : case R : cout << RED << \n ; break ; case b : case B : cout << BLUE << endl ; 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 نمايش داده ميشود.
جدول اولویت عملگرها
تمرین برنامه ای که یک سکه 100 ریالی را به سکه های 2و5 و10و20 و 50 ریالی خرد کند. برنامه ای که خروجی زیر را چاپ کند: برنامه ای که حاصل عبارت زیر را بدست اورد:
فصل چهارم اعداد تصادفی
فهرست مطالب فصل چهارم تولید اعداد تصادفی تعریف نوع داده ( typedef ) داده های از نوع شمارشی
اعداد تصادفی مقادير تصادفي يا شانسي در اكثر برنامههاي كاربردي در زمينه شبيه سازي و بازيهاي كامپيوتري نقش مهمي را ايفا مينمايند. براي ايجاد يك عدد تصادفي صحيح بين 0 و 32767 بايستي از تابع rand() استفاده نمائيم. rand( )
برنامه زير 10 عدد تصادفي بين 0 و 32767 را ايجاد مينمايد. #include <stdlib.h> #include < iostream.h> int main( ) { for(int j=1; j<=10; ++j) cout << rand( ) << \n ; return 0 ; }
تعريف نوع داده (typedef) typedef type newtype; نشان دهنده نوع داده موجود اسم جديد
مثال : typedef int integer; حال ميتوان y و x را بصورت زير تعريف نمود : integer x,y;
دادههاي از نوع شمارشي بمنظور معرفي دادههاي از نوع شمارشي از كلمه enum استفاده ميگردد. مثال emum status {married, devorced, vidow, single}; status a ; a= single ; : 1 2 3 4 enum color {red, blue, green, yellow, brown} ; color يك نوع داده شمارشي ميباشد.
توجه : بايستي در نظر داشت كه دادههاي از نوع شمارشي در عمليات ورودي و خروجي شركت نمينمايند. بعبارت ديگر مقادير دادههاي از نوع شمارشي بايستي در برنامه تعيين نمود. دستورالعمل هاي ورودي و خروجي مانند cin و cout در مورد دادههاي شمارشي نميتوان استفاده نمود.
فصل پنجم آرایه ها
فهرست مطالب فصل پنجم آرایه یک بعدی آرایه دو بعدی ( ماتریس ها )
آرایه یک بعدی آرايه يك فضاي پيوسته از حافظه اصلي كامپيوتر ميباشد كه ميتواند چندين مقدا را در خود جاي دهد. كليه عناصر يك آرايه از يك نوع ميباشند. عناصر آرايه بوسيله انديس آن ها مشخص ميشوند. در C++ ، انديس آرايه از صفر شروع ميشود.
کاربرد آرایه ها آرايهها در برنامهنويسي در مواردي كاربرد دارند كه بخواهيم اطلاعات و دادهها را در طول اجراي برنامه حفظ نمائيم.
آرایه یک بعدی از نوع int x 1 2 3 4 اولين عنصر x[0] پنجمين عنصر x[4] 1 2 3 4 اولين عنصر x[0] پنجمين عنصر x[4]
تخصیص مقادیر اولیه به عناصر آرایه : int x[5]= {4, 2, 5, 17, 30}; x 4 2 5 17 30 1 3
دریافت مقادیر عناصر آرایه : 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}; x 12 5 7 1 2 3 4
بايستي توجه داشت كه آرايهها به صورت ضمني مقدار اوليه صفر نميگيرند بايستي توجه داشت كه آرايهها به صورت ضمني مقدار اوليه صفر نميگيرند. برنامه نويس بايد به عضو اول آرايه، مقدار اوليه صفر تخصيص دهد تا عضوهاي باقيمانده بطور اتوماتيك، مقدار اوليه صفر بگيرند. int x[5] = {0} ; x 1 2 3 4
دستور زير يك آرايه يك بعدي شش عنصري از نوع float ايجاد مينمايد. float x[ ] = {2.4, 6.3, -17.1, 14.2, 5.9, 16.5} ; x 2.4 6.3 -17.1 14.2 5.9 16.5 1 2 3 4 5
برنامه ذيل 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; }
برنامه زير 100 عدد اعشاري را گرفته بروش حبابي (Bubble sort) بصورت صعودي مرتب مينمايد. #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]; ستون 0 ستون 1 ستون 2 ستون 3 سطر 0 a[0][0] a[0][1] a[0][2] a[0][3] سطر 1 a[1][0] a[1][1] a[1][2] a[1][3] سطر 2 a[2][0] a[2][1] a[2][2] a[2][3]
تخصیص مقادیر اولیه به عناصر آرایه : int a[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} } ; 1 2 3 4 5 6 7 8 9 10 11 12
نکته 1 : int a[3][4]= { {1}, {2,3} , {4,5,6} } ; 1 2 3 4 5 6
نکته 2 : int a[3][4]= {1, 2, 3, 4,5 } ; 1 2 3 4 5
نکته 3 : در يك آراية دوانديسي، هر سطر، در حقيقت آرايهاي يك انديسي است. در اعلان آرايههاي دوانديسي ذكر تعداد ستون ها الزامي است. int a[ ][4]={1,2,3,4,5}; 1 2 3 4 5
برنامه زير يك ماتريس 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(j=0; j<4; j++) total + = x [ i ][ j ]; cout << "total = " << total << endl; return 0 ; }
برنامه که عناصر ماتریس 2*3 را از ورودی خوانده و بزرگترین عنصر هر سطر را پیدا کرده و به همراه شماره سطر آن جاپ نماید.
ضدحال...!
فصل ششم توابع هدف طراحی یک دفترچه تلفن است. که دارای خصوصیتهای زیر باشد: قابلیت اضافه کردن بر اساس اسم و شماره جستجو بر اساس شماره و نام ویرایش کردن حذف کردن خروج از برنامه
فهرست مطالب فصل ششم تعریف تابع تابع بازگشتی توابع درون خطی انتقال پارامترها از طریق ارجاع کلاس های حافظه ( storage classes ) سربارگذاری توابع
تعریف توابع استفاده از توابع در برنامهها به برنامهنويس اين امكان را ميدهد كه بتواند برنامههاي خود را به صورت قطعه قطعه برنامه بنويسد. تا كنون كليه برنامههائي كه نوشتهايم فقط از تابع main( ) استفاده نمودهايم.
شكل كلي توابع بصورت زير ميباشند : نوع مقدار برگشتي لیست پارامتر ها جهت انتقال اطلاعات از تابع احضار كننده به تابع فراخوانده شده return-value-type function-name (parameter-list) { declaration and statements } نام تابع تعريف اعلانهاي تابع و دستورالعمل هاي اجرائي
تابع زير يك حرف كوچك را به بزرگ تبديل مينمايد. نوع مقدار برگشتی پارامتری از نوع char نام تابع char low_to_up (char c1) { char c2; c2 = (c1>= a && c1<= z )?(c1 - 32): c1; // کد حرف کوچک = کد حرف بزرگ+ 32 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; a b 10 15 x y 10 15 z 15 a, b آرگومانهای تابع maximum
اسامي پارامترها و آرگومان هاي يك تابع ميتوانند همنام باشند. نکته 1 : اسامي پارامترها و آرگومان هاي يك تابع ميتوانند همنام باشند.
برنامه زير يك مقدار مثبت را گرفته فاكتوريل آنرا محاسبه نموده نمايش ميدهد. 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 ; n در main 3 n در factorial 3 i در factorial 2,3,4 prod در factorial 6
نکته 2 : وقتي در تابعي، تابع ديگر احضار ميگردد بايستي تعريف تابع احضار شونده قبل از تعريف تابع احضار كننده در برنامه ظاهر گردد.
نکته 3 : اگر بخواهیم در برنامهها ابتدا تابع main ظاهر گردد بايستي prototype تابع يعني پيش نمونة تابع كه شامل نام تابع، نوع مقدار برگشتي تابع، تعداد پارامترهائي را كه تابع انتظار دريافت آنرا دارد و انواع پارامترها و ترتيب قرارگرفتن اين پارامترها را به اطلاع كامپايلر برساند. در اسلاید بعد مثالی در این زمینه آورده شده است.
#include <iostream. h> #include <conio #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);
نکته 4 : در صورتي كه تابع مقداري بر نگرداند نوع مقدار برگشتي تابع را 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 ) a در main 20 #include <iostream.h> int modify(int); int main( ) { int a=20; cout << a << endl; modify(a) ; return 0 ; } int modify(int a) a *= 2; return 0; a در modify 20 a در modify 40 خروجی برنامه : 20 40
احضار بوسیله مقدار ( Call By Value ) a در main 20 #include <iostream.h> int modify(int); int main( ) { int a=20; cout << a << endl; modify(a) ; return 0 ; } int modify(int a) a *= 2; return 0; a در modify 20 a در modify 40 در این نوع احضار تابع حافظههاي مورد استفاده آرگومان ها و پارامترها از هم متمايزند و هرگونه تغيير در پارامترها باعـــث تغيـــر در آرگومان هاي متناظر نميگردد.
تابع بازگشتي (recursive functions)
نحوه محاسبه فاکتوریل از طریق تابع بازگشتی n != 1*2*3*…*(n-1) *n f(n) = n ! f(n) = 1 n=1/ n=0 اگر n *f(n-1) در غير اينصورت 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, … دنباله فیبوناچی : = fib(n)= جمله n ام اگر n=1 1 اگر n=2 1 در غير اينصورت fib(n-1)+fib(n-2) در اسلاید بعد تابع بازگشتی مورد نظر پیاده سازی شده است.
برنامهزير n امين مقدار دنبالة فيبوناچي (fibonacci) را مشخص و نمايش ميدهد. #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 ; 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( ) { 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 10 مقدار آرگومان x تغییر نمی کند. 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) ; return 0 ; } void fswap(float &x , float & y) float t; t = x ; x = y ; y = t ;
توابع درون خطي (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) آن ها و ديگري بوسيله كلاس حافظه آن ها. نوع متغير قبلاً اشاره شده بعنوان مثال int ، float ، double ، . . . ولي كلاس حافظة يك متغير در مورد طول عمر و وسعت و دامنة متغير بحث مينمايد. در اسلاید بعد به انواع کلاس حافظه می پردازیم.
بطور كلي كلاس حافظه متغيرها به چهار دستة تقسيم ميگردد : automatic static external register
automatic متغيرهاي automatic در درون يك تابع تعريف ميشوند و در تابعي كه اعلان ميشود بصورت متغيرهاي محلي براي آن تابع ميباشند. حافظه تخصيص داده شده به متغيرهاي automatic پس از اتمام اجراي تابع از بين مي رود بعبارت ديگر وسعت و دامنة متغيرهاي از نوع automatic تابعي ميباشد كه متغير در آن اعلان گرديده است.
static و به دودسته تقسیم می شوند 1- متغیر های استاتیک محلی متغيرهاي 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 متغيرهاي از نوع 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 اعلان ميشود از كامپيوتر عملاً درخواست ميشود كه به جاي حافظه از يكي از رجيسترهاي موجود استفاده نمايد.
کاربرد کلاس register register int i; for(i=1;i<=10;i++) معمولاً از نوع رجيستر براي شاخصهاي دستور تكرار و يا انديس هاي آرايهها استفاده ميشود. بايستي توجه داشت كه متغيرهاي از نوع رجيستر قابل استفاده دردستور cin نميباشند register int i; for(i=1;i<=10;i++) cout<<“hi”;
سربارگذاري توابع (function overloading)
مثال : #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)
برنامه ای که با استفاده ار تابعی به نام Square() ، مربع یک عدد را محاسبه می کند دقت شود این برنامه باید بتواند مربع یک عدد صحیح و اعشاری را با استفاده از توابع سرباگذاری محاسبه نمایید.
تمرین برنامه ای بنویسید که 3 عدد اعشاری را خوانده و به تابعی ارسال کند و تابع میانگین آن ها را محاسبه کرده و برگرداند. برنامه ای که ضرایب معادله ی درجه دومی را خوانده، آن ها را به تابعی ارسال کند. تابع معادله را حل کند و جواب ها را در خروجی چاپ کند. (تابع جواب ها را به تابع اصلی برنمی گرداند.) برنامه ای بنویسید که عددی را از ورودی خوانده و هریک از ارقام آن را در یک سطر چاپ کند. تفکیک و چاپ ارقام توسط تابع بازگشتی صورت گیرد. برنامه ای بنویسید که حاصلضرب دو عدد صحیح را به کمک جمع کردن محاسبه کند. برای این کار از تابع بازگشتی استفاده کنید. a اگر b=1 a×(b-1)+a اگر b>1 a×b =
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 # 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() { float x, y, z; cin>>x>>y>>z; f(x,y,z); getch(); 2
3 # 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();
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();
فصل هفتم ساختار ها و اشاره گرها
فهرست مطالب فصل هفتم ساختارها Union ها اشاره گرها ( Pointer) تعریف آرایه آرایه های دو بعدی و اشاره گرها تخصیص حافظه بصورت پویا ( عملگر new ) رشته ها و توابع مربوطه
ساختارها ساختارها شبيه آرايهها بوده بدين صورت كه يك نوع داده گروهي است كه فضاي پيوسته از حافظه اصلي را اشغال مينمايد. اما عناصر ساختار الزاماً از يك نوع نميباشند بلكه اعضاي يك ساختار ميتوانند از نوعهاي مختلف از قبيل char ، int ، float ، … باشند.
تعريف ساختار struct time { int hour ; // 0 – 23 int minute ; // 0 – 59 نام ساختار 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 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 ;
تمرین: برنامه اي بنويسيم كه يك دفترچه تلفن 20 تايي (ظرفيت پذيرش 20 نام و شماره تلفن را داشته باشد)و امكان جستجو در آن را بر اساس نام فرد ايجاد نمايد.
اشارهگرها (Pointers) دادههائي كه در كامپيوتر در حافظه اصلي ذخيره ميشوند بايتهاي متوالي از حافظه بسته به نوع data اشغال ميكنند. نوع داده مقادير حافظه لازم int 32767 تا –32768 2 بايت long int 2147483647 تا –2147483648 4 بايت char يك كاركتر 1بايت float 3.4e38 تا 1.2e-38 double 1.8e308 تا 2.2e-308 8 بايت
اشارهگرها (Pointers) با داشتن آدرس داده در حافظة اصلي ميتوان براحتي به آن داده دسترسي پيدا نمود و از طرف ديگر آدرس هر داده در حافظه آدرس بايت شروع آن داده ميباشد. int x = 613; 1 2 3 4 613 5 6 7
نکته : در كامپيوتر آدرسها معمولاً دو بايت اشغال مينمايند. اگر آدرس x را در px قرار دهيم آنگاه ميگوئيم كه px به x اشاره مينمايد. px x آدرس متغير x را بوسيله &x نشان ميدهيم و عملگر & را عملگر آدرس مينامند. int x , *px X=54; px = &x ;
26 36 43 مثال : px x حال اگر دستور العمل x += 10 ; را بدهيم: px x int y , x , *px ; x = 26 ; px = &x ; px x 26 حال اگر دستور العمل x += 10 ; را بدهيم: px x 36 حال اگر دستورالعمل *px = *px + 7 ; بدهيم. px x 43
آرایه یک بعدی و اشاره گرها اولين عنصر آرايه بوسيله 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 ;
ساختارها و اشاره گرها px = &x ; ميتوان اشارهگري را تعريف نمود كه به اولين بايت يك ساختار (struct) اشاره نمايد. struct struc1 { int a ; float b ; char c; int d ; } x, *px ; px = &x ; عبارت x.a معادل pxa معادل (*px).a ميباشد.
نکته : استفاده از آرايهها بعنوان پارامتر تابع مجاز است. در اسلاید بعد به یک مثال توجه نمایید.
در برنامه زير تابع modify آرايه a را بعنوان پارامتر ميگيرد. #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(int j=0; j<5; ++j) cout << a[ j ] << endl ; return 0 ; } void modify(int a[ ]) // function definition a[ j ] += 2 ; return ; 3 4 5 6 7 خروجی : 1 2 3 4 5 6 7 نکته: در این مثال از فراخوانی با مقدار استفاده نشده است. برای همین تغییرات انجام شده در تابع 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} , arr3 [2][3]={ {1,2}, {4} }; printarr(arr1); cout << endl ; printarr(arr2); 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 ] << ; خروجی :
آرايههاي دوبعدي و اشارهگرها يك آرايه دوبعدي بصورت تعدادي آرايه يك بعدي ميتوان تعريف نمود. اگر x يك ماتريس 5 سطري و 4 ستوني از نوع اعشاري باشد قبلاً اين ماتريس را با float x[5][4]; معرفي كرديم. حال با استفاده از اشارهگرها بصورت زير معرفي نمائيم: float (*x)[4];
آرايههاي دوبعدي و اشارهگرها float (*x)[4]; آرايه يك بعدي اول x آرايه يك بعدي دوم (x+1) آرايه يك بعدي سوم (x+2) آرايه يك بعدي چهارم (x+3) آرايه يك بعدي پنجم (x+4)
در برنامه زير يك آرايه 5 عنصري از نوع int ايجاد شده و مقادير عناصر آرايه را به چهار طريق نمايش ميدهد. #include <iostream.h> 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 cout << px[ i ]<<endl; //the forth method cout << *(px+i)<<endl; return 0; }
تخصيص حافظه به صورت پويا يا (عملگر new) delete dynamic memory allocation
براي تخصيص حافظه باندازه 20 مقدار از نوع int كه اشارهگر ptx به آن اشاره نمايد بصورت زير عمل ميشود. int *ptx; ptx = new int [20]; ptx به اولين داده از نوع int اشاره مينمايد. ptx+i به i+1 امين عنصر از فضاي پيوسته اشاره مينمايد.
برنامه زير يك فضاي n عنصري از نوع اعشاري در حافظه ايجاد نموده، سپس آن را مقدار داده و مجموع مقادير رامشخص و نمايش ميدهد. #include <iostream.h> int main( ) { int n; float *ptr, tot = 0.0; cout << enter a value for n << endl; cin >> n; ptr=new float [n]; for(int j=0; j<n; ++j) cin >> *(ptr + j); cout << \n ; } for(j=0; j<=n-1; ++j) tot += *(ptr + j); cout << tot ; // in order to free the space use delete[ ] ptr ; return 0;
برنامه زير آرايههاي n عنصري از ساختار را ايجاد مينمايد. #include <iostream.h> #include <conio.h> int main( ) { struct rec float a; int b; } ; int n; rec *ptr; 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 \0
مقداردهی اولیه به رشته
رشته و اشاره گر char *name = sara; هر رشته از طريق اشارهگري به اولين كركتر آن در دسترس قرار ميگيرد. آدرس يك رشته، آدرس كركتر اول آن ميباشد. به رشتهها ميتوان مقدار اوليه تخصيص داد. char *name = sara;
char *s1= "ALI"; // char s1[10] = "ALI"; تابع 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;
تابع ) strcmp(s1, s2 char *s1= "ALI"; char *s2="ali"; رشتههاي s1 و s2 را با هم مقايسه نموده اگر s1 برابر با s2 باشد مقدار صفر و اگر رشته s1 كوچكتر از رشته s2 باشد يك مقدار منفي در غير اينصورت يك مقدار مثبت برميگرداند. char *s1= "ALI"; char *s2="ali"; char s1[10]= "ALI"; char s2[10]="ali"; cout << strcmp(s1, s2) << endl; -1
تابع ) strncmp(s1, s2,n 32 char *s1= "ali reza"; char *s2="ali"; حداكثر n كركتر از رشتة s1 را با n كركتر از رشتة s2 مقايسه نموده در صورتيكه s1 كوچكتر از s2 باشد يك مقدار منفي، اگر s1 مساوي با s2 باشد مقدار صفر در غير اينصورت يك مقدار مثبت برميگرداند. char *s1= "ali reza"; char *s2="ali"; char s1[10]= "ali reza"; char s2[10]="ali"; cout << strncmp(s1, s2,3) << endl; char *s1= "ali reza"; char *s2="ali"; char s1[10]= "ali reza"; char s2[10]="ali"; cout << strncmp(s1, s2,4) << endl; 32
تابع (strcat(s1, s2 ali reza char s1[20]= "ali "; char *s2="reza"; دو رشتة s1 و s2 را بعنوان آرگومان گرفته رشتة s2 را به انتهاي رشتة s1 اضافه مينمايد. كركتر اول رشتة s2 روي كركتر پاياني \0 رشتة s1 نوشته ميشود ونهايتاً رشتة s1 را برميگرداند. char s1[20]= "ali "; char *s2="reza"; char s2[20]="reza"; cout << strcat(s1, s2) << endl; ali reza
تابع (strncat(s1, s2,n ali re char s1[20]= "ali "; char *s2="reza"; دو رشته s1 و s2 ومقدار صحيح و مثبت n را بعنوان آرگومان گرفته، حداكثر n كركتر از رشتة s2 را در انتهاي رشتة s1 كپي مينمايد. اولين كركتر رشته s2 روي كركتر پاياني \0 رشتة s1 مينويسد ونهايتاً مقدار رشتة s1 را برميگرداند. char s1[20]= "ali "; char *s2="reza"; char s2[20]="reza"; cout << strncat(s1, s2,2) << endl; ali re
رشتة s را بعنوان آرگومان گرفته طول رشته را مشخص مينمايد. تابع (strlen(s رشتة s را بعنوان آرگومان گرفته طول رشته را مشخص مينمايد. char *s1= "ali"; char s1[10]= "ali"; cout << strlen(s1); 3 4 char *s1= "ali "; char s1[10]= "ali "; cout << strlen(s1);
تابع strcpy(s1,s2) reza ali char s1[20]= "ali "; char *s2="reza"; دو رشتة s1 و s2 را بعنوان آرگومان گرفته رشتة s2 را در رشتة s1 كپي مينمايد و نهايتاً مقدار رشتة s1 را بر ميگرداند. char s1[20]= "ali "; char *s2="reza"; char s2[10]="reza"; cout << strcpy(s1, s2) << endl; reza char s1[20]; char *s2=“ali"; char s2[10]=“ali"; cout << strcpy(s1, s2) << endl; ali
تابع (strncpy(s1, s2,n rez amir char s1[20]= "ali "; char *s2="reza"; دو رشتة s1 , s2 و مقدار صحيح و مثبت n را بعنوان آرگومان گرفته، حداكثر n كركتر را از رشتة s2 در رشتة s1 كپي نموده، نهايتاً مقدار رشتة s1 را برميگرداند. char s1[20]= "ali "; char *s2="reza"; char s2[10]="reza"; cout << strncpy(s1, s2,3) << endl; rez char s1[20]; char *s2=“amir ali"; char s2[10]=“amir ali"; cout << strncpy(s1, s2,4) << endl; 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 واحد کم کنید.
برنامه ای بنویسید که رشته ای را که به نقطه ختم می شود را از ورودی خوانده ، کاراکتر های موجود در رشته را به همراه تعداد دفعات تکرار آنها به خروجی ببرد
فصل هشتم برنامه نویس شی گرا
فهرست مطالب فصل هشتم عضوهای static کلاسهای تودرتو کلاس های محلی استفاده از object ها بعنوان پارامترهای تابع برگشت اشیاء انتساب اشیاء آرایه اشیاء اشاره گر به اشیاء اشاره گر this توابع مجازی و پلی مرفیسم تعریف شی گرایی چند ریختی (polymorphism) خاصیت ارث بری پشته (stack) ایجاد شی ارث بری سازنده ها و نابود کننده ها توابع دوست کلاس های دوست توابع سازنده پارامتر دار توابع سازنده یک پارامتری
تعریف شی گرایی برنامه نويسي شئ گرا يا 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، initialize ، pop كردن پشته. در اسلاید بعد مثالی از نحوه ایجاد شی آورده شده است.
مثال : #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( ); }; بدين معني است كه stck و tos بوسيله توابعي كه عضو object نباشند غير قابل دسترسي هستند. و اين يكي از روشهاي محصور سازي اقلام دادههاست. بدين معني است كه بوسيله ساير قطعات برنامه قابل دسترسي ميباشد.
نکته : فقط توابع عضو ميتوانند به متغيرهاي عضو از نوع private دسترسي داشته باشند. بايستي توجه داشت كه اگر نوع عضوي مشخص نگردد آن عضو به صورت اتوماتيك 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; return 0; }
سازندهها و نابودكنندهها (constructors and destructors) Initialization يا مقدار اوليه دادن بصورت اتوماتيك از طريق تابعي انجام ميشود بنام تابع constructor يا تابع سازنده. تابع سازنده تابع مخصوصي است كه عضوي از كلاس بوده و همنام با كلاس ميباشد.
سازندهها و نابودكنندهها (constructors and destructors)
سازندهها (constructors)
سازندهها با پارامتر (constructors)
مثال از سازنده با یک پارامتر
توابع دوست کلاس همانطورکه گفته شد تابعی که عضو کلاس نباشد ، نمی تواند به اعضای اختصاصی آن کلاس دستیابی داشته باشند برای اعلان تابع دوست ، باید الگوی آن را در داخل کلاس قرار دهید و کلمه کلیدی Friend را قبل از آن ذکر کنید.
برنامه ای که با استفاده از تابع دوست دوعدد را با هم جمع و تفریق می کند
مثال: تابع دوست دو کلاس
مثال: کلاس های دوست کلاس های را می توان دوست کلاس های دیگر معرفی کرد مثال: کلاس های دوست کلاس های را می توان دوست کلاس های دیگر معرفی کرد. دراین حالت ، کلاس دوست و تمام توابع عضو آن به اعضای اختصاصی کلاس دیگر دسترسی دارند برنامه ای که با استفاده از کلاس دوست ، بین دو عدد کوچکترین را پیدا می کند.
اعضای کلاس با ویژگی static در بعضی از مواقع ، فقط یک کپی از یک متغیر باید بین تمام اشیای یک کلاس مشترک باشد . کلمه کلیدی static برای این منظور به کار می رود. وقتی کلمه کلیدی static را با اعضای داده ای کلاس به کار می بریم ، به کامپایلر می گوییم که فقط یک کپی از آن متغیر وجود خواهد داشت و تمام اشیای آن کلاس ، آن متغیر را به اشتراک می گذارند.
مثال: اعضای کلاس با ویژگی static برنامه ای که کاربرد و اثر عضو داده ای staticرا نشان می دهد.
انتساب اشياء (object assignment) در اسلاید بعد مثالی آورده شده است.
مثال : #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 مشتق شده است مثال. کلاس جديد 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 And -- or bitor not_eq compl
پایان