Transcript C++
دانشگاه آزاد اسالمی واحد گرگان
گروه مهندسی كامپيوتر و فناوري اطالعات
برنامه نويسيC++
محمد رضا ملک شاهکویی
[email protected]
WWW.MrMalek.Ir
منابع:
• برنامه نویسی به زبان ، C ++نویسنده :جعفرنژاد قمی
• کتاب آموزش زبان برنامه نویسی C ++دایتل دایتل
ابزارها و نرم افزارهاي مورد نياز:
نرم افزارهاي آفيس و ویژوال استودیو Borland c++,2008
آدرس پست الکترونيکی:
[email protected]
2
Course Evaluation Scheme
امتحان پایان ترم 14 :نمره
امتحان ميان ترم 5 :نمره
تمرین هاي کالسی و شرکت در بحث کالس 1 :نمره
3
جايگاه اين درس در رشته مهندسي کامپيوتر و مهندسي IT
• این درس اولين درس دانشگاهی رشته می باشد و نقطه شروعی براي ورود به
دنياي جالب برنامه نویسی و علم و فن كامپيوتر هست .بنابراین یاد گيري اصول
اوليه برنامه نویسی در این درس از جایگاه ویژه اي برخوردار است.
• این درس پایه و اساس برنامه نویسی است كه جزء اصول این رشته می باشد و
این اصول را به فرگيران یاد می دهد .بنابراین یادگيري دقيق این درس به
همراه ارائه پروژه هاي عملی كه الزمه این درس می باشد جزء اهم مسائل می
باشد .
اهداف درس
•
الگوریتمی براي حل مسئله ارائه دهد.
•
اصول و مبانی اوليه نرم افزار و سخت افزار را بشناسد.
•
اهداف و مفاهيم زبانهاي برنامه نویسی را بداند.
•
مفاهيم اوليه برنامه نویسی ساخت یافته را بداند و اصول الزم را در مرحله اجراء بکار ببرد .
•
دستورات زبان C++را در برنامه ها بکار ببرد.
•
از توابع و روال هاي استاندارد زبان C++در صورت لزوم استفاده نماید.
•
از توابع ،روال ها براي جدا كردن قطعات برنامه استفاده كند.
زبان هاي برنامهنويسي
• نرمافزارها توسط زبان هاي برنامهنویسی نوشته میشوند .زبان هاي برنامهنویسی،
یک سيستم ارتباطی هستند كه توسط آن ها میتوان دستورات الزم را به ماشين
انتقال داد.
• هر زبان برنامهنویسی به مجموعهأي از عالیم ،قواعد و دستورالعملها گفته میشود
كه امکان ارتباط با كامپيوتر را جهت بيان كاري یا حل مسئلهاي فراهم میكند.
•
•
•
•
•
در حالت كلی زبان هاي برنامهنویسی را به سه دسته زیر تقسيمبندي میكنند:
زبان هاي سطح باال
زبان هاي سطح پایين
زبان هاي سطح ميانی
كامپایلر برنامه نوشته در یک زبان سطح باال را به برنامه مقصد تبدیل میكند.
جلسه اول :الگوريتم ها
هدفهاي كلي
شناخت حل مسئله و ارائه الگوريتم
شناخت اجزاء الزم براي حل مسئله
بررسي صحت الگوريتم
هدفهاي رفتاري
دانشجو پس از مطالعه این فصل باید بتواند:
الگوريتمي را براي حل مسئله ارائه دهد.
الگوريتم هاي مختلف براي يک مسئله را مقايسه کند.
شرط ها و حلقه ها را در الگوريتم بکار ببرد .
مقدمه
در زندگي روزمره ،انسان با مسائل مختلفي روبروست و براي هر کددام از ايد
مسائل (حل مشکالت) راه حلي و روشي را بر ميگزيند .مسائلي از قبيل راه رفت ،
غذا خوردن ،خوابيدن و غيره که بشر تقريباً هر روز آنها را پيش روي خود دارد.
همه اي مسائل نياز به روشي براي حل کردن دارند مثال راه رفت بايد با ترتيد
خاصي و مراحل معيني انجام شود .تا مسدئله راه رفدت
بدراي بشدر حدل شدود.
اصطالحاً روش انجام کار يا حل مسئله را الگوريتم آن مسئله مينامند.
تعریف الگوریتم
هر دستورالعملي که مراحل انجام کاري را با زباني دقيق و با جزئيات کافي
بيان نمايد بطوريکه ترتي مراحل و شدرط خاتمده لمليدات در آن کدامال“
مشخص شده باشدد را الگدوريتم گويندد .بده لبدارتي ديگدر :الگدوريتم
مجمولهاي از دستورالعمل ها ،براي حل مسئله ميباشد که شدراي زيدر را
بايد دارا باشد:
دقيق باشد
جزئيات کامل حل مسئله را داشته باشد.
پايانپذير باشد.
مراحل الگوریتم
براي حل يك مسئله بايد الگوريتم آن مسئله را مشخص نيخ م (يخا ب خاب م) .نخه
اصطالحاً طراحي الگوريتم براي آن مسئله نام ده ميشخو .ر طراحخي الگخوريتم
معموالً سه مرحله زير را از هم جدا مينييد:
خواندن دادهها
انجام محاسبات
خروجيها
مثال :الگوريتمي بنويسيد كه دو عدد از ورودي دريافت كرده مجموع
دو عدد را محاسبه و چاپ نمايد.
خروجیها
مجموع دو عدد
انجام محاسبات
ورودي ها
جمع دو عدد
a , b
0ـ شروع
1ـ b ,aرا بخوان.
2ـ مجموع b , aرا محاسبه و در sumقرار بده.
3ـ sumرا در خروجی چاپ کن
4ـ پایان
مثال :الگوريتمي بنويسيد که سه لدد از ورودي دريافت کرده مجموع و ميانگي
سه لدد را محاسبه و چاپ کند.
خروجيها
چاپ مجموع
چاپ ميانگي
انجام محاسبات
محاسبه مجموع
محاسبه ميانگي
0د شروع
1د سه لدد از ورودي بخوان
2د مجموع سه لدد را محاسبه و در sumقرار بده.
3د sumرا بر سه تقسيم کرده،در aveقرار بده.
4د ave , sumرا در خروجي چاپ ک .
5د پايان.
ورودي ها
a
b
c
معموال درك يک الگوريتم با شکل راحت تر از نوشت آن بصورت مت
ميباشد .لذا الگوريتم را با فلوچارت( )flowchartنمايش ميدهند.
فلوچارت از شکلهاي زير تشکيل ميشود.
لالمتهاي شروع و پايان :که معموال از يک بيضي استفاده ميکنند:
End
Begin
لالمتهاي ورودي و خروجي :که معموال از متوازياالضالع استفاده ميشود:
چاپ کردن
write
خواندن يا
Read
عالمتهاي محاسباتی و جایگزینی :براي نمایش دستورات جایگزینی و
محاسباتی از مستطيل استفاده میکنند:
جایگزین یا
محاسبات
لالمت شرط:
براي نمايش شرط از لوزي
استفاده ميشود.
لالمت اتصال:
شرط
براي اتصال شکلهاي مختلف بهم از فلشهاي جهتدار استفاده ميکنند.
فلوچارت مجموع سه لدد
Begin
Read(a,b,c)
Sum
a+b+c
Ave
sum/3
Write(sum,ave)
End
مثال :فلوچارتي رسم نمائيد که دو لدد از ورودي دريافت کرده سپس
محتويات دو لدد را با هم جابجا نمايد.
براي حل اي مسئله b , aرا دو متغير که در آنها دو لدد خواندده شدده ،قدرار
ميگيرند در نظر ميگيريم .سپس با استفاده از يک متغير کمکي محتويدات ايد
دو لدد را جابجا ميکنيم :
a
b
a
b
12
15
12
15
temp
12
temp
a
b
a
b
15
15
15
12
12
12
temp
temp
:فلوچارت مسئله باال بصورت زير خواهد بود
Begin
Read(a,b)
temp
a
a
b
b
temp
Write(a,b)
End
تمرين
1ـ فلوچارتی رسم نمائيد كه طول و عرض مستطيل را از ورودي دریافت كرده
محيط و مساحت آنرا محاسبه و چاپ كند.
2ـ فلوچارتی رسم نمائيد كه شعاع دایرهاي را از ورودي دریافت كرده ،محيط و
مساحت آنرا محاسبه و چاپ نماید.
3ـ فلوچارتی رسم كنيد كه سه عدد Third , second, firstرا از ورودي
دریافت كرده ،محتویات آن ها را جابجا نموده ،حاصل را در خروجی چاپ كند.
4ـ فلوچارتی رسم نمائيد كه دو عدد از ورودي دریافت كرده ،سپس محتویات دو
عدد را بدون استفاده از متغير كمکی جابجا كند.
5ـ فلوچارتی رسم نمائيد كه عددي (درجه حرارت برحسب سانتيگراد) را از
ورودي دریافت كرده سپس آن را به درجه فارنهایت تبدیل كند.
دستورالعملهاي شرطي
در حل بسياري از مسائل يا تقريباً تمام مسائل نيداز بده اسدتفاده از شدروط
جزء ،نيازهاي اساسي محسوب ميشود .همانطور که ما خودمان در زندگي
روزمره با اي شرطها سرکار داريم .بطور مثال اگر هوا ابري باشد ممکد
است چني سخ بگوييم:
اگر هوا باراني باشد سپس چتري برميدارم .در غير اينصورت چتر برنميدارم.
در حالت كلي شرط را بصورت زير نمايش ميدهند:
لمل يا المال
yes
شرط يا شروط If
then
NO
لمل يا المال بعدي
مثال :فلوچارتی رسم نمائيد كه عددي را از ورودي دریافت
كرده ،فرد یا زوج بودن آن را تشخيص دهد.
مثال :فلوچارتی رسم کنيد که دو عدد از ورودي دریافت کرده بزرگترین عدد را پيدا کرده در
خروجی چاپ نماید.
مثال :فلوچارتي رسم نمائيد که سه لدد از ورودي دريافت کرده،
کوچکتري لدد را يافته در خروجي چاپ نمايد:
نمونه اجراي فلوچارت باال بصورت زير ميباشد:
خروج
Min
11
12
11
11
11
c
b
a
17
11
12
1
2
3
4
5
تمرين
-1فلوچارتی رسم كنيد كه عددي را از ورودي دریافت كرده ،قدر مطلق عدد را در
خروجی چاپ كند.
-2فلوچارتی رسم نمائيد كه عددي از ورودي دریافت كرده مثبت ،منفی یا صفر
بودن عدد را تشخيص داده ،در خروجی با پيغام مناسب چاپ كند.
-3فلوچارتی رسم نمائيد كه عددي را از ورودي دریافت كرده ،بخش پذیري آن بر 3
و 5را بررسی نماید.
4ـ فلوچارتی رسم نمائيد كه ضرایب یک معادله درجه دوم را از ورودي دریافت
كرده ،ریشههاي آن را محاسبه در خروجی چاپ كند.
حلقهها
در حل بسياري از مسائل با عملياتی روبرو میشویم ،که نياز به تکرار دارند
و عمل تکرار آن ها به تعداد مشخصی انجام میگيرد .فرض کنيد ،بخواهيم
ميانگين 100عدد را محاسبه کنيم ،در اینصورت منطقی بنظر نمیرسد که
100متغير مختلف را از ورودي دریافت کنيم سپس آن ها را جمع کنيم.
انواع حلقه ها
حلقه هاي با تکرار مشخص
حلقه هاي با تکرار نامشخص
حلقه هاي با تکرار مشخص
در اي نوع حلقهها تعداد تکرار مشخص ميباشد اي حلقه از اجزاء زير
تشکيل ميشود:
1د انديس حلقه
2د مقدار اوليه براي انديس حلقه
-3مقدار افزاينده براي انديس حلقه (معموال يک واحد در هر مرحله)
4د مقدار نهايي (تعداد تکرار حلقه)
5د شرطي براي کنترل تعداد تکرار حلقه
اين حلقهها را غالباً با فلوچارت بصورت زير نمايش ميدهند:
مقدار اوليه براي انديس حلقه 1 :
انديس حلقه i :
مقدار نهايي (تعداد تکرار حلقه)n :
مقدار افزاينده براي انديس حلقه (معموال
يک واحد در هر مرحله) +1 :
شرطي براي
کنترل تعداد
تکرار حلقه:
i<=n
مثال :فلوچارتي رسم نمائيد که لدد nرا از ورودي دريافت کرده ،مجموع
الداد از يک تا nرا محاسبه کند.
n
مقدار نهایی
i
اندیس حلقه
نمونه اجراي فلوچارت باال بصورت زیر است:
خروجی
15
sum
0
1
3
6
10
15
i
N
1
2
3
4
5
6
5
مثال :فلوچارتي رسم کنيد که nلدد از ورودي دريافت کرده ،بزرگتري مقدار از
بي nلدد را پيدا کرده در خروجي چاپ نمايد.
i
انديس حلقه
مقدار نهایی
بزرگترین مقدار
n
Max
مثال :فلوچارتي رسم نمائيد که ،n , xدو لددد صدحيم مثبدت را از
ورودي دريافت کرده سپس xبه توان nرا محاسبه کند.
انديس حلقه
مقدار نهايي
لدد به توان n
i
n
pow
حلقههایی که تعداد تکرار آن ها مشخص نيست.
در اي حلقهها با توجه به ورودي ،تعداد تکرار مشخص ميشود .و دقيقاً
نميتوان تعداد تکرار حلقه را بدون ورودي معي کرد .اي حلقه ها فق
شامل شرطي هستند که تا زمانيکه برقرار باشد حلقه اجرا ميشود.
در حالت كلی این نوع حلقهها بصورت زیر نمایش داده میشوند:
مثال :فلوچارتي رسم کنيد که لددي را از ورودي دريافدت کدرده سدپس
تعداد ارقام آن را شمرده در خروجي چاپ نمايد.
عد خوانده شده
تعدا ارقام
N
count
مثال :فلوچارتي رسم نمائيدد کده لدددي از ورودي دريافدت کدرده ،سدري
فيبوناچي قبل از آن را توليد نمايد.
در حالت کلي جمالت سري بصورت:
fk=fk-1+fk-2
N
لدد خوانده شده
f1
جمله اول سري
f2
جمله دوم سري
f3
جمله سوم سري
تمري
-1فلوچارتی رسم نمائيد كه عددي از ورودي دریافت كرده ،كامل بودن آن را
بررسی نماید( .عدد كامل ،عددي است كه مجموع مقسومعليههاي آن با خودش
برابر باشد).
-2فلوچارتی رسم كنيد كه Nرا از ورودي دریافت كرده N ،جمله سري
فيبوناچی را توليد نماید.
3ـ فلوچارتی رسم نمائيد كه دو عدد N , Mرا از ورودي خوانده ،بزرگترین
مقسومعليه مشترك دو عدد را محاسبه و چاپ كند.
حلقههاي تودرتو
الگوريتمهايي که تا حال بکار برديم ،فق شامل يک حلقه بودند .در صورتي که در
بسياري از مسائل ممک است نياز به استفاده از چند حلقه در داخل هم باشيم .در اي
نوع حلقهها بايد دقت بيشتري به خرج دهيم ،تا مشکلي پيش نيايد .اگر از حلقههاي
نوع اول بصورت تودرتو استفاده کنيم در اينصورت براي هر حلقه شرط نهايي و
انديس اوليه جداگانه بايد تعريف کنيم .
در حلقههاي تودرتو به ازاي يکبار تکرار حلقه اوليه ،حلقه داخلي به اندازه
مقدار نهايي خود تکرار ميشود .در کل اگر حلقه اوليه nبار تکرار شود و
حلقه داخلي mبار ،در اينصورت کل حلقه :
n m
nبار
بار تکرار خواهد شد.
mبار
فلوچارت حلقههاي تودرتو را ميتوان بصورت زير نشان داد:
nبار
mبار
مثال :فلوچارتي رسم نمائيد که Nرا از ورودي دريافت کرده ،مجموع سري زيدر
را محاسبه نمايد:
N
!N
....
انديس حلقه اول
ورودي
محاسبه فاكتوريل
انديس حلقه داخلي
مجموع
3
!3
i
N
fact
j
Sum
2
!2
S 1
ایا راه ساده تري وجود دارد؟
Sum ← Sum + i/fact
تمرينات آخر فصل
-1فلوچارتی رسم نمائيد كه Nعدد از ورودي دریافت كرده تعداد اعداد اول و كامل را شمرده در خروجی
چاپ نماید.
-2فلوچارتی رسم نمائيد كه N , Xرا از ورودي خوانده مقدار سري زیر را محاسبه كند:
+2
2
4
n
x
x
x
S 1
....
!2! 4
!N
-3فلوچارتی رسم نمائيد كه عددي را از ورودي دریافت كرده مقلوب عدد را محاسبه و در خروجی چاپ
كند.
4ـ فلوچارتی رسم كنيد كه تاریخ تولد شخصی را از ورودي خوانده ،سن شخص را با تاریخ روز ،محاسبه
نموده در خروجی چاپ كند.
-5فلوچارتی رسم نمائيد كه (m>n) N ,Mرا از ورودي دریافت كرده سري فيبوناچی بين N ,Mرا
توليد كرده ،در خروجی چاپ كند.
برنامه نويسي به زبان C++
فهرست مطالب
فصل اول :مقدمات زبان C++
فصل دوم :ساختار هاي تصميم گيري و تکرار
فصل سوم :سایر ساختار هاي تکرار
فصل چهارم :اعداد تصادفی
فصل پنجم :آرایه ها
فصل ششم :توابع
فصل هفتم :ساختارها و اشاره گرها
فصل اول
مقدمات C++
فهرست مطالب فصل اول
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
تاریخچه مختصر
قانون نامگذاري شناسه ها
متغير ها
اعالن متغير
تخصيص مقادیر به متغير
داده هاي از نوع کرکتر
کرکتر هاي مخصوص
رشته ها
نمایش مقادیر داده ها
دریافت مقادیر
.11
.12
.13
.14
.15
.16
.17
.18
.19
عملگر انتساب
عملگر هاي محاسباتی
عملگرهاي افزایش و کاهش
عملگر sizeof
عملگرهاي جایگزینی محاسباتی
اولویت عملگرها
توضيحات ()Comments
توابع کتابخانه
برنامه در C++
تاريخچه مختصر C++
این زبان در اوائل دهه 1980توسـط Bjarne stroustrupدر آزمایشـگاه
بل طراحی شده .این زبان عمالً توسعه یافته زبان برنامه نویسی Cمی باشد كه
امکان نوشتن برنامههاي ساخت یافته شئ گرا را میدهد.
قانون نامگذاري شناسهها
(1
حروف کوچك و بزرگ در نامگذاري شناسهها متفاوت میباشند.
بنابراین xy ، xY ، XY ، Xyچهار شناسه متفاوت
از نظر C++میباشد.
قانون نامگذاري شناسهها
)2در نامگذاري شناسهها از حروف الفباء ،ارقام وزیر خط ()underscore
استفاده میشود و حداکثر طول شناسه 31میباشد و شناسه بایستی با
یك رقم شروع نگردد.
قانون نامگذاري شناسهها
در زیر بعضی از كلمات.) براي نامگذاري شناسهها از كلمات كليدي نبایستی استفاده نمود3
.كليدي داده شده است
And
Sizeof
then
xor
Template
Float
False
Friend
While
continue
extern
Private
Switch
Default
Const
delete
typedef
if
this
Virtual
متغيرها
متغيــر ،مکــانی در حافصــه اصــلی
كامپيوتر میباشد كـه در آنجـا یـک
مقدار را میتوان ذخيره و در برنامـه
از آن استفاده نمود .قانون نامگذاري
متغيرهــا همــان قــانون نامگــذاري
شناسهها میباشد.
در اسالید بعد به انواع داده ها اشاره می شود.
انواع داده ها
حافظه الزم
مقادير
2بایت
32767تا –32768
2بایت
65535تا 0
4بایت
2147483647تا –2147483648
4بایت
4294967295تا 0
1بایت
یك کارکتر
1بایت
127تا –128
4بایت
3.4e38تا 1.2e-38
8بایت
1.8e308تا 2.2e-308
نوع داده
int
unsigned int
long int
unsigned long int
char
unsigned char
float
double
اعالن متغيرها
قبل از آنکه در برنامه به متغيرها مقـداري تخصـيص داده
شود و از آنها استفاده گردد بایستی آنها را در برنامه اعالن
نمود.
در اسالید بعد مثال هایی از اعالن متغير ذکر شده است.
چند مثال از اعالن متغير ها :
براي اعالن متغير xاز نوع : int
;x
int
براي اعالن متغيرهاي pو qرا از نوع floatکه هر کدام چهار بایت از
حافظه را اشغال میکنند :
; float p , q
براي اعالن متغير nextاز نوع کرکتر که میتوان یکی از 256کرکتر را به
آن تخصيص داد و یك بایت را اشغال میکند.
; char next
تخصيص مقادير به متغيرها
با استفاده از عملگر = میتوان به متغيرها مقدار اوليه تخصيص نمود.
در اسالید بعد مثال هایی از اعالن متغير ذکر شده است.
مثال :
در دستورالعمل
Xرا از نوع intبا مقدار اوليه 26اعالن نموده .
;int x=26
در دستورالعمل
;b=260
متغيرهاي bو aرا از نوع long intتعریف نموده با مقادیر بترتيب
long int a=67000 ,
260و .67000
دادههاي از نوع کرکتر
براي نمایش دادههاي از نوع charدر حافظه کامپيوتر از جدول
ASCIIاستفاده میشود .جدول اسکی به هر یك از 256کرکتر
یك عدد منحصر بفرد بين 0تا 255تخصيص میدهد.
کرکترهاي مخصوص
كامپيلر C++بعضی از كركترهاي مخصوص كه در برنامه میتوان از
آنها براي فرمت بندي استفاده كرد را تشخيص میدهد .تعدادي از
این كركترهاي مخصوص به همراه كاربرد آنها در اسالید بعد آورده
شده است .
کرکترهاي مخصوص
\n
Newline
\t
Tab
\b
Backspace
\a
Beep sound
\”
Double quote
\’
Single quote
\0
Null character
\?
Question mark
\\
Back slash
\ میتوان براي ایجاد صدايa بعنوان مثال از کرکتر
. استفاده نمودbeep
char
x = '\a ;
رشتهها
رشته یا stringعبارتست از دنبالهاي از كركترها كه بين " " قرار داده
میشود .در حافصه كامپيوتر انتهاي رشتهها بوسيله \0ختم میگردد.
در اسالید بعد به دو مثال دقت نمایيد.
مثال : 1
" "BOOK STOREیک رشته ده كركتري مـیباشـد
كه با توجه به كركتر \0كه به انتهاي آن در حافصه
اضافه می شود جمعــاً یازده بایت را اشغال میكند.
مثال : 2
دقت نمایيد كه " "wیک رشته میباشد كه دو بایت از
حافصه را اشغال میكند در حاليکه ' 'wیک كركتر
میباشد كه یک بایت از حافصه را اشغال مینماید.
نمايش مقادير دادهها
براي نمایش دادهها بـر روي صـفحه مـانتور از coutكـه
بدنبال آن عملگر درج یعنـی <<قيـد شـده باشـد اسـتفاده
میگردد .بایستی توجه داشت كه دوكركتر <پشت سـر هـم
توسط C++بصورت یک كركتر تلقی میگردد.
مثال :
براي نمایش پيغام good morningبر روي صفحه نمایش :
;"cout << "good morning
براي نمایش مقدار متغير Xبر روي صفحه نمایش :
; cout << x
دريافت مقادير متغيرها
به منصور دریافت مقادیر براي متغيرها در ضمن اجراي برنامه از
صفحه كليد ،از cinكه بدنبال آن عملگر استخراج یعنی >>
قيد شده باشد میتوان استفاده نمود.
: مثال
int x;
cout << "Enter a number:" ;
cin >> x;
عملگر انتساب
عملگر انتساب = میباشد که باعث میگردد
مقدار عبارت در طرف راست این عملگر ارزیابی
شده و در متغير طرف چپ آن قرار گيرد.
مثال :
;x=a+b
; x=35
; x=y=z=26
از عملگرهـــاي انتســـاب
چندگانــه نيــز مــیتــوان
استفاده نمـود .كـه مقـدار
سه متغير zو yو xبرابر
با 26می شود.
عملگرهاي محاسباتي
در C++پنج عملگر محاسباتی وجود دارد که عبارتند از :
+
جمع
-
تفریق
*
ضرب
/
تقسيم
%
باقيمانده
این عملگرها دو تائی میباشند زیرا روي دو عملوند عمل مینمایند .از طرف
دیگر عملگرهاي +و – رامیتوان بعنوان عملگرهاي یکتائی نيز در نظر گرفت.
مثال : 1
در حالتی که هر دو عملوند عملگرهـاي – ، + ، * ، / ، %از نـوع
صحيح باشد نتيجه عمل از نوع صحيح میباشد.
نتيجه
عبارت
7
5+2
10
5*2
3
5–2
1
5%2
2
5/2
مثال : 2
در صورتيکه حداقل یکی از عملوندهاي عملگرهاي + ، – ، * ، /از
نوع اعشاري باشد نتيجه عمل از نوع اعشاري میباشد.
نتيجه
عبارت
7. 0
5. 0 +2
10.0
5* 2. 0
2.5
5. 0 / 2
3. 0
5. 0 -2
2.5
5. 0 / 2. 0
عملگرهاي افزايش و کاهش
در ، C++افزایش یك واحد به مقدار یك
متغير از نوع صـحيح را افـزایش و بطـور
مشابه کاهش یك واحـد از مقـدار یـك
متغير از نوع صحيح را کاهش مینامند..
عملگرهاي افزايش و کاهش
عملگر کاهش را با - -و عملگر افزایش
را بــا ++نمــایش مــیدهنــد .چــون
عملگرهــاي ++و - -فقــط روي یــك
عملوند اثر دارند این دو عملگر نيز جـزء
عملگرهاي یکتائی میباشند.
مثال :
سه دستور العمل :
;++x
;x++
;x= x+1
معادل میباشند و بطریق مشابه سه دستورالعمل زیر نيز معادل می باشند.
;--y
;y= y-1
;y--
از عملگرهاي ++و --میتوان بدو صورت پيشوندي و پسوندي استفاده نمود.
در دستورالعملهاي پيچيده عملگر پيشوندي قبل از انتساب ارزیابی می شود و عملگر
پسوندي بعد از انتساب ارزیابی میشود.
مثال :
;int x=5
;y=++x * 2
پس از اجراي دستورالعملهاي فوق :
y=12
X=6
;int x=5
;y=x++ * 2
پس از اجراي دستورالعملهاي فوق :
y=10
X=6
عملگر sizeof
Sizeofازعملگرهاي یکتائی می باشد و مشخص کننده
تعداد بایت هائی است که یك نوع داده اشغال میکند.
مثال :
;int x
; cout << sizeof x
مقدار 2نمایش داده میشود .
; )cout << sizeof(float
مقدار 4نمایش داده می شود.
عملگرهاي جايگزيني محاسباتي
براي سادهتر نوشتن عبارتها در ، C++میتوان از عملگرهاي
جایگزینی محاسبـــاتی استفاده نمود.
=+
مثال:
=-
;int a=1
;a += 1
=*
=/
=%
;int a=1
;a = a +1
اولويت عملگرها
ارزیابی مقدار یك عبارت ریاضی براساس جدول اولویت عملگرها انجام میگردد .در ذیل جدول اولویت
عملگرها براساس بترتيب از بيشترین اولویت به کمترین اولویت داده شده است.
چ پ به راس ت
پرانتزها
راس ت به چ پ
عملگرهاي ي كتاي ي
چ پ به راس ت
عملگرهاي ضرب و تق سي م و باقيمان ده
%
چ پ به راس ت
عملگرهاي جم ع و تفريق
چ پ به راس ت
عملگرهاي درج و استخراج
>>
راس ت به چ پ
عملگرهاي جايگزين ي و انت ساب
) (
sizeof
+ --
++
/
*
+
<<
== += -= *= /= %
-
مثال : 1
(5+2) *(6+2*2)/2
با توجه به جدول اولویت عملگرها داریم که
7 *(6+2*2)/2
7*(6+4)/2
7* 10 /2
70 /2
35
: 2 مثال
int a=6 , b=2, c=8, d=12;
d=a++ * b/c ++;
cout << d << c << b << a;
: خروجی
1
9
2
7
توضيحات ()Comments
توضيحات در برنامه باعث خوانائی بيشتر و درك بهتر برنامه می شود.
بنابراین توصيه بر آن است که حتی االمکان در برنامهها از توضيحات
استفاده نمائيم .در ،C++توضيحات بدو صورت انجام میگيرد که در
اسالیدهاي بعد به آن اشاره شده است.
توضيحات ()Comments
الف :این نوع توضيح بوسيله //انجام میشود .که کامپيوتر هر چيزي را کـه بعـد از //قـرار داده
شود تا انتهاي آن خط اغماض مینماید.
مثال :
//c is equal to sum of a and b
;c=a+b
ب :توضيح نوع دوم با * /شروع شده و به */ختم میشود و هر چيزي که بين* /و */قـرار گيـرد
اغماض مینماید .
مثال :
/ * this is a program
to calcufate sum of
n integer numbers */
توابع کتابخانه
زبان C++مجهز به تعدادي توابع کتابخانه میباشـد .بعنـوان
مثال تعدادي توابع کتابخانه بـراي عمليـات ورودي و خروجـی
وجود دارند .معموالً توابع کتابخانه مشابه ،بصورت برنامـههـاي
هدف (برنامه ترجمه شـده بزبـان ماشـين) در قالـب فایلهـاي
کتابخانه دسته بندي و مورد استفاده قرا رمیگيرند .این فایلهـا
را فایلهاي headerمینامند و داراي پسوند .hمیباشند.
نحوه استفاده از توابع کتابخانه اي
براي استفاده از توابع کتابخانه خاصی بایستـــی
نام فایل headerآنرا در ابتداي برنامه در دستور
#includeقرار دهيم.
> اسم فایل < header
#include
تابع
نوع
شرح
فاي ل هي در
abs(i)
int
i ق درمطل ق
stdlib.h
cos(d)
double
math.h
exp(d)
log(d)
log10(d)
double
double
double
sin(d)
double
d ك سينوس
ex
loge d
Log10 d
d سينوس
sqrt(d)
double
d ج ذر
math.h
strlen(s)
int
s تع داد كركترهاي رشته
string.h
tan(d)
double
d تانژانت
math.h
toascii( c)
int
cك داس ك ي كركتر
stdlib.h
tolower(c )
int
تب دي ل به حروف كوچ ك
stdlib.h
toupper(c )
int
تب دي ل به حرف بزرگ
stdlib.h
math.h
math.h
math.h
math.h
برنامه در C++
اکنون باتوجه به مطالب گفته شده قادر خواهيم بود که تعدادي برنامه ساده و
کوچك به زبان C++بنویسيم .براي نوشتن برنامه بایستی دستورالعملها را در
تابع ) ( mainقرار دهيم و براي اینکار میتوان به یکی از دو طریقـی کـه در
اسالیدهاي بعد آمده است ،عمل نمود.
روش اول :
>
#include
<
) (int main
}
; دستورالعمل 1
; دستورالعمل 2
.
.
.
;دستورالعمل n
; return 0
}
روش دوم :
>
#include
<
) (void main
{
; دستورالعمل 1
; دستورالعمل 2
.
.
.
;دستورالعمل n
}
:error
•
•
•
به خطاهاي برنامه نویسی errorمی گویند .ما در برنامه نویسی دو نوع خطا داریم:
خطاهاي دستوري ()syntax error
خطاهاي منطقی (.)logical error
را روي صفحهC++ is an object oriented language برنامه اي که پيغام
.مانيتور نمايش مي دهد
#include <iostream.h>
int main( )
{
cout <<"C++ is an object oriented language \n" ;
return 0 ;
}
.برنامه زير يك حرف انگليسي کوچك را گرفته به حرف بزرگ تبديل مينمايد
#include <iostream.h>
#include <stdlib. h>
int main( )
{
char c1 , c2;
cout << "Enter a lowercase letter:"
cin >> c1;
c2 = toupper(c1);
cout << c2 << endl;
return 0; }
.دو عدد از نوع اعشاري را گرفته مجموع و حاصلضرب آنها را محاسبه و نمايش ميدهد
#include <iostream.h>
int main( )
{
float
x,y,s,p ;
cin >> x >> y ;
s= x+y ;
p=x*y;
cout << s <<endl << p;
return 0 ;
}
فصل دوم
ساختارهاي تصميم گيري و تکرار
فهرست مطالب فصل دوم
.1
.2
.3
.4
.5
.6
عملگر هاي رابطه اي
عملگر شرطی
دستورالعمل شرطی
عملگر کاما
عملگر هاي منطقی
دستورالعمل For
عملگرهاي رابطه اي
از این عملگرها براي تعيين اینکه آیا دو عدد با
هم معادلند یا یکی از دیگري بزرگتر یا کوچکتر
میباشد استفاده میگردد .عملگرهاي رابطهاي
عبارتند از:
مساوي
==
مخالف
=!
بزرگتر
>
بزرگتر يا مساوي
=>
كوچكتر
<
كوچكتر يا مساوي
=<
عملگر شرطي
شکل کلی عملگر شرطی بصورت زیر میباشد:
expression _ test ? expression _ true : expression _ false
عملگر شرطی تنها عملگري در C++میباشد که داراي سه عملوند میباشد.
مثال : 1
;int x=10,y=20,b
; b=(x>y) ? x : y
این دو دستور العمل باعث می شوند که ماکزیمم مقادیر yو xدر bقرار بگيرد.
مثال : 2
; "x>=10 ? cout << "passed" : cout << "failed
اگر مقدار xبزرگتر یا مساوي ده باشد رشتة passedدر غير اینصورت رشته
failedنمایش داده می شود.
IF
دستورالعمل شرطي
توسط این دستور شرطی را تست نموده و بسته به
آنکه شرط درست یا غلـط باشـد عکـس العمـل
خاصی را نشان دهيم.
) عبارت(
if
{
; دستورالعمل 1
.
;دستورالعمل n
}
else
{
; دستورالعمل 1
.
;دستورالعمل n
}
: 1 مثال
if(x != y)
{
cout << x ;
++ x ;
}
else
{
cout << y ;
--y;
}
:2 مثال
.برنامه زیر یك عدد اعشاري را از ورودي گرفته جذر آن را محاسبه مینماید
#include <iostream.h>
#include <math . h>
int main( )
{
float x,s;
cin >> x ;
if ( x < 0 )
cout << " x is negative" << endl ;
else
{
s = sqrt(x) ;
cout << s << endl ;
}
return 0;
}
عملگر کاما
تعدادي عبارت را می توان با کاما بهـم متصـل نمـود و تشـکيل یـك عبـارت
پيچيدهتري را داد .این عبارتها به ترتيب از چپ به راست ارزیابی شده و مقـدار
عبارت معادل عبارت nمیباشد.
(عبارت , .… , nعبارت , 3عبارت , 2عبارت )1
مثال :
اگر داشته باشيم
; int a=2 , b=4 , c=5عبارت زیر را در نظر بگيرید:
)(++ a , a+b, ++ c, c+b
مقدار عبارت برابر است با b+cکه معادل 10میباشد.
عملگرهاي منطقي
با استفاده از عملگرهاي منطقی میتوان شرط هاي ترکيبی در برنامه ایجاد نمود.
عملگرهاي منطقی عبارتست از :
AND
OR
NOT
که در C++به ترتيب بصورت زیر نشان داده می شود.
&&
||
!
جدول درستي سه عملگر شرطي
a
true
true
false
false
a
true
true
false
false
b
true
false
true
false
b
true
false
true
false
a && b
True
False
False
False
a
true
false
!a
False
True
a || b
True
True
True
False
چند مثال :
))if ((x= = 5) ||(y != 0
; cout << x << endl
اگر xبرابر با 5یا yمخالف صفر باشد مقدار xنمایش داده شود .
)if(x
;x=0
اگر مقدار xمخالف صفر باشد ،آنگاه xبرابر با صفر شود .
برنامه زير طول سه پارهخط را از ورودي گرفته مشخص مينمايد که آيا تشكيل يك مثلث مي دهد يا خير؟
#include
< iostream.h >
int main( )
{
float a, b, c;
cout << "Enter three real numbers" << endl ;
cin >> a >> b >> c;
if(( a < b + c) &&(b < a+c) &&(c < a+b))
cout << "It is a triangle" ;
else
cout << "Not a triangle" ;
return 0 ;
}
دستورالعمل For
از دستور العمل forبراي تکرار دستورالعمل ها استفاده می شود .شکل کلی دستور
forبصورت زیر میباشد:
(عبارت 3
; عبارت 2
; عبارت for )1
{
; دستورالعمل 1
; دستورالعمل 2
.
.
.
;دستورالعمل n
}
ساختار for
;معرفی کنترل گر حلقه
) گام حرکت
;شرط حلقه ;مقداردهی اوليه کنترل گر حلقه( for
}
; مجموعه دستورات بدنه حلقه
;int i
)for (i=1; i<=3; i++
{
;”cout << “hello \n
{
{
مثال
void main()
{
cout << “hello \n”;
cout << “hello \n”;
cout << “hello \n”;
}
void main()
{
int i;
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
}
for نحوه اجراي دستور
int i;
i=
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
for نحوه اجراي دستور
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
for نحوه اجراي دستور
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
hello
2
for نحوه اجراي دستور
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
hello
hello
2
3
for نحوه اجراي دستور
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
hello
hello
hello
2
3
4
for نحوه اجراي دستور
int i;
i= 1
for (i=1; i<=3; i++)
{
cout << “hello \n”;
}
hello
hello
hello
2
3
4
نكته
• لزومی ندارد كه كنترل گر حلقه حتماً از 1شروع شود.
;int i
)for (i=5; i<=7; i++
{
;”cout << “hello \n
}
نكته
• مقدار دهی اوليه كنترل گر حلقه می تواند خارج از دستور for
باشد.
;int i =1
)for ( i ; i<=3; i++
{
;”cout << “hello \n
}
نكته
• مقدار دهی اوليه كنترل گر حلقه می تواند خارج از دستور for
باشد .در این صورت می توان جمله اول موجود در عبارت forرا
خالی گذاشت.
;int i=1
;int i=1
)for ( ; i<=3; i++
{
;”cout << “hello \n
}
=
)for ( i; i<=3; i++
{
;”cout << “hello \n
}
نكته
• گام حركت می تواند در بدنه دستور forتعریف شود.
;int i=1
;for ( i; i<=3
)
{
;”cout << “hello \n
;i++
}
نكته
• معرفی كنترل گر حلقه می تواند در داخل دستور forباشد.
)for (int i= 1; i<=3; i++
{
;”cout << “hello \n
}
نكته
• در دستور forاگر قسمت شرط خالی باشد ،حلقه هميشه اجرا
خواهد شد .به عبارتی هيچ شرطی براي توقف نداریم
;for (int i= 1
); i++
{
;”cout << “hello \n
}
• وقتی هيچ شرطی نداریم ،دو قسمت دیگر دستور forنيز می توانند
خالی باشند.
)
( for
;
;
{
;”cout << “hello \n
}
نكته
• لزومی ندارد كه گام حركت بصورت افزایشی باشد بلکه می تواند
بصورت كاهشی نيز باشد.
)for (int i= 3; i >= 1; i--
{
;”cout << “hello \n
}
• تمرین :اعداد 100تا 1را به صورت نزولی چاپ نمایيد ( .با گام
حركت افزایشی و كاهشی جداگانه بنویسيد)
نكته
• گام حركت می تواند افزایش یا كاهش بيش از 1واحد را داشته
باشد.
• مثال :چاپ اعداد فرد بين 1تا 100
)for (int i= 1; i <= 100; k=k+2
{
;”cout << k << “\n
}
نكته
• كنترل گر حلقه می تواند اعشاري یا كاراكتري باشد ،لزومی ندارد
كه حتما عدد صحيح در نصر بگيریم.
)for (char ch= ‘a’; ch <= ‘z’; ch++
{
;”cout << ch << “\n
}
. را از ورودي گرفته فاکتوریل آن را محاسبه ونمایش میدهدn برنامه زیر عدد صحيح و مثبت
#include
<iostream.h>
int
main( )
{
int n, i ;
long fact = 1 ;
cout << "Enter a positive integer number";
cin >> n;
for( i=1; i<=n; ++i)
fact *= i;
cout << fact << endl;
return 0 ;
}
برنامه زیر مجموع اعداد صحيح و متوالی بين 1تا nرا محاسبه نموده و نمایش میدهد.
#include
><iostream.h
int
) (main
{
; int n, i=1
; long s = 0
; cin >> n
)for( ; i<=n; i++
;s += i
; cout << s
} ; return 0
. را نمایش میدهد9 تا0 برنامه زیر ارقام
#include <iostream.h>
int main( )
{
int j=0 ;
for( ; j <= 9 ; )
cout << j++ << endl;
return 0 ;
}
. ایجاد میشوند را نمایش میدهد3 ، 2 ، 1 برنامه زیر کليه اعداد سه رقمی که با ارقام
#include <iostream.h>
int main( )
{
int i,j,k,n;
for(i=1; i<=3; ++i)
for(j=1; j<=3; ++j)
for(k=1; k<=3; ++k)
{
n=i*100 + j*10+k;
cout << n << ‘\n’ ;
}
return 0 ;
}
تمرين
•
•
•
•
•
•
برنامه اي كه اعداد ذوج بين 1تا 1000را چاپ كند.
برنامه اي كه 100عدد را خوانده ،مجموع را محاسبه و چاپ كند.
برنامه اي كه حاصلضرب اعداد 1تا 50را چاپ كند.
برنامه اي كه 50كاراكتر از صفحه كليد خوانده و تعيين كند كه
كدام یک حرف كوچک است.
برنامه اي كه 100عدد صحيح را خوانده maxو minرا چاپ
كند.
برنامه اي كه كاراكتر هایی كه كد آن ها بين 100تا 200هست ،را
چاپ نماید.
کاربرد دستور breakدر دستور for
• اگر در بدنه forاز جمله ي ; breakاستفاده شود ،ادامه ي اجراي
حلقه متوقف شده و حلقه خاتمه می یابد.
;int i , x
)for(i=1;i<=100;i++
;{cin>>x
;if(x==50) break
}
• قطعه كد فوق حداكثر 100عدد صحيح از ورودي می گيرد ،ولی اگر در بين
اعداد ورودي عدد 50وارد شود بدون بررسی شرط حلقه از ادامه اجراي
دستورات forاجتناب كرده و از حلقه خارج می شود.
مثال
• قطعه كدي كه تعدادي كاراكتر از صفحه كليد خوانده ،بعد از
فشردن دكمه ي Eتعداد آن ها را مشخص كند:
;char ch
;int i
)for(i=0; ;i++
;{cin>>ch
;if (ch==‘E’) break
}
;cout<<i
حلقه forتودرتو
• می توان داخل بدنه ي دستور forهر دستور دلخواه دیگري نوشت .به عنوان
مثال می توان از یک دستور forدر بدنه دستور forاستفاده كرد.
• قطعه كد زیر عبارت Helloرا 15بار اجرا می كند:
15
بار
)for(int i=1; i<=5; i++
{
)for(int j=1; j<=3; j++
3بار
;”cout<<“Hello \n
}
5بار
چاپ جدول ضرب اعداد:مثال
int main()
{int i,j;
for(int i=1; i<=10; i ++)
for(int j=1; j<=10; j++)
{ cout<<i*j<<“ “;
if (j==10) cout<<‘\n’;
}
return 0;
}
عدد را خوانده و براي هرکدام20 برنامه اي که:مثال
. تا آن عدد را محاسبه کند1 مجموع اعداد
int main()
{
int i,j,x,sum;
for(int i=1; i<=20; i++)
{sum=0; cin>>x;
for(int j=1; j<=x; j++)
sum+=j;
cout<<“sum of 1 to “<<x<<“ :“<<sum<<endl;
}
return 0;
}
کاربرد حلقه forبا دو انديس
برنامه اي بنویسيد كه ستون اعداد زیر را چاپ كند:
1, 20
2, 19
3, 18
4, 17
.
.
.
20, 1
روش اول:
)for(int i=1; i<=20; i++
;cout<<i<<“, “<<21-i<<endl
روش دوم:
)for(int i=1, j=20; i<=20; i++, j--
;cout<<i<<“, “<<j<<endl
دستور ; continueدر for
• اگر دستور ; continueدر حلقه forاستفاده شود ،جمالتی از
حلقه كه هنوز اجرا نشده اند ،بدون اجرا مانده و ادامه اجرا از انتهاي
حلقه اغاز خواهد شد.
برنامه فوق 20عدد از ورودي خوانده و
حاصلضرب اعداد غير صفر را در متغير p
محاسبه كرده و در نهایت نمایش می دهد.
)(int main
{
;int x, p=1
)for(int i=1; i<=20; i++
;{cin>>x
;if (!x) continue
;p*=x
}
;cout<<p
;return 0
}
فصل سوم
سایر ساختارهاي تکرار
فهرست مطالب فصل سوم
.1
.2
.3
.4
.5
.6
.7
.8
دستورالعمل while
دستورالعمل do while
دستورالعمل break
دستورالعمل continue
دستورالعمل switch
تابع )(cin.get
عملگر )(><static_cast
جدول اولویت عملگرها
دستورالعمل while
از این دستور العمل مانند دستورالعمل forبراي تکرار یك دستورالعمل ساده یا ترکيبی
استفاده میگردد .شکل کلی این دستور العمل بصورت زیر میباشد.
;معرفی کنترل گر حلقه
;مقدار دهی اوليه کنترل گر حلقه
)شرط (while
}
; دستورالعمل 1
; دستورالعمل 2
.
.
; دستورالعمل n
;گام حرکت
}
تفاوت دستورهاي whileو for
دستورالعمل forزمانی استفاده می شود که تعـداد دفعـات
تکرار از قبل مشخص و معـين باشـد .در صـورتيکه تعـداد
دفعات تکرار مشخص نباشد بایستی از دسـتورالعمل while
استفاده نمود.
دقت کنيد با پياده سازي مکانيزم هاي خاصی می توان بدون
توجه به دفعات تکرار از هر دو دستور بصورت مشابه استفاده
کرد.
مثال :
int x=0
)while(x<5
;cout << x ++<< endl
با اجراي قطعه برنامه فوق مقادیر زیر نمایش داده ميشود :
0
1
2
3
4
. قرار ميدهدavg مقدار از نوع اعشاري را گرفته ميانگين آن ها را محاسبه و در متغيرn برنامة فوق
#inclode <iostream.h>
int main( )
{
int count = 0 , n;
float x, sum = 0 , avg ;
cin >> n ; /* تعداد مقادیر وروديn*/
while(count < n){
cin >> x ;
sum += x ;
++ count ; }
avg = sum / n ;
cout << avg << endl;
return 0 ; }
نكته
• همانند دستور forاگر داخل بدنه دستور whileفقط یک جمله
باشد می توان { و } را حذف كرد.
• مثال :نمایش اعداد 0تا :100
) (int main
{
;int j = 0
)while(j<=100
;cout<<j++<<endl
; return 0
}
:برنامه زير را تفسير کنيد
int main( )
{
int j = 0;
while(j<10)
J++;
cout<<j;
return 0 ;
}
دستورالعمل do while
این دستور العمل نيز براي تکرار یک دستورالعمل سـاده
یا تركيبی استفاده میشود .شکل كلی این دستورالعمل
بصورت زیر میباشد.
;معرفی کنترل گر حلقه
;مقدار دهی اوليه کنترل گر حلقه
do
; دستورالعمل { 1
; دستورالعمل 2
.
.
; دستورالعمل n
;گام حرکت
;)شرط (} while
do
}
; دستورالعمل 1
; دستورالعمل 2
.
.
; دستورالعمل n
;)شرط (} while
تفاوت دستورهاي do whileو while
در دستورالعمل whileابتدا مقـدار شـرط
ارزیابی شده اما در دستورالعمل do while
ابتدا دستورالعمل اجرا شده سـپس مقـدار
شرط ارزیابی میگردد .بنابراین دستورالعمل
do whileحداقل یك بار انجام می شود .
: مثال
#include <iostream.h>
int main( )
{
int count = 0;
do
cout << count ++<<endl ;
while(count <= 9);
return 0 ; }
را روي ده خط نمایش میدهد9 تا0 ارقام
دستورالعمل break
این دستورالعمل باعث توقف دستورالعمل هاي تکرار( )for , while ,do whileشده
و کنترل به خارج از این دستورالعمل ها منتقل مینماید.
مثال : 1
>#include <iostream.h
) (int main
{
; float x, s=0.0
; cin >> x
{ )while(x <= 1000.0
{)if(x < 0.0
; "cout << "Error-Negative Value
;break
}
; s += x
}; cin >> x
; cout << s << endl
جمع تعدادی عدد که بین 0و 1000هستند .اگر بین
; return 0
اعداد وارد شده عدد منفی وارد شود ،بواسطه دستور
}
; breakحلقه خاتمه می یابد.
اگر عدد وارد شده بزرگتر از 1000باشد نیز شرط
حلقه برآورده نشده و حلقه خاتمه می یابد
:2 مثال
#include <iostream.h>
int main( )
{
int count = 0 ;
while( 1 )
{
count ++ ;
if(count > 10 )
break ;
}
cout << "counter : " << count << "\n";
return 0 ;
}
counter : 11
مثال :3
>#include <iostream.h
) (void main
{
;int count
;float x, sum = 0
; cin >> x
) for(count = 1; x < 1000 . 0; ++ count
{
; cin >> x
{ )if(x < 0.0
;cout << "Error – Negative value " <<endl
; break
}
جمع تعدادی عدد اعشاری که بیشتر از 0و کمتر
; sum += x
از 1000هستند را محاسبه می کند .اگر بین اعداد
; cin >> x
وارد شده عدد منفی وارد شود ،بواسطه دستور
}
; breakحلقه خاتمه می یابد.
; cout << sum << \n
اگر عدد وارد شده بزرگتر یا مساوی 1000باشد
}
نیز شرط حلقه برآورده نشده و حلقه خاتمه می یابد
مثال :4
>#include <iostream.h
) (int main
{
; float x , sum = 0.0
{ do
; cin >> x
)if(x < 0.0
{
; cout << "Error – Negative Value" << endl
; break
جمع تعدادی عدد که بین 0و 1000هستند .اگر بین اعداد
}
وارد شده عدد منفی وارد شود ،بواسطه دستور ;break
حلقه خاتمه می یابد.
اگر عدد وارد شده بزرگتر از 1000باشد نیز شرط حلقه
برآورده نشده و حلقه خاتمه می یابد.
نکته :اين حلقه حداقل يک بار اجرا می شود ....حتی اگر
عدد اول بزرگتر از 1000باشد نيز در مجموع شرکت
داده خواهد شد .سپس از حلقه خارج خواهيم شد.
; sum += x
;)} while(x <= 1000.0
; cout << sum << endl
; return 0
}
دستورالعمل continue
از دستورالعمل continueمیتوان در دستورالعمل هـاي تکـرار ، do while
for ، whileاستفاده نمود .این دستورالعمل باعث میشود که کنترل به ابتـداي
دستورالعمل هاي تکرار منتقل گردد.
(تذکر :در ابتداي حلقه بایستی شرط حلقه نيز بررسی شود)
پس بهتر است بگویيم به انتهاي بدنه حلقه تکرار رفته و از آن جا ادامه می دهد.
مثال :1
جمع تعدادی عدد که کوچکتر و مساوی 1000
هستند را بدست می اورد .اگر بین اعداد وارد
شده عدد منفی وارد شود ،در حاصل جمع
شرکت نخواهد کرد و اجرای دستورالعمل ها به
انتهای حلقه هدایت خواهد شد.
اگر عدد وارد شده بزرگتر از 1000باشد نیز
شرط حلقه برآورده نشده و حلقه خاتمه می یابد.
نکته :اين حلقه حداقل يک بار اجرا می شود....
حتی اگر عدد اول بزرگتر از 1000باشد نيز در
مجموع شرکت داده خواهد شد سپس از حلقه
خارج خواهيم شد.
>#include <iostream.h
) (int main
{
; float x, sum = 0.0
{ Do
; cin >> x
)if(x < 0 . 0
{
; cout << "Error" << endl
; continue
}
; sum += x
;) } while(x <= 1000.0
; cout << sum
} ; return 0
مثال :2
nعدد از ورودی خوانده .در صورتیکه صفر نباشد ان را
در مجموع اعداد شرکت می دهد.
در نهایت میانگین اعداد غیر صفر را محاسبه می کند
>#include <iostream.h
) (int main
{
; int n , navg = 0
; float x, avg, sum = 0
n * /عبارت از تعداد اعداد ورودي * cin >> n ; /
) for(int count = 1 ; count <=n; ++ count
{
; cin >> x
; if(x == 0 ) continue
; sum += x
; ++ navg
}
;avg = sum / navg
; cout << avg << endl
; return 0
}
دستورالعمل switch
همانطور که می دانيد از دستورالعمل شرطی( )if elseمی توان بصورت تودرتو
استفاده نمود ولی از طرفی اگر عمق استفادة تو در تو از این دستورالعمل زیـاد
گردد ،درك آن ها مشکل می شود .براي حل این مشکل ، C++دسـتورالعمل
switchکه عمالً یك دستورالعمل چند انتخابی میباشد را ارائه نموده است.
Switch شكل کلي دستور العمل
switch()عبارت
{
case valueone : statement;
break;
case
valuetwo: statement;
break;
case
valuen : statement;
break;
default: statement ;
}
#include <iostream.h>
void main( )
{
unsigned int n ;
cin >> n;
switch(n)
{
case 0:
cout << "ZERO" << endl ;
break;
case 1:
cout << "one" << endl ;
break ;
case 2:
cout << "two" << endl ;
break;
default :
cout << "default" << endl;
}
/ * end of switch statement * /
}
: 1 مثال
#include <iostream.h>
void main( )
{
unsigned int n;
cin >> n ;
switch(n) {
case 0:
case 1:
case 2:
cout << "Less Than Three" << endl;
break;
case 3:
cout << "Equal To Three" << endl ;
break;
default:
cout << "Greater Than Three" << endl;
}
}
: 2 مثال
تابع )(: cin.get
این تابع یك کرکتر را از صفحه
کليد میگيرد .براي استفاده از این
تابع در ابتداي برنامه بایستی داشته
باشيم:
#include
><iostream.h
قطعه برنامه ذیل یك کرکتر را از صفحه کليد گرفته و نمایش میدهد.
char
;x
;) (x = cin.get
; cout << x
برنامة ذیل یك سطر متن انگليسی که به CTRL Zختم می شود را گرفته دقيقاً نمایش میدهد.
><iostream.h
#include
) (int main
{
;char x
)while((x = cin.get( )) !=EOF
; cout << x
; return 0
}
EOFبـه معنـی End of Fileمـیباشـد کـه در
iostream.hتعریف شده و مقـدار آن برابـر بـا -1
مــیباشــد .مقــدار آن در سيســتم عامــل DOS
عبارتست از . ctrl z
. استفاده شده استswitch و دستورcin.get() در قطعه برنامه ذيل ازتابع
char
x;
x = cin.get( );
switch(x) {
case r :
case R :
cout << RED << \n ;
break ;
case b :
case B :
cout << BLUE << endl ;
break ;
case y :
case Y :
cout << YELLOW << endl; break;
}
.) آن را حذف نموده و نمایش می دهدblank( برنامة ذیل یك سطر متن انگليسی را گرفته کرکترهاي خالی
#include
<iostream.h>
int main( )
{
char next;
while((next = cin.get( ) ) !=EOF)
if(next != )
cout << next ;
return 0 ;
}
تمرین :برنامه اي با استفاده از ساخنار switch caseکه یك عملگر و
دو عملوند را از ورودي خوانده ،عملگر را بر روي عملوند اجرا نمایيد.
عملگر static_cast
از این عملگر براي تبدیل موقت یك نوع dataبه نوع دیگر
استفاده میشود .این عملگر یك عملگر یکتائی میباشد.
مثال :1
; int x = 25
; float y
; )y = static_cast < float >(x
مقدار xموقتاً بصورت اعشاري در می آید و در نتيجـه مقـدار yبرابـر بـا
25.0می شود .بایستی توجه داشت که نوع متغير xعوض نمی شـود بلکـه
موقتاً مقدار آن بصورت اعشاري در آمده است.
مثال :2
; float x = 14.75
;cout << static_cast < int >(x) << endl
; cout << x
ابتدا مقدار 14نمایش داده می شـود
و ســپس مقــدار 14.75نمــایش داده
ميشود.
جدول اولويت عملگرها
(
چ پ به راس ت
راس ت به چ پ
)
sizeof
-
+
Static_cast < >( ) ++
--
چ پ به راس ت
* / %
چ پ به راس ت
+ -
چ پ به راس ت
چ پ به راس ت
<<
>>
=> > =<
چ پ به راس ت
=!
==
راس ت به چ پ
:
?
راس ت به چ پ
چ پ به راس ت
=-
=*= /= %
,
<
=+
=
تمرين
.1برنامه اي كه یک سکه 100ریالی را به سکه هاي 2و 5و10و 20و 50
ریالی خرد كند.
.2برنامه اي كه خروجی زیر را چاپ كند:
.3برنامه اي كه حاصل عبارت زیر را بدست اورد:
N
!N
S 1 22! 33! ....
فصل چهارم
اعداد تصادفی
فهرست مطالب فصل چهارم
.1توليد اعداد تصادفی
.2تعریف نوع داده ( ) typedef
.3داده هاي از نوع شمارشی
اعداد تصادفي
مقادیر تصادفی یا شانسی در اکثر برنامـههـاي کـاربردي در زمينـه شـبيه سـازي و بازیهـاي
کامپيوتري نقش مهمی را ایفا مینمایند .براي ایجاد یك عدد تصادفی صـحيح بـين 0و 32767
بایستی از تابع )( randاستفاده نمائيم.
. را ایجاد مینماید32767 و0 عدد تصادفی بين10 برنامه زیر
#include
<stdlib.h>
#include
< iostream.h>
int main( )
{
for(int j=1; j<=10; ++j)
cout << rand( ) << \n ;
return 0 ;
}
تعريف نوع داده ()typedef
از typedefمیتوان براي تعریف نوع دادههاي جدید که معادل نوع
دادههاي موجود باشد استفاده نمود .شکل کلی عبارتست از :
;typedef type newtype
اسم جدید
نشان دهنده نوع داده موجود
مثال :
;typedef int integer
حال میتوان yو xرا بصورت زیر تعریف نمود :
;integer x,y
دادههاي از نوع شمارشي
بمنظور معرفی دادههاي از نوع شمارشی از کلمه enumاستفاده میگردد.
مثال
4
3
2
1
0
; }enum color {red, blue, green, yellow, brown
مثال
colorیك نوع داده شمارشی میباشد.
;}emum status {married, devorced, vidow, single
; status a
; a= single
:
توجه :
بایستی در نظر داشت که داده هاي از نوع شمارشـی
در عمليات ورودي و خروجـی شـرکت نمـینماینـد.
بعبارت دیگـر مقـادیر داده هـاي از نـوع شمارشـی
بایستی در برنامه تعيـين نمـود .دسـتورالعمل هـاي
ورودي و خروجی مانند cinو coutدر مورد دادههاي
شمارشی نمیتوان استفاده نمود.
فصل پنجم
آرایه ها
فهرست مطالب فصل پنجم
.1آرایه یك بعدي
.2آرایه دو بعدي ( ماتریس ها )
آرايه يك بعدي
آرایه یك فضاي پيوسته از حافظه اصلی کامپيوتر میباشد که میتواند
چندین مقدا را در خود جاي دهد.
کليه عناصر یك آرایه از یك نوع میباشند.
عناصر آرایه بوسيله اندیس آن ها مشخص میشوند.
در ، C++اندیس آرایه از صفر شروع میشود.
کاربرد آرايه ها
آرایهها در برنامهنویسی در مواردي کاربرد دارند که
بخواهيم اطالعات و دادهها را در طول اجراي
برنامه حفظ نمائيم.
; ]int x[5
x
4
پنجمين عنصر ]x[4
3
2
1
0
اولين عنصر ]x[0
تخصيص مقادير اوليه به عناصر آرايه :
;}int x[5]= {4, 2, 5, 17, 30
30
17
4
3
x
5
2
4
2
1
0
دریافت مقادیر عناصر آرایه :
;]int x[5
)for(int i=0; i<=4; ++i
; ] cin >> x[ i
نمایش مقادیر عناصر آرایه :
)for(int i=0; i<5; ++i
; ] cout << x[ i
اگر تعداد مقادير اوليه کمتر از تعداد عضوهاي آرايه باشد عضوهاي باقيمانده بطور اتوماتيك ،مقدار اوليه صفر ميگيرند.
;}int x[5] = {12, 5, 7
0
0
4
3
x
7
5
12
2
1
0
بايستي توجه داشت که آرايهها به صورت ضمني مقدار اوليه صفر نميگيرند .برنامه نويس بايد به عضو اول آرايه،
مقدار اوليه صفر تخصيص دهد تا عضوهاي باقيمانده بطور اتوماتيك ،مقدار اوليه صفر بگيرند.
; }int x[5] = {0
0
0
4
3
x
0
0
0
2
1
0
دستور زير يك آرايه يك بعدي شش عنصري از نوع floatايجاد مينمايد.
; }float x[ ] = {2.4, 6.3, -17.1, 14.2, 5.9, 16.5
16.5
5.9
14.2
5
4
3
x
-17.1
6.3
2.4
2
1
0
عدد اعشاري و مثبت را گرفته تشکيل یك آرایه می دهد سپس مجموع عناصر آرایه را100 برنامه ذیل
.مشخص نموده نمایش میدهد
#include <iostream.h>
int main( )
{
const int arrsize = 100 ;
float x[ arrsize], tot = 0.0 ;
for(int j=0; j<arrsize; j++)
cin >> x[ j ];
for(j=0; j<arrsize; j++)
tot += x[ j ] ;
cout << tot ;
return 0 ;
}
عدد اعشاري را گرفته تشكيل يك آرايه داده سپس کوچكترين عنصر آرايه را20 برنامه ذيل
.مشخص و نمايش ميدهد
#include <iostream.h>
#include <conio.h>
int main( )
{
float x[20], s;
int j ;
for(j=0; j<20 ; ++j)
cin >> x[ j ];
s = x[0 ] ;
for(j=1; j<20; ++j)
if(x[ j] <s)
s = x[ j ];
cout << s << endl;
return 0;
}
.) بصورت صعودي مرتب مينمايدBubble sort( عدد اعشاري را گرفته بروش حبابي100 برنامه زير
#include <iostream.h>
#include <conio.h>
int main ( )
{
float x[100] , temp;
int i,j ;
for(i=0; i<100; ++i)
cin >> x[i ];
for(i=0; i<99; i++)
for(j=i+1 ; j<100; j++)
if(x[ j ] < x[i ]
{
temp = x[ j ] ;
x[ j ] = x[ i ];
x[ i ] = temp ;
}
for(i=0; i<=99; i++)
cout << x[ i ] << endl;
return 0 ;
}
آرايههاي دوبعدي (ماتريسها)
ماتریس ها بوسيله آرایههاي دوبعدي در کامپيوترنمایش داده می شوند.
;]int a[3][4
ستون
3
ستون
2
ستون
1
ستون
0
]a[0][3
]a[0][2
]a[0][1
]a[0][0
سطر
0
]a[1][3
]a[1][2
]a[1][1
]a[1][0
سطر
1
]a[2][3
]a[2][2
]a[2][1
]a[2][0
سطر
2
تخصيص مقادير اوليه به عناصر آرايه :
; } }int a[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12
3
2
1
0
4
3
2
1
0
8
7
6
5
1
12
11
10
9
2
int a[3][4]= { {1}, {2,3} , {4,5,6} } ;
0
1
2
3
0
1
0
0
0
1
2
3
0
0
2
4
5
6
0
int a[3][4]= {1, 2, 3, 4,5 } ;
0
1
2
3
0
1
2
3
4
1
5
0
0
0
2
0
0
0
0
در یك آرایة دواندیسی ،هر سطر ،در حقيقت آرایهاي یك اندیسی است .در
اعالن آرایههاي دواندیسی ذکر تعداد ستون ها الزامی است.
;}int a[ ][4]={1,2,3,4,5
3
2
1
0
4
3
2
1
0
0
0
0
5
1
. را گرفته مجموع عناصر آن را مشخص نموده و نمایش میدهد3*4 برنامه زیر یك ماتریس
#include <iostream.h>
#include <conio.h>
int main( )
{
float x[3][4], total= 0.0;
int i, j ;
// generate matrix x.
for(i=0; i<3; ++i)
for (j=0; j<4; j++)
cin >> x[ i ][ j ];
// calculate the sum of elements.
for(i=0; i<3; ++i)
for(j=0; j<4; j++)
total + = x [ i ][ j ];
cout << "total = " << total << endl;
return 0 ;
}
برنامه که عناصر ماتریس 3*2را از ورودي خوانده و بزرگترین عنصر هر سطر را پيدا کرده و به
همراه شماره سطر آن جاپ نماید.
ضدحال!...
فصل ششم
توابع
فهرست مطالب فصل ششم
.1
.2
.3
.4
.5
.6
تعریف تابع
تابع بازگشتی
توابع درون خطی
انتقال پارامترها از طریق ارجاع
کالس هاي حافظه ( ) storage classes
سربارگذاري توابع
تعريف توابع
استفاده از توابع در برنامهها به برنامهنویس این امکان را میدهـد کـه
بتواند برنامههاي خود را به صورت قطعه قطعه برنامه بنویسد .تا کنـون
کليه برنامههـائی کـه نوشـتهایـم فقـط از تـابع ) ( mainاسـتفاده
نمودهایم .
شكل کلي توابع بصورت زير ميباشند :
نوع مقدار برگشتی
ليست پارامتر ها جهت انتقال اطالعات از تابع احضار کننده به تابع فراخوانده شده
)return-value-type function-name (parameter-list
{
declaration and statements
نام تابع
}
تعریف اعالنهاي تابع و دستورالعمل هاي اجرائی
تابع زیر یك حرف کوچك را به بزرگ تبدیل مینماید.
نوع مقدار برگشتی
پارامتري از نوع char
کد حرف بزرگ = 32 +کد حرف کوچک //
یا
نام تابع
)char low_to_up (char c1
{
;char c2
;c2 = (c1>= a && c1<= z )?(c1 - 32): c1
; )return (c2
}
)if (c1>= a && c1<= z
;c2=c1-32
;else c2=c1
.برنامه کامل که از تابع قبل جهت تبدیل یك حرف کوچك به بزرگ استفاده مینماید
#include <iostream.h>
char low_to_up(char c1)
{
char c2;
c2=(c1 >= a && c1 <= z )?( A +c1 - a ) : c1;
return c2;
}
int main( )
{
char x;
x=cin.get( );
cout << low_to_up(x) ;
return 0;
}
x
‘d’
c1
‘d’
آرگومان
c2
‘D’
. دو مقدار صحيح را گرفته بزرگترین آنها را برمی گرداندmaximum تابع
int maximum(int x, int y)
{
int z ;
z=(x >= y)? x : y;
// if (x>=y) z=x; else z=y;
return z;
}
. جهت یافتن ماکزیمم دو مقدار صحيح استفاده می نمایدmaximum برنامه کامل که از تابع
#include <iostream.h>
int maximum(int x , int y)
{
int z ;
z=(x > y)? x : y ;
return z;
}
int main( )
{
int a, b ;
cin >> a >> b ;
cout << maximum(a,b);
return 0;
}
maximum آرگومانهاي تابعa, b
a
b
10
15
x
y
10
15
z
15
اسامی پارامترها و آرگومان هاي یك تابع
میتوانند همنام باشند.
.برنامه زیر یك مقدار مثبت را گرفته فاکتوریل آنرا محاسبه نموده نمایش میدهد
x!=1*2*3*4*…*(x-1)*x
#include <iostream.h>
long int factorial(int n)
{
long int prod=1;
if(n>1)
for(int i=2; i<=n; ++i)
prod *=i;
return(prod);
}
int main( )
{
int n;
cin >> n ;
cout << factorial(n) ;
return 0 ;
}
main درn
3
factorial درn
3
factorial درi
2,3,4
factorial درprod
6
وقتی در تابعی ،تابع دیگر احضار میگردد
بایستی تعریف تابع احضار شونده قبل از
تعریف تابع احضار کننده در برنامه ظاهر گردد.
اگر بخواهيم در برنامهها ابتدا تابع mainظاهر
گردد بایستی prototypeتابع یعنی پيش
نمونة تابع که شامل نام تابع ،نوع مقدار
برگشتی تابع ،تعداد پارامترهائی را که تابع
انتظار دریافت آنرا دارد و انواع پارامترها و
ترتيب قرارگرفتن این پارامترها را به اطالع
کامپایلر برساند.
در اسالید بعد مثالی در این زمينه آورده شده است.
#include <iostream.h>
#include <conio.h>
long int factorial(int); // function prototype
int main( )
{
int n;
cout << "Enter a positive integer" << endl;
cin >> n;
cout << factorial(n) << endl;
return 0 ;
}
long int factorial(int n)
{
long int prod = 1;
if(n>1)
for(int i=2; i<=n; ++i)
prod *= i;
return(prod);
}
در صورتی که تابع مقداري بر نگرداند نوع مقدار برگشتی
تابع را voidاعالن میکنيم .و در صورتيکه تابع مقداري
را دریافت نکند بجاي parameter- listاز voidیا ( )
استفاده می گردد.
در اسالید بعد مثالی در این زمينه آورده شده است.
#include <iostream.h>
#include <conio.h>
void maximum(int , int) ;
int main( )
{ int x, y;
cin >> x >> y;
maximum(x,y);
return 0;
}
void maximum(int x, int y)
{
int z ;
z=(x>=y) ? x : y ;
cout << "max value \n" << z<< endl;
return ;
}
.تابع مقداري بر نمی گرداند
) Call By Value ( احضار بوسيله مقدار
#include <iostream.h>
int modify(int);
int main( )
{
int a=20;
cout << a << endl;
modify(a) ;
cout << a << endl;
return 0 ;
}
int modify(int a)
{
a *= 2;
cout << a << endl;
return 0;
}
main درa
20
modify درa
20
modify درa
40
: خروجی برنامه
20
40
20
احضار بوسيله مقدار ( ) Call By Value
aدر main
20
aدرmodify
20
aدرmodify
40
>#include <iostream.h
;)int modify(int
) (int main
{
;int a=20
;cout << a << endl
; )modify(a
;cout << a << endl
; return 0
}
)int modify(int a
{
;a *= 2
;cout << a << endl
در این نوع احضـار تـابع حافظـه هـاي مـورد
;return 0
اســـتفاده آرگومـــان هـــا و پارامترهـــا
}
از هم متمایزند و هرگونه تغييـر در پارامترهـا
باعــــــــــــــث تغيــــــــــــــر
در آرگومان هاي متناظر نمیگردد.
تابع بازگشتي ()recursive functions
توابع بازگشتی یا recursiveتوابعی هستند که
وقتی احضار شوند باعث میشوند که خود را احضار نمایند.
نحوه محاسبه فاکتوريل از طريق تابع بازگشتي
n != 1*2*3*…*(n-1) *n
! f(n) = n
اگر n=1/ n=0
در غير اينصورت
1
)n *f(n-1
= )f(n
n!= 1* 2* 3* … *(n-2) *(n-1) *n
n!=(n-1)! *n
در اسالید بعد تابع بازگشتی مورد نظر پياده سازي شده است.
تابع بازگشتی محاسبه فاکتوریل
#include <iostream.h>
long int factorial(int) ;
int main( )
{
int n ;
cout << n= ;
cin >> n ;
cout << endl << factorial = << factorial(n) << endl;
return 0 ;
}
long int factorial(int n)
{
if(n<=1)
return(1);
else
return(n *factorical(n-1) ) ;
}
نحوه محاسبه nامين مقدار دنباله فيبوناچي از طريق تابع بازگشتي
… 0 , 1, 1, 2, 3, 5, 8, 13, 21 , 34,
دنباله فيبوناچی :
اگر n=1
1
اگر n=2
1
در غير اینصورت
)fib(n-1)+fib(n-2
در اسالید بعد تابع بازگشتی مورد نظر پياده سازي شده است.
=) = fib(nجمله nام
.) را مشخص و نمایش میدهدfibonacci( امين مقدار دنبالة فيبوناچیn برنامهزیر
#include <iostream.h>
long int fib(long int); // forward declaration
int main( )
{
long int r ;
int n ;
cout << Enter an integer value << endl ;
cin >> n ;
r = fib(n) ;
cout << r << endl ;
return 0 ;
}
long int fib(long int n)
{ if (n==0) return 0;
else
if(n = = 1 || n= = 2)
return 1 ;
else
return(fib(n-1) + fib(n-2) ) ;
}
.برنامه زير يك خط متن انگليسي را گرفته آن را وارون نموده نمايش ميدهد
# include <iostream>
# include <conio.h>
using namespace std;
void reverse(void) ; // forward declaration
int main( )
{
reverse( ) ;
getch();
return 0 ;
}
void reverse(void)
// read a line of characters and reverse it
{
char c ;
if( (c=cin.get()) != '\n')
reverse( );
cout << c ;
return ;
}
انتقال پارامترها از طريق ارجاع
تاکنون وقتی تابعی را احضار میکردیم یك کپی از مقادیر آرگومان ها درپارامترهاي متناظر
قرار میگرفت .این روش احضار بوسيله مقدار یا call by valueناميده شد.
در انتقال پارامترها از طریق ارجاع در حقيقت حافظه مربوط به آرگومان ها و پارامترهاي متناظر
بصورت اشتراکی مورد استفاده قرار میگيرد .این روش call by reference
ناميده میشود .
انتقال پارامترها از طريق ارجاع
در این روش پارامترهائی که از طریق call by referenceعمل مینمایند در
پيش نمونه تابع قبل از نام چنين پارامترهائی از & استفاده میشود.واضح است
که در تعریف تابع نيز بهمين طریق عمل میشود.
#include <iostream.h>
int vfunct(int);
void rfunct (int &) ;
int main( )
x
{
int x=5, y=10;
5
cout << x << endl << vfunct(x) << endl << x << endl ;
cout << y << endl ;
rfunct(y) ;
cout << y << endl ;
.تغيير نمی کندx مقدار آرگومان
return 0 ;
}
int vfunct(int a)
{
return a *= a ;
}
void rfunct(int &b)
{
x
y b
b *= b ;
}
5
10 100
: مثال
y
10
: خروجی
5
25
5
10
: ادامه خروجی
100
نكته :
وقتی پارامتري بصورت call by reference
اعالن میگردد این بدان معنی است که با تغيير
مقدار این پارامتر در تابع احضار شده مقدار
آرگومان متناظر نيز تغيير مینماید.
. دو مقدار اعشاري را مبادله مينمايدfswap برنامهزير با استفاده از
#include <iostream.h>
void fswap(float & , float & );
int main( )
{
float a=5.2, b=4.3;
cout << a << endl << b ;
fswap( a , b) ;
cout << a << endl << b ;
return 0 ;
}
void fswap(float &x , float & y)
{
float t;
t=x;
x=y;
y=t;
}
توابع درون خطي ()inline
کلمه inlineبدین معنی است که به کامپایلر دستور میدهد که
یك کپی از دستورالعمل هاي تابع در همان جا (در زمان مقتضی)
توليد نماید تا از احضار تابع ممانعت بعمل آورد.
اشكال توابع inline
بجاي داشتن تنها یك کپی از تابع ،چند کپی از دستورالعمل هاي تابع در
برنامه اضافه میشود که باعث بزرگ شدن اندازه یا طول برنامه میشود.
بنابراین از inlineبراي توابع کوچك استفاده میگردد.
مثالي از توابع درون خطي
#include <iostream.h>
inline float cube(const float s) {return s*s*s; }
int main( )
{
float side ;
cin >> side ;
cout << side << cube(side) << endl ;
return 0 ;
}
کالسهاي حافظه ()storage classes
متغيرها بدو طریق متمایز مشخص میشوند یکی بوسيله نوع ( )typeآن ها و دیگري بوسيله
کالس حافظه آن ها .نوع متغير قبالً اشاره شده بعنوان مثال . . . ، double ، float ، intولی
کالس حافظة یك متغير در مورد طول عمر و وسعت و دامنة متغير بحث مینماید.
در اسالید بعد به انواع کالس حافظه می پردازیم.
بطور کلي کالس حافظه متغيرها به چهار دستة تقسيم ميگردد :
.1
.2
.3
.4
automatic
static
external
register
متغيرهاي automaticدر درون یك تابع تعریف مـیشـوند و در تـابعی کـه
اعالن میشود بصورت متغيرهاي محلی براي آن تابع میباشند .حافظه تخصـيص
داده شده به متغيرهاي automaticپس از اتمام اجراي تابع از بـين مـی رود
بعبارت دیگر وسعت و دامنة متغيرهاي از نوع automaticتابعی میباشـد کـه
متغير در آن اعالن گردیده است.
متغيرهاي staticنيز در درون توابع تعریف می شوند و از نظر وسعت و دامنه شبيه
متغيرهاي automaticهستند ولی در خاتمة اجراي تابع ،حافظه وابسته به این نوع
متغيرهـــا از بين نمیرود بلکه براي فراخوانی بعدي تابع باقی میماند.
و به دودسته تقسيم می شوند
1متغير هاي استاتيک محلی2متغير هاي استاتيک عمومیمقدار اوليه متغيرهاي استاتيک محلی و عمومی صفر است.
در اسالید بعد به یك مثال از کاربرد این نوع کالس حافظه می پردازیم.
• فقط در همان تابعی که تعریف می شوند قابل استفاده اند.
• هنگام فراخوانی تابع ایجاد می شوند و به هنگام خروج تابع ،آخرین مقدار
خودشان را حفظ می کنند.
•فقط یك با مقدار اوليه می گيرند.
در اسالید بعد به یك مثال از کاربرد این نوع کالس حافظه می پردازیم.
: مثال
#include <iostream.h>
#include <conio.h>
Void test(void);
int main( )
{
Int i;
For (i=0 ; i<5; i++)
test();
return 0 ;
}
Void test(void)
{
Static int y=0;
Int x=0;
Cout<<“\n outo x= “<<x<<“, static y=“<<y;
X++;
Y++;
}
: مثال
#include <iostream.h>
// program to calculate successive fibonacci numbers
long int fib(int) ;
int main( )
{
int n ;
cout << how many fibonacci numbers? ;
cin >> n ;
cout << endl ;
for(int j=1; j<=n; ++j )
cout << j << << fib(j) << endl ;
return 0 ;
}
long int fib(int count)
{
static long int t1 = 1, t2=1;
long int t ;
t =(count <3) ?1 : t1 + t2 ;
t2 = t1 ;
t1 = t ;
return(t) ;
}
بایستی توجه داشت که اگر در
توابــع بــه متغيرهــاي از نــوع
مقدار اوليه تخصـيصstatic
ندهيم مقـدار صـفر بصـورت
اتوماتيك براي آنهـا در نظـر
.گرفته میشود
متغيرهاي از نوع externalمتغيرهائی هستند که در بيرون از توابع اعالن می شوند و وسعت و
دامنه فعاليت آنها کليه توابعی میباشد که در زیر دستور اعالن متغير قرار دارد.
در اسالید بعد به یك مثال از کاربرد این نوع کالس حافظه می پردازیم.
#include <iostream.h>
External int w; // external variable
functa(int x, int y)
{
cout << w ;
w=x+y;
cout << endl << w << enld;
return x%y ;
}
int main( )
{
int a, b, c, d;
cin >> a >> b ;
c=functa(a, b) ;
d=functa(w, b+1);
cout << endl << c << endl << d << endl << w ;
return 0 ;
}
: مثال
بایستی توجه داشت که اگر در
توابــع بــه متغيرهــاي از نــوع
مقــــدار اوليــــهexternal
تخصيص ندهيم مقـدار صـفر
بصورت اتوماتيك براي آنها در
.نظر گرفته میشود
وقتی متغيري از نوع registerاعالن میشود از کامپيوتر عمالً درخواست
میشود که به جاي حافظه از یکی از رجيسترهاي موجود استفاده نماید.
کاربرد کالس register
معموالً از نوع رجيستر براي شاخصهاي دستور تکرار و یا اندیس هاي آرایهها
استفاده میشود .بایستی توجه داشت که متغيرهاي از نوع رجيستر قابل استفاده
دردستور cinنمیباشند
;register int i
)for(i=1;i<=10;i++
;”cout<<“hi
سربارگذاري توابع ()function overloading
در C++این امکان وجود دارد که دریك برنامه بتوانيم از چند توابع هم نام
استفاده نمائيم مشروط بر این که پارامترهاي این توابع متفاوت باشند( .از
نظر تعداد پارامتر و یا نوع پارامترها و ترتيب آنها)
: مثال
#include <iostream.h>
float addf(float , int);
int addf(int , int);
int main( )
{
int a=5, b=10 ;
float d=14.75 ;
cout << addf(a , b) << endl;
cout << addf(d , b) << endl;
return 0 ;
}
int addf(int x, int y)
{
return x+y ;
}
float addf(float x, int y)
{
return x+y ;
}
برنامه اي که با استفاده ار تابعي به نام )(، Square
مربع يك عدد را محاسبه مي کند
دقت شود این برنامه باید بتواند مربع یك عدد صحيح و اعشاري را با استفاده
از توابع سرباگذاري محاسبه نمایيد.
تمرين
.1
.2
.3
.4
برنامه اي بنویسيد كه 3عدد اعشاري را خوانده و به تابعی ارسال كند و تابع
ميانگين آن ها را محاسبه كرده و برگرداند.
برنامه اي كه ضرایب معادله ي درجه دومی را خوانده ،آن ها را به تابعی
ارسال كند .تابع معادله را حل كند و جواب ها را در خروجی چاپ كند( .تابع
جواب ها را به تابع اصلی برنمی گرداند).
برنامه اي بنویسيد كه عددي را از ورودي خوانده و هریک از ارقام آن را در
یک سطر چاپ كند .تفکيک و چاپ ارقام توسط تابع بازگشتی صورت گيرد.
برنامه اي بنویسيد كه حاصلضرب دو عدد صحيح را به كمک جمع كردن
محاسبه كند .براي این كار از تابع بازگشتی استفاده كنيد.
= a×b
a
a×(b-1)+a
اگر b=1
اگر b>1
1
# include <iostream>
# include <conio.h>
using namespace std;
float average(float a, float b, float c){return ((a+b+c)/3);}
void main()
{
float x, y, z;
cin>>x>>y>>z;
cout<<average(x,y,z);
getch();
}
# include <iostream>
# include <conio.h>
# include <math.h>
using namespace std;
void f(int a, int b, int c){
float delta = (b*b)-(4*a*c);
if(delta == 0)
cout<<"The only answer:n"<<"x= "<<(-b)/(2*a);
else if(delta > 0)
{
cout<<"Two answers:n"<<"x1= "<<(-b+sqrt(delta))/(2*a);
cout<<"x2= "<<(-b-sqrt(delta))/(2*a);
}
}
void main() {
2
float x, y, z;
cin>>x>>y>>z;
f(x,y,z);
getch();
}
# include <iostream>
# include <conio.h>
# include <math.h>
using namespace std;
void f(int a)
{if (a>10) f(a/10);
cout<<(a%10)<<endl;
}
void main()
{
int n;
cin>>n;
f(n);
getch();
}
3
4
# include <iostream>
# include <conio.h>
# include <math.h>
using namespace std;
int f(int a,int b)
{if (b==1) return a;
return (f(a,b-1)+a);
}
void main()
{
int n,m;
cin>>n>>m;
cout<<f(n,m);
getch();
}
فصل هفتم
ساختار ها و اشاره گرها
فهرست مطالب فصل هفتم
.1
.2
.3
.4
.5
.6
.7
ساختارها
Unionها
اشاره گرها ( ) Pointer
تعریف آرایه
آرایه هاي دو بعدي و اشاره گرها
تخصيص حافظه بصورت پویا ( عملگر ) new
رشته ها و توابع مربوطه
ساختارها
ساختارها شبيه آرایهها بوده بدین صورت که یك نوع داده گروهی است که فضاي
پيوسته از حافظه اصلی را اشغال مینماید .اما عناصر ساختار الزاماً از یك نوع
نمیباشند بلکه اعضاي یك ساختار میتوانند از نوعهاي مختلف از قبيل ، char
… ، float ، intباشند.
تعريف ساختار
نام ساختار
struct time
{
int hour ; // 0 – 23
int minute ; // 0 – 59
int second; //
};
اعضا ساختار
مثال :
{ struct account
; int acc_no
;char acc_type
; ]char name[80
; float balance
;}
ساختار accountداراي چهار عضو میباشد.
acc_noشماره حساب از نوع int
acc_typeنوع حساب از نوع char
مشخصات صاحب حساب از نوع رشتة 80کرکتري
name
balanceمانده حساب از نوع float
: به دو صورت مي توان اعالن يك متغير از نوع ساختار را نمايش داد
: روش اول
struct account
{
int acc_no;
char acc_type;
char name[80];
float balance;
} cust1, cust2, cust3;
: روش دوم
struct account
{
int acc_no ;
char acc_type;
char name[80];
float balance;
};
account cust1, cust2, cust3;
به ساختارها میتوان مقدار اوليه نيز تخصيص داد
;}account cust = {4236, r, Nader Naderi , 7252.5
دسترسی به عناصر یك ساختار
.
بمنظور دسترسی به عناصر یك ساختار از عملگر استفاده
میگردد .عملگر .جزء عملگرهاي یکتائی میباشد.
: مثال
cust .acc_no = 4236;
cust .acc_type = r;
cust . name = Nader Naderi;
cust . balance = 7252.5;
: نكته
struct date {
int month;
int day;
int year;
};
struct account {
int acc_no ;
char acc_typer;
char name[80];
float balance ;
date lastpay ;
};
.عضو یك ساختار خود میتواند یك ساختار دیگر باشد
اگرداشته باشيم
account x, y ;
بوسيلهlastpay آنگاه عضو
x.lastpay.day
x.lastpay.month
x.lastpay.year
.مشخص میگردد
نكته :
میتوان آرایهاي تعریف نمود که هر عضو آن یك ساختار باشد و حتی به آنها مقادیر اوليه تخصيص نمود.
{ struct struc1
;]char name[40
;int pay1
;int pay2
;}
struc1 cust[ ]= {nader, 3000 , 40000,
sara, 4200, 6000,
susan, 3700, 25000,
;} saman, 4800 , 2000,
دو عدد مختلط را میگيرد و،برنامه زیر هر عدد مختلط را بصورت یك ساختار در نظر گرفته
.مجموع آن ها را مشخص و نمایش میدهد
#include <iostream.h>
int main( )
{
struct complex{
float a;
float b; } x, y, z;
cout << enter 2 complex numbers << endl ;
cin >> x.a>>x.b ;
cout << endl;
cin >> y.a >> y.b;
z.a = x.a + y.a ;
z.b = x.b + y.b ;
cout << endl << z.a << << z.b;
return 0 ;
}
union
unionاز نظر ساختاري شبيه structمی باشد .با این تفاوت که عضـوهائی
که تشکيل unionميدهد همگی از حافظه مشـترکی در کـامپيوتر اسـتفاده
مینمایند .بنابراین استفاده از unionباعث صرفهجوئی در حافظه میگردد.
مثال :
union id
{
;]char color [10
;int size
;} x , y
هر کدام از متغيرهاي xو yیك رشته
10کرکتري یا یك مقدار از نوع int
میباشد وکامپيوتر یك بلوك حافظه که
بتواند رشته 10کرکتري رادر خود جاي
دهد ،براي colorو sizeدر نظر
میگيرد.
: مثال
union xpq
{
int x ;
char y[2] ;
}p;
x
y[1]
y[0]
تمرين:
برنامه اي بنویسيم که یك دفترچه تلفن 20تایی (ظرفيت پذیرش 20نام و شماره تلفن را
داشته باشد)و امکان جستجو در آن را بر اساس نام فرد ایجاد نماید.
اشارهگرها ()Pointers
دادههائی که در کامپيوتر در حافظه اصلی ذخيره ميشوند
بایتهاي متوالی از حافظه بسته به نوع dataاشغال میکنند.
نوع داده
حافظه الزم
مقادير
2بایت
32767تا –32768
4بایت
2147483647تا –2147483648
1بایت
یك کارکتر
char
4بایت
3.4e38تا 1.2e-38
float
8بایت
1.8e308تا 2.2e-308
int
long int
double
اشارهگرها ()Pointers
با داشتن آدرس داده در حافظة اصلی میتوان براحتی به آن داده
دسترسی پيدا نمود و از طرف دیگر آدرس هر داده در حافظه آدرس
بایت شروع آن داده میباشد.
;int x = 613
0
1
2
3
4
5
6
7
613
نكته :
در کامپيوتر آدرسها معموالً دو بایت اشغال مینمایند .اگر آدرس xرا در pxقرار دهيم آنگاه میگوئيم که px
به xاشاره مینماید.
x
px
آدرس متغير xرا بوسيله &xنشان ميدهيم و عملگر & را عملگر آدرس مینامند.
int x , *px
;X=54
; px = &x
مثال :
; int y , x , *px
x
px
26
حال اگر دستور العمل ; x += 10را بدهيم :
x
px
36
حال اگر دستورالعمل ; *px = *px + 7بدهيم.
x
43
px
; x = 26
; px = &x
آرايه يك بعدي و اشاره گرها
x
اولين عنصر آرایه بوسيله ] x[0مشخص میشود.
آدرس اولين عنصر آرایه بوسيله ] &x[0یا بوسيله xمشخص میشود.
آدرس iامين عنصر آرایه بوسيله ] &x[iیا بوسيله ) (x+iمشخص میشود.
دو دستورالعمل زیر با هم معادلند .
; x[ i ] = 82.5
; *(x + i) = 82.5
از طرف دیگر اگر داشته باشيم
;]float x[10
;float *p
دو دستورالعمل زیر معادلند.
; ]p = &x[2
; p= x + 2
26.5
24.7
5.8
-73.2
69.0
100.5
-13.24
424.3
187.8
358.2
0
1
2
3
4
5
6
7
8
9
ساختارها و اشاره گرها
میتوان اشارهگري را تعریف نمود که به اولين بایت یك ساختار ) (structاشاره نماید.
x
int
float
char
int
px
a
b
c
d
struc1
struct
{
; int a
; float b
;char c
; int d
; } x, *px
; px = &x
عبارت x.aمعادل pxaمعادل (*px).aمیباشد.
استفاده از آرایهها بعنوان پارامتر تابع مجاز است.
در اسالید بعد به یك مثال توجه نمایيد.
در برنامه زیر تابع modifyآرایه aرا بعنوان پارامتر میگيرد.
>#include <iostream.h
void modify(int [ ] ); // forward declaration
خروجی :
) (int main
{
1
3
; ]int a[5
2
4
)for(int j=0; j<=4; ++j
3
; a[ j ] = j+1
5
; )modify(a
4
6
)for(int j=0; j<5; ++j
5
7
; cout << a[ j ] << endl
; return 0
3
}
void modify(int a[ ]) // function definition
4
{
5
)for(int j=0; j<5; ++j
6
; a[ j ] += 2
7
)for(int j=0; j<5; ++j
; cout << a[ j ] << endl
; return
نکته :در این مثال از فراخوانی با مقدار استفاده نشده است .براي همين
}
تغييرات انجام شده در تابع )( modifyباعث تغيير در مقادیر ارایه در
تابع اصلی یا )( mainشده است .این مبحث ،تحت عنوان فراخوانی از
طریق ارجاع در ادامه توضيح داده می شود.
در صورتيکه آرایه بيش از یك بعد داشته باشد
بعدهاي دوم به بعد بایستی در تعریف تابع و پيش
نمونه تابع ذکر گردد.
در اسالید بعد به یك مثال توجه نمایيد.
#include <iostream.h>
void printarr(int [ ][ 3 ]);
int main( )
{
,
int arr1 [2][3] = { {1,2,3}, {4,5,6} } arr2 [2][3]= {1,2,3,4,5}
printarr(arr1);
cout << endl ;
printarr(arr2);
cout << endl ;
printarr(arr3);
return 0 ;
}
void printarr(int a[ ][3] )
{
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
cout << a[ i ][ j ] << ;
cout << endl ;
}
}
, arr3 [2][3]={ {1,2}, {4} };
1
4
2
5
3
6
1
4
2
5
3
0
1
4
2
0
0
0
: خروجی
آرايههاي دوبعدي و اشارهگرها
یك آرایه دوبعدي بصورت تعدادي آرایه یك بعدي میتوان تعریف نمود.
اگر xیك ماتریس 5سطري و 4ستونی از نوع اعشاري باشد قبالً این ماتریس را با
;]float x[5][4
معرفی کردیم .حال با استفاده از اشارهگرها بصورت زیر معرفی نمائيم:
;]float (*x)[4
آرايههاي دوبعدي و اشارهگرها
;]float (*x)[4
آرايه يك بعدي اول
x
آرايه يك بعدي دوم
)(x+1
آرايه يك بعدي سوم
)(x+2
آرايه يك بعدي چهارم
)(x+3
آرايه يك بعدي پنجم
)(x+4
ایجاد شده و مقادیر عناصر آرایه را به چهار طریق نمایشint عنصري از نوع5 در برنامه زیر یك آرایه
.میدهد
#include
<iostream.h>
int main( )
{
int x[ ]={12, 25, 6, 19, 100}, i;
int *px=x; // اشاره به عنصر اول آرایه مینماید،نام آرایه بدون اندیس
for(i=0; i<=4; i++)
cout << *(x+i) << endl;
//the second method
for(i=0; i<5; i++)
cout << x[ i ] << \n;
//the third method
for(i=0; i<=4; i++)
cout << px[ i ]<<endl;
//the forth method
for(i=0; i<=4; i++)
cout << *(px+i)<<endl;
return 0; }
تخصيص حافظه به صورت پويا يا (عملگر )new
از عملگر newبراي تخيصيص حافظه به صورت پویا
می توان استفاده نمود ،در ضمن میتوان براي
بلوکی از حافظه که تخصيص یافته مقدار اوليه تعيين
نمود.
براي تخصيص حافظه باندازه 20مقدار از نوع intکه اشارهگر ptxبه آن اشاره نماید بصورت زیر عمل میشود.
;int *ptx
;]ptx = new int [20
ptxبه اولين داده از نوع intاشاره مینماید .
ptx+iبه i+1امين عنصر از فضاي پيوسته اشاره مینماید.
سپس آن را مقدار داده و مجموع، عنصري از نوع اعشاري در حافظه ایجاد نمودهn برنامه زیر یك فضاي
.مقادیر رامشخص و نمایش میدهد
#include
<iostream.h>
int main( )
{
int n;
float *ptr, tot = 0.0;
cout << enter a value for n << endl;
cin >> n;
ptr=new float [n];
for(int j=0; j<n; ++j)
{
cin >> *(ptr + j);
cout << \n ;
}
for(j=0; j<=n-1; ++j)
tot += *(ptr + j);
cout << tot ;
// in order to free the space use
delete[ ] ptr ;
return 0;
}
. عنصري از ساختار را ایجاد مینمایدn برنامه زیر آرایههاي
#include
#include
int main( )
{
struct rec
{
<iostream.h>
<conio.h>
float a;
int b;
};
int n;
rec *ptr;
cout << "how many records? \n";
cin >> n ;
ptr = new rec[n];
for(int i=0; i<n; ++i) {
cout <<((ptr+i) ->b=i) << " ";
cout <<((*(ptr +i)).a = i+0.5) << endl ;
}
delete [ ] ptr;
getch();
return 0;
}
. جابهجا مینمایدswap برنامه زیر دو مقدار اعشاري را گرفته مقادیر آن ها را به کمك تابع
#include
<iostream.h>
#include
<conio.h>
void swap(float *, float *);
int main( )
{
float a,b,*ptb,*pta;
cin >> a >> b;
pta=&a;
ptb=&b;
swap(pta,ptb); ///////swap(a,b);
cout << a << endl << b << endl ;
return 0;
}
void swap(float *px , float *py)
{
float t;
t = *px;
*px = *py;
*py = t ;
return;
}
برنامه اي که تعداد nعدد را از ورودي خوانده ،در آرایه اي قرار می دهد و سپس آرایه را
به تابعی ارسال می کند .تابع تعداد اعداد زوج و فرد را نمایش دهد.
رشتهها و توابع مربوطه
رشتهها در ، C++آرایهاي از کرکترها میباشند که با کرکتر \0ختم می شوند.
;char name[ ]= sara
s
a
r
a
\0
مقداردهي اوليه به رشته
رشته و اشاره گر
هر رشته از طریق اشارهگري به اولين کرکتر آن در دسترس قرار میگيرد .آدرس یك رشته ،آدرس کرکتر
اول آن میباشد .به رشتهها میتوان مقدار اوليه تخصيص داد.
;char *name = sara
تابع )strcmpi(s1, s2
رشتههاي s1و s2را با هم مقایسه نموده (بدون توجه به حروف کوچك و بزرگ) اگر رشته
s1برابر با رشته s2باشد مقدار صفر و اگر رشته s1کوچکتر از رشته s2باشد یك مقدار
منفی در غير اینصورت یك مقدار مثبت بر میگرداند.
;"char *s1= "ALI"; // char s1[10] = "ALI
;"char *s2="ali"; //char s2[10]="ali
;cout << strcmpi(s1, s2) << endl
0
تابع ) strcmp(s1, s2
رشتههاي s1و s2را با هم مقایسه نموده اگر s1برابر با s2باشد مقدار صفر و اگر رشته
s1کوچکتر از رشته s2باشد یك مقدار منفی در غير اینصورت یك مقدار مثبت
برمیگرداند.
;"char *s1= "ALI
;"char *s2="ali
;"char s1[10]= "ALI
;"char s2[10]="ali
-1
;cout << strcmp(s1, s2) << endl
تابع ) strncmp(s1, s2,n
حداکثر nکرکتر از رشتة s1را با nکرکتر از رشتة s2مقایسه نموده در صورتيکه s1
کوچکتر از s2باشد یك مقدار منفی ،اگر s1مساوي با s2باشد مقدار صفر در غير
اینصورت یك مقدار مثبت برميگرداند.
0
32
;"*s1= "ali reza
;"*s2="ali
;"s1[10]= "ali reza
;"s2[10]="ali
;<< strncmp(s1, s2,3) << endl
char
char
char
char
cout
;"*s1= "ali reza
;"*s2="ali
;"s1[10]= "ali reza
;"s2[10]="ali
;<< strncmp(s1, s2,4) << endl
char
char
char
char
cout
تابع (strcat(s1, s2
دو رشتة s1و s2را بعنوان آرگومان گرفته رشتة s2را به انتهاي رشتة s1اضافه
مینماید .کرکتر اول رشتة s2روي کرکتر پایانی \0رشتة s1نوشته میشود ونهایتاً
رشتة s1را برميگرداند.
ali reza
;" s1[20]= "ali
;"*s2="reza
;"s2[20]="reza
;<< strcat(s1, s2) << endl
char
char
char
cout
تابع (strncat(s1, s2,n
دو رشته s1و s2ومقدار صحيح و مثبت nرا بعنوان آرگومان گرفته ،حداکثر nکرکتر
از رشتة s2را در انتهاي رشتة s1کپی مینماید .اولين کرکتر رشته s2روي کرکتر
پایانی \0رشتة s1مینویسد ونهایتاً مقدار رشتة s1را برميگرداند.
ali re
;" s1[20]= "ali
;"*s2="reza
;"s2[20]="reza
;<< strncat(s1, s2,2) << endl
char
char
char
cout
strlen(s( تابع
. را بعنوان آرگومان گرفته طول رشته را مشخص مینمایدs رشتة
char *s1= "ali";
char s1[10]= "ali";
cout << strlen(s1);
3
char *s1= "ali ";
char s1[10]= "ali ";
cout << strlen(s1);
4
strcpy(s1,s2) تابع
کپی مینماید وs1 را در رشتةs2 را بعنوان آرگومان گرفته رشتةs2 وs1 دو رشتة
. را بر میگرداندs1 نهایتاً مقدار رشتة
char
char
char
cout
s1[20]= "ali ";
*s2="reza";
s2[10]="reza";
<< strcpy(s1, s2) << endl;
char
char
char
cout
s1[20];
*s2=“ali";
s2[10]=“ali";
<< strcpy(s1, s2) << endl;
reza
ali
strncpy(s1, s2,n( تابع
کرکترn حداکثر، را بعنوان آرگومان گرفتهn و مقدار صحيح و مثبتs1 , s2 دو رشتة
. را برميگرداندs1 نهایتاً مقدار رشتة، کپی نمودهs1 در رشتةs2 را از رشتة
char
char
char
cout
char
char
char
cout
s1[20]= "ali ";
*s2="reza";
s2[10]="reza";
<< strncpy(s1, s2,3) << endl;
s1[20];
*s2=“amir ali";
s2[10]=“amir ali";
<< strncpy(s1, s2,4) << endl;
rez
amir
براي استفاده از توابع مربوط به
رشتهها بایستی حتماً در ابتدا برنامه
> #include <string.hرا قرار
دهيم.
. رشته در نظر گرفته آن ها را بترتيب حروف الفباء مرتب نموده نمایش میدهد5 برنامه ذیل پنج اسم را بصورت
using namespace std;
#include<iostream>
#include<conio.h>
#include<string.h>
void sort(char name[][10])
{char t[10];
for(int i=0; i<4; ++i)
for(int j=i+1; j<5; ++j)
if(strcmpi(name[i], name[j])> 0) {// interchange the two strings
strcpy(t,name[i]);
strcpy(name[i] , name[j]);
strcpy(name[j] , t) ;
}
}
void main()
{
char name[5][10] = {"sara", "afsaneh", "babak", "saman", "naser" };
sort(name);
// display sorted strings
for(int i=0; i<5; ++i)
cout << name[i] << endl;
getch();
}
: مثال
using namespace std;
#include<iostream>
#include<conio.h>
#include<string.h>
int main( )
{
char s1[20]= "happy birthday";
char s2[20]= "happy holidays";
cout << strcmp(s1, s2) << endl;
cout << strncmp(s1, s2, 7) << endl ;
getch();
}
-1
-6
: مثال
using namespace std;
#include<iostream>
#include<conio.h>
#include<string.h>
int main( )
{
char s[10] = "sara";
cout << strlen(s);
getch();
}
4
. مي باشدstrcmp تابع زير معادل تابع کتابخانه
int nikstrcmp(char s[] , char t[] )
{
int i=0;
while (s[i]==t[i] )
if ( s[i++]='\0' )
return 0;
return (s[i]-t[i]);
}
برنامه اي بنويسيد که رشته اي را از ورودي خوانده ،تمام حروف کوچك آن
رشته را به حروف بزرگ تبديل کرده و چاپ مي کند.
• توضيح :در این برنامه از تابعی به نام )( upperاستفاده كنيد كه
در این تابع باید عمليات تبدیل را انجام دهد
• نکته :تفاوت كد اسکی حروف كوچک و بزرگ 32واحد است براي
تبدیل ’ ‘aبه ’ ‘Aكافی است از ’ ‘aبه اندازه 32واحد كم كنيد.
برنامه اي بنويسيد که رشته اي را که به نقطه ختم مي شود را از ورودي
خوانده ،کاراکتر هاي موجود در رشته را به همراه تعداد دفعات تكرار آنها
به خروجي ببرد
فصل هشتم
برنامه نویس شی گرا
فهرست مطالب فصل هشتم
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
تعریف شی گرایی
چند ریختی ()polymorphism
خاصيت ارث بري
پشته ()stack
ایجاد شی
ارث بري
سازنده ها و نابود کننده ها
توابع دوست
کالس هاي دوست
توابع سازنده پارامتر دار
توابع سازنده یك پارامتري
.12
.13
.14
.15
.16
.17
.18
.19
.20
.21
عضوهاي static
کالسهاي تودرتو
کالس هاي محلی
استفاده از objectها بعنوان
پارامترهاي تابع
برگشت اشياء
انتساب اشياء
آرایه اشياء
اشاره گر به اشياء
اشاره گر this
توابع مجازي و پلی مرفيسم
تعريف شي گرايي
برنامه نویسی شئ گرا یا oopیك روش جدید برنامه
نویسی میباشد که در آن از ویژگی
ساختيافته همراه با چند ویژگیهاي قوي جدید استفاده
میشود .زبان برنامه نویسی C++امکان استفاده از oop
را به راحتی فراهم مینماید.
نوع داده انتزاعي
•برنامه ها براي حل مسائل دنياي واقعی نوشته می شـوند ،مثـل نگهـداري
اطالعات مربوط به دانشجویان ،نگهداري اطالعات مشتریان بانك ها.
•گر چه می توان بسياري از مسئله هاي دنياي واقعی را با اسـتفاده از انـواع
اوليه حل کرد ،اما با تعریف انواع جدیدي که بتوان اشياي دنياي واقعی ،مثل
دانشجویان را مدلسازي کنند ،حل مسائل راحتر خواهد بود
•در زبان برنامه نویسی شی گرا امکان تعریف انواع جدید وجود دارد
•در زبان برنامه نویسی C++براي تعریف نوع جدید ،از کالس ها اسـتفاده
می شود
کالس ها و اشيا
•کالس ها نوع جدیدي است که برنامه نویس آن را براي حـل مسـئله هـاي
دنياي واقعی تعریف می کند ،
•کالس ها حاوي داده ها و تعریف عمليات است
•داده هاي عضو کالس را فيلد یا صفت می گویند.
•عمليات کالس ها را تابع یا متد می نامند.
•شی یك نمونه از کالس است که در تکنيك برنامه نویسی شی گرا یك نهاد
زمان اجرا می باشد.
نكته مهم :
تمام زبانهاي برنامه نویسی شیگرا داراي سه
خصوصيت مشترك زیر میباشند :
الف( encapsulation :محصورسازي)
ب( polymorphism :چندریختی)
ج( inheritance :ارث بري)
محصورسازي () Encapsulation
محصور سازي یا بسته بندي به معناي این است که تمام جنبه هاي یك نهاد در داخل یـك کـالس جمـع
آوري و از سایر نهاد ها تفکيك می شود .بسته بندي ،مانع از این می شود کـه داده هـا یـك شـی،
توسط متد هاي شی دیگري دستيابی شود.
( polymorphismچند ريختي)
چند ریختی به معناي این است که نهادي مثل متغير ،تابع ،شی ،معانی
یا کاربردهاي مختلفی داشته باشند .به عنوان مثال توابع همنام نوعی
چند ریختی محسوب می شوند.
( inheritanceارث بري)
ارث بري فرآیندي است که بوسيله آن یك شی ( )objectمیتواند
خاصيتهاي شی دیگري را دارا شود.
تعريف کالس و اشيادرc++
نام کالس Class
{
داده ها توابع اختصاصی
Public :
داده ها و عمومی
Private :
داده ها و توابع اختصاصی
Protected:
داده ها و توابع محافظت شده
;اشایی از کالس}
مثال
دستيابي به اعضاي يك کالس
براي دستيابی به اعضاي یک كالس از (نقطه) به صورت زیر استفاده می شود.
نام عضو كالس .نام شی كالس
امکان پذیر نيست em1.name
)(Em1.putname
امکان پذیر نيست )(Em1.age
برنامه اي که طول و عرض مستطيلي را از ورودي خوانده ،مساحت و محيط آن را به
خروجي مي برد
برنامه اي با استفاده از کالس ها بنویسيد که عددي را از ورودي گرفته و فاکتوریل آن را محاسبه
ونمایش میدهد.
پشته ()stack
پشته ساختاري است که داراي خاصيت last in first out
میباشد .پشته فضاي پيوسته در حافظه اشغال مینماید .عملياتی
کــه روي پشته انجام میشوند عبارتند از :
الف ، push :که باعث میشود یك عنصر وارد پشته شده.
ب ، pop :که باعث میشود یك عنصر از پشته خارج گردد.
ايجاد شي ()object
بمنظور ایجاد یك شی بایستی از کلمة رزروشده
classاستفاده نمود class .از نظر ظاهر شبيه
ساختار یا structمیباشد .پشته را بعنوان یك
objectمیتوان در نظر گرفت که dataآن شامل
یك آرایه و یك ، tosو عملياتی که روي این
objectانجام میشود عبارتست از ، push
pop ، initializeکردن پشته.
در اسالید بعد مثالی از نحوه ایجاد شی آورده شده است.
مثال :
بدین معنی است که stckو tos
بوسيله توابعی که عضو object
نباشند غير قابل دسترسی
هستند .و این یکی از روشهاي
محصور سازي اقالم دادههاست.
بدین معنی است که بوسيله سایر
قطعات برنامه قابل دسترسی
میباشد.
#define SIZE 100
// this creates the class stack.
{ class stack
private :
;]int stck[SIZE
;int tos
public:
;) (void init
;)void push(int i
;) (int pop
;}
نكته :
فقط توابع عضو میتوانند به متغيرهاي عضو از نوع private
دسترسی داشته باشند .بایستی توجه داشت که اگر نوع عضوي
مشخص نگردد آن عضو به صورت اتوماتيك privateمی باشد.
نحوه تعريف تابع عضو يك کالس
)void stack : : push(int i
{
{ ) if(tos = = SIZE
;cout << stack is full.
;return
}
; stck[tos]= i
; tos ++
}
عملگر : :مشخص مینماید که تابع متعلق به کدام objectمیباشد .عملگر : :عملگر
scope resolutionناميده میشود.
: stack برنامه کامل
#include <iostream.h>
#define SIZE 100
// this creates the class stack.
class stack {
int stck[SIZE];
int tos;
public:
void init(int i);
int pop( );
void push(int i);
};
void stack : : init( )
{
tos = 0 ;
}
void stack : : push(int i)
{
if(tos = = size) {
cout << stack is full. ;
return ;
}
stck[tos] = i ;
tos ++ ;
}
int stack : : pop( )
{
if(tos = = 0) {
cout << stack empty. ;
return 0 ; }
tos - - ;
return stck[tos];
}
int main( )
{
stack st1, st2; // create two objects
st1. init( );
st2.init( );
st1.push(1);
st2.push(2);
st1.push(3);
st2.push(4);
cout << st1.pop( ) << endl;
cout << st1.pop( ) << endl;
cout << st2. pop( ) << endl;
cout << st2. pop( ) << endl;
return 0; }
سازندهها و نابودکنندهها ()constructors and destructors
Initializationیا مقدار اوليه دادن بصورت اتوماتيك از طریق تابعی انجام میشود
بنام تابع constructorیا تابع سازنده .تابع سازنده تابع مخصوصی است که
عضوي از کالس بوده و همنام با کالس میباشد.
سازندهها و نابودکنندهها ()constructors and destructors
تابع نابود کننده یا ، destructorعکس عمل تابع سازنده را انجام
میدهد .وقتی که شیاي از بين میرود بصورت اتوماتيك تابع نابود کننده
آن فراخوانی میگردد.
)constructors( سازندهها
سازندهها با پارامتر ()constructors
مثال از سازنده با يك پارامتر
توابع دوست کالس
همانطوركه گفته شد تابعی كه عضو كالس نباشد ،نمی تواند به
اعضاي اختصاصی آن كالس دستيابی داشته باشند
براي اعالن تابع دوست ،باید الگوي آن را در داخل كالس قرار دهيد و
كلمه كليدي Friendرا قبل از آن ذكر كنيد.
برنامه اي که با استفاده از تابع دوست دوعدد را با هم جمع و تفریق می کند
مثال :تابع دوست دو کالس
مثال :کالس هاي دوست
کالس هاي را می توان دوست کالس هاي
دیگر معرفی کرد .دراین حالت ،کالس
دوست و تمام توابع عضو آن به اعضاي
اختصاصی کالس دیگر دسترسی دارند
برنامه اي که با استفاده از کالس دوست ،
بين دو عدد کوچکترین را پيدا می کند.
اعضاي کالس با ويژگي static
در بعضی از مواقع ،فقط یک كپی از یک متغير باید بين تمام اشياي
یک كالس مشترك باشد .كلمه كليدي staticبراي این منصور به
كار می رود.
وقتی كلمه كليدي staticرا با اعضاي داده اي كالس به كار می بریم
،به كامپایلر می گویيم كه فقط یک كپی از آن متغير وجود خواهد
داشت و تمام اشياي آن كالس ،آن متغير را به اشتراك می گذارند.
مثال :اعضاي کالس با ویژگی static
برنامه اي که کاربرد و اثر عضو داده اي
staticرا نشان می دهد.
انتساب اشياء ()object assignment
در صورتيکه دو تا objectاز یك نوع باشند
میتوان یك objectرا بدیگري انتساب نمود.
در اسالید بعد مثالی آورده شده است.
: مثال
#include <iostream.h>
#include <conio.h>
class myclass{
int i;
public:
void set_i(int n) {i=n;}
int get_i( ) {return i;}
};
int main( )
{
myclass ob1, ob2;
obl.set_i(126);
ob2= ob1; // assign data from ob1 to ob2
clrscr( );
cout << ob2.get_i( );
retrun 0 ;
}
مثال :آرایه اي از اشيا
اشاره گر به کالس Pointers to Classes
• اشاره گرها همانطور كه می توانند به متغيرها اشاره كنند ،می توانند
به اشياء یک كالس نيز اشاره كنند و چون شی نمونه اي از كالس
است پس به كالس اشاره می كنند .
• در حالت ساده براي دسترسی به اعضاي كالس توسط شی تعریفی،
از نقطه ( ).استفاده كردیم .اما در اشاره گر به شی باید از تركيب 2
كاراكتر خط و بزرگتر (< )-استفاده كنيم .با هم مثالی كامل از
اشاره گر به شی یا همان كالس را بررسی می كنيم :
مثال :اشاره گر به کالس
برنامه اي که نام ،شماره دانشحویی و معدل تعداد 15دانشجو را از ورودي خوانده در آرایه اي از
اشيا قرار داده و سپس دانشجویی که بيشترین معدل را دارد نمایش دهد.
ارث بري
ارث بري فرآیندي است که بوسيله آن یك شی ( )objectمیتواند
خاصيتهاي شی دیگري را دارا شود.
کالس هاي پايه و مشتق شده
• چند كالس ممکن است خصوصيات و رفتارهاي مشتركی داشته باشند
اما هریک شامل خواص و توابع دیگري هم باشد .وراثت اجازه می دهد
یک كالس عمومی تعریف شود كه اشيا درخصوصيات آن مشترك
هستند و این كالس می تواند توسط سایر كالس ها ارث برده شود و
خواص جدیدي به آن اضافه شود بدون اینکه تاثيري روي كالس عمومی
داشته باشد.
• وراثت شباهت بين دو كالس را با استفاده از مفاهيم كالس پایه
baseو كالس مشتق شده derivedبيان می كند .كالسی كه از
آن ارث بري می شود كالس پایه یا مبنا و كالس وارث كه خصوصيات
كالس پایه را به ارث می برد را كالس مشتق شده می نامند .كالس پایه
شامل كليه خواص و رفتارهائی است كه بين كالس هاي مشتق شده
مشترك است.
مثال:
• مثال .كالس پایه shapeرا درنصر بگيرید كه داراي خاصيت هاي
اندازه ،رنگ و موقعيت است .هر شکل می تواند رسم شود ،پاك شود،
حركت كند و رنگ شود .هر كدام از اشکال داراي خواص و رفتارهاي
اضافه تري هستند .براي یک شکل معين بعضی رفتارها ممکن است
متفاوت باشد مثال محاسبه مساحت.
• نکته .یک كالس متشق شده به نوبه خود می تواند كالس پایه براي
سایر كالس ها باشد.
نکته .اگر كالس پایه تغيير كند كالس مشتق شده نيز تحت تاثير این
تغييرات قرار می گيرد.
تعريف کالس مشتق شده
• فرم كلی تعریف یک كالس مشتق شده به صورت زیر است:
class derived : access base
{
;//members of new class
}
derivedنام كالس جدید است كه از كالس پایه baseمشتق شده
است .قسمت accessاختياري است ولی می تواند ،public
privateیا protectedباشد و براي تعيين مجوز دسترسی اعضاي
كالس پایه در كالس جدید بکار می رود .اگر مجوز دسترسی ذكر نشود به
این معنی است كه كليه اعضاي عمومی كالس پایه در كالس مشتق شده
به صورت خصوصی خواهند بود.
مثال .کالس جديد Derivedاز کالس Baseمشتق شده است .در برنامه اصلي تابع
changeاز کالس Derivedفراخواني شده که خود دو تابع setو readاز کالس
Baseرا صدا مي زند.
مثال:
پروژه
كالسی به نام tictacتعریف كنيد كه با آن بتوانيد دوزبازي انجام
دهيد این كالس حاوي یک آرایه دوبعدي 3 *3از نوع صحيح است
.سازنده كالس باید عناصر آرایه را برابر صفر قرار دهد .دو بازیکن ،
بازي می كنند .بازیکن اول عدد 1را در قرار می دهد و بازیکن دوم
عدد 2را در مربعی قرار می دهد .حركت ها باید در خانه هاي
خالی انجام شود .پس از هر حركت كنترل می كنيد كه آیا كسی
برنده شده است یا خير .برنامه باید نوبت را رعایت كند مشخص
كند كه كدام بازیکن باید اول شروع كند.
keywords and alternative tokens.
asm
enum
protected
typedef
auto
explicit
public
typeid
bool
extern
register
typename
break
false
reinterpret_cast
union
case
float
return
unsigned
catch
for
short
using
char
friend
signed
virtual
class
goto
sizeof
void
const
if
static
volatile
const_cast
inline
static_cast
wchar_t
continue
int
struct
while
default
long
switch
xor
delete
mutable
template
xor_eq
do
namespace
this
or_eq
double
new
throw
not
dynamic_cast
operator
true
bitand
else
private
try
and_eq
bitor
not_eq
compl
And
--
or