Professional Documents
Culture Documents
C
C
بعد از امتحان پایان ترم 30 پروژه برنامه نویسی پایان ترم
Pr.rashidi@gmail.com 4
فهرست مطالب
Pr.rashidi@gmail.com 5
مفاهیم اولیه کامپیوتر و نقش آن در زندگی
Pr.rashidi@gmail.com 6
اجزای اصلی کامپیوتر
Pr.rashidi@gmail.com 7
اجزای اصلی کامپیوتر
• واحدهای ورودی
– کیبورد ،ماووس ،قلم نوری CD ، DVD، USB Drive ،
– Ports
– ...
• واحدهای خروجی
– مانیتور ،چاپگر CD ، DVD ، USB ،و ...
– ....
• واحد پردازش مرکزی
• حافظه
Pr.rashidi@gmail.com 8
سلسله مراتب حافظه کامپیوتری
• حافظه اصلی
– فقط خواندنی )ROM ( Read Only Memory
– خواندنی و نوشتنی )RAM (Random Access Memory
• حافظه جانبی
– دیسک سخت ()Hard Disk
– Tape
– CD ، DVDو ....
Pr.rashidi@gmail.com 9
تکالیف پیشنهادی
Pr.rashidi@gmail.com 11
فهرست مطالب
Pr.rashidi@gmail.com 12
سخت افزار /نرم افزار /هوش مصنوعی/فناوری اطالعات
• سخت افزار
– در دانش رایانه به قطعات و دستگاههای قابل لمس تشکیل دهنده رایانه سخت افزار
گفته میشود
• نرم افزار
– به بخش غیرقابل لمس مانند سیستمهای عامل ،برنامههای رایانهای نرمافزار اطالق
میگردد
• هوش مصنوعی
– تلفیق نرم افزار با روشهای هوشمند (مبتنی بر هوش مصنوعی)
– هوش مصنوعی عبارت است از مطالعه این که چگونه کامپیوترها را میتوان وادار
به کارهایی کرد که در حال حاضر انسانها آنها را بهتر انجام میدهند.
• فناوری اطالعات و ارتباطات
– تعریف :انجمن فناوری اطالعات آمریکا :بxه مطالعxه ،طxراحی ،توسxعه ،پیادهسxازی،
پشxتیبانی یxا مxدیریت سیسxتمهای اطالعxاتی مبتxنی بxر رایانxه ،خصوصxا برنامههxای
یپxردازد» .بxه طxور کوتxاه ،فنxاوری اطالعxات بxا نرمافxزاری و سxختافزار رایانxه م
مسxائلی ماننxد اسxتفاده از رایانههای الکترونیکی و نرمافزار سxروکار دارد تxا تبدیل،
ذخیره ،حفاظت ،پردازش ،انتقال و بازیابی اطالعات بxه شxکلی مطمئن و امن انجxام
Pr.rashidi@gmail.com 13
پذیرد.
سایت های مرتبط با سخت افزار
Pr.rashidi@gmail.com 14
سایت های مرتبط با نرم افزار
- • مقاالت مفید
http://www.developercenter.ir/articles.htm
www.google.com : Google • موتور جستجوی
http://www.sanaray.ir/ • ثنارای
Pr.rashidi@gmail.com 15
سایت های مرتبط با فن آوری اطالعات
http://www.itiran.com/ •
http://www.iritn.com/ •
http://www.parsinic.com/ •
http://www.itrc.ac.ir/ •
http://www.iranscience.net/ •
http://www.shci.ir/ •
Pr.rashidi@gmail.com 16
تکالیف پیشنهادی
Pr.rashidi@gmail.com 17
فهرست مطالب
Pr.rashidi@gmail.com 18
سیستم های عددی کامپیوتری
Pr.rashidi@gmail.com 19
سیستم های عددی کامپیوتری
• ( Decimalدهدهی – مبنای ده)
– در این سیستم تمامی اعداد بر مبنای ده ( یعنی با استفاده از ارقام ,0,1
… )9,تعریف می گردد.
• ( Binaryدودویی – مبنای دو)
– در این سیستم تمامی اعداد بر مبنای دودویی (یعنی با استفاده از ارقام
)0,1تعریف می گردد.
• ( Octalمبنای هشت)
– در این سیستم تمامی اعداد بر مبنای هشت (یعنی با استفاده از ارقام
)7,…,0,1تعریف می گردد.
• ( Hexadecimalمبنای شانزده)
• در این سیستم تمامی اعداد بر مبنای شانزده ( یعنی با استفاده از
ارقام 9,…,0,1و )A,B,C,D,E,Fتعریف می گردد.
Pr.rashidi@gmail.com 20
مبنای مبنای مبنای مبنای ده
شانزده هشت دو مثال
0000 000 0 0
• در مبنای دو هر عدد را با یک
0001 001 1 1
0010 010 10 2
رقم نمایش می دهند.
0011 011 11 3 • در مبنای هشت هر عدد را با
0100 100 100 4 سه رقم نمایش می دهند.
0101 101 101 5
• در مبنای شانزده هر عدد را با
0110 110 110 6
0111 111 111 7
چهار رقم نمایش می دهند.
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
Pr.rashidi@gmail.com 21
1111 15
ریاضیات دودویی
جمع •
تفریق •
ضرب •
تقسیم •
Pr.rashidi@gmail.com 22
جمع دودویی
Pr.rashidi@gmail.com 23
تفریق دودویی
Pr.rashidi@gmail.com 24
ضرب دودویی
دو عxدد " "Aو " "Bرا بxا ضxرب جxزئی ( )partialمی تxوان در هم ضxرب کxرد بxرای هxر رقم
" "Bحاصxل ضxرب آن را در عxدد " "Aبxه دسxت آورده و بxر روی خطی جدیxد زیxر رقم
ضرب شده از " "Bبنویسید .در آخر مجموع تمام ضرب های جرئی را محاسبه کنید.
)A( 1 1 0 1
* )B( 0 1 0 1
-----------------
0000
1101
0000
1101
----------------------
0111011
Pr.rashidi@gmail.com 25
تقسیم دودویی
Pr.rashidi@gmail.com 26
مطالعه
Pr.rashidi@gmail.com 27
Pr.rashidi@gmail.com 28
کار در منزل( - )3تحویل جلسه بعدی
Pr.rashidi@gmail.com 29
فعالیت پیشنهادی
Pr.rashidi@gmail.com 30
فهرست مطالب
Pr.rashidi@gmail.com 31
مفهوم الگوریتم و اصول طراحی آن
مقدمه •
تعریف الگوریتم •
مراحل الگوریتم •
چند مثال •
کار در منزل •
Pr.rashidi@gmail.com 32
مفهوم الگوریتم (مقدمه)
• دقيق باشد
• جزئيات كامل حل مسئله را داشته باشد.
پايانپذير باشد.
•
Pr.rashidi@gmail.com 34
مراحل الگوریتم
براي حxل يك مسxئله بايد الگxوريتم آن مسxئله را مشxخص كxنيم (يا
بيابيم) .كxه اصxطالحًا طxراحي الگxوريتم بxراي آن مسxئله ناميده
ميشxود .در طxراحي الگxوريتم معمxوًال سxه مرحلxه زير را از
ميكنند:
هم جدا
– خواندن دادهها
– انجام محاسبات
خروجيها
–
Pr.rashidi@gmail.com 35
مثال :الگوريتمي بنويسيد كه دو عدد از ورودي
دريافت كرده مجموع
دو عدد را محاسبه و چاپ نمايد.
وروديها انجام محاسبات خروجيها
0ـ شروع
1ـ b ,aرا بخوان.
2ـ مجموع b , aرا محاسبه و در sumقرار بده.
3ـ sumرا در خروجي چاپ كن
4ـ پايان
Pr.rashidi@gmail.com 36
مثال :الگوريتمي بنويسيد كه سه عدد از ورودي دريافت كرده
مجموع و ميانگين سه عدد را محاسبه و چاپ كند.
Pr.rashidi@gmail.com 38
کار در منزل ( -)1تاریخ تحویل جلسه بعدی
Begin End
ميشود
:عالمتهاي ورودي و خروجي :كه معموال از متوازياالضالع استفاده
جایگزین یا
محاسبات
Pr.rashidi@gmail.com 42
Begin
فلوچارت مجموع سه عدد
Read(a,b,c)
Sum a+b+c
Ave sum/3
Write(sum,ave)
End
Pr.rashidi@gmail.com 43
مثال :فلوچارتی رسم نمائيد كه دو عدد از ورودي دريافت كرده سپس
.محتويات دو عدد را با هم جابجانمايد
Pr.rashidi@gmail.com 44
a temp b a b
12 15 12 15
temp
12
temp
a b a b
15 15 15 12
12 12
temp temp
Pr.rashidi@gmail.com 45
فلوچارت مسئله باال بصورت زير خواهد بود:
Begin
Read(a,b)
temp a
a b
b temp
Write(a,b)
End Pr.rashidi@gmail.com 46
تمرين
Pr.rashidi@gmail.com 47
4ـ فلوچارتي رسم نمائيد كه دو عدد از ورودي دريافت كرده ،سپس
محتويات دو عدد را بدون استفاده از متغير كمكي جابجا كند.
5ـ فلوچارتي رسم نمائيد كه عددي (درجه حرارت برحسب سانتيگراد)
را از ورودي دريافت كرده سپس آنرا به درجه فارنهايت تبديل كند.
Pr.rashidi@gmail.com 48
دستورالعملهاي شرطي
در حل بسياري از مسائل يا تقريبًا تمام مسائل نياز به استفاده از شروط جزء،
ميشود .همانطور كه ما خودمان در زندگي روزمره نيازهاي اساسي محسوب
شرطها سركار داريم .بطور مثال اگر هوا ابري باشد ممكن است چنين با اين
سخن بگوييم:
اگر جاده یخ بندان باشد انگاه زنجیر چرخ باید بسته شود
.در غير اينصورت نیازی نیست
Pr.rashidi@gmail.com 49
:در حالت كلي شرط را بصورت زير نمايش ميدهند
NO
عمل يا اعمال بعدي
Pr.rashidi@gmail.com 50
رد يا زوجx ف،ردهxددي را از ورودي دريافت كxه عxم نمائيد كxارتي رسx فلوچ: مث\ال
.بودن آن را تشخيص دهد
Begin
Read(a)
R a mod 2
yes
if R=0 then Write(‘even’)
No
Write(‘odd’)
End Pr.rashidi@gmail.com 51
مثال :فلوچارتي رسم كنيد كه دو عدد از ورودي دريافت كرده بزرگترين عدد
.را پيدا كرده در خروجي چاپ نمايد
Begi
n
)Read(a,b
max a
yes
if b>max max b
No
)Write(max
yes
if b<min then min b
No
yes
if c<min then min c
No
Write(min)
End Pr.rashidi@gmail.com 53
:نمونه اجراي فلوچارت باال بصورت زير
ميباشد
نميرسد كه 100متغير مختلف را از ورودي دريافت كنيم سپس آنها را
جمع كنيم.
Pr.rashidi@gmail.com 56
انواع حلقه ها
Pr.rashidi@gmail.com 57
حلقه های با تکرار مشخص
حلقهها تعداد تكرار مشخص
ميباشد اين حلقه از اجزاء زير در اين نوع
:تشكيل
ميشود
ـ انديس حلقه1
ـ مقدار اوليه براي انديس حلقه2
مقدار افزاينده براي انديس حلقه (معموال يك واحد در هر مرحله) 3-
ـ مقدار نهايي (تعداد تكرا حلقه)4
ـ شرطي براي كنترل تعداد تكرار حلقه5
Pr.rashidi@gmail.com 58
حلقهها را غالبًا با فلوچارت بصورت زير نمايش ميدهند:
اين
i 1
No
if i<n اتمام كار حلقه
yes
i i+1
Pr.rashidi@gmail.com 59
مثال :فلوچارتي رسم نمائيد كه عدد nرا از ورودي دريافت كرده،
مجموع اعداد از يك تا nرا محاسبه كند.
Pr.rashidi@gmail.com 60
Begi
n
Read(n)
I 1
sum 0
if I<=n No
Write(sum)
yes
حلقه
End
sum sum+I
I I+1
Pr.rashidi@gmail.com 61
:نمونه اجراي فلوچارت باال بصورت زير است
بزرگ\ترين مق\دار
Max
Pr.rashidi@gmail.com 63
Begin
Read(n,a)
I 2
max a
No
if i<=n then write(max)
yes
End
حلقه Read(a)
yes
if a > max max a
No
i i+1Pr.rashidi@gmail.com 64
مثال :فلوچارتي رسم نمائيد كه ، n , xدو عدد صحيح مثبت را از
ورودي دريافت كرده سپس xبه توان nرا محاسبه كند.
Pr.rashidi@gmail.com 65
Begi
n
Read(n,x)
i 1
pow 1
if i<=n then No
write(pow)
yes
End
حلقه pow pow*x
i i+1
Pr.rashidi@gmail.com 66
حلقههايي كه تعداد تكرار آنها مشخص نيست
(در ریانهای برنامه نویسی به حلقه whileمشهورند).
نميتوان تعداد تكرار حلقه را بدون ورودي معين كرد .اين حلقه ها فقط
Pr.rashidi@gmail.com 67
ميشوند
:در حالت كلي اين نوع حلقهها بصورت زير نمايش داده
No
شرط يا شروط If
yes
محموعه دستورالعملها
و جاگزينها
Pr.rashidi@gmail.com 68
مثال :فلوچارتي رسم كنيد كه عددي را از ورودي دريافت كرده سپس تعداد ارقام آن
را شمرده در خروجي چاپ نمايد.
Pr.rashidi@gmail.com 69
Begi
n
count 0
Read(N)
if N>0 then No
write(count)
yes
End
N N div 10
حلقه
count count+1
Pr.rashidi@gmail.com 70
مثال :فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده ،سري
فيبوناچي قبل از آنرا توليد نمايد.
Pr.rashidi@gmail.com 71
Begi
n
f1 0
f2 1
Read(N)
f3 f1+f2
I =4
No
if i<=N then write(f3)
yes
f1 f2
حلقه
f2 f3
End
f3 f1+f2
i i+1 Pr.rashidi@gmail.com 72
تمرين(جواب با تست)
Pr.rashidi@gmail.com 73
حلقههاي تودرتو
Pr.rashidi@gmail.com 74
در حلقههاي تودرتو به ازاي يكبار تكرار حلقه اوليه ،حلقه داخلي به
ميشود .در كل اگر حلقه اوليه nبار
اندازه مقدار نهايي خود تكرار
تكرار شود و حلقه داخلي mبار ،در اينصورت كل حلقه :
nm
.بار تكرار خواهد شد
Pr.rashidi@gmail.com 75
حلقههاي تودرتو را
ميتوان بصورت زير نشان داد: فلوچارت
i 1
.
.
A .
A
j j+1
Pr.rashidi@gmail.com 76
مثال :فلوچارتي رسم نمائيد كه Nرا از ورودي دريافت كرده ،مجموع
سري زير را محاسبه نمايد:
Pr.rashidi@gmail.com 77
i 2
sum 1
Read(N)
A
if i<=N No Write(sum)
yes End
fact 1
j 2
sum sum+i/fact
if j<=i No
yes
i i+1
fact fact*j
A
j j+1 Pr.rashidi@gmail.com 78
تمرينات
-1فلوچارتي رسم نمائيد كه Nعدد از ورودي دريافت كرده تعداد
اعداد اول و كامل کوچکتر از Nرا شمرده در خروجي چاپ نمايد.
x 2
S 1 !2 x4
!4
.... xn
!N
Pr.rashidi@gmail.com 79
-3فلوچارتي رسم نمائيد كه عددی را از ورودي دريافت كرده مقلوب
عدد را محاسبه و در خروجي چاپ كند.
4ـ فلوچارتي رسم كنيد كه تاريخ تولد شخصي را از ورودي خوانده،
سن شخص را با تاريخ روز ،محاسبه نموده در خروجي چاپ كند.
Pr.rashidi@gmail.com 80
برنامه نویسی C
زبان برنامه نویسی عامل اصلی پیشرفت سیستم های کامپیوتری است.
مقدمه ای بر تمام درس های آتی می باشد.
بازار کxار عمxده شxما بxر اسxاس مxیزان تسxلط شxما بxر اسxاس زبانهxای برنامxه نویسxی می
باشد.
ادامه تحصیل در دوره های باالتر مستلزم داشتن پایه قوی در برنامه نویسی می باشد.
با داشتن پایه قوی در برنامه نویسی صاحب اختیار خویش باشید.
مقدمات C
فهرست مطالب فصل اول
Dennis Ritchie
مطالعه آزاد
Borland C
Turbo C
Microsoft Visual Studio 2008
محیط برنامه نویسی()1
محیط برنامه نویسی()2
محیط برنامه نویسی()3
C اولین برنامه در
>include <stdio.h#
>include <conio.h#
)(int main
{
;printf(“Hello World”)
;)(getch
;return 0
}
VS برای کار در محیطC دستورات
>include <conio.h#
"include "stdafx.h#
”include “iostream#
;using namespace std
#include "stdafx.h“
#include <iostream>
#include <conio.h>
using namespace std;
#include <stdio.h>
int _tmain()
{
printf(" Hello World");
getch();
return 0;
}
ساختار ساده برنامه ها در C
در اسالید بعد مثال هایی از اعالن متغیر ذکر شده است.
Pr.rashidi@gmail.com 106
چند مثال از اعالن متغیر ها :
براي اعالن متغير xاز نوع : int
;int x
برای اعالن متغيرهاي pو qرا از نوع floatكه هر كدام چهار بايت از
حافظه را اشغال ميكنند :
;float p , q
برای اعالن متغير nextاز نوع كركتر كه ميتوان يكي از 256كركتر را به
آن تخصيص داد و يك بايت را اشغال ميكند.
;char next
Pr.rashidi@gmail.com 107
تخصيص مقادير به متغيرها
در اسالید بعد مثال هایی از اعالن متغیر ذکر شده است.
Pr.rashidi@gmail.com 108
مثال :
Pr.rashidi@gmail.com 109
دادههاي از نوع كركتر
Pr.rashidi@gmail.com 110
كركترهاي مخصوص
Pr.rashidi@gmail.com 111
كركترهاي مخصوص
\n Newline
\t Tab beep ميتوان براي ايجاد صدايa\ بعنوان مثال از كركتر
\b Backspace .استفاده نمود
; char x = '\a
\a Beep sound
\” Double quote
\’ Single quote
\0 Null character
\? Question mark
\\ Back slash
رشتهها
Pr.rashidi@gmail.com 113
مثال : 1
Pr.rashidi@gmail.com 114
مثال : 2
دقت نماییxد کxه " "wيك رشxته ميباشxد كxه دو بxايت از
حافظxxه را اشxxغال ميكنxxد در حاليكxxه ' 'wيك كركxxتر
ميباشد كه يك بايت از حافظه را اشغال مينمايد.
Pr.rashidi@gmail.com 115
نمايش مقادير دادهها
دستور )(printf
– براي نمxايش دادههxا بxر روي صxفحه مxانیتواز دسxتور ;)”“(printfاسxتفاده می شxود این
تابع دارای فرمت مشخصی می باشد که به شکل زیر می باشد.
;)> عبارت <,”>1عبارت Printf(“<2
عبارت 1عبارت کنترلی می باشد(نحوه نمایش اطالعات را در خروجی تعیین می کند).
.عبارت 2مقادیر و متغیر های که باید در خروجی چاپ شود
• دستور cout
– براي نمxايش داد ههxا بxر روي صxفحه مxانیتور از coutكxه بxدنبال آن عملگxر درج يعxني << قيد شxده
يگxردد .بايسxتي توجxه داشxت كxه دوكركxتر < پشxت سxر هم توسxط ++Cبصxورت يك باشxد اسxتفاده م
كركتر تلقي ميگردد.
• دستور )(putch()، putcharبرای چاپ یک کرکتر در خروجی
• دستور )(puts
Pr.rashidi@gmail.com 116
برای نمایش پيغام good morningبر روی صفحه نمایش :
;"cout << "good morning
:مثال
برای نمایش مقدار متغیر Xبر روی صفحه نمایش :
; cout << x
چاپ مقدار یک متغییر در برنامه توسط دستور printf
Pr.rashidi@gmail.com 118
متغیرها کنترلی دستور )(printf
• );printf(“%d”,23
– 23چاپ مي شود.
• )’printf(“%c”,’a
– کاراکتر aروي مانيتور چاپ مي شود.
• )’;printf(“%d”,’a
– کد اسکي کاراکتر aيعني 97چاپ مي شود.
• )printf(“%c”,97
– کاراکتري که کد اسکي آن 97است يعني aچاپ مي شود.
Pr.rashidi@gmail.com 119
دریافت مقادیر متغیرها
• دستور )(scanf
از این دستور برای دریافت ورودی از کاربر استفاده می شود.
شکل کلی دستور
)>عبارت < ,”>1عبارت Scanf(“<2
همانند دستور printfاین دستور نیز دارای پارامترهای کنترلی می باشد.
• دستور )(cin
به منظxور دريافت مقxادير بxراي متغيرهxا در ضxمن اجxراي برنامxه از صxفحه كليد ،از cin
كه بدنبال آن عملگر استخراج يعني >> قيد شده باشد ميتوان استفاده نمود.
• دستور getch() ، ()getcheبرای دریافت یک کاراکتر از ورودی
• دستور )(getsبرای دریافت یک رشته از ورودی
Pr.rashidi@gmail.com 120
دريافت کند وkeyboard برنامه اي بنويسيد که عددي صحيح را از: مثال
.مربع آن را چاپ کند
Pr.rashidi@gmail.com 121
عملگر انتساب
Pr.rashidi@gmail.com 122
مثال :
;x=a+b
; x=35
; x=y=z=26
Pr.rashidi@gmail.com 123
عملگرهاي محاسباتي
در Cپنج عملگر محاسباتي وجود دارد كه عبارتند از :
جمع +
تفريق -
ضرب *
تقسيم /
باقيمانده %
اين عملگرها دو تائي ميباشند زيرا روي دو عملوند عمل مينمايند .از طرف
ديگر عملگرهاي +و – راميتوان بعنوان عملگرهاي يكتائي نيز در نظر گرفت.
مثال : 1
در ح\التي ك\ه ه\ر دو عملون\د عملگره\اي – ، + ، * ، / ، %از ن\وع ص\حيح باش\د
نتيجه عمل از نوع صحيح ميباشد.
عبارت نتیجه
2+5 7
5*2 10
5–2 3
5%2 1
5/2 2
مثال : 2
در صورتيكه حداقل يكي از عملوندهاي عملگرهاي + ، – ، * ، /از نوع اعشاري باشد
نتيجه عمل از نوع اعشاري ميباشد.
عبارت نتیجه
2 + 0 .5 7. 0
5* 2. 0 10.0
5. 0 / 2 2.5
5. 0 -2 3. 0
5. 0 / 2. 0 2.5
عملگرهاي افزايش و كاهش
Pr.rashidi@gmail.com 127
عملگرهاي افزايش و كاهش
Pr.rashidi@gmail.com 128
مثال :
;y--
;y=y-1
; - -y
Pr.rashidi@gmail.com 129
از عملگرهاي ++و --ميتوان بدو صورت پيشوندي و پسوندي استفاده نمود.
در دستورالعملهاي پيچيده عملگر پيشوندي قبل از انتساب ارزيابي ميشود و عملگر
پسوندي بعد از انتساب ارزيابي ميشود.
Pr.rashidi@gmail.com 130
مثال :
;int x=5
;y=++x * 2
پس از اجراي دستورالعملهاي فوق :
y=12,x=6
;int x=5
;y=x++ * 2
پس از اجراي دستورالعملهاي فوق :
y=10, x=6
Pr.rashidi@gmail.com 131
عملگر sizeof
Sizeofازعملگرهاي يكتائي مي باشد و مشخص كننده تعداد بايت هائي
است كه يك نوع داده اشغال ميكند.
مثال :
;int x
; cout << sizeof x
مقدار 2نمايش داده ميشود .
); cout << sizeof(float
مقدار 4نمايش داده مي شود.
Pr.rashidi@gmail.com 132
عملگرهاي جايگزيني محاسباتي
Pr.rashidi@gmail.com 133
اولويت عملگرها
ارزيابي مقدار يك عبارت رياضي براساس جدول اولويت عملگرها انجام ميگردد .در ذيل جدول اولويت
عملگرها براساس بترتيب از بيشترين اولويت به كمترين اولويت داده شده است.
2/)2*6+2(* 7
2/)6+4(*7
2/ 10 *7
2/ 70
35
Pr.rashidi@gmail.com 135
: 2 مثال
;int a=6 , b=2, c=8, d=12
;++ d=a++ * b/c
;cout << d << c << b << a
: خروجی
1 9 2 7
Pr.rashidi@gmail.com 136
توضيحات ()Comments
توض\يحات در برنام\ه ب\اعث خوان\ائي بيش\تر و درك به\تر برنام\ه ميش\ود .بن\ابراين
توص\يه ب\ر آن اس\ت ك\ه ح\تي االمك\ان در برنامهه\ا از توض\يحات اس\تفاده نم\ائيم .در
،Cتوض\يحات ب\دو ص\ورت انج\ام ميگ\يرد ک\ه در اس\الیدهای بع\د ب\ه آن اش\اره ش\ده
است.
Pr.rashidi@gmail.com 137
توضيحات ()Comments
ال\ف :اين ن\وع توض\يح بوس\يله //انج\ام ميش\ود .ك\ه ك\امپيوتر ه\ر چ\يزي را
كه بعد از //قرار داده شود تا انتهاي آن خط اغماض مينمايد.
مثال :
ب:توض\يح ن\وع دوم ب\ا */ش\روع ش\ده و ب\ه * /ختم ميش\ود و ه\ر چ\يزي ك\ه
بين* /و * /قرار گيرد اغماض مينمايد .
مثال :
Pr.rashidi@gmail.com 138
توابع كتابخانه
زب\ان Cمجه\ز ب\ه تع\دادي تواب\ع كتابخان\ه ميباش\د .بعن\وان مث\ال تع\دادي
تواب\ع كتابخان\ه ب\راي عملي\ات ورودي و خ\روجي وج\ود دارن\د .معم\وًال
تواب\ع كتابخان\ه مش\ابه ،بص\ورت برنام هه\اي ه\دف (برنام\ه ترجم\ه ش\ده
بزب\ان ماش\ين) در ق\الب فايله\اي كتابخان\ه دس\ته بن\دي و م\ورد اس\تفاده
ق\\\را رميگيرن\\\د .اين فايله\\\ا را فايله\\\اي headerمينامن\\\د و داراي
پسوند h.ميباشند.
Pr.rashidi@gmail.com 139
نحوه استفاده از توابع کتابخانه ای
Pr.rashidi@gmail.com 140
تابع نوع شرح فايل هيد ر
abs(i) int i قد رمطلق stdlib.h
cos(d) double d كس ينوس math.h
exp(d) double ex math.h
log(d) double loge d math.h
log10(d) double Log10 d math.h
sin(d) double d سينوس math.h
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
Pr.rashidi@gmail.com 141
برنامه در C
اكن\ون باتوج\ه ب\ه مط\الب گفت\ه ش\ده ق\ادر خ\واهيم ب\ود ك\ه تع\دادي برنام\ه س\اده و كوچ\ك ب\ه زب\ان C
بنويس\يم .ب\راي نوش\تن برنام\ه بايس\تي دس\تورالعملها را در ت\ابع ) (mainق\رار دهيم و ب\راي اينك\ار
ميتوان به يكي از دو طريقی که در اسالیدهای بعد آمده است ،عمل نمود.
روش اول:
Pr.rashidi@gmail.com 143
روش دوم :
Pr.rashidi@gmail.com 144
.را روي صفحه مانیتور نمايش مي دهدC Is a Strong Language برنامه ای که پيغام
#include <iostream.h>
int main( )
{
cout <<“C is an Strong Language \n" ;
return 0 ;
}
Pr.rashidi@gmail.com 145
برنامه زير يك حرف انگليسي كوچك را گرفته به حرف بزرگ تبديل مينمايد.
#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;
}
Pr.rashidi@gmail.com 146
دو عدد از نوع اعشاري را گرفته مجموع و حاصلضرب آنها را محاسبه و نمايش ميدهد.
#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 ;
}
Pr.rashidi@gmail.com 147
تمارین
Pr.rashidi@gmail.com 148
فصل دوم
مساوي ==
مخالف =!
بزرگتر >
بزرگتر يا مساوي =>
كوچكتر <
كوچكتر يا مساوي <=
عملگر شرطی
Pr.rashidi@gmail.com 152
مثال : 1
;int x=10,y=20,b
; b=(x>y) ? x : y
اين دو دستور العمل باعث ميشوند كه ماكزيمم مقادير yو xدر bقرار بگيرد.
مثال : 2
; "x>=10 ? cout << "passed" : cout << "failed
Pr.rashidi@gmail.com 153
IF دستورالعمل شرطي
Pr.rashidi@gmail.com 154
1 مثال:
if(x != y)
{
cout << x ;
++ x ;
}
else
{
cout << y ;
--y;
}
Pr.rashidi@gmail.com 155
:مثال 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
}
Pr.rashidi@gmail.com 156
عملگر كاما
تع\دادي عب\ارت را ميت\وان ب\ا كام\ا بهم متص\ل نم\ود و
تش\\\كيل يك عب\\\ارت پيچي\\\دهتري را داد .اين عبارته\\\ا ب\ه
ت\\رتيب از چپ ب\\ه راس\\ت ارزيابي ش\\ده و مق\\دار عب\\ارت
معادل عبارت nميباشد.
Pr.rashidi@gmail.com 157
مثال :
; int a=2 , b=4 , c=5عبارت زير را در نظر بگيريد: اگر داشته باشيم
Pr.rashidi@gmail.com 158
عملگرهای منطقی
با استفاده از عملگرهاي منطقي ميتوان شرطهاي تركيبي در برنام ه ايجاد نمود .عملگرهاي
منطقي عبارتست از :
AND
OR
NOT
كه در ++Cبه ترتيب بصورت زير نشان داده ميشود.
&&
||
!
Pr.rashidi@gmail.com 159
جدول درستی سه عملگر شرطی
a b a || b
true true True
true false True
false true True
false false False
a b a && b
true true True
true false False
false true False
false false False
a !a
true False
false True
چند مثال :
))if ((x= = 5) ||(y != 0
; cout << x << endl
اگر xبرابر با 5يا yمخالف صفر باشد مقدار xنمايش داده شود .
(if
)x
x
;=0
اگر مقدار xمخالف صفر باشد ،آنگاه xبرابر با صفر شود .
Pr.rashidi@gmail.com 161
برنامه زير طول سه پارهخط را از ورودي گرفته مشخص مينمايد كه آيا تشكيل يك مثلث ميدهد يا خير؟
Pr.rashidi@gmail.com 162
دستورالعمل For
از دستور العمل forبراي تكرار دستورالعملها استفاده ميشود .شكل كلي دستور for
بصورت زير ميباشد:
(عبارت ; 3عبارت ; 2عبارت for )1
{
; دستورالعمل 1
; دستورالعمل 2
.
.
.
; دستورالعمل n
}
Pr.rashidi@gmail.com 163
. را از ورودي گرفته فاكتوريل آنرا محاسبه ونمايش ميدهد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 ;
}
Pr.rashidi@gmail.com 164
. را محاسبه نموده و نمايش ميدهدn تا1 برنامه زير مجموع اعداد صحيح و متوالي بين
#include <iostream.h>
int main( )
{
int n, i=1 ;
long s = 0 ;
cin >> n ;
for(; i<=n; i++)
s += i;
cout << s ;
return 0 ;
}
Pr.rashidi@gmail.com 165
. را نمايش ميدهد9 تا0 برنامه زير ارقام
#include <iostream.h>
int main( )
{
int j=0 ;
for( ; j <= 9 ; )
cout << j++ << endl;
return 0 ;
}
Pr.rashidi@gmail.com 166
. ايجاد ميشوند را نمايش ميدهد3 ، 2 ، 1 برنامه زير كليه اعداد سه رقمي كه با ارقام
#include <iostream.h>
int main( )
{
int i,j,k,n;
Pr.rashidi@gmail.com 167
تکالیف
Pr.rashidi@gmail.com 168
) (h:m:sساخت يک ساعت کامپيوتري
الگوريتم:
s=0، m=0،h=0 ، d=0، mon=0، y=0 .1
.2نمايش زمان
s=s+1 .3
.4اگر s=60آنگاه s=0و ++m
.5اگر m=60آنگاه m=0و ++h
.6اگر h=24آنگاه h=0و ++d
.7اگر d=31انگاه d=0و ++mon
.8اگر mon=12انگاه mon=0و ++y
.9يک ثانيه انتظار(از تابع ) Sleep(1000واقع در هدر فایل
>include <windows.h#استفاده نماید)
.10انجام 2تا 9به تعداد بي نهايت
Pr.rashidi@gmail.com 169
برنامه :2برنامه محاسبه گر تعطیالت سال 88و به بعد
الگوریتم برنامه .1
تعداد روزهای تعطیلی سال 88را به صورت پیش فرض .2
تعیین نماید.
تا جایی که تعداد روزهای تعطیلی خاتمه نیافته است( .از یک .3
شروع نماید تا جایی که به تعداد روزهای می رسید).
برای هر روز شماره آنروز تعطیل +شرح آن +نوع آن (s، .4
) gرا از ورودی دریافت نماید)
روزهای تعطیل سال 88را به ترتیب در خروجی چاپ نماید. .5
فرمت خروجی ()day-description-type .1
.6برای سال بعد نیز تعطیالت را محاسبه و چاپ نماید.
(توجه داشته باشید که تعطیالت سال قمری هر سال 10روز جلوتر می .1
آیند).
نماید. .7 170مرحله 6را تا سال 1404تکرار
Pr.rashidi@gmail.com
راهنمایی ( تمرین ) 2
• روش 1
– به ازای تمام روزهای تعطیالت متغیرهای جداگانه برای شماره روز
تعریف نماید.
– به ازای تمام روزهای تعطیالت متغیرهای جداگانه برای شرح روز
تعریف نماید.
– به ازای تمام روزهای تعطیالت متغیرهای جداگانه برای نوع تعریف
نماید.
• روش 2
– برای شماره روزهای تعطیل یک آرایه از نوع صحیح تعریف نماید
– برای شرح روزهای تعطیل یک آرایه از نوع رشته تعریف نماید
– برای نوع روزهای تعطیل یک آرایه از نوع صحیح تعریف نماید
Pr.rashidi@gmail.com 171
تمرین ( 3مثال های کتاب)
Pr.rashidi@gmail.com 172
فصل سوم
whileدستورالعمل .1
do whileدستورالعمل .2
breakدستورالعمل .3
continueدستورالعمل .4
switchدستورالعمل .5
)( cin.getتابع .6
)(>< static_castعملگر .7
جدول اولویت عملگرها .8
دستورالعمل while
از اين دستور العمل مانند دستورالعمل forبراي تكرار يك دستورالعمل ساده يا تركيبي استفاده
ميگردد .شكل كلي اين دستور العمل بصورت زير ميباشد.
)شرط (while
}
; دستورالعمل 1
; دستورالعمل 2
.
.
; دستورالعمل n
}
Pr.rashidi@gmail.com 175
تفاوت دستورهای whileو for
Pr.rashidi@gmail.com 176
مثال :
int x=0
)while(x<5
;cout << x ++<< endl
0
1
2
3
4
Pr.rashidi@gmail.com 177
قرار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 ;
}
Pr.rashidi@gmail.com 178
دستورالعمل do while
اين دسxتور العمxل نxيز بxراي تكxرار يك دسxتورالعمل
سxxاده يا تركيبي اسxxتفاده ميشxxود .شxxكل كلي اين
دستورالعمل بصورت زير ميباشد.
do
}
; دستورالعمل 1
; دستورالعمل 2
.
.
; دستورالعمل n
;)شرط (} while
Pr.rashidi@gmail.com 179
تفاوت دستورهای do whileو while
Pr.rashidi@gmail.com 180
: مثال
#include <iostream.h>
int main( )
{
int count = 0;
do
{
cout << count ++<<endl ;
}while(count <= 9);
return 0 ;
}
Pr.rashidi@gmail.com 181
دستورالعمل break
اين دستورالعمل باعث توقف دستورالعملهاي تكرار( )for , while ,do whileشده و
كنترل به خارج از اين دستورالعملها منتقل مينمايد.
Pr.rashidi@gmail.com 182
#include <iostream.h> : 1 مثال
int main( )
{
float x, s=0.0 ;
cin >> x ;
while(x <= 1000.0)
{
if(x < 0.0)
{
cout << "Error-Negative Value" ;
break;
}
s += x ;
cin >> x ;
}
cout << s << endl ;
return 0 ;
}
Pr.rashidi@gmail.com 183
:2 مثال
#include <iostream.h>
int main( )
{
int count = 0 ;
while( 1 )
{
count ++ ;
if(count > 10 )
break ;
}
cout << "counter : " << count << "\n";
return 0 ;
}
Pr.rashidi@gmail.com 184
#include <iostream.h>
void main( ) :3 مثال
{
int count;
float x, sum = 0;
cin >> x ;
for(count = 1; x < 1000 . 0; ++ count )
{
Pr.rashidi@gmail.com 185
#include <iostream.h>
int main( ) :4 مثال
{
float x , sum = 0.0 ;
do
{
cin >> x ;
if(x < 0.0)
{
cout << "Error – Negative Value" << endl ;
break ;
}
sum += x ;
} while(x <= 1000.0);
cout << sum << endl ;
return 0 ;
}
Pr.rashidi@gmail.com 186
دستورالعمل continue
از دس\تورالعمل continueميت\وان در دس\تورالعملهاي تك\رار
do while ، while ، forاس\\تفاده نم\\ود .اين دس\\تورالعمل
باعث ميشود كه كنترل بابتداي دستورالعملهاي تكرار منتقل گردد.
Pr.rashidi@gmail.com 187
:1 مثال
#include <iostream.h>
int main( )
{
float x, sum = 0.0 ;
Do
{
cin >> x ;
if(x < 0 . 0)
{
cout << "Error" << endl ;
continue ;
}
sum += x ;
} while(x <= 1000.0 );
cout << sum ;
return 0 ;
}
Pr.rashidi@gmail.com 188
:2 مثال
#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 ;
}
Pr.rashidi@gmail.com 189
دستورالعمل switch
هم\انطور ک\ه می دانید از دس\تورالعمل ش\رطی( )if elseمی ت\وان بص\ورت تودرت\و
اس\تفاده نم\ود ولي از ط\رفي اگ\ر عم\ق اس\تفادة ت\و در ت\و از اين دس\تورالعمل زياد
گ\ردد ،درك آنه\ا مش\كل ميش\ود .ب\راي ح\ل اين مش\كل ، ++Cدس\تورالعمل switch
كه عمًال يك دستورالعمل چند انتخابي ميباشد را ارائه نموده است.
Pr.rashidi@gmail.com 190
Switch شکل کلی دستور العمل
switch()عبارت
{
case valueone :
statement;
break;
case valuetwo:
statement;
break;
case valuen :
statement;
break;
default: statement ;
}
Pr.rashidi@gmail.com 191
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 ;
break;
default :
cout << "default" << endl;
} / * end of switch statement * /
}
Pr.rashidi@gmail.com 192
: 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 ;
break;
default:
cout << "Greater Than Three" << endl;
}
}
Pr.rashidi@gmail.com 193
تابع : )(cin.get
Pr.rashidi@gmail.com 194
قطعه برنامه ذيل يك كركتر را از صفحه كليد گرفته و نمايش ميدهد.
;char x
;) (x = cin.get
; cout << x
Pr.rashidi@gmail.com 195
برنامة ذيل يك سطر متن انگليسي كه به CTRL Zختم ميشود را گرفته دقيقاً نمايش ميدهد.
#include ><iostream.h
) (int main
{
;char x
)while((x = cin.get( ) !=EOF
; cout << x
; return 0
}
Pr.rashidi@gmail.com 196
. استفاده شده است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 ;
cas e y:
case Y :
cout << YELLOW << endl;
}
Pr.rashidi@gmail.com 197
.) آنرا حذف نموده و نمايش ميدهدblank( برنامة ذيل يك سطر متن انگليسي را گرفته كركترهاي خالي
#include <iostream.h>
int main( )
{
char next;
while((next = cin.get( ) ) !=EOF)
if(next != )
cout << next ;
return 0 ;
}
Pr.rashidi@gmail.com 198
عملگر static_cast
از اين عملگر براي تبديل موقت يك نوع dataبه نوع ديگر
استفاده ميشود .اين عملگر يك عملگر يكتائي ميباشد.
Pr.rashidi@gmail.com 199
:مثال 1
int
int xx==25;;25
float
;;float yy
yy==static_cast
static_cast
<<float
)float>(x
;;)>(x
Pr.rashidi@gmail.com 200
2 مثال:
float
floatxx==14.75
14.75;;
cout
cout<<<<
static_cast
static_cast<<int
int
>(x)
>(x)<<
<<endl;
endl;
cout
cout<<<<xx;;
Pr.rashidi@gmail.com 201
جدول اولویت عملگرها
Pr.rashidi@gmail.com 202
کوئیز 1
Pr.rashidi@gmail.com 204
فصل چهارم
اعداد تصادفی
فهرست مطالب فصل چهارم
مق\ادير تص\ادفي يا شانس\ي در اك\ثر برنامهه\اي ك\اربردي در زمين\ه ش\بيه س\ازي و بازيه\اي
ك\\امپيوتري نقش مهمي را ايف\\ا مينماين\\د .ب\\راي ايج\\اد يك ع\\دد تص\\ادفي ص\\حيح بين 0و 32767
بايستي از تابع ) (randاستفاده نمائيم.
Pr.rashidi@gmail.com 207
. را ايجاد مينمايد32767 و0 عدد تصادفي بين10 برنامه زير
#include <stdlib.h>
#include < iostream.h>
int main( )
{
for(int j=1; j<=10; ++j)
cout << rand( ) << \n ;
return 0 ;
}
Pr.rashidi@gmail.com 208
نکته :
اگر برنامة فوق را چندبار اجرا نمائيم جواب يكساني را از كامپيوتريمی گيريم.
براي تصادفي كردن اعداد ميبايستي از تابع ) (srandاستفاده نمائيم.
اين تابع به يك آرگومان صحيح از نوع unsignedنياز دارد.
به اين آرگومان seedگفته ميشود.
Pr.rashidi@gmail.com 209
) ) (srand ( . را ايجاد مينمايد32767 و0 عدد تصادفي بين10 برنامه زير
#include <stdlib.h>
#include < iostream.h>
int main( )
{
unsigned seed;
cout << "Enter seed value : " ;
cin >> seed ;
srand(seed);
for(int j=1; j<=10; ++j)
cout << rand( ) << \n ;
return 0 ;
}
Pr.rashidi@gmail.com 210
.برنامه زير نتيجه پرتاب دو تاس را نمايش ميدهد
Pr.rashidi@gmail.com 211
. را نمايش ميدهد1 و0 اعداد شانسي بين10 برنامه زير
#include <stdlib.h>
#include < iostream.h>
int main( )
{
unsigned seed ;
cout << "Enter seed: " ;
cin >> seed ;
srand(seed) ;
for(int i=1; i<=10; ++i)
cout << rand( ) / 32768.0 << endl ;
return 0 ;
}
Pr.rashidi@gmail.com 212
تعريف نوع داده ()typedef
از typedefميت\\وان ب\\راي تعريف ن\\وع دادهه\\اي جديد ك\\ه مع\\ادل ن\\وع
دادههاي موجود باشد استفاده نمود .شكل كلي عبارتست از :
Pr.rashidi@gmail.com 213
: مثال
Pr.rashidi@gmail.com 214
دادههاي از نوع شمارشي
Pr.rashidi@gmail.com 215
چند مثال:
0 3 4
Pr.rashidi@gmail.com 216
:توجه
Pr.rashidi@gmail.com 217
فرمتهای مختلفه مقادیر خروجی
Pr.rashidi@gmail.com 218
فصل پنجم
آرایه ها
فهرست مطالب فصل پنجم
Pr.rashidi@gmail.com 221
کاربرد آرایه ها
Pr.rashidi@gmail.com 222
]; int x[5
x
x
4 2 5 17 30
0 1 2 3 4
: دریافت مقادیر عناصر آرایه
;int x[5]
for(int i=0; i<=4; ++i)
; cin >> x[ i ]
Pr.rashidi@gmail.com 225
.اگر تعداد مقادير اوليه كمتر از تعداد عضوهاي آرايه باشد عضوهاي باقيمانده بطور اتوماتيك ،مقدار اوليه صفر ميگيرند
x
12 5 7 0 0
0 1 2 3 4
بايستي توجه داشت كه آرايهها به صورت ضمني مقدار اوليه صفر نميگيرند .برنامه نويس بايد به عضو اول آرايه،
مقدار اوليه صفر تخصيص دهد تا عضوهاي باقيمانده بطور اتوماتيك ،مقدار اوليه صفر بگيرند.
x
0 0 0 0 0
0 1 2 3 4
دستور زير يك آرايه يك بعدي شش عنصري از نوع floatايجاد مينمايد.
x
2.4 6.3 -17.1 14.2 5.9 16.5
0 1 2 3 4 5
عدد اعشاري و مثبت را گرفته تشكيل يك آرايه ميدهد سپس مجموع عناصر آرايه را مشخص نموده100 برنامه ذيل
.نمايش ميدهد
#include <iostream.h>
#include <iomanip.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++)
cout << setiosflags(ios::fixed ios :: showpoint ) << setw(12) <<
setprecision(2) << x[ j ] << endl;
for(j=0; j<arrsize; j++)
tot += x[ j ] ;
cout << tot ;
return 0 ;
}
Pr.rashidi@gmail.com 229
عدد اعشاري را گرفته تشكيل يك آرايه داده سپس كوچكترين عنصر آرايه را مشخص و20 برنامه ذيل
.نمايش ميدهد
#include <iostream.h>
#include <conio.h>
int main( )
{
float x[20], s;
int j ;
clrscr( ) ;
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;
}
Pr.rashidi@gmail.com 230
. عدد اعشاري را گرفته بروش تعویضی بصورت صعودي مرتب مينمايد100
برنامه زير
#include <iostream.h>
#include <conio.h>
int main ( )
{
float x[100] , temp;
int i,j ;
clrscr( );
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 ;
}
Pr.rashidi@gmail.com 231
تمرین برنامه نویسی ()4
Pr.rashidi@gmail.com 232
آرايههاي دوبعدي (ماتريسها)
ماتريسها بوسيله آرايههاي دوبعدي در كامپيوترنمايش داده ميشوند.
;]int a[3][4
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
#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++)
tot + = x [ i ][ j ];
cout << "total = " << total << endl;
return 0 ;
}
Pr.rashidi@gmail.com 238
مثال کالسی
Pr.rashidi@gmail.com 239
تمرین برنامه نویسی()5
توابع
فهرست مطالب فصل ششم
Pr.rashidi@gmail.com 243
نوع مقدار برگشتي
شكل كلي توابع بصورت زير ميباشند :
لیست پارامتر ها جهت انتقال اطالعات از تابع احضار كننده به تابع فراخوانده شده
نام تابع
}
Pr.rashidi@gmail.com 244
.تابع زير يك حرف كوچك را به بزرگ تبديل مينمايد
Pr.rashidi@gmail.com 245
.برنامه کامل که از تابع قبل جهت تبدیل يك حرف كوچك به بزرگ استفاده مينمايد
#include <iostream.h>
char low_to_up(char c1)
{ x
char c2;
c2=(c1 >= a && c1 <= z )?( A +c1 - a ) :
‘d’
c1;
return c2;
}
int main( )
{
char x;
c1
x=cin.get( ); ‘d’
cout << low_to_up(x) ;
return 0;
}
c2
‘D’
آرگومان
. دو مقدار صحيح را گرفته بزرگترين آنها را برميگرداندmaximum تابع
Pr.rashidi@gmail.com 247
. جهت یافتن ماکزیمم دو مقدار صحيح استفاده می نمایدmaximum برنامه کامل که از تابع
#include <iostream.h>
int maximum(int x , int y)
{ a b
int z ; 10 15
z=(x > y)? x : y ;
return z;
}
int main( ) x y
{
int a, b ; 10 15
cin >> a >> b ;
cout << maximum(a,b);
return 0;
}
z
15
maximum آرگومانهای تابعa, b
فعالیت کالسی :
Pr.rashidi@gmail.com 250
برنامه زير يك مقدار مثبت را گرفته فاكتوريل آنرا محاسيه نموده نمايش ميدهد.
x!=1*2*3*4*…*(x-1)*x
#include <iostream.h>
long int factorial(int n)
main درn
{ 3
long int prod=1;
if(n>1)
for(int i=2; i<=n; ++i)
prod *=i;
return(prod); factorial درn
}
int main( ) 3
{
int n;
cin >> n ; factorial درi
cout << factorial(n) ;
return 0 ; 2,3,4
}
factorial درprod
6
وقتي در تابعي ،تابع ديگر احضار ميگردد
بايستي تعريف تابع احضار شونده قبل از تعريف
.تابع احضار كننده در برنامه ظاهر گردد
Pr.rashidi@gmail.com 252
اگ\ر بخ\واهیم در برنامهه\ا ابت\دا ت\ابع mainظ\اهر
گ\ردد بايس\تي prototypeت\ابع يع\ني پيش نمون\ة
ت\ابع ك\ه ش\امل ن\ام ت\ابع ،ن\وع مق\دار برگش\تي ت\ابع،
تع\داد پارامتره\ائي را ك\ه ت\ابع انتظ\ار دريافت آن\را
دارد و ان\\واع پارامتره\\ا و ت\\رتيب قرارگ\\رفتن اين
پارامترها را به اطالع كامپيلر برساند.
Pr.rashidi@gmail.com 253
#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);
}
Pr.rashidi@gmail.com 254
در ص\\ورتي ك\\ه ت\\ابع مق\\داري ب\\ر نگردان\\د ن\\وع
مق\\دار برگش\\تي ت\\ابع را voidاعالن ميك\\نيم .و
در ص\ورتيكه ت\ابع مق\داري را دريافت نكن\د بج\اي
parameter- listاز voidيا ( ) اس\\\\تفاده
ميگردد.
Pr.rashidi@gmail.com 255
#include <iostream.h>
#include <conio.h>
void maximum(int , int) ;
int main( )
{
int x, y;
clrscr( )
cin >> x >> y;
maximum(x,y);
return 0; .تابع مقداري بر نمی گرداند
}
void maximum(int x, int y)
{
int z ;
z=(x>=y) ? x : y ;
cout << "max value \n" << z<< endl;
return ;
}
Pr.rashidi@gmail.com 256
مطالب مهم
Pr.rashidi@gmail.com 257
) Call By Value ( احضار بوسیله مقدار
main درa
#include <iostream.h>
int modify(int) 20
int main( )
{
int a=20; modify درa
cout << a << endl;
modify(a) ; 20
cout << a << endl;
return 0 ;
} modify درa
int modify(int a)
{ 40
a *= 2;
cout << a << endl;
return ; : خروجی برنامه
} 20
40
20
احضار بوسیله مقدار ( ) Call By Value
main aدر
>#include <iostream.h
)int modify(int 20
) (int main
{
;int a=20 modify aدر
;cout << a << endl
; )modify(a 20
;cout << a << endl
; return 0
} modify aدر
)int modify(int a
{ 40
;a *= 2
;cout << a << endl
; return در این ن\وع احض\ار ت\ابع حافظهه\اي م\ورد اس\تفاده
} آرگومانه\\\\\\\\\\\\\\\\\\\\\\ا و پارامتره\\\\\\\\\\\\\\\\\\\\\\ا
از هم متمايزن\\د و هرگون\\ه تغي\\ير در پارامتره\\ا
باعـــث تغيـــر
در آرگومانهاي متناظر نميگردد.
هر زم\\ان ک\\ه ن\\وع مق\\دار برگش\\تي ت\\ابع int
ميباش\د ني\ازي ب\ه ذك\ر آن نیس\ت و همچ\نين ني\ازي
به تعريف پيش نمونه تابع نميباشد.
Pr.rashidi@gmail.com 260
تابع بازگشتي ()recursive functions
Pr.rashidi@gmail.com 261
نحوه محاسبه فاکتوریل از طریق تابع بازگشتی
n != 1*2*3*…*(n-1) *n
! f(n) = n
n!=(n-1)! *n
در اسالید بعد تابع بازگشتی مورد نظر پیاده سازی شده است.
Pr.rashidi@gmail.com 262
تابع بازگشتی محاسبه فاکتوریل
#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) ) ;
}
Pr.rashidi@gmail.com 263
نحوه محاسبه nامین مقدار دنباله فیبو ناچی از طریق تابع بازگشتی
در اسالید بعد تابع بازگشتی مورد نظر پیاده سازی شده است.
Pr.rashidi@gmail.com 264
.) را مشخص و نمايش ميدهد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 = = 1 || n= = 2)
return 1 ;
else
return(fib(n-1) + fib(n-2) ) ;
}
Pr.rashidi@gmail.com 265
.برنامه زير يك خط متن انگليسي را گرفته آنرا وارون نموده نمايش ميدهد
#include <iostream.h>
void reverse(void) ; // forward declaration
int main( )
{
reverse( ) ;
return 0 ;
}
void reverse(void)
// read a line of characters and reverse it
{
char c ;
if(( c=cin.get( )) != \n ) reverse( );
cout << c ;
return ;
}
Pr.rashidi@gmail.com 266
استفاده از آرايهها بعنوان پارامتر تابع مجاز است.
Pr.rashidi@gmail.com 267
. را بعنوان پارامتر ميگيردa آرايهmodify در برنامه زير تابع
#include <iostream.h>
void modify(int [ ] ); // forward declaration
int main( )
{
int a[5] ; خروجی:
for(int j=0; j<=4; ++j) 1
a[ j ] = j+1 ;
modify(a) ; 2
for(j=0; j<5; ++j) 3
cout << a[ j ] << endl ; 4
return 0 ;
}
5
void modify(int a[ ]) // function definition
{ 3
for(int j=0; j<5; ++j) 4
a[ j ] += 2 ;
for(j=0; j<5; ++j) 5
cout << a[ j ] << endl ; 6
return ; 7
}
Pr.rashidi@gmail.com 268
در ص\\ورتيكه آرايه بيش از يك بع\\د داش\\ته باش\\د
بع\دهاي دوم ب\ه بع\د بايس\تي در تعريف ت\ابع و پيش
نمونه تابع ذكر گردد.
Pr.rashidi@gmail.com 269
#include <iostream.h>
void printarr(int [ ][ 3 ]);
int main( )
{
int arrl [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);
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 ;
} : خروجی
}
1 2 3
4 5 6
1 2 3
4 5 0
1 2 0
4 0 0
توابع درون خطي ()inline
كلم\ه inlineب\دين مع\ني اس\ت ك\ه ب\ه ك\امپيلر دس\تور ميده\د ك\ه
يك ك\پي از دس\تورالعلمهاي ت\ابع در هم\ان ج\ا (در زم\ان مقتض\ي)
توليد نمايد تا از احضار تابع ممانعت بعمل آورد.
Pr.rashidi@gmail.com 271
اشکال توابع inline
بجاي داشتن تنها يك كپي از تابع ،چند كپي از دستورالعملهاي تابع در
برنامه اضافه ميشود كه باعث بزرگ شدن اندازه يا طول برنامه ميشود.
بنابراين از inlineبراي توابع كوچك استفاده ميگردد.
Pr.rashidi@gmail.com 272
مثالی از توابع درون خطی
#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 ;
}
Pr.rashidi@gmail.com 273
انتقال پارامترها از طريق ارجاع
تاكنون وقتي تابعي را احضار ميكرديم يك كپي از مقادير آرگومانها درپارامترهاي متناظر
قرار ميگرفت .این روش احضار بوسيله مقدار يا call by valueناميده شد.
در انتقال پارامترها از طريق ارجاع در حقيقت حافظه مربوط به آرگومانها و پارامترهاي متناظر
بصورت اشتراكي مورد استفاده قرار ميگيرد .اين روش call by reference
ناميده ميشود .
Pr.rashidi@gmail.com 274
انتقال پارامترها از طريق ارجاع
Pr.rashidi@gmail.com 275
#include <iostream.h>
int vfunct(int); // for
void rfunct (int &) ;
int main( ) : مثال
{ x y
int x=5, y=10; 5 10
cout << x << endl << vfunct(x) << endl << x <<
endl ; 5
cout << y << endl ; خروجی:
rfunct(y) ; 2
cout << y << endl ; . تغییر نمی کندx مقدار آرگومان 5
return 0 ; 5
} 1
int vfunct(int a) 0
{
return a *= a ;
} x y b
void rfunct(int &b)
{ 5 10 100
b *= b ;
}
: ادامه خروجی
100
نکته :
Pr.rashidi@gmail.com 277
. دو مقدار اعشاري را مبادله مينمايد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;
}
Pr.rashidi@gmail.com 278
كالسهاي حافظه ()storage classes
متغيرها بدو طريق متمايز مشخص ميشوند يكي بوسيله نوع ( )typeآنها و ديگري بوسيله
كالس حافظه آنها .نوع متغير قبًال اشاره شده بعنوان مثال . . . ، int ، float ، doubleولي
كالس حافظة يك متغير در مورد طول عمر و وسعت و دامنة متغير بحث مينمايد.
Pr.rashidi@gmail.com 279
بطور كلي كالس حافظه متغيرها به چهار دستة تقسيم ميگردد:
automatic .1
static .2
external .3
register .4
Pr.rashidi@gmail.com 280
متغيره\اي automaticدر درون يك ت\ابع تعريف ميش\وند و در ت\ابعي ك\ه اعالن
ميش\ود بص\ورت متغيره\اي محلي ب\راي آن ت\ابع ميباش\ند .حافظ\ه تخص\يص داده ش\ده
ب\ه متغيره\اي automaticپس از اتم\ام اج\راي ت\ابع از بين مي رود بعب\ارت ديگ\ر
وس\عت و دامن\ة متغيره\اي از ن\وع automaticت\ابعي ميباش\د ك\ه متغ\ير در آن
اعالن گرديده است.
Pr.rashidi@gmail.com 281
متغيرهاي staticنيز در درون توابع تعريف ميشوند و از نظر وسعت و دامنه شبيه
متغيرهاي automaticهستند ولي در خاتمة اجراي تابع ،حافظه وابسته به اين نوع
متغيرهـــا از بين نميرود بلكه براي فراخواني بعدي تابع باقي ميماند.
در اسالید بعد به یک مثال از کاربرد این نوع کالس حافظه می پردازیم.
Pr.rashidi@gmail.com 282
: مثال
#include <iostream.h>
// program to calculate successive fibonacci numbers
Pr.rashidi@gmail.com 283
متغيره\اي از ن\وع externalمتغيره\ائي هس\تند ك\ه در ب\يرون از تواب\ع اعالن
ميش\وند و وس\عت و دامن\ه فع\اليت آنه\ا كلي\ه ت\وابعي ميباش\د ك\ه در زير دس\تور اعالن
متغير قرار دارد.
در اسالید بعد به یک مثال از کاربرد این نوع کالس حافظه می پردازیم.
Pr.rashidi@gmail.com 284
#include <iostream.h> : مثال
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
} تخص\\يص ن\\دهيم مق\\دار ص\\فر
بص\ورت اتوماتي\ك ب\راي آنه\ا در
.نظر گرفته ميشود
Pr.rashidi@gmail.com 285
وق\تي متغ\يري از ن\وع registerاعالن ميش\ود از ك\امپيوتر عمًال درخواس\ت
ميشود كه به جاي حافظه از يكي از رجيسترهاي موجود استفاده نمايد.
Pr.rashidi@gmail.com 286
کاربرد کالس register
Pr.rashidi@gmail.com 287
سربارگذاري توابع ()function overloading
در ++Cاين امكان وجود دارد كه دريك برنامه بتوانيم از چند توابع هم نام
استفاده نمائيم مشروط بر اين كه پارامترهاي اين توابع متفاوت باشند( .از
نظر تعداد پارامتر و يا نوع پارامترها و ترتيب آنها)
Pr.rashidi@gmail.com 288
: مثال
#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 ;
}
Pr.rashidi@gmail.com 289
فصل هفتم
ساختارها .1
ها Union .2
) ( Pointerاشاره گرها .3
تعریف آرایه .4
آرایه های دو بعدی و اشاره گرها .5
) newتخصیص حافظه بصورت پویا ( عملگر .6
رشته ها و توابع مربوطه .7
Pr.rashidi@gmail.com 291
ساختارها
س\اختارها ش\بيه آراي هه\ا ب\وده ب\دين ص\ورت ك\ه يك ن\وع داده گ\روهي اس\ت ك\ه فض\اي
پيوس\ته از حافظ\ه اص\لي را اش\غال مينمايد .ام\ا عناص\ر س\اختار الزام\ًا از يك ن\وع
نميباش\ند بلك\ه اعض\اي يك س\اختار ميتوانن\د از نوعه\اي مختلف\ه از قبي\ل char ، int
… ، ، floatباشند.
Pr.rashidi@gmail.com 292
تعريف ساختار
نام ساختار
struct time
{ اعضا ساختار
int hour ; // 0 –
23
int minute ; // 0 –
59
int second; //
};
Pr.rashidi@gmail.com 293
مثال:
struct account {
int acc_no ;
char acc_type;
char name[80] ;
float balance ;
};
Pr.rashidi@gmail.com 294
: به دو صورت می توان اعالن یک متغیر از نوع ساختار را نمایش داد
روش اول:
struct account
{
int acc_no;
char acc_type;
char name[80];
float balance;
} cust1, cAust2, cust3; روش دوم:
struct account
{
int acc_no ;
char acc_type;
char name[80];
float balance;
};
account cust1, cust2, cust3;
Pr.rashidi@gmail.com 295
به ساختارها ميتوان مقدار اوليه نيز تخصيص داد
Pr.rashidi@gmail.com 296
دسترسي به عناصر يك ساختار
.
بمنظور دسترسي به عناصر يك ساختار از عملگر استفاده
.ميگردد .عملگر .جزء عملگرهاي يكتائي ميباشد
Pr.rashidi@gmail.com 297
: مثال
Pr.rashidi@gmail.com 298
نکته:
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
.مشخص ميگردد
Pr.rashidi@gmail.com 299
نکته:
.ميتوان آرايهاي تعريف نمود كه هر عضو آن يك ساختار باشد و حتي به آنها مقادير اوليه تخصيص نمود
struct struc1
{
char name[40];
int pay1;
int pay2;
};
strucl cust[ ]=
{
nader, 3000 , 40000,
sara, 4200, 6000,
susan, 3700, 25000,
saman, 4800 , 2000,
};
Pr.rashidi@gmail.com 300
دو عدد مختلط را ميگيرد و مجموع،برنامه زير هر عدد مختلط را بصورت يك ساختار در نظر گرفته
آنها را مشخص و نمايش ميدهد.
#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 ;
} x = a + ib i2= -1 بطوريكه
y = c + id
x+y =(a+c) + i(b+d)
Pr.rashidi@gmail.com 301
union
unionاز نظ\ر س\اختاري ش\بيه structميباش\د .ب\ا اين تف\اوت ك\ه عض\وهائي
ك\\\ه تش\\\كيل unionميده\\\د همگي از حافظ\\\ه مش\\\تركي در ك\\\امپيوتر اس\\\تفاده
مينمايند .بنابراين استفاده از unionباعث صرفهجوئي در حافظه ميگردد.
Pr.rashidi@gmail.com 302
مثال :
union id
{
;]char color [10
;int size
;} x , y
Pr.rashidi@gmail.com 303
: مثال
union xpq
{
int x ;
char y[2] ;
}p;
x
بايت دوم بايت اول
y[1] y[0]
Enum
Enum color
{
Red,
Green,
blue
};
اشارهگرها ()Pointers
ته\اي
دادهه\ائي ك\ه در ك\امپيوتر در حافظ\ه اص\لي ذخ\يره ميش\وند باي
متوالي از حافظه بسته به نوع dataاشغال ميكنند.
1
2
3
4
613
5
6
7
نکته :
در كامپيوتر آدرسها معموًال دو بايت اشغال مينمايند .اگر آدرس xرا در pxقرار دهيم آنگاه ميگوئيم كه pxبه x
اشاره مينمايد.
px x
آدرس متغير xرا بوسيله & xنشان ميدهيم و عملگر & را عملگر آدرس مينامند.
int x , *px
; px = &x
Pr.rashidi@gmail.com 308
:مثال
26
36
43
Pr.rashidi@gmail.com 309
آرایه یک بعدی و اشاره گرها
0 26.5 x
1 24.7
2 5.8
اولين عنصر آرايه بوسيله ] x[0مشخص ميشود.
3 -73.2
4 69.0
5 100.5 آدرس اولين عنصر آرايه بوسيله &] x[0يا بوسيله xمشخص ميشود.
6 -13.24
7 424.3
8 187.8
9 358.2 آدرس iامين عنصر آرايه بوسيله &] x[i-1يا بوسيله ) x(i-1مشخص ميشود.
Pr.rashidi@gmail.com 310
ساختارها و اشاره گرها
ميتوان اشارهگري را تعريف نمود كه به اولين بايت يك ساختار ( )structاشاره نمايد.
struct
struc1
{
int a
; px x
float a int
;b b float
c char
char d int
;c
int d
;
px =}&x ; ;
x, *px
];float x[5][4
;]float (*x)[4
Pr.rashidi@gmail.com 312
آرايههاي دوبعدي و اشارهگرها
;]float (*x)[4
#include <iostream.h>
#include <conio.h>
int main( )
{
int x[ ]={12, 25, 6, 19, 100};
clrs cr( );
int *px=x;
// اشاره به عنصر اول آرايه مينمايد،نام آرايه بدون انديس
for(int i=0; i<=4; i++)
cout << *(x+i) << endl;
Pr.rashidi@gmail.com 315
براي تخصيص حافظه باندازه 20مقدار از نوع intكه اشارهگر ptxبه آن اشاره نمايد بصورت زير عمل ميشود.
;int *ptx
];ptx = new int [20
Pr.rashidi@gmail.com 316
سپس آنرا مقدار داده و مجموع مقادير، عنصري از نوع اعشاري در حافظه ايجاد نموده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;
} Pr.rashidi@gmail.com 317
. عنصري از ساختار را ايجاد مينمايدn برنامه زير آرايههاي
#include <iostream.h>
#include <conio.h>
int main( )
{
struct rec
{
float a;
int b;
};
int n;
rec *ptr;
clrscr( );
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;
return 0 ;
}
Pr.rashidi@gmail.com 318
. جابهجا مينمايدswap برنامه زير دو مقدار اعشاري را گرفته مقادير آنها را بكمك تابع
#include <iostream.h>
#include <conio.h>
void swap(float *, float *);
int main( )
{
float a,b;
cin >> a >> b;
cout << a << endl << b << endl ;
return 0;
}
void swap(float *px , float *py)
{
float t;
t = *px;
*px = *py;
*py = t ;
return;
}
Pr.rashidi@gmail.com 319
رشتهها و توابع مربوطه
رشتهها در ، ++Cآرايهاي از كركترها ميباشند كه با كركتر \0ختم ميشوند.
s
a
r
a
\0
رشته و اشاره گر
هر رشته از طريق اشارهگري به اولين كركتر آن در دسترس قرار ميگيرد .آدرس يك رشته ،آدرس كركتر اول
آن ميباشد .به رشتهها ميتوان مقدار اوليه تخصيص داد.
Pr.rashidi@gmail.com 321
. رشته در نظر گرفته آنها را بترتيب حروف الفباء مرتب نموده نمايش ميدهد5 برنامه ذيل پنج اسم را بصورت
#include <iostream.h>
#include <string.h>
void sort(char *[ ]);
int main( )
{
char *name[5] = {sara, afsaneh, babak, saman, naser };
sort(name);// display sorted strings
for(int i=0; i<5; ++i)
cout << name[ i ] << endl;
return 0;
}
sort(char *name[ ])
{
char *t;
for(int i=0; i<4; ++i)
for(int j=i+1; j<5; ++j)
if(strcmpi(name[ i ], name[ j ]> 0)
{// interchange the two strings
t= name[ i ];
name[ j ] = name[ i ];
name[ i ] = t ;
}
return ;
}
Pr.rashidi@gmail.com 322
تابع )strcmpi(s1, s2
رش\تههاي s1و s2را ب\ا هم مقايس\ه نم\وده (ب\دون توج\ه ب\ه ح\روف كوچ\ك و ب\زرگ) اگ\ر رش\ته
s1براب\ر ب\ا رش\ته s2باش\د مق\دار ص\فر و اگ\ر رش\ته s1كوچك\تر از رش\ته s2باش\د يك مق\دار
منفي در غير اينصورت يك مقدار مثبت بر ميگرداند.
Pr.rashidi@gmail.com 323
تابع ) strcmp(s1, s2
رش\تههاي s1و s2را ب\ا هم مقايس\ه نم\وده اگ\ر s1براب\ر ب\ا s2باش\د مق\دار ص\فر و اگ\ر رش\ته
s1كوچك\تر از رش\ته s2باش\د يك مق\دار منفي در غ\ير اينص\ورت يك مق\دار مثبت برميگردان\د.
Pr.rashidi@gmail.com 324
تابع ) strncmp(s1, s2,n
حداكثر nكرك\تر از رش\تة s1را ب\ا nكرك\تر از رش\تة s2مقايس\ه نم\وده در ص\ورتيكه s1
كوچك\\تر از s2باش\\د يك مق\\دار منفي ،اگ\\ر s1مس\\اوي ب\\ا s2باش\\د مق\\دار ص\\فر در غ\\ير
اينصورت يك مقدار مثبت برميگرداند.
Pr.rashidi@gmail.com 325
تابع (strcat(s1, s2
دو رش\\تة s1و s2را بعن\\وان آرگوم\\ان گرفت\\ه رش\\تة s2را ب\\ه انته\\اي رش\\تة s1اض\\افه
مينمايد .كرك\تر اول رش\تة s2روي كرك\تر پاياني \0رش\تة s1نوش\ته ميش\ود ونهايت\ًا
رشتة s1را برميگرداند.
Pr.rashidi@gmail.com 326
تابع (strncat(s1, s2,n
دو رش\ته s1و s2ومق\دار ص\حيح و مثبت nرا بعن\وان آرگوم\ان گرفت\ه ،ح\داكثر nكرك\تر از
رش\تة s2را در انته\اي رش\تة s1ك\پي مينمايد .اولين كرك\تر رش\ته s2روي كرك\تر پاياني
\0رشتة s1مينويسد ونهايتًا مقدار رشتة s1را برميگرداند.
Pr.rashidi@gmail.com 327
تابع (strlen(s
Pr.rashidi@gmail.com 328
تابع (strlen(s
Pr.rashidi@gmail.com 329
تابع )strcpy(s1,s2
دو رشتة s1و s2را بعنوان آرگومان گرفته رشتة s2را در رشتة s1كپي مينمايد و
نهايتًا مقدار رشتة s1را بر ميگرداند.
Pr.rashidi@gmail.com 330
تابع (strncpy(s1, s2,n
دو رشتة s1 , s2و مقدار صحيح و مثبت nرا بعنوان آرگومان گرفته ،حداكثر nكركتر را
از رشتة s2در رشتة s1كپي نموده ،نهايتًا مقدار رشتة s1را برميگرداند.
Pr.rashidi@gmail.com 331
براي استفاده از توابع مربوط به
رشتهها بايستي حتمًا در ابتدا برنامه
>include <string.h#را قرار
دهيم.
Pr.rashidi@gmail.com 332
: مثال
#include <iostream.h>
#include <string.h>
#include <conio.h>
int main( )
{
char *s1= happy birthday;
char *s2= happy holidays ;
clrscr( );
cout << strcmp(s1, s2) << endl;
cout << strncmp(s1, s2, 7) << endl ;
return 0;
}
Pr.rashidi@gmail.com 333
: مثال
#include <iostream.h>
#include <string.h>
#include <conio.h>
int main( )
{
char *s = sara;
clrscr( );
cout << strlen(s);
return 0;
}
Pr.rashidi@gmail.com 334
. می باشدstrcmp تابع زیر معادل تابع کتابخانه
Pr.rashidi@gmail.com 335
فصل هشتم
Pr.rashidi@gmail.com 338
تعریف شی گرایی
Pr.rashidi@gmail.com 339
نکته مهم :
Pr.rashidi@gmail.com 340
محصورسازی () Encapsulation
محصورس\ازي مك\انيزمي اس\ت ك\ه codeو dataرا بهم وص\ل نم\وده و ه\ر دوي آنه\ا را از اس\تفادههاي
غيرمج\\از مص\\ون نگ\\ه ميدارد .ش\\ي يك مؤلف\\ه منطقي اس\\ت ك\\ه dataو codeرا محص\\ور نم\\وده و
codeباعث دستكاري و پردازش dataميشود.
Pr.rashidi@gmail.com 341
( polymorphismچند ريختي)
چند ريختي مشخصهاي است كه بيك وسيله امكان ميدهد كه باتعدادي از
.سيستمها يا عميات يا دستگاهها ،مورد استفاده قرار گيرد
Pr.rashidi@gmail.com 342
( inheritanceارث بري)
Pr.rashidi@gmail.com 343
پشته ()stack
پشته ساختاري است كه داراي خاصيت last in first outميباشد.
پشته فضاي پيوسته در حافظه اشغال مينمايد .عملياتي كــه روي پشته
انجام ميشوند عبارتند از :
Pr.rashidi@gmail.com 344
ايجاد شي ()object
Pr.rashidi@gmail.com 345
مثال :
#define SIZE 100 بدين مع\\\ني اس\\\ت ك\ه stckو tos
// this creates the class stack. بوس\يله ت\وابعي ك\ه عض\و object
class stack نباش\ند غ\ير قاب\ل دسترس\ي هس\تند .و
{ اين يكي از روشه\\\\\اي محص\\\\\ور
سازي اقالم دادههاست.
private :
;]int stck[SIZE
;int tos
Public:
بدين مع\\ني اس\\ت ك\\ه بوس\يله س\\اير
;) (void init
قطع\\\ات برنام\\\\ه قاب\\\ل دسترس\\\ي
;)void push(int i ميباشد.
;) (int pop
;}
Pr.rashidi@gmail.com 346
نکته :
Pr.rashidi@gmail.com 347
نحوه تعریف تابع عضو یک کالس
void stack : : push(int i)
{
{ if(tos = = SIZE )
;cout << stack is full.
;return
}
; stck[tos]= i
; ++ tos
}
عملگ\ر: : عملگ\ر. ميباش\دobject مش\خص مينمايد ك\ه ت\ابع متعل\ق ب\ه ك\دام: :عملگ\ر
. ناميده ميشودscope resolution
Pr.rashidi@gmail.com 348
: stack برنامه کامل
>include <iostream.h#
define SIZE 100# int stack : : pop( )
.this creates the class stack // {
{ class stack if(tos = = 0) {
;int stck[SIZE] cout << stack underflow. ;
;int tos return 0 ; }
:public tos - - ;
;void init(int i) return stck[tos];
;) (int pop }
;void push(int i)
;} int main( )
) (void stack : : init {
{ stack st1, st2; // create two objects
; tos = 0 st1. init( );
} st2.init( );
void stack : : push(int i) st1.push(1);
{ st2.push(2);
{ if(tos = = size) st1.push(3);
; cout << stack is full. st2.push(4);
; return cout << st1.pop( ) << endl;
} cout << st1.pop( ) << endl;
; stck[tos] = i cout << st2. pop( ) << endl;
; ++ tos cout << st2. pop( ) << endl;
} return 0; }
Pr.rashidi@gmail.com 349
ارث بری
Pr.rashidi@gmail.com 350
مثال:
class building {
int rooms; تعريف گرديدهbuilding اي بن\ام س\اختمان ياobject در روب\رو
int floors; تع\دادي طبق\ه و س\طح زير بن\ا، ه\ر س\اختمان داراي تع\دادي اط\اق.اس\ت
int area; : از طرف ديگرتوابعي كه براي شي تعريف شده.نيز ميباشد
public:
void set_rooms(int num);
int get_rooms( );
void set_floors(int num);
int get_floors( );
void set_area(int num);
int get_area( );
};
تعريف مينم\\ائيم ك\\ه ن\\ه تنه\\اhouse ديگ\\ري بن\\امobject حال
ميباش\\د بلك\\ه دارای دو اقالمbuilding داراي تم\\ام اعض\\اي ش\\ي
house دراينج\ا عمًال ش\ي.داده اض\افي و چه\ار ت\ابع اض\افي ميباش\د
// house is derived from building : ارث ميبردbuilding از شي
class house : public building {
int bedrooms;
int baths;
public:
void set_bedrooms(int num);
int get_bedrooms( );
void set_baths(int num);
int get_baths( );
};
Pr.rashidi@gmail.com 351
: نکته
ش\ي. می نامن\دderived class راhouse وbase class راbuilding در مث\ال قب\ل
را دارا اس\\ت بعالوه اينك\\ه داراي متغيره\\اي عض\\وي اض\\افيbuilding تم\\ام اعض\\ايhouse
set_baths()، set_bebrooms()، و همچ\\\نين تواب\\\ع عض\\\ويbedrooms ، baths
. .()نيز ميباشدget_baths()، get_bedrooms
Pr.rashidi@gmail.com 352
سازندهها و نابودكنندهها ()constructors and destructors
يا مق\دار اولي\ه دادن بص\ورت اتوماتي\ك از طريق ت\ابعي انج\ام ميش\ود Initialization
بن\ام ت\ابع constructorيا ت\ابع س\ازنده .ت\ابع س\ازنده ت\ابع مخصوص\ي اس\ت ك\ه عض\وي
از كالس بوده و همنام با كالس ميباشد.
Pr.rashidi@gmail.com 353
سازندهها و نابودكنندهها ()constructors and destructors
Pr.rashidi@gmail.com 354
توابع دوست ()friend functions
ب\ا اس\تفاده از كلم\ة friendاين امك\ان وج\ود دارد ك\ه ب\ه ت\ابعي ك\ه عض\و كالس
نميباش\د اج\ازه دسترس\ي ب\ه متغيره\اي privateكالس را داد .ب\راي آنك\ه ت\ابعي
را دوست اعالن نمائيم از كلمه friendقبل از تعريف تابع استفاده مينمائيم.
Pr.rashidi@gmail.com 355
#include <iostream.h>
: مثال
#include <conio.h>
class myclass
{
int a,b;
public :
friend int sum(myclass x);
void set_ab(int i, int j);
};
void myclass :: set_ab(int i, int j)
{
a=i;
b=j;
}
//sum is not a member function
int sum(myclass x)
{
return s.a + x.b;
}
int main( )
{
myclass n;
clrscr( );
n. set_ab(5,8);
cout << sum(n);
return 0 ;
}
Pr.rashidi@gmail.com 356
نکته :
Pr.rashidi@gmail.com 357
كالسهاي دوست ()friend classes
اين امكان وجود دارد كه يك كالس دوست كالس ديگري باشد .در چنين وضعيتي تابع دوست به كليه
اسامي privateتعريف شده در كالس ديگر دسترسي دارد.
Pr.rashidi@gmail.com 358
#include <iostream.h>
class coins : مثال
{
enum units{
penny,
nickel,
dime,
quarter,
half_ dollar
};
friend class amount;
};
class amount {
coins :: units money;
public:
void setm( );
int getm( );
} ob;
void amount :: setm( )
{
money = coins :: dime;
}
int amount :: getm( )
{
return money;
}
int main( )
{
ob.setm( );
cout << ob.getm( );
return 0 ; } Pr.rashidi@gmail.com 359
توابع سازنده پارامتردار
امك\ان انتق\ال آرگومانه\ا ب\ه تواب\ع س\ازنده وج\ود دارد .معم\وًال از اين
آرگومانه\\ا ب\\راي initializeنم\\ودن ش\\ي در زم\\ان ايج\\اد آن اس\\تفاده
ميگردد.
Pr.rashidi@gmail.com 360
: مثال
>include <iostream.h#
>include <conio.h#
class myclass
{
;int x, y
: public
myclass(int i, int j) {x = i; y=j; }
void show( ) {cout << x << endl << y; }
;}
) (int main
{
;myclass obj( 3 , 5)
;) (clrscr
;) (obj.show
;return 0
}
Pr.rashidi@gmail.com 361
توابع سازنده يك پارامتري
#include <iostream.h>
#include <conio.h>
class myclass
{
int x;
public:
myclass(int i) {x=i;}
int getx( ) {return x;}
};
int main( )
{
clrscr( );
myclass obj=126; // منتقل كنi 126 را به
cout << obj.getx( );
return 0 ;
}
Pr.rashidi@gmail.com 362
عضوهاي static
اگر عضو دادهاي بصورت staticاعالن گردد اين بدين معني است كه
كامپيلر فقط يك كپي از متغير مذكور را نگهداري نموده و تمام objectها
بايستي بصورت اشتراكي از آن كپي استفاده نمايند .براي اينكار ميبايستي از
كلمه staticقبل از اعالن عضو استفاده نمود.
Pr.rashidi@gmail.com 363
مثال:
#include <iostream.h>
class shared{
static int a;
int b;
public :
void set(int i, int j) {a=i; b=j; }
void show( );
};
int shared :: a ; // define a
void shared :: show( )
{
cout << static a: << a << endl;
cout << nonstatic b: << b << endl;
}
int main( )
{
shared x,y;
x.set(1,1); // set a to 1
x.show( );
y.set(4,4); // change a to 4
y.show( );
x.show( );
return 0;
}
Pr.rashidi@gmail.com 364
( nested classesكالسهاي تودرتو)
Pr.rashidi@gmail.com 365
( local classesكالسهاي محلي)
Pr.rashidi@gmail.com 366
در مورد كالسهاي محلي رعايت نكات زير ضروري است :
Pr.rashidi@gmail.com 367
ها بعنوان پارامترهاي توابع استفاده از object
از objectها ميتوان بعنوان پارامترهاي توابع استفاده نمود و مكانيز م انتقال آرگومانها و پارامترها بصورت
call by valueميباشد.
Pr.rashidi@gmail.com 368
برگشت اشياء ()returning objects
Pr.rashidi@gmail.com 369
مثال:
#include <iostream.h>
class myclass
{
int i ;
public :
void set_ i(int n)
{
i=n;
}
int get_i( ) {return i;}
};
myclass funct( ); // return an object
int main( )
{
myclass ob;
ob=funct( );
cout << ob.get_i( ) << endl;
return 0;
}
myclass funct( )
{
myclass x ;
x.set_i(1);
return x;
}
Pr.rashidi@gmail.com 370
انتساب اشياء ()object assignment
Pr.rashidi@gmail.com 371
: مثال
#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 ;
}
Pr.rashidi@gmail.com 372
آرايه اشياء ()array of objects
Pr.rashidi@gmail.com 373
مثال:
#include <iostream.h>
#include <conio.h>
class myclass
{
int i;
public:
void set_i(int j) {i=j;}
int get_i( ) {return i;}
};
int main( )
{
clrscr( );
myclass ob[3];
int i;
for(i=0; i<3; i++) ob[ i ].set_i(i+1);
for(i=0; i<3; i++)
cout << ob[ i ].get_i( ) << endl;
return 0;
}
Pr.rashidi@gmail.com 374
اشارهگر به اشياء () pointers to objects
Pr.rashidi@gmail.com 375
: مثال
#include <iostream.h>
#include <conio.h>
class myclass
{
int i ;
public:
myclass( ) {i=0;}
myclass(int j) {i=j;}
int get_i( ) {return i;}
};
int main( )
{
myclass ob[3]= {1, 2, 3};
myclass *p;
int i;
p=ob; // get start of array
for(i=0; i<3; i++)
{
cout << p get_i( ) << endl;
p++; // point to next object
}
return 0;
}
Pr.rashidi@gmail.com 376
اشارهگر )this (this pointer
Pr.rashidi@gmail.com 377
#include <iostream.h> : مثال
class pwr
{
double b;
int e;
double val;
public:
pwr(double base, int exp);
double get_pwr( ) {return val;}
};
pwr :: pwr(double base, int exp)
{
this b=base;
this e=exp;
this val =1;
if(exp = = 0) return;
for(; exp > 0 ; exp )
this val = this val *this b;
}
int main( )
{
pwr x(4.0, 2) , y(2.5, 1), z(5.7,0);
cout << x.get_pwr( ) << ;
cout << y.get_pwr( ) << ;
cout << z.get_pwr( ) << \n ;
return 0;
}
Pr.rashidi@gmail.com 378
توابع مجازي و پلي مرفيسم ()virtual functions
Pr.rashidi@gmail.com 379
#include <iostream.h>
class base
: مثال
{
public :
virtual void vfunc( ){cout << this is base s vfunc( ) \n ;}
};
class derived1 : public base {
public:
void vfunc( ) {cout << this is derived1 s vfunc( ) " << endl ; }
};
class derived2: public derived1 {
public:
/*vfunc( ) not overridden by derived2.In this case, since derived2 is
derived from derived1, derived1 s vfunc( ) is used */ } ;
int main( )
{
base *p, b;
derived1 d1;
derived2 d2;
//point to base
p = &b;
p vfunc( ); // access base's vfunc
// point to derived1
p=&d1;
p vfunc( ); //access derived1's vfunc( )
//point to derived2
p = &d2;
p vfunc( ); // use derived1 s vfunc( )
return 0 ;
} Pr.rashidi@gmail.com 380
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