Download presentation
Presentation is loading. Please wait.
Published byÔΠοσειδῶν Κωνσταντόπουλος Modified over 6 years ago
1
برنامه نويسي C++ محمد رضا ملک شاهکویی mamad.malek@gmail.com
دانشگاه آزاد اسلامی واحد گرگان گروه مهندسي كامپيوتر و فناوري اطلاعات برنامه نويسي C++ محمد رضا ملک شاهکویی سایت و انجمن علمی تخصصی مهندسی شیمی SUTCHE.COM
2
نرم افزارهاي آفيس و ويژوال استوديو 2008 Borland c++,
منابع: برنامه نویسی به زبان ++ C ، نویسنده: جعفرنژاد قمی کتاب آموزش زبان برنامه نویسی ++ C دایتل دایتل ابزارها و نرم افزارهاي مورد نياز: نرم افزارهاي آفيس و ويژوال استوديو 2008 Borland c++, آدرس پست الکترونيکي:
3
Course Evaluation Scheme
امتحان پايان ترم: 14 نمره امتحان ميان ترم: 5 نمره تمرین های کلاسی و شرکت در بحث کلاس: 1 نمره
4
جايگاه اين درس در رشته مهندسي کامپيوتر و مهندسي IT
اين درس اولين درس دانشگاهي رشته مي باشد و نقطه شروعي براي ورود به دنياي جالب برنامه نويسي و علم و فن کامپيوتر هست. بنابراين ياد گيري اصول اوليه برنامه نويسي در اين درس از جايگاه ويژه اي برخوردار است. اين درس پايه و اساس برنامه نويسي است که جزء اصول اين رشته مي باشد و اين اصول را به فرگيران ياد مي دهد . بنابراين يادگيري دقيق اين درس به همراه ارائه پروژه هاي عملي که لازمه اين درس مي باشد جزء اهم مسائل مي باشد .
5
اهداف درس الگوريتمي براي حل مسئله ارائه دهد.
اصول و مباني اوليه نرم افزار و سخت افزار را بشناسد. اهداف و مفاهيم زبانهاي برنامه نويسي را بداند. مفاهيم اوليه برنامه نويسي ساخت يافته را بداند و اصول لازم را در مرحله اجراء بکار ببرد . دستورات زبان C++ را در برنامه ها بکار ببرد. از توابع و روال هاي استاندارد زبان C++ در صورت لزوم استفاده نمايد. از توابع ، روال ها براي جدا کردن قطعات برنامه استفاده کند.
6
زبان هاي برنامهنويسي نرمافزارها توسط زبان هاي برنامهنويسي نوشته ميشوند. زبان هاي برنامهنويسي، يك سيستم ارتباطي هستند كه توسط آن ها ميتوان دستورات لازم را به ماشين انتقال داد. هر زبان برنامهنويسي به مجموعهأي از علايم، قواعد و دستورالعملها گفته ميشود كه امكان ارتباط با كامپيوتر را جهت بيان كاري يا حل مسئلهاي فراهم ميكند.
7
در حالت كلي زبان هاي برنامهنويسي را به سه دسته زير تقسيمبندي ميكنند:
زبان هاي سطح بالا زبان هاي سطح پايين زبان هاي سطح مياني كامپايلر برنامه نوشته در يك زبان سطح بالا را به برنامه مقصد تبديل ميكند.
8
جلسه اول: الگوریتم ها
9
هدفهاي كلي شناخت حل مسئله و ارائه الگوريتم
شناخت اجزاء لازم براي حل مسئله بررسي صحت الگوريتم
10
دانشجو پس از مطالعه اين فصل بايد بتواند:
هدفهاي رفتاري دانشجو پس از مطالعه اين فصل بايد بتواند: الگوريتمي را براي حل مسئله ارائه دهد. الگوريتم هاي مختلف براي يک مسئله را مقايسه کند. شرط ها و حلقه ها را در الگوريتم بکار ببرد .
11
مقدمه در زندگي روزمره، انسان با مسائل مختلفي روبروست و براي هر كدام از اين مسائل (حل مشكلات) راه حلي و روشي را بر ميگزيند. مسائلي از قبيل راه رفتن، غذا خوردن، خوابيدن و غيره كه بشر تقريباً هر روز آنها را پيش روي خود دارد. همه اين مسائل نياز به روشي براي حل كردن دارند مثلا راه رفتن بايد با ترتيب خاصي و مراحل معيني انجام شود. تا مسئله راه رفتن براي بشر حل شود. اصطلاحاً روش انجام كار يا حل مسئله را الگوريتم آن مسئله مينامند.
12
تعريف الگوريتم دقيق باشد جزئيات كامل حل مسئله را داشته باشد.
هر دستورالعملی که مراحل انجام کاری را با زبانی دقیق و با جزئیات کافی بیان نماید بطوریکه ترتیب مراحل و شرط خاتمه عملیات در آن کاملا“ مشخص شده باشد را الگوریتم گویند. به عبارتي ديگر: الگوريتم مجموعهاي از دستورالعمل ها، براي حل مسئله ميباشد كه شرايط زير را بايد دارا باشد: دقيق باشد جزئيات كامل حل مسئله را داشته باشد. پايانپذير باشد.
13
مراحل الگوريتم براي حل يك مسئله بايد الگوريتم آن مسئله را مشخص كنيم (يا بيابيم). كه اصطلاحاً طراحي الگوريتم براي آن مسئله ناميده ميشود. در طراحي الگوريتم معمولاً سه مرحله زير را از هم جدا ميكنند: خواندن دادهها انجام محاسبات خروجيها
14
مثال : الگوريتمي بنويسيد كه دو عدد از ورودي دريافت كرده مجموع
مثال : الگوريتمي بنويسيد كه دو عدد از ورودي دريافت كرده مجموع دو عدد را محاسبه و چاپ نمايد. خروجيها انجام محاسبات ورودي ها مجموع دو عدد جمع دو عدد a , b 0ـ شروع 1ـ b ,a را بخوان. 2ـ مجموع b , a را محاسبه و در sum قرار بده. 3ـ sum را در خروجي چاپ كن 4ـ پايان
15
مثال: الگوريتمي بنويسيد كه سه عدد از ورودي دريافت كرده مجموع و ميانگين
سه عدد را محاسبه و چاپ كند. خروجيها انجام محاسبات ورودي ها چاپ مجموع محاسبه مجموع a چاپ ميانگين محاسبه ميانگين b c 0ـ شروع 1ـ سه عدد از ورودي بخوان 2ـ مجموع سه عدد را محاسبه و در sum قرار بده. 3ـ sum را بر سه تقسيم كرده،در ave قرار بده. 4ـ ave , sum را در خروجي چاپ كن. 5ـ پايان.
16
Begin End خواندن يا Read چاپ کردن write
معمولا درك يك الگوريتم با شكل راحت تر از نوشتن آن بصورت متن ميباشد. لذا الگوريتم را با فلوچارت(flowchart) نمايش ميدهند. فلوچارت از شكلهاي زير تشكيل ميشود. علامتهاي شروع و پايان: كه معمولا از يك بيضي استفاده ميكنند: Begin End علامتهاي ورودي و خروجي: كه معمولا از متوازيالاضلاع استفاده ميشود: خواندن يا Read چاپ کردن write
17
شرط علامت شرط: علامت اتصال: جايگزين يا محاسبات
علامتهاي محاسباتي و جايگزيني: براي نمايش دستورات جايگزيني و محاسباتي از مستطيل استفاده ميكنند: جايگزين يا محاسبات علامت شرط: براي نمايش شرط از لوزي استفاده ميشود. شرط علامت اتصال: براي اتصال شكلهاي مختلف بهم از فلشهاي جهتدار استفاده ميكنند.
18
فلوچارت مجموع سه عدد Begin Read(a,b,c) Sum a+b+c Ave sum/3
Write(sum,ave) End
19
مثال: فلوچارتي رسم نمائيد كه دو عدد از ورودي دريافت كرده سپس محتويات دو عدد را با هم جابجا نمايد.
براي حل اين مسئله b , a را دو متغير كه در آنها دو عدد خوانده شده، قرار ميگيرند در نظر ميگيريم. سپس با استفاده از يك متغير كمكي محتويات اين دو عدد را جابجا ميكنيم :
20
a b a b 12 15 12 15 temp 12 temp a b a b 15 15 15 12 12 12 temp temp
21
فلوچارت مسئله بالا بصورت زير خواهد بود:
Begin Read(a,b) temp a a b Write(a,b) End b temp
22
تمرين 1ـ فلوچارتي رسم نمائيد كه طول و عرض مستطيل را از ورودي دريافت كرده محيط و مساحت آنرا محاسبه و چاپ كند. 2ـ فلوچارتي رسم نمائيد كه شعاع دايرهاي را از ورودي دريافت كرده، محيط و مساحت آنرا محاسبه و چاپ نمايد. 3ـ فلوچارتي رسم كنيد كه سه عدد Third , second, first را از ورودي دريافت كرده، محتويات آن ها را جابجا نموده، حاصل را در خروجي چاپ كند. 4ـ فلوچارتي رسم نمائيد كه دو عدد از ورودي دريافت كرده، سپس محتويات دو عدد را بدون استفاده از متغير كمكي جابجا كند. 5ـ فلوچارتي رسم نمائيد كه عددي (درجه حرارت برحسب سانتيگراد) را از ورودي دريافت كرده سپس آن را به درجه فارنهايت تبديل كند.
23
اگر هوا باراني باشد سپس چتري برميدارم. در غير اينصورت چتر برنميدارم.
دستورالعملهاي شرطي در حل بسياري از مسائل يا تقريباً تمام مسائل نياز به استفاده از شروط جزء، نيازهاي اساسي محسوب ميشود. همانطور كه ما خودمان در زندگي روزمره با اين شرطها سركار داريم. بطور مثال اگر هوا ابري باشد ممكن است چنين سخن بگوييم: اگر هوا باراني باشد سپس چتري برميدارم. در غير اينصورت چتر برنميدارم.
24
در حالت كلي شرط را بصورت زير نمايش ميدهند:
If شرط يا شروط then yes عمل يا اعمال NO عمل يا اعمال بعدي
25
مثال : فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده، فرد يا زوج بودن آن را تشخيص دهد.
26
مثال : فلوچارتي رسم كنيد كه دو عدد از ورودي دريافت كرده بزرگترين عدد را پيدا كرده در خروجي چاپ نمايد.
27
مثال : فلوچارتي رسم نمائيد كه سه عدد از ورودي دريافت كرده، كوچكترين عدد را يافته در خروجي چاپ نمايد:
28
نمونه اجراي فلوچارت بالا بصورت زير ميباشد:
خروج a b c Min 11 12 1 2 3 4 5
29
تمرين 1- فلوچارتي رسم كنيد که عددي را از ورودي دريافت كرده، قدر مطلق عدد را در خروجي چاپ كند. 2- فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده مثبت، منفي يا صفر بودن عدد را تشخيص داده، در خروجي با پيغام مناسب چاپ كند. 3- فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده، بخش پذيري آن بر 3 و 5 را بررسي نمايد. 4ـ فلوچارتي رسم نمائيد كه ضرايب يك معادله درجه دوم را از ورودي دريافت كرده، ريشههاي آن را محاسبه در خروجي چاپ كند.
30
حلقهها در حل بسياري از مسائل با عملياتي روبرو ميشويم ، كه نياز به تكرار دارند و عمل تكرار آن ها به تعداد مشخصي انجام ميگيرد. فرض كنيد، بخواهيم ميانگين 100 عدد را محاسبه كنيم، در اينصورت منطقي بنظر نميرسد كه 100 متغير مختلف را از ورودي دريافت كنيم سپس آن ها را جمع كنيم.
31
انواع حلقه ها حلقه هاي با تکرار مشخص حلقه هاي با تکرار نامشخص
32
حلقه هاي با تکرار مشخص در اين نوع حلقهها تعداد تكرار مشخص ميباشد اين حلقه از اجزاء زير تشكيل ميشود: 1ـ انديس حلقه 2ـ مقدار اوليه براي انديس حلقه 3- مقدار افزاينده براي انديس حلقه (معمولا يك واحد در هر مرحله) 4ـ مقدار نهايي (تعداد تكرار حلقه) 5ـ شرطي براي كنترل تعداد تكرار حلقه
33
اين حلقهها را غالباً با فلوچارت بصورت زير نمايش ميدهند:
مقدار اوليه براي انديس حلقه : 1 انديس حلقه : i شرطي براي كنترل تعداد تكرار حلقه: i<=n مقدار نهايي (تعداد تكرار حلقه): n مقدار افزاينده براي انديس حلقه (معمولا يك واحد در هر مرحله) : +1
34
n مقدار نهايي i انديس حلقه
مثال : فلوچارتي رسم نمائيد كه عدد n را از ورودي دريافت كرده، مجموع اعداد از يك تا n را محاسبه كند. n مقدار نهايي i انديس حلقه
36
15 نمونه اجراي فلوچارت بالا بصورت زير است: خروجي N i sum 5 1 0 2 1 3 3
37
مثال : فلوچارتي رسم كنيد كه n عدد از ورودي دريافت كرده، بزرگترين مقدار از بين n عدد را پيدا كرده در خروجي چاپ نمايد. انديس حلقه i مقدار نهايي n بزرگترين مقدار Max
39
مثال : فلوچارتي رسم نمائيد كه n , x ، دو عدد صحيح مثبت را از ورودي دريافت كرده سپس x به توان n را محاسبه كند. انديس حلقه i مقدار نهايي n عدد به توان n pow
41
حلقههايي كه تعداد تكرار آن ها مشخص نيست.
در اين حلقهها با توجه به ورودي، تعداد تكرار مشخص ميشود. و دقيقاً نميتوان تعداد تكرار حلقه را بدون ورودي معين كرد. اين حلقه ها فقط شامل شرطي هستند كه تا زمانيكه برقرار باشد حلقه اجرا ميشود.
42
در حالت كلي اين نوع حلقهها بصورت زير نمايش داده ميشوند:
43
مثال: فلوچارتي رسم كنيد كه عددي را از ورودي دريافت كرده سپس تعداد ارقام آن را شمرده در خروجي چاپ نمايد. عدد خوانده شده N تعداد ارقام count
45
fk=fk-1+fk-2 عدد خوانده شده N جمله دوم سري f2 جمله سوم سري f3
مثال : فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده، سري فيبوناچي قبل از آن را توليد نمايد. در حالت كلي جملات سري بصورت: fk=fk-1+fk-2 عدد خوانده شده N جمله اول سري f1 جمله دوم سري f2 جمله سوم سري f3
47
تمرين 1- فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده، كامل بودن آن را بررسي نمايد. (عدد كامل، عددي است كه مجموع مقسومعليههاي آن با خودش برابر باشد.) 2- فلوچارتي رسم كنيد كه N را از ورودي دريافت كرده، N جمله سري فيبوناچي را توليد نمايد. 3ـ فلوچارتي رسم نمائيد كه دو عدد N , M را از ورودي خوانده، بزرگترين مقسومعليه مشترك دو عدد را محاسبه و چاپ كند.
48
حلقههاي تودرتو الگوريتمهايي كه تا حال بكار برديم، فقط شامل يك حلقه بودند. در صورتي كه در بسياري از مسائل ممكن است نياز به استفاده از چند حلقه در داخل هم باشيم. در اين نوع حلقهها بايد دقت بيشتري به خرج دهيم، تا مشكلي پيش نيايد. اگر از حلقههاي نوع اول بصورت تودرتو استفاده كنيم در اينصورت براي هر حلقه شرط نهايي و انديس اوليه جداگانه بايد تعريف كنيم .
49
در حلقههاي تودرتو به ازاي يكبار تكرار حلقه اوليه، حلقه داخلي به اندازه
مقدار نهايي خود تكرار ميشود. در كل اگر حلقه اوليه n بار تكرار شود و حلقه داخلي m بار، در اينصورت كل حلقه : n بار بار تكرار خواهد شد. m بار
50
فلوچارت حلقههاي تودرتو را ميتوان بصورت زير نشان داد:
n بار m بار
51
مثال : فلوچارتي رسم نمائيد كه N را از ورودي دريافت كرده، مجموع سري زير را محاسبه نمايد:
انديس حلقه اول i ورودي N محاسبه فاكتوريل fact انديس حلقه داخلي j مجموع Sum
52
ایا راه ساده تری وجود دارد؟
Sum ← Sum + i/fact
54
تمرينات آخر فصل 1- فلوچارتي رسم نمائيد كه N عدد از ورودي دريافت كرده تعداد اعداد اول و كامل را شمرده در خروجي چاپ نمايد. 2- فلوچارتي رسم نمائيد كه N , X را از ورودي خوانده مقدار سري زير را محاسبه كند: 3- فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده مقلوب عدد را محاسبه و در خروجي چاپ كند. 4ـ فلوچارتي رسم كنيد كه تاريخ تولد شخصي را از ورودي خوانده، سن شخص را با تاريخ روز، محاسبه نموده در خروجي چاپ كند. 5- فلوچارتي رسم نمائيد كه (m>n) N ,M را از ورودي دريافت كرده سري فيبوناچي بين N ,M را توليد كرده، در خروجي چاپ كند. +2
55
برنامه نویسی به زبان C++
56
فهرست مطالب فصل اول : مقدمات زبان C++
فصل دوم : ساختار های تصمیم گیری و تکرار فصل سوم : سایر ساختار های تکرار فصل چهارم : اعداد تصادفی فصل پنجم : آرایه ها فصل ششم : توابع فصل هفتم : ساختارها و اشاره گرها
57
فصل اول مقدمات C++
58
فهرست مطالب فصل اول عملگر انتساب عملگر های محاسباتی
عملگرهای افزایش و کاهش عملگر sizeof عملگرهای جایگزینی محاسباتی اولویت عملگرها توضیحات (Comments) توابع کتابخانه برنامه در C++ تاریخچه مختصر قانون نامگذاری شناسه ها متغیر ها اعلان متغیر تخصیص مقادیر به متغیر داده های از نوع کرکتر کرکتر های مخصوص رشته ها نمایش مقادیر داده ها دریافت مقادیر
59
تاریخچه مختصر C++ این زبان در اوائل دهه 1980 توسط Bjarne stroustrup در آزمايشگاه بل طراحي شده. اين زبان عملاً توسعه يافته زبان برنامه نويسي C می باشد كه امكان نوشتن برنامههاي ساخت يافته شئ گرا را ميدهد.
60
قانون نامگذاري شناسهها
حروف كوچك و بزرگ در نامگذاري شناسهها متفاوت ميباشند. بنابراين Xy ، XY ، xY ، xy چهار شناسه متفاوت از نظر C++ ميباشد.
61
قانون نامگذاري شناسهها
2) در نامگذاري شناسهها از حروف الفباء، ارقام وزير خط (underscore) استفاده ميشود و حداكثر طول شناسه 31 ميباشد و شناسه بايستي با يك رقم شروع نگردد.
62
قانون نامگذاري شناسهها
3) براي نامگذاري شناسهها از كلمات كليدي نبايستي استفاده نمود. در زير بعضي از كلمات كليدي داده شده است. And Sizeof then xor Template Float False Friend While continue extern Private Switch Default Const delete typedef if this Virtual لیست کامل کلمات کلیدی
63
متغيرها متغير، مكاني در حافظه اصلي كامپيوتر ميباشد كه در آنجا يك مقدار را ميتوان ذخيره و در برنامه از آن استفاده نمود. قانون نامگذاري متغيرها همان قانون نامگذاري شناسهها ميباشد. در اسلاید بعد به انواع داده ها اشاره می شود.
64
انواع داده ها نوع داده مقادير حافظه لازم يك كاركتر int 32767 تا –32768
2 بايت unsigned int 65535 تا 0 2بايت long int تا – 4 بايت unsigned long int تا 0 char يك كاركتر 1بايت unsigned char 127 تا –128 1 بايت float 3.4e38 تا 1.2e-38 double 1.8e308 تا 2.2e-308 8 بايت
65
اعلان متغیرها در اسلاید بعد مثال هایی از اعلان متغیر ذکر شده است.
قبل از آنكه در برنامه به متغيرها مقداري تخصيص داده شود و از آنها استفاده گردد بايستي آنها را در برنامه اعلان نمود. در اسلاید بعد مثال هایی از اعلان متغیر ذکر شده است.
66
چند مثال از اعلان متغیر ها :
براي اعلان متغيرx از نوع int : int x; برای اعلان متغيرهاي p و q را از نوع float كه هر كدام چهار بايت از حافظه را اشغال ميكنند : float p , q; برای اعلان متغير next از نوع كركتر كه ميتوان يكي از 256 كركتر را به آن تخصيص داد و يك بايت را اشغال ميكند. char next;
67
تخصيص مقادير به متغيرها
با استفاده از عملگر = ميتوان به متغيرها مقدار اوليه تخصيص نمود. در اسلاید بعد مثال هایی از اعلان متغیر ذکر شده است.
68
مثال : در دستورالعمل int x=26; X را از نوع int با مقدار اوليه 26 اعلان نموده . در دستورالعمل long int a=67000 , b=260; متغيرهاي b و a را از نوعlong int تعريف نموده با مقادير بترتيب 260 و
69
دادههاي از نوع كركتر براي نمايش دادههاي از نوع char در حافظه كامپيوتر از جدول ASCII استفاده ميشود. جدول اسكي به هر يك از 256 كركتر يك عدد منحصر بفرد بين 0 تا 255 تخصيص ميدهد.
70
كركترهاي مخصوص كامپيلر C++ بعضي از كركترهاي مخصوص كه در برنامه ميتوان از آنها براي فرمت بندي استفاده كرد را تشخيص ميدهد. تعدادي از اين كركترهاي مخصوص به همراه کاربرد آنها در اسلاید بعد آورده شده است .
71
كركترهاي مخصوص \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 ;
72
رشتهها رشته يا string عبارتست از دنبالهاي از كركترها كه بين " " قرار داده ميشود. در حافظه كامپيوتر انتهاي رشتهها بوسيله \0 ختم ميگردد. در اسلاید بعد به دو مثال دقت نمایید.
73
مثال 1 : "BOOK STORE" يك رشته ده كركتري ميباشد كه با توجه به كركتر \0 كه به انتهاي آن در حافظه اضافه مي شود جمعــاً يازده بايت را اشغال ميكند.
74
مثال 2 : دقت نمایید که "w" يك رشته ميباشد كه دو بايت از حافظه را اشغال ميكند در حاليكه 'w' يك كركتر ميباشد كه يك بايت از حافظه را اشغال مينمايد.
75
نمايش مقادير دادهها براي نمايش دادهها بر روي صفحه مانتور از cout كه بدنبال آن عملگر درج يعني <<قيد شده باشد استفاده ميگردد. بايستي توجه داشت كه دوكركتر <پشت سر هم توسط C++ بصورت يك كركتر تلقي ميگردد.
76
مثال : برای نمایش پيغام good morning بر روی صفحه نمایش :
cout << "good morning"; برای نمایش مقدار متغیر X بر روی صفحه نمایش : cout << x ;
77
دریافت مقادیر متغیرها به منظور دريافت مقادير براي متغيرها در ضمن اجراي برنامه از صفحه كليد، از cin كه بدنبال آن عملگر استخراج يعني >> قيد شده باشد ميتوان استفاده نمود.
78
مثال : int x; cout << "Enter a number:" ; cin >> x;
79
عملگر انتساب عملگر انتساب = ميباشد كه باعث ميگردد مقدار عبارت در طرف راست این عملگر ارزيابي شده و در متغير طرف چپ آن قرار گيرد.
80
x=a+b; مثال : x=35 ; x=y=z=26 ;
از عملگرهاي انتساب چندگانه نيز ميتوان استفاده نمود. که مقدار سه متغير z و y و x برابر با 26 مي شود.
81
عملگرهاي محاسباتي - + / %
در C++ پنج عملگر محاسباتي وجود دارد كه عبارتند از : اين عملگرها دو تائي ميباشند زيرا روي دو عملوند عمل مينمايند. از طرف ديگر عملگرهاي + و – راميتوان بعنوان عملگرهاي يكتائي نيز در نظر گرفت. جمع + تفريق - ضرب * تقسيم / باقيمانده %
82
مثال 1 : در حالتي كه هر دو عملوند عملگرهاي % ، / ، * ، + ، – از نوع صحيح باشد نتيجه عمل از نوع صحيح ميباشد. عبارت نتیجه 5 + 2 7 5 * 2 10 5 – 2 3 5 % 2 1 5 / 2 2
83
مثال 2 : در صورتيكه حداقل يكي از عملوندهاي عملگرهاي / ، * ، – ، + از نوع اعشاري باشد نتيجه عمل از نوع اعشاري ميباشد. عبارت نتیجه 7. 0 5* 2. 0 10.0 5. 0 / 2 2.5 3. 0 5. 0 / 2. 0
84
عملگرهاي افزايش و كاهش در C++ ، افزايش يك واحد به مقدار يك متغير از نوع صحيح را افزايش و بطور مشابه كاهش يك واحد از مقدار يك متغير از نوع صحيح را كاهش مينامند..
85
عملگرهاي افزايش و كاهش عملگر كاهش را با - - و عملگر افزايش را با ++ نمايش ميدهند. چون عملگرهاي ++ و - - فقط روي يك عملوند اثر دارند اين دو عملگر نيز جزء عملگرهاي يكتائي ميباشند.
86
مثال : سه دستور العمل : ++x; x++; x= x+1;
معادل ميباشند و بطريق مشابه سه دستورالعمل زير نیز معادل مي باشند. - - y ; y= y-1; y - - ;
87
از عملگرهاي ++ و -- ميتوان بدو صورت پيشوندي و پسوندي استفاده نمود
از عملگرهاي ++ و -- ميتوان بدو صورت پيشوندي و پسوندي استفاده نمود. در دستورالعملهاي پيچيده عملگر پيشوندي قبل از انتساب ارزيابي مي شود و عملگر پسوندي بعد از انتساب ارزيابي ميشود.
88
مثال : پس از اجراي دستورالعملهاي فوق : پس از اجراي دستورالعملهاي فوق :
int x=5; y=++x * 2; پس از اجراي دستورالعملهاي فوق : y=12 X=6 int x=5; y=x++ * 2; پس از اجراي دستورالعملهاي فوق : y=10 X=6
89
عملگر sizeof Sizeof ازعملگرهاي يكتائي مي باشد و مشخص كننده تعداد بايت هائي است كه يك نوع داده اشغال ميكند. مثال : int x; cout << sizeof x ; مقدار 2 نمايش داده ميشود . cout << sizeof(float) ; مقدار 4 نمايش داده مي شود.
90
عملگرهاي جايگزيني محاسباتي
براي سادهتر نوشتن عبارتها در C++ ، ميتوان از عملگرهاي جايگزيني محاسبـــاتي استفاده نمود. %= /= *= = = مثال: int a=1; a = a +1; int a=1; a += 1;
91
اولويت عملگرها ارزيابي مقدار يك عبارت رياضي براساس جدول اولويت عملگرها انجام ميگردد. در ذيل جدول اولويت عملگرها براساس بترتيب از بيشترين اولويت به كمترين اولويت داده شده است.
92
مثال 1 : با توجه به جدول اولويت عملگرها داريم كه (5+2) *(6+2*2)/2
7 *(6+2*2)/2 7*(6+4)/2 7* 10 /2 70 /2 35
93
مثال 2 : خروجی : 1 9 2 7 int a=6 , b=2, c=8, d=12; d=a++ * b/c ++;
cout << d << c << b << a; خروجی :
94
توضيحات (Comments) توضيحات در برنامه باعث خوانائي بيشتر و درك بهتر برنامه مي شود. بنابراين توصيه بر آن است كه حتي الامكان در برنامهها از توضيحات استفاده نمائيم. در C++، توضيحات بدو صورت انجام ميگيرد که در اسلایدهای بعد به آن اشاره شده است.
95
توضيحات (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 */
96
توابع كتابخانه زبان C++ مجهز به تعدادي توابع كتابخانه ميباشد. بعنوان مثال تعدادي توابع كتابخانه براي عمليات ورودي و خروجي وجود دارند. معمولاً توابع كتابخانه مشابه ، بصورت برنامههاي هدف (برنامه ترجمه شده بزبان ماشين) در قالب فايلهاي كتابخانه دسته بندي و مورد استفاده قرا رميگيرند. اين فايلها را فايلهاي header مينامند و داراي پسوند .h ميباشند.
97
نحوه استفاده از توابع کتابخانه ای
براي استفاده از توابع كتابخانه خاصي بايستـــي نام فايل header آنرا در ابتداي برنامه در دستور #include قرار دهيم. > اسم فايل header < include#
99
برنامه در C++ اكنون باتوجه به مطالب گفته شده قادر خواهيم بود كه تعدادي برنامه ساده و كوچك به زبان C++ بنويسيم. براي نوشتن برنامه بايستي دستورالعملها را در تابع main( ) قرار دهيم و براي اينكار ميتوان به يكي از دو طريقی که در اسلایدهای بعد آمده است ، عمل نمود.
100
روش اول : دستورالعمل 1 ; دستورالعمل 2 ; #include < > int main( )
} دستورالعمل 1 ; دستورالعمل 2 ; . n دستورالعمل ; return 0 ;
101
روش دوم : دستورالعمل 1 ; دستورالعمل 2 ; #include < >
void main( ) { دستورالعمل 1 ; دستورالعمل 2 ; . n دستورالعمل ; }
102
error: به خطاهاي برنامه نويسي error مي گويند. ما در برنامه نویسی دو نوع خطا داریم: خطاهای دستوری (syntax error) خطاهای منطقی (logical error).
103
برنامه ای که پيغام C++ is an object oriented language را روي صفحه مانیتور نمايش مي دهد.
#include <iostream.h> int main( ) { cout <<"C++ is an object oriented language \n" ; return 0 ; }
104
برنامه زير يك حرف انگليسي كوچك را گرفته به حرف بزرگ تبديل مينمايد.
#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; }
105
دو عدد از نوع اعشاري را گرفته مجموع و حاصلضرب آنها را محاسبه و نمايش ميدهد.
#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 ; }
106
ساختارهای تصمیم گیری و تکرار
فصل دوم ساختارهای تصمیم گیری و تکرار
107
فهرست مطالب فصل دوم عملگر های رابطه ای عملگر شرطی دستورالعمل شرطی
عملگر کاما عملگر های منطقی دستورالعمل For
108
عملگرهای رابطه ای مساوي = = مخالف = ! بزرگتر > بزرگتر يا مساوي
از این عملگرها براي تعيين اينكه آيا دو عدد با هم معادلند يا يكي از ديگري بزرگتر يا كوچكتر ميباشد استفاده ميگردد. عملگرهاي رابطهاي عبارتند از: مساوي = = مخالف = ! بزرگتر > بزرگتر يا مساوي = > كوچكتر < كوچكتر يا مساوي <=
109
expression _ test ? expression _ true : expression _ false
عملگر شرطی شكل كلي عملگر شرطي بصورت زير ميباشد: عملگر شرطي تنها عملگري در C++ ميباشد كه داراي سه عملوند ميباشد. expression _ test ? expression _ true : expression _ false
110
مثال 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 نمايش داده مي شود.
111
IF دستورالعمل شرطي توسط این دستور شرطي را تست نموده و بسته به آنكه شرط درست يا غلط باشد عكسالعمل خاصي را نشان دهيم. if (عبارت ) { 1دستورالعمل ; . n دستورالعمل ; } else 1 دستورالعمل ;
112
مثال 1 : if(x != y) { cout << x ; ++ x ; } else cout << y ; - - y ;
113
برنامه زير يك عدد اعشاري را از ورودي گرفته جذر آن را محاسبه مينمايد.
مثال 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;
114
(عبارت n , …. , عبارت 3 , عبارت 2 , عبارت 1)
عملگر كاما تعدادي عبارت را ميتوان با كاما بهم متصل نمود و تشكيل يك عبارت پيچيدهتري را داد. اين عبارتها به ترتيب از چپ به راست ارزيابي شده و مقدار عبارت معادل عبارتn ميباشد. (عبارت n , …. , عبارت 3 , عبارت 2 , عبارت 1)
115
مثال : اگر داشته باشيم int a=2 , b=4 , c=5 ; عبارت زير را در نظر بگيريد: (++ a , a+b, ++ c, c+b) مقدار عبارت برابر است با b+c كه معادل 10 ميباشد.
116
عملگرهای منطقی با استفاده از عملگرهاي منطقي ميتوان شرط هاي تركيبي در برنامه ايجاد نمود. عملگرهاي منطقي عبارتست از : AND OR NOT كه در C++ به ترتيب بصورت زير نشان داده مي شود. && || !
117
جدول درستی سه عملگر شرطی
Or And Not
118
چند مثال : if ((x= = 5) ||(y != 0)) cout << x << endl ;
اگر x برابر با 5 يا y مخالف صفر باشد مقدار x نمايش داده شود . if(x) x = 0 ; اگر مقدار x مخالف صفر باشد، آنگاه x برابر با صفر شود .
119
برنامه زير طول سه پارهخط را از ورودي گرفته مشخص مينمايد كه آيا تشكيل يك مثلث مي دهد يا خير؟
#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 ; }
120
دستورالعمل For (عبارت 3 ; عبارت ; 2 عبارت 1) for { 1 دستورالعمل ; }
2 دستورالعمل ; . n دستورالعمل ; }
121
{ ساختار for } int i; for (i=1; i<=3; i++) {
معرفی کنترل گر حلقه; for (مقداردهی اولیه کنترل گر حلقه; شرط حلقه; گام حرکت ) } مجموعه دستورات بدنه حلقه ; { int i; for (i=1; i<=3; i++) { cout << “hello \n”;
122
مثال void main() { cout << “hello \n”; } void main() { int i;
for (i=1; i<=3; i++) cout << “hello \n”; }
123
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i =
124
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1
125
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1 2 hello
126
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1 2 3 hello hello
127
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1 2 3 4 hello hello hello
128
نحوه اجرای دستور for int i; for (i=1; i<=3; i++) { cout << “hello \n”; } i = 1 2 3 4 hello hello hello
129
نکته لزومی ندارد که کنترل گر حلقه حتماً از 1 شروع شود. int i;
for (i=5; i<=7; i++) { cout << “hello \n”; }
130
نکته مقدار دهی اولیه کنترل گر حلقه می تواند خارج از دستور for باشد.
int i =1; for ( i ; i<=3; i++) { cout << “hello \n”; }
131
نکته مقدار دهی اولیه کنترل گر حلقه می تواند خارج از دستور for باشد. در این صورت می توان جمله اول موجود در عبارت for را خالی گذاشت. int i=1; for ( i; i<=3; i++) { cout << “hello \n”; } int i=1; for ( ; i<=3; i++) { cout << “hello \n”; } =
132
نکته گام حرکت می تواند در بدنه دستور for تعریف شود. int i=1;
for ( i; i<=3; ) { cout << “hello \n”; i++; }
133
نکته معرفی کنترل گر حلقه می تواند در داخل دستور for باشد.
for (int i= 1; i<=3; i++) { cout << “hello \n”; }
134
نکته در دستور for اگر قسمت شرط خالی باشد، حلقه همیشه اجرا خواهد شد. به عبارتی هیچ شرطی برای توقف نداریم for (int i= 1; ; i++) { cout << “hello \n”; } وقتی هیچ شرطی نداریم، دو قسمت دیگر دستور for نیز می توانند خالی باشند. for ( ; ; ) { cout << “hello \n”; }
135
نکته لزومی ندارد که گام حرکت بصورت افزایشی باشد بلکه می تواند بصورت کاهشی نیز باشد. for (int i= 3; i >= 1; i--) { cout << “hello \n”; } تمرین: اعداد 100 تا 1 را به صورت نزولی چاپ نمایید. ( با گام حرکت افزایشی و کاهشی جداگانه بنویسید)
136
نکته گام حرکت می تواند افزایش یا کاهش بیش از 1 واحد را داشته باشد.
گام حرکت می تواند افزایش یا کاهش بیش از 1 واحد را داشته باشد. مثال: چاپ اعداد فرد بین 1 تا 100 for (int i= 1; i <= 100; k=k+2) { cout << k << “\n”; }
137
نکته کنترل گر حلقه می تواند اعشاری یا کاراکتری باشد، لزومی ندارد که حتما عدد صحیح در نظر بگیریم. for (char ch= ‘a’; ch <= ‘z’; ch++) { cout << ch << “\n”; }
138
برنامه زير عدد صحيح و مثبت 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 ; }
139
برنامه زير مجموع اعداد صحيح و متوالي بين 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 ; }
140
برنامه زير ارقام 0 تا 9 را نمايش ميدهد.
#include <iostream.h> int main( ) { int j=0 ; for( ; j <= 9 ; ) cout << j++ << endl; return 0 ; }
141
برنامه زير كليه اعداد سه رقمي كه با ارقام 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 ;
142
تمرین برنامه ای که اعداد ذوج بین 1 تا 1000 را چاپ کند.
برنامه ای که 100 عدد را خوانده، مجموع را محاسبه و چاپ کند. برنامه ای که حاصلضرب اعداد 1 تا 50 را چاپ کند. برنامه ای که 50 کاراکتر از صفحه کلید خوانده و تعیین کند که کدام یک حرف کوچک است. برنامه ای که 100 عدد صحیح را خوانده max و min را چاپ کند. برنامه ای که کاراکتر هایی که کد آن ها بین 100 تا 200 هست، را چاپ نماید.
143
کاربرد دستور break در دستور for
اگر در بدنه for از جمله ی break; استفاده شود، ادامه ی اجرای حلقه متوقف شده و حلقه خاتمه می یابد. int i , x; for(i=1;i<=100;i++) {cin>>x; if(x==50) break; } قطعه کد فوق حداکثر 100 عدد صحیح از ورودی می گیرد، ولی اگر در بین اعداد ورودی عدد 50 وارد شود بدون بررسی شرط حلقه از ادامه اجرای دستورات for اجتناب کرده و از حلقه خارج می شود.
144
مثال قطعه کدی که تعدادی کاراکتر از صفحه کلید خوانده، بعد از فشردن دکمه ی E تعداد آن ها را مشخص کند: char ch; int i; for(i=0; ;i++) {cin>>ch; if (ch==‘E’) break; } cout<<i;
145
حلقه 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 بار
146
مثال: چاپ جدول ضرب اعداد
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;
147
مثال: برنامه ای که 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;
148
کاربرد حلقه 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;
149
دستور 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 محاسبه کرده و در نهایت نمایش می دهد.
150
فصل سوم سایر ساختارهای تکرار
151
فهرست مطالب فصل سوم دستورالعمل while دستورالعمل do while
دستورالعمل break دستورالعمل continue دستورالعمل switch تابع cin.get() عملگر static_cast<>() جدول اولویت عملگرها
152
دستورالعمل while معرفی کنترل گر حلقه; مقدار دهی اولیه کنترل گر حلقه;
از اين دستور العمل مانند دستورالعمل for براي تكرار يك دستورالعمل ساده يا تركيبي استفاده ميگردد. شكل كلي اين دستور العمل بصورت زير ميباشد. معرفی کنترل گر حلقه; مقدار دهی اولیه کنترل گر حلقه; while( شرط) } دستورالعمل ; دستورالعمل ; . n دستورالعمل ; گام حرکت ;
153
تفاوت دستورهای while و for
دستورالعمل for زماني استفاده مي شود كه تعداد دفعات تكرار از قبل مشخص و معين باشد. در صورتيكه تعداد دفعات تكرار مشخص نباشد بايستي از دستورالعمل while استفاده نمود. دقت کنید با پیاده سازی مکانیزم های خاصی می توان بدون توجه به دفعات تکرار از هر دو دستور بصورت مشابه استفاده کرد.
154
با اجراي قطعه برنامه فوق مقادير زير نمايش داده ميشود :
مثال : int x=0 while(x<5) cout << x ++<< endl; با اجراي قطعه برنامه فوق مقادير زير نمايش داده ميشود : 1 2 3 4
155
برنامة فوق 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 ; }
156
نکته همانند دستور for اگر داخل بدنه دستور while فقط یک جمله باشد می توان { و } را حذف کرد. مثال: نمایش اعداد 0 تا 100: int main( ) { int j = 0; while(j<=100) cout<<j++<<endl; return 0 ; }
157
برنامه زیر را تفسیر کنید:
int main( ) { int j = 0; while(j<10) J++; cout<<j; return 0 ; }
158
دستورالعمل do while اين دستور العمل نيز براي تكرار يك دستورالعمل ساده يا تركيبي استفاده ميشود. شكل كلي اين دستورالعمل بصورت زير ميباشد. do } دستورالعمل 1 ; دستورالعمل 2 ; . n دستورالعمل ; } while( شرط); معرفی کنترل گر حلقه; مقدار دهی اولیه کنترل گر حلقه; do {دستورالعمل ; دستورالعمل ; . n دستورالعمل ; گام حرکت ; } while( شرط);
159
تفاوت دستورهای do while و while
در دستورالعمل while ابتدا مقدار شرط ارزيابي شده اما در دستورالعمل do while ابتدا دستورالعمل اجرا شده سپس مقدار شرط ارزيابي ميگردد. بنابراین دستورالعمل do while حداقل يك بار انجام مي شود .
160
مثال : #include <iostream.h> int main( ) { int count = 0; do
cout << count ++<<endl ; while(count <= 9); return 0 ; } ارقام 0 تا 9 را روي ده خط نمايش ميدهد
161
Break دستورالعمل break
اين دستورالعمل باعث توقف دستورالعمل هاي تكرار( for , while ,do while) شده و كنترل به خارج از اين دستورالعمل ها منتقل مينمايد. Break
162
مثال 1 : #include <iostream.h> int main( ) { float x, s=0.0 ; cin >> x ; while(x <= ) { if(x < 0.0){ cout << "Error-Negative Value" ; break; } s += x ; cin >> x ;} cout << s << endl ; return 0 ; جمع تعدادی عدد که بین 0 و 1000 هستند. اگر بین اعداد وارد شده عدد منفی وارد شود، بواسطه دستور break; حلقه خاتمه می یابد. اگر عدد وارد شده بزرگتر از 1000 باشد نیز شرط حلقه برآورده نشده و حلقه خاتمه می یابد
163
مثال 2: #include <iostream.h> int main( ) { int count = 0 ; while( 1 ) count ++ ; if(count > 10 ) break ; } cout << "counter : " << count << "\n"; return 0 ; counter : 11
164
مثال 3: #include <iostream.h> void main( ) { int count; float x, sum = 0; cin >> x ; for(count = 1; x < ; ++ count ) if(x < 0.0) { cout << "Error – Negative value " <<endl; break ; } sum += x ; cout << sum << \n ; جمع تعدادی عدد اعشاری که بیشتر از 0 و کمتر از 1000هستند را محاسبه می کند. اگر بین اعداد وارد شده عدد منفی وارد شود، بواسطه دستور break; حلقه خاتمه می یابد. اگر عدد وارد شده بزرگتر یا مساوی 1000 باشد نیز شرط حلقه برآورده نشده و حلقه خاتمه می یابد
165
مثال 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 <= ); cout << sum << endl ; return 0 ; جمع تعدادی عدد که بین 0 و 1000 هستند. اگر بین اعداد وارد شده عدد منفی وارد شود، بواسطه دستور break; حلقه خاتمه می یابد. اگر عدد وارد شده بزرگتر از 1000 باشد نیز شرط حلقه برآورده نشده و حلقه خاتمه می یابد. نکته: این حلقه حداقل یک بار اجرا می شود.... حتی اگر عدد اول بزرگتر از 1000 باشد نیز در مجموع شرکت داده خواهد شد. سپس از حلقه خارج خواهیم شد.
166
Continue دستورالعمل continue
از دستورالعمل continue ميتوان در دستورالعمل هاي تكرار do while ، while ، for استفاده نمود. اين دستورالعمل باعث ميشود كه كنترل به ابتدای دستورالعمل هاي تكرار منتقل گردد. (تذکر: در ابتدای حلقه بایستی شرط حلقه نیز بررسی شود) پس بهتر است بگوییم به انتهای بدنه حلقه تکرار رفته و از آن جا ادامه می دهد. Continue
167
مثال 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 <= ); cout << sum ; return 0 ; } جمع تعدادی عدد که کوچکتر و مساوی 1000 هستند را بدست می اورد. اگر بین اعداد وارد شده عدد منفی وارد شود، در حاصل جمع شرکت نخواهد کرد و اجرای دستورالعمل ها به انتهای حلقه هدایت خواهد شد. اگر عدد وارد شده بزرگتر از 1000 باشد نیز شرط حلقه برآورده نشده و حلقه خاتمه می یابد. نکته: این حلقه حداقل یک بار اجرا می شود.... حتی اگر عدد اول بزرگتر از 1000 باشد نیز در مجموع شرکت داده خواهد شد سپس از حلقه خارج خواهیم شد.
168
در نهایت میانگین اعداد غیر صفر را محاسبه می کند
مثال 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 ;
169
switch case دستورالعمل switch
همانطور که می دانید از دستورالعمل شرطی(if else) می توان بصورت تودرتو استفاده نمود ولي از طرفي اگر عمق استفادة تو در تو از اين دستورالعمل زياد گردد، درك آن ها مشكل مي شود . براي حل اين مشكل C++ ، دستورالعمل switch كه عملاً يك دستورالعمل چند انتخابي ميباشد را ارائه نموده است. switch case
170
شکل کلی دستور العمل Switch
{ case valueone : statement; break; case valuetwo: statement; case valuen : statement; break; default: statement ; }
171
مثال 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 * / }
172
مثال 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; }
173
تابع cin.get() : اين تابع يك كركتر را از صفحه كليد ميگيرد. براي استفاده از اين تابع در ابتداي برنامه بايستي داشته باشيم : #include <iostream.h>
174
قطعه برنامه ذيل يك كركتر را از صفحه كليد گرفته و نمايش ميدهد.
char x; x = cin.get( ); cout << x ;
175
برنامة ذيل يك سطر متن انگليسي كه به 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 .
176
در قطعه برنامه ذيل ازتابع 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; }
177
برنامة ذيل يك سطر متن انگليسي را گرفته كركترهاي خالي (blank) آن را حذف نموده و نمايش مي دهد.
#include <iostream.h> int main( ) { char next; while((next = cin.get( ) ) !=EOF) if(next != ) cout << next ; return 0 ; }
178
تمرین : برنامه ای با استفاده از ساخنار switch case که یک عملگر و دو عملوند را از ورودی خوانده ، عملگر را بر روی عملوند اجرا نمایید.
179
عملگر static_cast از اين عملگر براي تبديل موقت يك نوع data به نوع ديگر استفاده ميشود. اين عملگر يك عملگر يكتائي ميباشد.
180
مثال 1: int x = 25 ; float y ; y = static_cast < float >(x) ;
مقدار x موقتاً بصورت اعشاري در می آيد و در نتيجه مقدار y برابر با می شود. بايستي توجه داشت كه نوع متغير x عوض نمي شود بلكه موقتاً مقدار آن بصورت اعشاري در آمده است.
181
مثال 2: float x = ; cout << static_cast < int >(x) << endl; cout << x ; ابتدا مقدار 14 نمايش داده مي شود و سپس مقدار نمايش داده ميشود.
182
جدول اولویت عملگرها
183
تمرین برنامه ای که یک سکه 100 ریالی را به سکه های 2و5 و10و20 و 50 ریالی خرد کند. برنامه ای که خروجی زیر را چاپ کند: برنامه ای که حاصل عبارت زیر را بدست اورد:
184
فصل چهارم اعداد تصادفی
185
فهرست مطالب فصل چهارم تولید اعداد تصادفی تعریف نوع داده ( typedef )
داده های از نوع شمارشی
186
اعداد تصادفی مقادير تصادفي يا شانسي در اكثر برنامههاي كاربردي در زمينه شبيه سازي و بازيهاي كامپيوتري نقش مهمي را ايفا مينمايند. براي ايجاد يك عدد تصادفي صحيح بين 0 و بايستي از تابع rand() استفاده نمائيم. rand( )
187
برنامه زير 10 عدد تصادفي بين 0 و 32767 را ايجاد مينمايد.
#include <stdlib.h> #include < iostream.h> int main( ) { for(int j=1; j<=10; ++j) cout << rand( ) << \n ; return 0 ; }
188
تعريف نوع داده (typedef)
typedef type newtype; نشان دهنده نوع داده موجود اسم جديد
189
مثال : typedef int integer; حال ميتوان y و x را بصورت زير تعريف نمود : integer x,y;
190
دادههاي از نوع شمارشي بمنظور معرفي دادههاي از نوع شمارشي از كلمه enum استفاده ميگردد. مثال emum status {married, devorced, vidow, single}; status a ; a= single ; : 1 2 3 4 enum color {red, blue, green, yellow, brown} ; color يك نوع داده شمارشي ميباشد.
191
توجه : بايستي در نظر داشت كه دادههاي از نوع شمارشي در عمليات ورودي و خروجي شركت نمينمايند. بعبارت ديگر مقادير دادههاي از نوع شمارشي بايستي در برنامه تعيين نمود. دستورالعمل هاي ورودي و خروجي مانند cin و cout در مورد دادههاي شمارشي نميتوان استفاده نمود.
192
فصل پنجم آرایه ها
193
فهرست مطالب فصل پنجم آرایه یک بعدی آرایه دو بعدی ( ماتریس ها )
194
آرایه یک بعدی آرايه يك فضاي پيوسته از حافظه اصلي كامپيوتر ميباشد كه ميتواند چندين مقدا را در خود جاي دهد. كليه عناصر يك آرايه از يك نوع ميباشند. عناصر آرايه بوسيله انديس آن ها مشخص ميشوند. در C++ ، انديس آرايه از صفر شروع ميشود.
195
کاربرد آرایه ها آرايهها در برنامهنويسي در مواردي كاربرد دارند كه بخواهيم اطلاعات و دادهها را در طول اجراي برنامه حفظ نمائيم.
196
آرایه یک بعدی از نوع int x 1 2 3 4 اولين عنصر x[0] پنجمين عنصر x[4]
1 2 3 4 اولين عنصر x[0] پنجمين عنصر x[4]
197
تخصیص مقادیر اولیه به عناصر آرایه :
int x[5]= {4, 2, 5, 17, 30}; x 4 2 5 17 30 1 3
198
دریافت مقادیر عناصر آرایه :
int x[5]; for(int i=0; i<=4; ++i) cin >> x[ i ] ; نمایش مقادیر عناصر آرایه : for(int i=0; i<5; ++i) cout << x[ i ] ;
199
اگر تعداد مقادير اوليه كمتر از تعداد عضوهاي آرايه باشد عضوهاي باقيمانده بطور اتوماتيك، مقدار اوليه صفر ميگيرند. int x[5] = {12, 5, 7}; x 12 5 7 1 2 3 4
200
بايستي توجه داشت كه آرايهها به صورت ضمني مقدار اوليه صفر نميگيرند
بايستي توجه داشت كه آرايهها به صورت ضمني مقدار اوليه صفر نميگيرند. برنامه نويس بايد به عضو اول آرايه، مقدار اوليه صفر تخصيص دهد تا عضوهاي باقيمانده بطور اتوماتيك، مقدار اوليه صفر بگيرند. int x[5] = {0} ; x 1 2 3 4
201
دستور زير يك آرايه يك بعدي شش عنصري از نوع 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
202
برنامه ذيل 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 ; }
203
برنامه ذيل 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; }
204
برنامه زير 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 ;
205
آرايههاي دوبعدي (ماتريسها)
ماتريس ها بوسيله آرايههاي دوبعدي در كامپيوترنمايش داده مي شوند. 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]
206
تخصیص مقادیر اولیه به عناصر آرایه :
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
207
نکته 1 : int a[3][4]= { {1}, {2,3} , {4,5,6} } ; 1 2 3 4 5 6
208
نکته 2 : int a[3][4]= {1, 2, 3, 4,5 } ; 1 2 3 4 5
209
نکته 3 : در يك آراية دوانديسي، هر سطر، در حقيقت آرايهاي يك انديسي است. در اعلان آرايههاي دوانديسي ذكر تعداد ستون ها الزامي است. int a[ ][4]={1,2,3,4,5}; 1 2 3 4 5
210
برنامه زير يك ماتريس 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 ; }
211
برنامه که عناصر ماتریس 2*3 را از ورودی خوانده و بزرگترین عنصر هر سطر را پیدا کرده و به همراه شماره سطر آن جاپ نماید.
212
ضدحال...!
213
فصل ششم توابع هدف طراحی یک دفترچه تلفن است. که دارای خصوصیتهای زیر باشد: قابلیت اضافه کردن بر اساس اسم و شماره جستجو بر اساس شماره و نام ویرایش کردن حذف کردن خروج از برنامه
214
فهرست مطالب فصل ششم تعریف تابع تابع بازگشتی توابع درون خطی
انتقال پارامترها از طریق ارجاع کلاس های حافظه ( storage classes ) سربارگذاری توابع
215
تعریف توابع استفاده از توابع در برنامهها به برنامهنويس اين امكان را ميدهد كه بتواند برنامههاي خود را به صورت قطعه قطعه برنامه بنويسد. تا كنون كليه برنامههائي كه نوشتهايم فقط از تابع main( ) استفاده نمودهايم.
216
شكل كلي توابع بصورت زير ميباشند :
نوع مقدار برگشتي لیست پارامتر ها جهت انتقال اطلاعات از تابع احضار كننده به تابع فراخوانده شده return-value-type function-name (parameter-list) { declaration and statements } نام تابع تعريف اعلانهاي تابع و دستورالعمل هاي اجرائي
217
تابع زير يك حرف كوچك را به بزرگ تبديل مينمايد.
نوع مقدار برگشتی پارامتری از نوع 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;
218
برنامه کامل که از تابع قبل جهت تبدیل يك حرف كوچك به بزرگ استفاده مينمايد.
#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’
219
تابع maximum دو مقدار صحيح را گرفته بزرگترين آنها را برمي گرداند.
int maximum(int x, int y) { int z ; z=(x >= y)? x : y; // if (x>=y) z=x; else z=y; return z; }
220
برنامه کامل که از تابع 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
221
اسامي پارامترها و آرگومان هاي يك تابع ميتوانند همنام باشند.
نکته 1 : اسامي پارامترها و آرگومان هاي يك تابع ميتوانند همنام باشند.
222
برنامه زير يك مقدار مثبت را گرفته فاكتوريل آنرا محاسبه نموده نمايش ميدهد.
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
223
نکته 2 : وقتي در تابعي، تابع ديگر احضار ميگردد بايستي تعريف تابع احضار شونده قبل از تعريف تابع احضار كننده در برنامه ظاهر گردد.
224
نکته 3 : اگر بخواهیم در برنامهها ابتدا تابع main ظاهر گردد بايستي prototype تابع يعني پيش نمونة تابع كه شامل نام تابع، نوع مقدار برگشتي تابع، تعداد پارامترهائي را كه تابع انتظار دريافت آنرا دارد و انواع پارامترها و ترتيب قرارگرفتن اين پارامترها را به اطلاع كامپايلر برساند. در اسلاید بعد مثالی در این زمینه آورده شده است.
225
#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);
226
نکته 4 : در صورتي كه تابع مقداري بر نگرداند نوع مقدار برگشتي تابع را void اعلان ميكنيم. و در صورتيكه تابع مقداري را دريافت نكند بجاي parameter- list از void يا ( ) استفاده مي گردد. در اسلاید بعد مثالی در این زمینه آورده شده است.
227
تابع مقداري بر نمی گرداند.
#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 ; تابع مقداري بر نمی گرداند.
228
احضار بوسیله مقدار ( 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
229
احضار بوسیله مقدار ( 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 در این نوع احضار تابع حافظههاي مورد استفاده آرگومان ها و پارامترها از هم متمايزند و هرگونه تغيير در پارامترها باعـــث تغيـــر در آرگومان هاي متناظر نميگردد.
230
تابع بازگشتي (recursive functions)
231
نحوه محاسبه فاکتوریل از طریق تابع بازگشتی
n != 1*2*3*…*(n-1) *n f(n) = n ! f(n) = n=1/ n=0 اگر n *f(n-1) در غير اينصورت n!= 1* 2* 3* … *(n-2) *(n-1) *n n!=(n-1)! *n در اسلاید بعد تابع بازگشتی مورد نظر پیاده سازی شده است.
232
تابع بازگشتی محاسبه فاکتوریل
#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) ) ;
233
نحوه محاسبه n امین مقدار دنباله فیبوناچی از طریق تابع بازگشتی
0 , 1, 1, 2, 3, 5, 8, 13, 21 , 34, … دنباله فیبوناچی : = fib(n)= جمله n ام اگر n= اگر n= در غير اينصورت fib(n-1)+fib(n-2) در اسلاید بعد تابع بازگشتی مورد نظر پیاده سازی شده است.
234
برنامهزير 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) ) ;
235
برنامه زير يك خط متن انگليسي را گرفته آن را وارون نموده نمايش ميدهد.
# 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 ;
236
انتقال پارامترها از طريق ارجاع
تاكنون وقتي تابعي را احضار ميكرديم يك كپي از مقادير آرگومان ها درپارامترهاي متناظر قرار ميگرفت . این روش احضار بوسيله مقدار يا call by value ناميده شد. در انتقال پارامترها از طريق ارجاع در حقيقت حافظه مربوط به آرگومان ها و پارامترهاي متناظر بصورت اشتراكي مورد استفاده قرار ميگيرد. اين روش call by reference ناميده ميشود .
237
انتقال پارامترها از طريق ارجاع
در اين روش پارامترهائي كه از طريق call by reference عمل مينمايند در پيش نمونه تابع قبل از نام چنين پارامترهائي از & استفاده ميشود.واضح است كه در تعريف تابع نيز بهمين طريق عمل ميشود.
238
مثال : خروجی : ادامه خروجی : #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
239
نکته : وقتي پارامتري بصورت call by reference اعلان ميگردد اين بدان معني است كه با تغيير مقدار اين پارامتر در تابع احضار شده مقدار آرگومان متناظر نيز تغيير مينمايد.
240
برنامهزير با استفاده از 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 ;
241
توابع درون خطي (inline)
242
اشکال توابع inline بجاي داشتن تنها يك كپي از تابع ، چند كپي از دستورالعمل هاي تابع در برنامه اضافه ميشود كه باعث بزرگ شدن اندازه يا طول برنامه ميشود. بنابراين از inline براي توابع كوچك استفاده ميگردد.
243
مثالی از توابع درون خطی #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 ; }
244
كلاسهاي حافظه (storage classes)
متغيرها بدو طريق متمايز مشخص ميشوند يكي بوسيله نوع (type) آن ها و ديگري بوسيله كلاس حافظه آن ها. نوع متغير قبلاً اشاره شده بعنوان مثال int ، float ، double ، ولي كلاس حافظة يك متغير در مورد طول عمر و وسعت و دامنة متغير بحث مينمايد. در اسلاید بعد به انواع کلاس حافظه می پردازیم.
245
بطور كلي كلاس حافظه متغيرها به چهار دستة تقسيم ميگردد :
automatic static external register
246
automatic متغيرهاي automatic در درون يك تابع تعريف ميشوند و در تابعي كه اعلان ميشود بصورت متغيرهاي محلي براي آن تابع ميباشند. حافظه تخصيص داده شده به متغيرهاي automatic پس از اتمام اجراي تابع از بين مي رود بعبارت ديگر وسعت و دامنة متغيرهاي از نوع automatic تابعي ميباشد كه متغير در آن اعلان گرديده است.
247
static و به دودسته تقسیم می شوند 1- متغیر های استاتیک محلی
متغيرهاي automatic هستند ولي در خاتمة اجراي تابع، حافظه وابسته به اين نوع متغيرهـــا از بين نميرود بلكه براي فراخواني بعدي تابع باقي ميماند. و به دودسته تقسیم می شوند 1- متغیر های استاتیک محلی 2- متغیر های استاتیک عمومی مقدار اولیه متغیرهای استاتیک محلی و عمومی صفر است. در اسلاید بعد به یک مثال از کاربرد این نوع کلاس حافظه می پردازیم.
248
استاتیک محلی فقط در همان تابعی که تعریف می شوند قابل استفاده اند.
هنگام فراخوانی تابع ایجاد می شوند و به هنگام خروج تابع ، آخرین مقدار خودشان را حفظ می کنند. فقط یک با مقدار اولیه می گیرند. در اسلاید بعد به یک مثال از کاربرد این نوع کلاس حافظه می پردازیم.
249
مثال : #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++;
250
مثال : #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 مقدار اوليه تخصيص ندهيم مقدار صفر بصورت اتوماتيك براي آنها در نظر گرفته ميشود.
251
external متغيرهاي از نوع external متغيرهائي هستند كه در بيرون از توابع اعلان مي شوند و وسعت و دامنه فعاليت آنها كليه توابعي ميباشد كه در زير دستور اعلان متغير قرار دارد. در اسلاید بعد به یک مثال از کاربرد این نوع کلاس حافظه می پردازیم.
252
مثال : #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 مقدار اوليه تخصيص ندهيم مقدار صفر بصورت اتوماتيك براي آنها در نظر گرفته ميشود.
253
register وقتي متغيري از نوع register اعلان ميشود از كامپيوتر عملاً درخواست ميشود كه به جاي حافظه از يكي از رجيسترهاي موجود استفاده نمايد.
254
کاربرد کلاس register register int i; for(i=1;i<=10;i++)
معمولاً از نوع رجيستر براي شاخصهاي دستور تكرار و يا انديس هاي آرايهها استفاده ميشود. بايستي توجه داشت كه متغيرهاي از نوع رجيستر قابل استفاده دردستور cin نميباشند register int i; for(i=1;i<=10;i++) cout<<“hi”;
255
سربارگذاري توابع (function overloading)
256
مثال : #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)
257
برنامه ای که با استفاده ار تابعی به نام Square() ، مربع یک عدد را محاسبه می کند
دقت شود این برنامه باید بتواند مربع یک عدد صحیح و اعشاری را با استفاده از توابع سرباگذاری محاسبه نمایید.
258
تمرین برنامه ای بنویسید که 3 عدد اعشاری را خوانده و به تابعی ارسال کند و تابع میانگین آن ها را محاسبه کرده و برگرداند. برنامه ای که ضرایب معادله ی درجه دومی را خوانده، آن ها را به تابعی ارسال کند. تابع معادله را حل کند و جواب ها را در خروجی چاپ کند. (تابع جواب ها را به تابع اصلی برنمی گرداند.) برنامه ای بنویسید که عددی را از ورودی خوانده و هریک از ارقام آن را در یک سطر چاپ کند. تفکیک و چاپ ارقام توسط تابع بازگشتی صورت گیرد. برنامه ای بنویسید که حاصلضرب دو عدد صحیح را به کمک جمع کردن محاسبه کند. برای این کار از تابع بازگشتی استفاده کنید. a اگر b=1 a×(b-1)+a اگر b>1 a×b =
259
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(); }
260
# 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
261
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();
262
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();
263
فصل هفتم ساختار ها و اشاره گرها
264
فهرست مطالب فصل هفتم ساختارها Union ها اشاره گرها ( Pointer)
تعریف آرایه آرایه های دو بعدی و اشاره گرها تخصیص حافظه بصورت پویا ( عملگر new ) رشته ها و توابع مربوطه
265
ساختارها ساختارها شبيه آرايهها بوده بدين صورت كه يك نوع داده گروهي است كه فضاي پيوسته از حافظه اصلي را اشغال مينمايد. اما عناصر ساختار الزاماً از يك نوع نميباشند بلكه اعضاي يك ساختار ميتوانند از نوعهاي مختلف از قبيل char ، int ، float ، … باشند.
266
تعريف ساختار struct time { int hour ; // 0 – 23 int minute ; // 0 – 59
نام ساختار struct time { int hour ; // 0 – 23 int minute ; // 0 – 59 int second; // } ; اعضا ساختار
267
مثال : struct account { int acc_no ; char acc_type; char name[80] ; float balance ; }; ساختار account داراي چهار عضو ميباشد. acc_no شماره حساب از نوع int acc_type نوع حساب از نوع char name مشخصات صاحب حساب از نوع رشتة 80 كركتري balance مانده حساب از نوع float
268
به دو صورت می توان اعلان یک متغیر از نوع ساختار را نمایش داد :
روش اول : 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;
269
به ساختارها ميتوان مقدار اوليه نيز تخصيص داد
account cust = {4236, r, Nader Naderi , };
270
دسترسي به عناصر يك ساختار
بمنظور دسترسي به عناصر يك ساختار از عملگر . استفاده ميگردد . عملگر. جزء عملگرهاي يكتائي ميباشد.
271
مثال : cust .acc_no = 4236; cust .acc_type = r; cust . name = Nader Naderi; cust . balance = ;
272
نکته : عضو يك ساختار خود ميتواند يك ساختار ديگر باشد. 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 مشخص ميگردد.
273
نکته : ميتوان آرايهاي تعريف نمود كه هر عضو آن يك ساختار باشد و حتي به آنها مقادير اوليه تخصيص نمود. struct struc1 { char name[40]; int pay1; int pay2; } ; struc1 cust[ ]= {nader, 3000 , 40000, sara, 4200, 6000, susan, 3700, 25000, saman, 4800 , 2000, };
274
برنامه زير هر عدد مختلط را بصورت يك ساختار در نظر گرفته، دو عدد مختلط را ميگيرد و مجموع آن ها را مشخص و نمايش ميدهد. #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 ; }
275
union union از نظر ساختاري شبيه struct ميباشد . با اين تفاوت كه عضوهائي كه تشكيل union ميدهد همگي از حافظه مشتركي در كامپيوتر استفاده مينمايند. بنابراين استفاده از union باعث صرفهجوئي در حافظه ميگردد.
276
مثال : union id { char color [10]; int size; } x , y; هر كدام از متغيرهاي x و y يك رشته 10 كركتري يا يك مقدار از نوع int ميباشد وكامپيوتر يك بلوك حافظه كه بتواند رشته 10 كركتري رادر خود جاي دهد ، برايcolor و size در نظر ميگيرد.
277
مثال : union xpq { int x ; char y[2] ; } p ;
278
تمرین: برنامه اي بنويسيم كه يك دفترچه تلفن 20 تايي (ظرفيت پذيرش 20 نام و شماره تلفن را داشته باشد)و امكان جستجو در آن را بر اساس نام فرد ايجاد نمايد.
279
اشارهگرها (Pointers)
دادههائي كه در كامپيوتر در حافظه اصلي ذخيره ميشوند بايتهاي متوالي از حافظه بسته به نوع data اشغال ميكنند. نوع داده مقادير حافظه لازم int 32767 تا –32768 2 بايت long int تا – 4 بايت char يك كاركتر 1بايت float 3.4e38 تا 1.2e-38 double 1.8e308 تا 2.2e-308 8 بايت
280
اشارهگرها (Pointers)
با داشتن آدرس داده در حافظة اصلي ميتوان براحتي به آن داده دسترسي پيدا نمود و از طرف ديگر آدرس هر داده در حافظه آدرس بايت شروع آن داده ميباشد. int x = 613; 1 2 3 4 613 5 6 7
281
نکته : در كامپيوتر آدرسها معمولاً دو بايت اشغال مينمايند. اگر آدرس x را در px قرار دهيم آنگاه ميگوئيم كه px به x اشاره مينمايد. px x آدرس متغير x را بوسيله &x نشان ميدهيم و عملگر & را عملگر آدرس مينامند. int x , *px X=54; px = &x ;
282
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
283
آرایه یک بعدی و اشاره گرها
اولين عنصر آرايه بوسيله 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 ;
284
ساختارها و اشاره گرها px = &x ;
ميتوان اشارهگري را تعريف نمود كه به اولين بايت يك ساختار (struct) اشاره نمايد. struct struc1 { int a ; float b ; char c; int d ; } x, *px ; px = &x ; عبارت x.a معادل pxa معادل (*px).a ميباشد.
285
نکته : استفاده از آرايهها بعنوان پارامتر تابع مجاز است.
در اسلاید بعد به یک مثال توجه نمایید.
286
در برنامه زير تابع 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() شده است. این مبحث، تحت عنوان فراخوانی از طریق ارجاع در ادامه توضیح داده می شود.
287
نکته : در صورتيكه آرايه بيش از يك بعد داشته باشد بعدهاي دوم به بعد بايستي در تعريف تابع و پيش نمونه تابع ذكر گردد. در اسلاید بعد به یک مثال توجه نمایید.
288
خروجی : #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 ] << ; خروجی :
289
آرايههاي دوبعدي و اشارهگرها
يك آرايه دوبعدي بصورت تعدادي آرايه يك بعدي ميتوان تعريف نمود. اگر x يك ماتريس 5 سطري و 4 ستوني از نوع اعشاري باشد قبلاً اين ماتريس را با float x[5][4]; معرفي كرديم. حال با استفاده از اشارهگرها بصورت زير معرفي نمائيم: float (*x)[4];
290
آرايههاي دوبعدي و اشارهگرها
float (*x)[4]; آرايه يك بعدي اول x آرايه يك بعدي دوم (x+1) آرايه يك بعدي سوم (x+2) آرايه يك بعدي چهارم (x+3) آرايه يك بعدي پنجم (x+4)
291
در برنامه زير يك آرايه 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; }
292
تخصيص حافظه به صورت پويا يا (عملگر new)
delete dynamic memory allocation
293
براي تخصيص حافظه باندازه 20 مقدار از نوع int كه اشارهگر ptx به آن اشاره نمايد بصورت زير عمل ميشود.
int *ptx; ptx = new int [20]; ptx به اولين داده از نوع int اشاره مينمايد. ptx+i به i+1 امين عنصر از فضاي پيوسته اشاره مينمايد.
295
برنامه زير يك فضاي 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;
296
برنامه زير آرايههاي 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;
297
برنامه زير دو مقدار اعشاري را گرفته مقادير آن ها را به كمك تابع 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;
298
برنامه ای که تعداد n عدد را از ورودی خوانده ، در آرایه ای قرار می دهد و سپس آرایه را به تابعی ارسال می کند .تابع تعداد اعداد زوج و فرد را نمایش دهد.
299
رشتهها و توابع مربوطه رشتهها در C++ ، آرايهاي از كركترها ميباشند كه با كركتر \0 ختم مي شوند. char name[ ]= sara; s a r \0
301
مقداردهی اولیه به رشته
306
رشته و اشاره گر char *name = sara;
هر رشته از طريق اشارهگري به اولين كركتر آن در دسترس قرار ميگيرد. آدرس يك رشته، آدرس كركتر اول آن ميباشد. به رشتهها ميتوان مقدار اوليه تخصيص داد. char *name = sara;
311
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;
312
تابع ) 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
313
تابع ) 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
314
تابع (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
315
تابع (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
316
رشتة 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);
317
تابع 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
318
تابع (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
319
نكته مهم براي استفاده از توابع مربوط به رشتهها بايستي حتماً در ابتدا برنامه #include <string.h> را قرار دهيم.
320
برنامه ذيل پنج اسم را بصورت 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();
321
مثال : 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
322
مثال : using namespace std; #include<iostream> #include<conio.h> #include<string.h> int main( ) { char s[10] = "sara"; cout << strlen(s); getch(); } 4
323
تابع زیر معادل تابع کتابخانه 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]); }
324
برنامه ای بنویسید که رشته ای را از ورودی خوانده، تمام حروف کوچک آن رشته را به حروف بزرگ تبدیل کرده و چاپ می کند. توضیح: در این برنامه از تابعی به نام upper() استفاده کنید که در این تابع باید عملیات تبدیل را انجام دهد نکته : تفاوت کد اسکی حروف کوچک و بزرگ32 واحد است برای تبدیل ‘a’ به ‘A’ کافی است از ‘a’ به اندازه 32 واحد کم کنید.
325
برنامه ای بنویسید که رشته ای را که به نقطه ختم می شود را از ورودی خوانده ، کاراکتر های موجود در رشته را به همراه تعداد دفعات تکرار آنها به خروجی ببرد
326
فصل هشتم برنامه نویس شی گرا
327
فهرست مطالب فصل هشتم عضوهای static کلاسهای تودرتو کلاس های محلی
استفاده از object ها بعنوان پارامترهای تابع برگشت اشیاء انتساب اشیاء آرایه اشیاء اشاره گر به اشیاء اشاره گر this توابع مجازی و پلی مرفیسم تعریف شی گرایی چند ریختی (polymorphism) خاصیت ارث بری پشته (stack) ایجاد شی ارث بری سازنده ها و نابود کننده ها توابع دوست کلاس های دوست توابع سازنده پارامتر دار توابع سازنده یک پارامتری
328
تعریف شی گرایی برنامه نويسي شئ گرا يا oop يك روش جديد برنامه نويسي ميباشد كه در آن از ويژگي ساختيافته همراه با چند ويژگيهاي قوي جديد استفاده ميشود. زبان برنامه نويسي C++ امكان استفاده از oop را به راحتي فراهم مينمايد.
329
نوع داده انتزاعی برنامه ها برای حل مسائل دنیای واقعی نوشته می شوند ، مثل نگهداری اطلاعات مربوط به دانشجویان ، نگهداری اطلاعات مشتریان بانک ها . گر چه می توان بسیاری از مسئله های دنیای واقعی را با استفاده از انواع اولیه حل کرد ، اما با تعریف انواع جدیدی که بتوان اشیای دنیای واقعی ، مثل دانشجویان را مدلسازی کنند ، حل مسائل راحتر خواهد بود در زبان برنامه نویسی شی گرا امکان تعریف انواع جدید وجود دارد در زبان برنامه نویسی C++ برای تعریف نوع جدید ، از کلاس ها استفاده می شود
330
کلاس ها و اشیا کلاس ها نوع جدیدی است که برنامه نویس آن را برای حل مسئله های دنیای واقعی تعریف می کند ، کلاس ها حاوی داده ها و تعریف عملیات است داده های عضو کلاس را فیلد یا صفت می گویند. عملیات کلاس ها را تابع یا متد می نامند. شی یک نمونه از کلاس است که در تکنیک برنامه نویسی شی گرا یک نهاد زمان اجرا می باشد.
331
نکته مهم : تمام زبانهاي برنامه نويسي شيگرا داراي سه خصوصيت مشترك زير ميباشند : الف: encapsulation (محصورسازي) ب: polymorphism (چندريختي) ج:inheritance (ارث بري)
332
محصورسازی (Encapsulation )
محصور سازی یا بسته بندی به معنای این است که تمام جنبه های یک نهاد در داخل یک کلاس جمع آوری و از سایر نهاد ها تفکیک می شود .بسته بندی ، مانع از این می شود که داده ها یک شی، توسط متد های شی دیگری دستیابی شود.
333
polymorphism (چند ريختي)
چند ریختی به معنای این است که نهادی مثل متغیر ، تابع ، شی، معانی یا کاربردهای مختلفی داشته باشند .به عنوان مثال توابع همنام نوعی چند ریختی محسوب می شوند.
334
inheritance (ارث بري) ارث بري فرآيندي است كه بوسيله آن يك شي (object) ميتواند خاصيتهاي شي ديگري را دارا شود.
335
تعریف کلاس و اشیادر c++ Class نام کلاس { داده ها توابع اختصاصی
Public : داده ها و عمومی Private : داده ها و توابع اختصاصی Protected: داده ها و توابع محافظت شده }اشایی از کلاس;
336
مثال
337
دستیابی به اعضای یک کلاس
برای دستیابی به اعضای یک کلاس از (نقطه) به صورت زیر استفاده می شود. نام عضو کلاس. نام شی کلاس امکان پذیر نیست em1.name Em1.putname() امکان پذیر نیست Em1.age()
338
برنامه ای که طول و عرض مستطیلی را از ورودی خوانده ، مساحت و محیط آن را به خروجی می برد
339
برنامه ای با استفاده از کلاس ها بنویسید که عددی را از ورودي گرفته و فاكتوريل آن را محاسبه ونمايش ميدهد.
340
پشته (stack) پشته ساختاري است كه داراي خاصيت last in first out ميباشد. پشته فضاي پيوسته در حافظه اشغال مينمايد. عملياتي كــه روي پشته انجام ميشوند عبارتند از : الف: push، كه باعث ميشود يك عنصر وارد پشته شده. ب: pop ، كه باعث ميشود يك عنصر از پشته خارج گردد.
341
در اسلاید بعد مثالی از نحوه ایجاد شی آورده شده است.
ايجاد شي (object) بمنظور ايجاد يك شي بايستي از كلمة رزروشده class استفاده نمود. class از نظر ظاهر شبيه ساختار يا struct ميباشد. پشته را بعنوان يك object ميتوان در نظر گرفت كه data آن شامل يك آرايه و يك tos ، و عملياتي كه روي اين object انجام ميشود عبارتست از push، initialize ، pop كردن پشته. در اسلاید بعد مثالی از نحوه ایجاد شی آورده شده است.
342
مثال : #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 نباشند غير قابل دسترسي هستند. و اين يكي از روشهاي محصور سازي اقلام دادههاست. بدين معني است كه بوسيله ساير قطعات برنامه قابل دسترسي ميباشد.
343
نکته : فقط توابع عضو ميتوانند به متغيرهاي عضو از نوع private دسترسي داشته باشند. بايستي توجه داشت كه اگر نوع عضوي مشخص نگردد آن عضو به صورت اتوماتيك private می باشد. Private
344
نحوه تعریف تابع عضو یک کلاس
void stack : : push(int i) { if(tos = = SIZE ) { cout << stack is full.; return; } stck[tos]= i ; tos ++ ; عملگر: : مشخص مينمايد كه تابع متعلق به كدام object ميباشد. عملگر : : عملگر scope resolution ناميده ميشود.
345
برنامه کامل 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; }
346
سازندهها و نابودكنندهها (constructors and destructors)
Initialization يا مقدار اوليه دادن بصورت اتوماتيك از طريق تابعي انجام ميشود بنام تابع constructor يا تابع سازنده. تابع سازنده تابع مخصوصي است كه عضوي از كلاس بوده و همنام با كلاس ميباشد.
347
سازندهها و نابودكنندهها (constructors and destructors)
348
سازندهها (constructors)
349
سازندهها با پارامتر (constructors)
350
مثال از سازنده با یک پارامتر
351
توابع دوست کلاس همانطورکه گفته شد تابعی که عضو کلاس نباشد ، نمی تواند به اعضای اختصاصی آن کلاس دستیابی داشته باشند برای اعلان تابع دوست ، باید الگوی آن را در داخل کلاس قرار دهید و کلمه کلیدی Friend را قبل از آن ذکر کنید.
352
برنامه ای که با استفاده از تابع دوست دوعدد را با هم جمع و تفریق می کند
353
مثال: تابع دوست دو کلاس
354
مثال: کلاس های دوست کلاس های را می توان دوست کلاس های دیگر معرفی کرد
مثال: کلاس های دوست کلاس های را می توان دوست کلاس های دیگر معرفی کرد. دراین حالت ، کلاس دوست و تمام توابع عضو آن به اعضای اختصاصی کلاس دیگر دسترسی دارند برنامه ای که با استفاده از کلاس دوست ، بین دو عدد کوچکترین را پیدا می کند.
355
اعضای کلاس با ویژگی static
در بعضی از مواقع ، فقط یک کپی از یک متغیر باید بین تمام اشیای یک کلاس مشترک باشد . کلمه کلیدی static برای این منظور به کار می رود. وقتی کلمه کلیدی static را با اعضای داده ای کلاس به کار می بریم ، به کامپایلر می گوییم که فقط یک کپی از آن متغیر وجود خواهد داشت و تمام اشیای آن کلاس ، آن متغیر را به اشتراک می گذارند.
356
مثال: اعضای کلاس با ویژگی static برنامه ای که کاربرد و اثر عضو داده ای staticرا نشان می دهد.
357
انتساب اشياء (object assignment)
در اسلاید بعد مثالی آورده شده است.
358
مثال : #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 ; }
359
مثال: آرایه ای از اشیا
360
اشاره گر به کلاس Pointers to Classes
اشاره گرها همانطور که می توانند به متغیرها اشاره کنند، می توانند به اشیاء یک کلاس نیز اشاره کنند و چون شی نمونه ای از کلاس است پس به کلاس اشاره می کنند . در حالت ساده برای دسترسی به اعضای کلاس توسط شی تعریفی، از نقطه (.) استفاده کردیم. اما در اشاره گر به شی باید از ترکیب 2 کاراکتر خط و بزرگتر (<-) استفاده کنیم. با هم مثالی کامل از اشاره گر به شی یا همان کلاس را بررسی می کنیم :
361
مثال :اشاره گر به کلاس
362
برنامه ای که نام ، شماره دانشحویی و معدل تعداد 15 دانشجو را از ورودی خوانده در آرایه ای از اشیا قرار داده و سپس دانشجویی که بیشترین معدل را دارد نمایش دهد.
363
ارث بری ارث بري فرآيندي است كه بوسيله آن يك شي (object) ميتواند خاصيتهاي شي ديگري را دارا شود.
364
کلاس های پايه و مشتق شده چند کلاس ممکن است خصوصيات و رفتارهای مشترکی داشته باشند اما هريک شامل خواص و توابع ديگری هم باشد. وراثت اجازه می دهد يک کلاس عمومی تعريف شود که اشيا درخصوصيات آن مشترک هستند و اين کلاس می تواند توسط ساير کلاس ها ارث برده شود و خواص جديدی به آن اضافه شود بدون اينکه تاثيری روی کلاس عمومی داشته باشد. وراثت شباهت بين دو کلاس را با استفاده از مفاهيم کلاس پايه base و کلاس مشتق شده derived بيان می کند. کلاسی که از آن ارث بری می شود کلاس پايه يا مبنا و کلاس وارث که خصوصيات کلاس پايه را به ارث می برد را کلاس مشتق شده می نامند. کلاس پايه شامل کليه خواص و رفتارهائی است که بين کلاس های مشتق شده مشترک است.
365
مثال: مثال. کلاس پايه shape را درنظر بگيريد که دارای خاصيت های اندازه، رنگ و موقعيت است. هر شکل می تواند رسم شود، پاک شود، حرکت کند و رنگ شود. هر کدام از اشکال دارای خواص و رفتارهای اضافه تری هستند. برای يک شکل معين بعضی رفتارها ممکن است متفاوت باشد مثلا محاسبه مساحت. نکته. يک کلاس متشق شده به نوبه خود می تواند کلاس پايه برای ساير کلاس ها باشد. نکته. اگر کلاس پايه تغيير کند کلاس مشتق شده نيز تحت تاثير اين تغييرات قرار می گيرد.
366
تعريف کلاس مشتق شده فرم کلی تعريف يک کلاس مشتق شده به صورت زير است:
class derived : access base { //members of new class; } derived نام کلاس جديد است که از کلاس پايه base مشتق شده است. قسمت access اختياری است ولی می تواند public، private يا protected باشد و برای تعيين مجوز دسترسی اعضای کلاس پايه در کلاس جديد بکار می رود. اگر مجوز دسترسی ذکر نشود به اين معنی است که کليه اعضای عمومی کلاس پايه در کلاس مشتق شده به صورت خصوصی خواهند بود.
367
مثال. کلاس جديد Derived از کلاس Base مشتق شده است
مثال. کلاس جديد Derived از کلاس Base مشتق شده است. در برنامه اصلی تابع change از کلاس Derived فراخوانی شده که خود دو تابع set و read از کلاس Base را صدا می زند.
368
مثال:
369
پروژه کلاسی به نام tictac تعریف کنید که با آن بتوانید دوزبازی انجام دهید این کلاس حاوی یک آرایه دوبعدی 3* 3 از نوع صحیح است .سازنده کلاس باید عناصر آرایه را برابر صفر قرار دهد. دو بازیکن ، بازی می کنند . بازیکن اول عدد 1 را در قرار می دهد و بازیکن دوم عدد 2 را در مربعی قرار می دهد . حرکت ها باید در خانه های خالی انجام شود .پس از هر حرکت کنترل می کنید که آیا کسی برنده شده است یا خیر . برنامه باید نوبت را رعایت کند مشخص کند که کدام بازیکن باید اول شروع کند.
370
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
371
پایان
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.