Information Technology
Download
Report
Transcript Information Technology
برنامه سازی پیشرفته
ارائه دهنده
دکتر سید امین حسیني
E.mail: [email protected]
Home page: http://hosseini.staffcms.um.ac.ir
ارزشیابی
کار کالسی شامل تمرین ،پروژه های برنامه نویسی و
نمره
10
فعالیت کالسی
4
امتحان میان ترم
نمره
8
امتحان پایان ترم
نمره
هفته اول
اصول و مباني شبکهها
3
مهر 85
فهرست مطالب
شكلهاي بكارگیري كامپیوتر
شبكه هاي كامپیوتري ،مزایا – معایب
انواع شبکه
مقدمه
در اوايل دهه 1970ميالدی ،زبان ، Cتوسط دنيس ريچي و به عنوان زبان برنامهنويس ي سيستم
ها طراحي شد.
اين زبان از دو زبان قديمي تر بنامهاي BCPLو Bحاصل شده است.
زبان Cتا سال 1978منحصر به استفاده در البراتوار كمپاني BELLبود تا اينکه
توسط دو تن بنامهای ريچی و کرنيه نسخه نهايي اين زبان منتشر شد
5
مقدمه – فازهای تولید و اجرای برنامه های
–C++
فاز 1
برنامه ها در ویرایشگر نوشته شده و در دیسک دخیره می شوند
فاز -2پیش چردازنده دستورات را پردازش می کند
فاز – 3کامپایلر کد مقصد را ایجاد می کند و آن را در دیسک ذخیره می کند
فاز – 4پیوند دهنده کد مقصد را به کتابخانه پیوند می دهد و یک فایل قابل اجرا
ایجاد کرده و آن را در دیسک ذخیره می کند
فاز – 5بارکننده فایل را در حافظه قرار می د هد
فاز – 6پردازشگر هر یک از دستورات را دریافت و اجرا می کند
6
مقدمه -ويژگيهاي مهم زبان C
زبان Cبه طور گستردهاي در دسترس است .
Cزباني است همه منظوره ،ساختيافته سطح باال و انعطافپذير كه برخي از خصوصيات
زبانهاي سطح پايین را نیز داراست.
برنامههاي نوشته شــده به زبان Cبه طور كلي مستقــل از ماشین يا نـوع كامپيوتر است و
ً
تقريبا تحت كنترل هر سيستم عاملي اجرا ميشود.
Cروش برنامهسازي ماژوالر را پشتيباني ميكند.
7
مقدمه -ويژگيهاي مهم زبان C
کامپايلرهاي Cفشرده و كم حجماند و برنامههاي هدف ايجاد شده با آنها خيلي كوچك و
كارآمدند.
برنامههاي Cدر مقايسه با ساير زبانهاي برنامهسازي سطح باال ،به راحتي قابل انتقالاند .
به طور کلي جامعيت ،عموميت ،خوانايي ،سادگي ،کارآيي و پيمانهاي بودن که همگي از
مشخصات برنامهای ايدهآلاند در زبان Cپيادهسازي ميشوند .
8
كاراكتر
زبـ ــان برنامـ ــهنويس ـ ـ ي Cمجموعـ ــهاي خـ ــاا از كاراكترهـ ــا را شناسـ ــايي مـ ــيكنـ ــد .ايـ ــن مجموعـ ــه
عبارتاند از:
حروف بزرگ و حروف كوچك :زبان Cبین حروف بزرگ و كوچك تفاوت قائل مي
شود (Case Sensitive) .
ارقام دهدهي :شامل 0تا 9
جاي خالي يا Blank
كاراكترهااي مصواو
;& , .
:شـامل * \ ? ( ) < > { } [ ] : ^ % $ # @ ! + - = /
كاراكترهاي فرمتدادن :که براي بيان کردن حاالت ويژه اي
:
9
بکار مي روند و عبارتند از
…\t ,\v ,\n ,\b ,\f ,\r ,\0 ,
شناسه
يك شناسه Cدنبالهاي است از حروف ،ارقام يا عالمت زير خط که با هر ترتيبي ميتوانند
قرار گیرند ،اما اولین کاراکتر بايد يک حرف باشد.
چند نمونه از شناسه هاي معتبر:
m1 , max , payam_noor , minimum
چند نمونه از شناسه هاي نامعتبر:
book-2 , 4s5 , $tax , "p" , computer science
10
قانون نامگذاري شناسهها
-1حروف كوچك و بزرگ در نامگذاري شناسهها متفاوت ميباشند.
بنابراين xy ، xY ، XY ، Xyچهار شناسه متفاوت از نظر
C++ميباشد.
ي شناسهها از حروف الفباء ،ارقام و ز ير خط ( )underlineاستفاده ميشود و
در نامگذار
)2
حداكثر طول شناسه 31ميباشد و شناسه بايستي با يك رقم شروع نگردد.
قانون نامگذاري شناسهها
بعض ي از كلمات كليدي.) براي نامگذاري شناسهها از كلمات كليدي نبايستي استفاده نمود3
.در زیر داده شده است
And
Sizeof
then
xor
Template
Float
False
Friend
While
continue
extern
Private
Switch
Default
Const
delete
typedef
if
this
Virtual
متغير
متغیر ،مكاني در حافظه اصلي كامپيوتر مـيباشـد كـه در آنجـا يـك مقـدار را مـيتـ وان ذخیـره
و در برنام ـ ــه از آن اس ـ ــتفاده نم ـ ــود .ق ـ ــانون نامگ ـ ــذاري متغیره ـ ــا هم ـ ــان ق ـ ــانون نامگ ـ ــذاري
شناسهها ميباشد.
متغیرها در زبان Cشناسههايي هستند كه محلهايي از حافظه را به خود اختصاا
ميدهند .
مقدار متغیر در طول اجراي برنامه مي تواند تغيیر کند .
13
انواع داده ها
حافظه
الزم
مقادير
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 x=26را از نوع intبا مقدار اوليه 26اعالن
;long a=67000 , b=260
در دستورالعمل
متغیرهاي bو aرا از نوع long intتعريف نموده با مقادير بترتيب
260و .67000
كراكترهاي مخصوص
در برنامه ميتوان از آنها براي فرمت
كراكترهاي مخصوا كه
كامپايلر C++بعض ي از
كراكترهاي مخصوا به همراه
بندي استفاده كرد را تشخي ميدهد .تعدادي از اين
کاربرد آنها آورده شده است .
كراكتر \aميتوان براي ايجاد
بعنوان مثال از
صداي beepاستفاده نمود.
char
; x = '\a
Newline
\n
Tab
\t
Backspace
\b
Beep sound
\a
Double quote
”\
Single quote
’\
Null character
\0
Question mark
?\
Back slash
\\
رشتهها
رشته يا stringعبارتست از دنبالهاي از كا راكترها كه بین " " قرار داده ميشود .در
حافظه كامپيوتر انتهاي رشتهها بوسيله \0ختم ميگردد.
" "BOOK STOREيك رشته ده كا راكتري ميباشد كه با توجه به كركتر \0كـه بـه انتهـاي آن
ً
در حافظه اضافه مي شود جمعــا يازده بايت را اشغال ميكند.
در حالي ه
دقت نمایید که " "wيك رشته ميباشد كه د و بايت از حافظه را اشغال ميكند
كتر ميباشد كه يك بايت از حافظه را اشغال مينمايد.
' 'wيك كا را
نمایش مقادیر دادهها
براي نمايش دادهها بر روي صفحه مـانیتور از coutكـه بـدنبال آن عملگـر درع يع ـي <<
قيد شده باشد استفاده ميگردد .بايستي توجه داشت كه دوكركتر < پشت سر هم توسـط
C++بصورت يك كركتر تلقي ميگردد.
مثال :
برای نمایش پيغام good morningبر روی صفحه نمایش :
;"cout << "good morning
برای نمایش مقدار متغیر Xبر روی صفحه نمایش :
; cout << x
دریافت مقادیر متغیرها
در ضمن اجراي برنامه از صفحه كليد ،از cinكه
مقادير براي متغیرها
به منظور دريافت
عملگر استخراع يع ي >> قيد شده باشد ميتوان استفاده نمود.
بدنبال آن
مثال :
;int x
; "cout << "Enter a number:
;cin >> x
عملگر انتساب
عملگر ار زيابي
عملگر انتساب = ميباشد كه باعث ميگردد مقدار عبارت در طرف راست این
شده و در متغیر طرف چپ آن قرار گیرد.
از عملگرهاي انتساب چندگانه نیز ميتوان استفاده نمود .که مقدار سه متغیر zو yو xبرابر
با 26ميشود.
;x=a+b
; x=35
; x=y=z=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
;int x=5
;y=x++ * 2
پس از اجراي دستورالعملهاي فوق :
y=12
عملگر sizeof
Sizeofازعملگرهاي ي تائي مي باشد و مشخ
ميكند.
كننده تعداد بايت هائي است كه يك نوع داده اشغال
مثال :
;int x
; cout << sizeof x
مقدار 2نمايش داده ميشود .
; )cout << sizeof(float
مقدار 4نمايش داده مي شود.
عملگرهاي جایگزیني محاسباتي
براي سادهتر نوشتن عبارتها در ، C++ميتوان از عملگرهاي جايگزي ي محاسب ــاتي استفاده نمود.
=+
=-
=*
=/
=%
اولویت عملگرها
ارزيابي مقدار يك عبارت رياض ي براساس جدول اولويت عملگرها انجام ميگردد .در ذيل جدول اولويت
عملگرها براساس بترتيب از بيشترين اولويت به كمترين اولويت داده شده است.
چ پ به راس ت
پرانتزها
)(
راس ت به چ پ
عملگرهاي ی كتایي
- + -- ++ 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
عالمت توضيح
Comment
توضيحات در برنامه باعث خوانائي بيشتر و درك بهتر برنامه ميشود .بنابراين توصيه بر آن است كه
حتي االمكان در برنامهها از توضيحات استفاده نمائيم .در ،C++توضيحات بدو صورت انجام
ً
ميگیرد ( )1هر عبارتي كه بین دو عالمت */و * /قرار گیرد و یا ( )2ربا //شروع شود صرفا
بعنوان توضيحات محسوب ميگردد
مثال:
>#include<stdio.h
) ( main
/* declare variables */
/* initialize */
/* outer loop */
{ int
;m,n
;m=1
) while (m <= 10
; ) {printf("%5d ", m
33
for ( n=1; n<=10 ; n+ +) // inner loop
; ) printf("%5d", m * n
; )"printf("\n
;m++
} }
توابع كتابخانه
زبان C++مجهز به تعدادي توابع كتابخانه ميباشد .بعنوان مثال تعدادي توابع كتابخانه
ً
براي عمليات ورودي و خروجي وجود دارند .معموال توابع كتابخانه مشابه ،بصورت
برنامههاي هدف (برنامه ترجمه شده بزبان ماشین) در قالب فايلهاي كتابخانه دسته بندي و
مورد استفاده قرا رميگیرند .اين فايلها را فايلهاي headerمينامند و داراي پسوند .h
ميباشند.
نحوه استفاده از توابع کتابخانه ای
براي استفاده از توابع كتابخانه خاص ي بايست ــي نام فايل headerآنرا در ابتداي
برنامه در دستور #includeقرار دهيم.
>اسم فايل #include < header
چند تابع نمونه
abs(i)
int
i
stdlib.h
cos(d)
double
d
math.h
exp(d)
log(d)
log10(d)
double
double
double
sin(d)
double
sqrt(d)
double
strlen(s)
int
tan(d)
double
toascii( c)
int
tolower(c )
int
stdlib.h
toupper(c )
int
stdlib.h
ex
loge d
Log10 d
d
d
s
math.h
math.h
math.h
math.h
math.h
string.h
d
c
math.h
stdlib.h
برنامه در
C++
اكنــون باتوجــه بــه مطالــب گفتــه شــده قــادر خــواهيم بــود كــه تعــدادي برنامــه ســاده و كوچــك ب ـه زبــان
C++بنويســيم .بـراي نوشــتن برنامــه بايســتي دســتورالعملها را در تــابع ) ( mainقـرار دهــيم و ب ـراي
اينكار ميتوان به يكي از دو طريقی که در اسالیدهای بعد آمده است ،عمل نمود.
برنامه در
>
#include
<
) (void main
{
; دستورالعمل 1
; دستورالعمل 2
.
.
.
;دستورالعمل n
}
C++
>
#include
<
) (int main
}
; دستورالعمل 1
; دستورالعمل 2
.
.
.
; دستورالعملn
; return 0
}
1 مثال
را روي صفحه مانیتور نمايشC++ is an object oriented language برنامه ای که پيغام
.مي دهد
#include <iostream.h>
int main( )
{
cout <<"C++ is an object oriented language \n" ;
return 0 ;
}
2 مثال
.برنامه زير يك حرف انگليس ي كوچك را گرفته به حرف بزرگ تبديل مينمايد
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; }
مثال 3
دو عدد از نوع اعشاري را گرفته مجموع و حاصلضرب آنها را محاسبه و نمايش ميدهد.
>#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
{
; دستورالعمل 1
;دستورالعمل n
}
.
else
{
; دستورالعمل 1
;دستورالعمل n
}
.
IF
: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
b
true
false
true
false
a
true
true
false
false
a && b
True
False
False
False
a
true
false
!a
False
True
b
true
false
true
false
a || b
True
True
True
False
مثال :
اگر xبرابر با 5يا yمصالف صفر باشد مقدار xنمايش داده شود .
اگر مقدار xمصالف صفر باشد ،آنگاه xبرابر با صفر شود .
))if ((x= = 5) ||(y != 0
; cout << x << endl
)if(x
;x=0
: مثال
برنامه زير طول سه چارهخط را از ورودي گرفته مشخص مينمايد كه آيا تشكيل يك مثلث ميدهد يا خير؟
#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
}
: مثال
. را از ورودي گرفته فاكتوريل آنرا محاسبه ونمايش ميدهد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
.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 ; }
دستورالعمل do while
اي اان دس ااتور العم اال ني ااد ب ااراي تك اارار ي ااك دس ااتورالعمل س اااده ي ااا تركيب ااي اس ااتفاده م اايش ااود .ش ااكل كل ااي اي اان
دستورالعمل بوورت زير ميباشد.
do
}
; دستورالعمل 1
; دستورالعمل 2
.
.
; دستورالعمل n
;)شرط (} while
تفاوت دستورهای
do whileو
while
در دستورالعمل whileابتدا مقدار شرد ارزيابي شده اما در دستورالعمل do whileابتدا
دستورالعمل اجرا شده سپس مقدار شرد ارزيابي ميگردد .بنابراین دستورالعمل do while
حداقل يك بار انجام ميشود .
>#include <iostream.h
) (int main
{
;int count = 0
do
; cout << count ++<<endl
;)while(count <= 9
} ; return 0
ارقام 0تا 9را روي ده خط نمايش ميدهد
دستورالعمل break
اين دستورالعمل باعث توقف دستورالعملهاي تكرار( )for , while ,do whileشده و كنترل به خارج
از اين دستورالعملها منتقل مينمايد.
: مثال
#include <iostream.h>
int main( )
{
float x, s=0.0 ;
cin >> x ;
while(x <= 1000.0) {
if(x < 0.0){
cout << "Error-Negative Value" ;
break;
}
s += x ;
cin >> x ;}
cout << s << endl ;
return 0 ; }
: 1 مثال
: مثال
:2 مثال
#include <iostream.h>
int main( )
{
int count = 0 ;
while( 1 )
{
count ++ ;
if(count > 10 )
break ;
}
cout << "counter : " << count << "\n";
return 0 ;
}
: مثال
#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 ;
}
sum += x ; }
cout << sum << \n ; }
:3 مثال
: مثال
#include <iostream.h>
int main( )
{
float x , sum = 0.0 ;
do
{
cin >> x ;
if(x < 0.0)
{
cout << "Error – Negative Value" << endl ;
break ;
}
sum += x ;
} while(x <= 1000.0);
cout << sum << endl ;
return 0 ; }
:4 مثال
دستورالعمل continue
از دستورالعمل continueميتوان در دستورالعملهاي تكرار for ، while ، do while
اسااتفاده نمااود .اياان دسااتورالعمل باعااث ماايشااود كااه كنتاارل بابتااداي دسااتورالعملهاي تكاارار منتقاال
گردد.
: مثال
#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 ; }
: مثال
#include <iostream.h>
int main( )
{
int n , navg = 0 ;
float x, avg, sum = 0 ;
cin >> n ; / * عبارت از تعداد اعداد وروديn * /
for(int count = 1 ; count <=n; ++ count )
{
cin >> x ;
if(x < 0 ) continue ;
sum += x ;
++ navg ;
}
avg = sum / navg;
cout << avg << endl ;
return 0 ;
}
دستورالعمل switch
هماانطور هاه مای دانیاد از دساتورالعمل شارطی( )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 * /
}
: مثال
#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;
}
}
تابع
)(: cin.get
اين تابع يك كركتر را از صفحه كليد ميگيرد .براي استفاده از اين تابع در ابتداي برنامه بايستي
داشته باشيم:
><iostream.h
قطعه برنامه ذيل يك كراكتر را از صفحه كليد گرفته و نمايش ميدهد.
char
;x
;) (x = cin.get
; cout << x
#include
مثال :
برنامة ذيل يك سطر متن انگليس ي كه به CTRL Zختم ميشود را گرفته دقيقا سً نمايش ميدهد.
#include
><iostream.h
) (int main
{
;char x
)while((x = cin.get( ) !=EOF
; cout << x
; return 0
}
معني EOF
تعريف شده و مقدار آن برابر با -1ميباشد .مقدار آن iostream.hميباشد كه در End of Fileبه
ctrl z.عبارتست از DOSدر سيستم عامل
: مثال
. استفاده شده است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;
}
: مثال
.) آنرا حذف نموده و نمايش ميدهدblank( برنامة ذيل يك سطر متن انگليس ي را گرفته كاراكترهاي خالي
#include
<iostream.h>
int main( )
{
char next;
while((next = cin.get( ) ) !=EOF)
if(next != )
cout << next ;
return 0 ;
}
عملگر static_cast
از اين عملگر براي تبديل موقت يك نوع dataبه نوع ديگر
استفاده ميشود .اين عملگر يك عملگر يكتائي ميباشد.
مثال :
; int x = 25
; float y
< y = static_cast
; )float >(x
س
مقاادار xموقتااا بوااورت اعشاااري در
م اای آي ااد و در ن يج ااه مق اادار yبراب اار ب ااا
25.0می شود .بايستي توجاه داشات
كه نوع متغيار xعاو نماي شاود بلكاه
س
موقت ااا مق اادار آن بو ااورت اعش اااري در
آمده است.
مثال :
; float x = 14.75
cout << static_cast
;< int >(x) << endl
; cout << x
ابتدا مقدار 14نمايش داده ميشاود و
سا ا ا ا ااپس مقا ا ا ا اادار 14.75نما ا ا ا ااايش داده
ميشود.
جدول اولویت عملگرها
(
چ پ به راس ت
راس ت به چ پ
)
sizeof
-
+
Static_cast < >( ) ++
--
چ پ به راس ت
* / %
چ پ به راس ت
+ -
چ پ به راس ت
چ پ به راس ت
<<
>>
=<
>
=>
چ پ به راس ت
=!
==
راس ت به چ پ
:
?
راس ت به چ پ
چ پ به راس ت
=-
=*= /= %
,
<
=+
=
فصل چهارم
اعداد تصادفی
فهرست مطالب فصل چهارم
.1
تولید اعداد توادگی
.2
تعریف نوع داده ( ) typedef
داده های از نوع شمارش ی
فرمت های مصتلفه مقادیر خروجی
.3
.4
اعداد تصادفی
مقادير توادگي يا شانس ي در اكثر برنامههاي كاربردي در زمينه شبيه سازي و بازيهاي كامپيوتري نقش مهماي
را ايفااا م ااينماين ااد .ب ااراي ايج اااد ي ااك ع اادد تو ااادگي ص ااحيح ب ااين 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 ;
}
نکته :
اگر برنامة فوق را چندبار اجرا نمائيم جواب يكساني را از كامپيوتريمی گيريم.
براي توادگي كردن اعداد ميبايستي از تابع ) ( srandاستفاده نمائيم.
اين تابع به يك آرگومان صحيح از نوع unsignedنياز دارد.
به اين آرگومان seedگفته ميشود.
در اسالید بعد برنامه قبلی را با تابع ) ( srandنوشته ایم.
: مثال
) 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 ;
}
: مثال
.برنامه زير ن يجه چرتاب دو تاس را نمايش ميدهد
#include
< iostream.h>
#include
<stdlib.h>
int main( )
{
unsigned seed, d1, d2;
cout << "Enter seed: " ;
cin >> seed ;
srand(seed) ;
d1= 1+rand( )% 6 ;
d2= 1+rand( )% 6 ;
cout << d1 <<
<< d2 ;
return 0 ;
}
: مثال
. را نمايش ميدهد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 ;
}
تعریف نوع
داده ()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 ;
enum days {sat, sun, mon, tue, wed, thr, fri};
enum bread {lavash, fantezi, taftoon, barbari};
enum color { yellow, red=2, brown, white };
color x=brown;
0
3
4
توجه :
بايس ااتي در نظ اار داش اات ك ااه دادهه اااي از ن ااوع شمارشا ا ي در عملي ااات ورودي و خروج ااي ش ااركت
نم ااينماين ااد .بعب ااارت ديگ اار مق ااادير دادهه اااي از ن ااوع شمارش ا ي بايس ااتي در برنام ااه تعي ااين نم ااود.
دستورالعلهاي ورودي و خروجاي مانناد cinو coutدر ماورد دادههااي شمارشا ي نمايتاوان
استفاده نمود.
فرمتهای مختلفه مقادیر خروجی
مقدار xبطور غير علمی با نقطه اعشار ثابت نمایش
داده می شود.
; double x=1050
<< )cout << setiosflags(ios : : fixed | ios: : showpoint ) << setw(23
; setprecision(2) << x << endl
مقدار xبا طول میدان 23نمایش داده می شود.
مقدار xبا دو رقم اعشار نمایش داده می شود.
بنابراین مقدار xبوورت زیر نمایش داده می شود :
1050.00شانزده ستون خالی
فصل پنجم
آرایه ها
فهرست مطالب فصل پنجم
.1
.2
آرایه یک بعدی
آرایه دو بعدی ( ماتریس ها )
آرایه یک بعدی
.1آرايه يك فضاي چيوسته از حافظه اصلي كامپيوتر ميباشد كه ميتواند
چندين مقدا را در خود جاي دهد.
.1كليه عناصر يك آرايه از يك نوع ميباشند.
عناصر آرايه بوسيله انديس آنها مشخص ميشوند.
در ، 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>
#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 ;
}
عدد اعشاري را گرفته تشكيل يك آرايه داده سپس كوچكترين عنور آرايه را مشخص و نمايش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;
}
.) بوورت صعودي مرتب مينمايدBubble sort( عدد اعشاري را گرفته بروش حبابي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 ;
}
آرایههاي
دوبعدي (ماتریسها)
ماتريسها بوسيله آرايههاي دوبعدي در كامپيوترنمايش داده ميشوند.
;]int a[3][4
ستون 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
ستون
3
تصویص مقادیر اولیه به عناصر آرایه :
; } }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<3; 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 ;
}
فصل ششم
توابع
فهرست مطالب فصل ششم
.1
.2
.3
.4
.5
.6
تعریف تابع
تابع بازگشتی
توابع درون خطی
انتقال چارامترها از طریت ارجاع
هالس های حافظه ( ) storage classes
سربارگذاری توابع
تعریف توابع
استفاده از توابع در برنامهها به برنامهنويس اين امكان را ميدهد كه بتواند
برنامههاي خود را به صورت قطعه قطعه برنامه بنويسد .تا كنون كليه برنامههائي كه
نوشتهايم فقط از تابع ) ( mainاستفاده نمودهايم .
نوع مقدار برگشتي
شكل كلي توابع بصورت زير ميباشند :
لیست چارامتر ها جهت انتقال اطالعات از تابع احضار كننده به تابع فراخوانده شده
)return-value-type function-name (parameter-list
{
declaration and statements
نام تابع
}
تعريف اعالنهاي تابع و دستورالعملهاي اجرائي
تابع زير يك حرف كوچك را به بزرگ تبديل مينمايد.
نوع مقدار برگشتی
چارامتری از نوع char
نام تابع
)char low_to_up (char c1
{
;char c2
;c2 = (c1>= a && c1<= z )?( A + c1- a ): c1
; )return (c2
}
.برنامه کامل که از تابع قبل جهت تبدیل يك حرف كوچك به بزرگ استفاده مينمايد
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
;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;
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 ;
}
.تابع مقداري بر نمی گرداند
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 ;
}
احضار
main درa
20
modify درa
20
modify درa
40
: خروجی برنامه
20
40
20
احضار
aدر main
بوسیله مقدار ( Call By
) Value
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
}
ي به تعريف پيش
ذكر آن نیست و همچنین نياز
ي به
مقدار برگشتي تابع intميباشد نياز
هر زمان که نوع
نمونه تابع نميباشد.
تابع
بازگشتي ( recursive
)functions
توابع بازگشتي يا recursiveتوابعي هستند كه
احضار نمايند.
احضار شوند باعث ميشوند كه خود را
وقتي
نحوه محاسبه فاکتوریل از طریق
تابع بازگشتی
n != 1*2*3*…*(n-1) *n
! f(n) = n
اگر 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
0
اگر n=2
1
=) =fib(nجمله nام
در غير اينوورت
در اسالید بعد تابع بازگشتی مورد نظر چیاده سازی شده است.
)fib(n-1)+fib(n-2
.و نمايش ميدهد
) را مشخ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)
{
n= = 2) || if(n = = 1
return 1 ;
else
return(fib(n-1) + fib(n-2) ) ;
}
.برنامه زير يك خط متن انگليس ي را گرفته آنرا وارون نموده نمايش ميدهد
#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 ;
}
مجاز است.
امتر تابع
استفاده از آرايهها بعنوان پار
. را بعنوان پارامتر ميگیردa آرايهmodify در برنامه زير تابع
#include <iostream.h>
void modify(int [ ] ); // forward declaration
int main( )
{
int a[5] ;
for(int j=0; j<=4; ++j)
a[ j ] = j+1 ;
modify(a) ;
for(j=0; j<5; ++j)
cout << a[ j ] << endl ;
return 0 ;
}
void modify(int a[ ]) // function definition
{
for(int j=0; j<5; ++j)
a[ j ] += 2 ;
for(j=0; j<5; ++j)
cout << a[ j ] << endl ;
return ;
}
: خروجی
1
2
3
4
5
3
4
5
6
7
در تعريف تابع و
در صورتي ه آرايه بيش از يك بعد داشته باشد بعدهاي دوم به بعد بايستي
ذكر گردد.
پيش نمونه تابع
#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
4
1
4
1
4
2
5
2
5
2
0
3
6
3
0
0
0
توابع درون
است
مع ي
بدين
كلمه 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 ;
}
انتقال پارامترها از طریق ارجاع
تاكنون وقتي تابعي را احضار ميكرديم يك كپي از مقادير آرگومانها د رپارامترهاي متناظر
قرار ميگرفت .این روش احضار بوسيله مقدار يا call by valueناميده شد.
در انتقال پارامترها از طريق ارجاع در حقيقت حافظه مربوط به آرگومانها و پارامترهاي متناظر
بصورت اشتراكي مورد استفاده قرار ميگیرد .اين روش call by reference
ناميده ميشود .
انتقال پارامترها از طریق ارجاع
در اين روش پارامترهائي كه از طريق call by referenceعمل مينمايند در
پيش نمونه تابع قبل از نام چنین پارامترهائي از & استفاده ميشود.واضح است
كه در تعريف تابع نیز بهمین طريق عمل ميشود.
: مثال
#include <iostream.h>
int vfunct(int); // for
void rfunct (int &) ;
int main( )
{
int x=5, y=10;
cout << x << endl << vfunct(x) << endl << x << endl ;
cout << y << endl ;
rfunct(y) ;
cout << y << endl ;
return 0 ;
}
int vfunct(int a)
{
return a *= a ;
}
void rfunct(int &b)
{
b *= b ;
}
x
y
5
10
: خروجی
.تغیير نمی هندx مقدار آرگومان
5
25
5
10
x
y b
5
10 100
100
: ادامه خروجی
نکته :
وقتي پارامتري بصورت call by referenceاعالن
مقدار اين
تغيیر
ميگردد اين بدان مع ي است كه با
تغيیر
متناظر نی ز
مقدار آرگومان
احضار شده
در تابع
امتر
پار
مينمايد.
. دو مقدار اعشاري را مبادله مينمايدfswap برنامهزير با استفاده از
#include <iostream.h>
void fswap(float & , float & );
int main( )
{
float a=5.2, b=4.3;
cout << a << endl << b ;
fswap( a , b) ;
cout << a << endl << b ;
return 0 ;
}
void fswap(float &x , float & y)
{
float t;
t=x;
x=y;
y=t;
}
كالسهاي
حافظه ()storage classes
متغیرها بدو طريق متمايز مشخ ميشوند يكي بوسيله نوع ( )typeآنها و ديگري بوسيله كالس حافظه
ً
آنها .نوع متغیر قبال اشاره شده بعنوان مثال . . . ، double ، float ، intولي كالس حافظة يك متغیر در
مورد طول عمر و وسعت و دامنة متغیر بحث مينمايد.
بطور كلي كالس حافظه متغیرها به چهار دستة تقسيم ميگردد :
.1
.2
.3
.4
automatic
static
external
register
متغیرهــاي automaticدر درون يــك تــابع تعريــف مــيشــوند و در تــابعي كــه اعــالن مــيشــود
بصــورت متغیره ــاي محلــي ب ـراي آن تــابع م ــيباش ــند .حافظ ــه تخصــي داده ش ــده بــه متغیره ــاي
متغیرهاي
automaticپس از اتمام اجراي تابع از بین مي رود بعبارت ديگر وسعت و دامنة
از نوع automaticتابعي ميباشد كه متغیر در آن اعالن گرديده است.
متغیرهاي staticنیز در درون توابع تعريف ميشوند و از نظر وسعت و دامنه شبيه
متغیرهاي automaticهستند ولي در خاتمة اجراي تابع ،حافظه وابسته به اين نوع متغیره ــا از
بین نميرود بل ه براي فراخواني بعدي تابع باقي ميماند.
: مثال
#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>
int w; // external variable
functa(int x, int y)
{
بايســتي توجــه داشــت كــه اگــر در توابــع بــه متغیرهــاي از نــوع
cout << w ;
مقـ ــدار اوليـ ــه تخصـ ــي نـ ــدهيم مقـ ــدار صـ ــفرexternal
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 ;
}
ً
عمال درخواست ميشود كه به جاي
كامپيوتر
وقتي متغیري از نوع registerاعالن ميشود از
حافظه از يكي از رجيسترهاي موجود استفاده نمايد.
کاربرد کالس register
ً
معموال از نوع رجيستر براي شاخ هاي دستور ت رار و يا انديسهاي آرايهها
استفاده ميشود .بايستي توجه داشت كه متغیرهاي از نوع رجيستر قابل
استفاده
دردستور cinنميباشند
سربارگذاري توابع ( 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 ;
}
فصل هفتم
ساختار ها و اشاره گرها
فهرست مطالب فصل هفتم
.1
.2
.3
.4
.5
.6
.7
ساختارها
Unionها
اشاره گرها ( ) Pointer
تعریف آرایه
آرایه های دو بعدی و اشاره گرها
تخصی حافظه بصورت پویا ( عملگر ) new
رشته ها و توابع مربوطه
ساختارها
ر
داده گروهي است كه فضاي پيوسته از
ساختارها شبيه آرايهها بوده بدين صو ت كه يك نوع ً
اما از يك نوع نميباشند بل ه اعضاي
ساختار الز
عناصر
حافظه اصلي را اشغال مينمايد .اما
ساختار ميتوانند از نوعهاي مختلفه از قبيل … ، float ، int ، charباشند.
يك
تعریف ساختار
نام ساختار
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 ساختار
int شماره حساب از نوعacc_no
char نوع حساب از نوعacc_type
كركتري80 مشخصات صاحب حساب از نوع رشتة
name
float مانده حساب از نوعbalance
: به دو صورت می توان اعالن یک متغیر از نوع ساختار را نمایش داد
: روش اول
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 ;
x.lastpay.day
x.lastpay.month
x.lastpay.year
بوسيلهlastpay آنگاه عضو
.مشخص ميگردد
نکته :
ميتوان آرايهاي تعريف نمود كه هر عضو آن يك ساختار باشد و حتي به آنها مقادير اوليه تخصي
نمود.
{ struct struc1
;]char name[40
;int pay1
; } ;int pay2
strucl 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 ;
i2= -1 بطوريكه
}
x = a + ib
y = c + id
x+y =(a+c) + i(b+d)
union
unionاز نظ ــر س ــاختاري ش ــبيه structم ــيباش ــد .ب ــا اي ــن تف ــاوت ك ــه عض ــوهائي ك ــه تشـ ـ يل
unionميده ــد همگ ــي از حافظ ــه مش ــتركي در ك ــامپيوتر اس ــتفاده م ــينماين ــد .بن ــابراين اسـ ـتفاده از
unionباعث صرفهجوئي در حافظه ميگردد.
مثال :
يك رشته
هر كدام از متغیرهاي xو y
كامپيوتر يك
مقدار از نوع intميباشد و
10كركتري يا يك
ادر خود جاي
ير
بلوك حافظه كه بتواند رشته 10كركتر
نظر ميگیرد.
در
دهد ،براي colorو size
union id
{
;]char color [10
;int size
;} x , y
: مثال
union xpq
{
int x ;
char y[2] ;
}p;
x
بای ت دوم
y[1]
بای ت اول
y[0]
اشارهگرها
()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
; px = &x
مثال :
; int y , x , *px
px
x
26
حال اگر دستور العمل ; x += 10را بدهيم :
px
x
36
حال اگر دستورالعمل ; *px = *px + 7بدهيم.
px
x
43
; x = 26
; px = &x
آرایه یک بعدی و اشاره گرها
x
اولين عنور آرايه بوسيله ] x[0مشخص ميشود.
آدرس اولين عنور آرايه بوسيله ] &x[0يا بوسيله xمشخص ميشود.
آدرس iامين عنور آرايه بوسيله ] &x[i-1يا بوسيله ) x(i-1مشخص ميشود.
دو دستورالعمل زير با هم معادلند .
از طرف ديگر اگر داشته باشيم
; 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اشاره نمايد.
struc1
x
int
float
char
int
px
a
b
c
d
struct
{
; int a
; float b
;char c
; int d
; } x, *px
; px = &x
عبارت x.aمعادل pxaمعادل (*px).aميباشد.
آرایههاي دوبعدي و اشارهگرها
يك آرايه دوبعدي بصورت تعدادي آرايه يك بعدي ميتوان تعريف نمود.
ً
اگر 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>
#include <conio.h>
int main( )
{
int x[ ]={12, 25, 6, 19, 100};
clrscr( );
int *px=x;
// اشاره به عنصر اول آرایه مينماید،نام آرایه بدون اندیس
for(int 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
<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 ; }
. جابهجا مينمايد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;
}
رشتهها و توابع مربوطه
رشتهها در ، C++آرايهاي از كركترها ميباشند كه با كركتر \0ختم ميشوند.
;char name[ ]= sara
s
a
r
a
\0
رشته و اشاره گر
هر رشته از طريق اشارهگري به اولین كركتر آن در دسترس قرار ميگیرد .آدرس يك رشته ،آدرس كركتر اول آن
ميباشد .به رشتهها ميتوان مقدار اوليه تخصي
داد.
;char *name = sara
. رشته در نظر گرفته آنها را بترتيب حروف الفباء مرتب نموده نمايش ميدهد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 ; }
تابع
)strcmpi(s1, s2
اگر رشته
رشتههاي s1و s2را با هم مقايسه نموده (بدو ن توجه به حروف كوچك و بزرگ)
مقدار
اگر رشته s1كوچ تر از رشته s2باشد يك
صفر و
مقدار
ابر با رشته s2باشد
s1بر
مقدار مثبت بر ميگرداند.
غیر اينصورت يك
در
منفي
تابع ) strcmp(s1, s2
اگر
صفر و
مقدار
ابر با s2باشد
رشتههاي s1و s2را با هم مقايسه نموده اگر s1بر
مقدار مثبت
غیر اينصورت يك
در
مقدار منفي
رشته s1كوچ تر از رشته s2باشد يك
برميگرداند.
تابع ) strncmp(s1, s2,n
در صورتي ه s1
كركتر از رشتة s2مقايسه نموده
كركتر از رشتة s1را با n
حداكثر n
غیر
در
صفر
مقدار
ي با s2باشد
مقدار منفي ،اگر s1مساو
كوچ تر از s2باشد يك
مقدار مثبت برميگرداند.
اينصورت يك
تابع (strcat(s1, s2
د و رشتة s1و s2را بعنوان آرگومان گرفته رشتة s2را به انتهاي رشتة s1اضافه
ً
ونهايتا رشتة
كركتر پاياني \0رشتة s1نوشته ميشود
كركتر او ل رشتة s2روي
مينمايد.
s1را برميگرداند.
تابع (strncat(s1, s2,n
كركتر از
ومقدار صحيح و مثبت nرا بعنوان آرگومان گرفته ،حداكثر n
د و رشته s1و s2
كركتر رشته s2روي كركتر چاياني \0رشتة
در انتهاي رشتة s1كپي مينمايد .اولین
رشتة s2را
س
s1مينويسد ونهايتا مقدار رشتة s1را برميگرداند.
تابع (strlen(s
رشتة sرا بعنوان آرگومان گرفته طول رشته را مشخ
مينمايد.
تابع (strlen(s
رشتة sرا بعنوان آرگومان گرفته طول رشته را مشخ
مينمايد.
تابع
)strcpy(s1,s2
دو رشتة s1و s2را بعنوان آرگومان گرفته رشتة s2را در رشتة s1كپي مينمايد و
ً
نهايتا مقدار رشتة s1را بر ميگرداند.
تابع (strncpy(s1, s2,n
دو رشتة s1 , s2و مقدار صحيح و مثبت nرا بعنوان آرگومان گرفته ،حداكثر nكركتر
ً
نهايتا مقدار رشتة s1را برميگرداند.
را از رشتة s2در رشتة s1كپي نموده ،
ً
#includeبراي استفاده از توابع مربوط به رشتهها بايستي حتما در ابتدا برنامه
را قرار دهيم><string.h
: مثال
#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;
}
: مثال
#include
<iostream.h>
#include
<string.h>
#include
<conio.h>
int main( )
{
char *s = sara;
clrscr( );
cout << strlen(s);
return 0; }
. می باشد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]);
}
فصل هشتم
برنامه نویس شی گرا
فهرست مطالب فصل هشتم
.1تعریف ش ی گرایی
.2چند ریختی ()polymorphism
.3خاصیت ارث بری
.4پشته ()stack
.5ایجاد ش ی
.6ارث بری
.7سازنده ها و نابود کننده ها
.8توابع دوست
.9کالس های دوست
.10توابع سازنده پارامتر دار
.11توابع سازنده یک پارامتری
.12
.13
.14
.15
.16
.17
.18
.19
.20
.21
عضوهای static
کالسهای تودرتو
کالس های محلی
استفاده از objectها بعنوان پارامترهای تابع
برگشت اشیاء
انتساب اشیاء
آرایه اشیاء
اشاره گر به اشیاء
اشاره گر this
توابع مجازی و پلی مرفیسم
نرم فزار
تعریف نرم فزار :به مجموعه برنامه ،ساختار داده ای و مستندات نرم
افزارگفته می شود.
تعاریف مهندسی نرم افزار:
-1مهندسی نرم افزار عبارتست از کاربرد عملی علم کامپیوتر ،علم مدیریت و
سایرعلوم برای تحلیل ،طراحی ،ساخت ،نگهداری نرم افزار و مستندسازی مورد
نیازبرای استفاده در اجرا و نگهداری نرم افزار تولید شده
-2مهندسی نرم افزار عبارتست از کاربرد اصول مهندسی برای بهینه سازی
روند تولید و نگهداری سیستم های نرم افزاری با هدف کاهش هزینه و افزایش
قابلیت اطمینان
: IEEE -3استفاده از روشهای سیستماتیک ،با قاعده و قابل اندازه گیری برای
تولید ،بکارگیری و نگهداری نرم افزار
-4تعریف و استفاده از قواعد و اصول صحیح مهندسی است برای دستیابی به
نرم افزاربصورت اقتصادی که دارای قابلیت اطمینان بوده و بصورت کارا روی
ماشین های واقعی کار کند.
منحنی نرخ خرابی سخت افزار
نسبت به نرم افزار
منحنی نرخ خرابی ایده ال نرم
افزار نسبت به زمان
منحنی نرخ خرابی واقعی نرم
افزار نسبت به زمان
سیستم
تعریف سیستم :یک مجموعه از مولفه هایی که برای انجام دادن یک کار و یا
کنترل یک فرایند سازماندهی شده باشند.
تولید یک نرم افزار بطور کلی دارای سه فاز است:
-1تعریف
-2تولید
-3نگهداری
در فاز تعریف بررسی های زیر انجام می شود:
-1چه اطالعات و داده هایی باید پردازش شود.
-2چه عملیات و کارهایی الزم است.
-3چه واسط هایی )نرم افزاری یا سخت افزاری) الزم است.
-4چه محدودیت هایی وجود دارد.
-5ضوابط ارزیابی سیستم باید مشخص شود.
*در این فاز بر روی اینکه چه چیزی مورد نیاز است ،تاکید می شود.
فاز تعریف
*به طور کلی در فاز تعریف سه قدم(گام) اصلی وجود دارد:
-1تجزیه و تحلیل سیستم :در این گام نقش هر مولفه در (سیستم سیستمی که
قرار است تولید شود) و نقش کل سیستم نیز تعیین می شود .به عبارت دیگر
حوزه عمل سیستم و بستر الزم چه سخت افزاری و چه نرم افزاری تعیین می
شود .به عالوه بررسی کالن در مورد کل سازمان و کارهای مربوطه در این گام
انجام می گیرد.
-2برنامه ریزی پروژه انجام می شود .در این گام ،برنامه ریزی انسانی و هزینه
و زمان و زمانبندی انجام کارها مشخص می شود.
-3تجزیه و تحلیل نیازهای سیستم مورد نظر .در این مرحله عملیات مورد انتظار
از سیستم تعیین و پرونده های) بانکهای( اطالعاتی الزم تعریف و سپس فرمهای
ورودی و خروجی مشخص می شود.
گام سوم به یک تکه از کل نگاه می کند ولی گام یا قدم اول کل سیستم را می
بیند که در خیلی از پروژه ها،متاسفانه به کل توجهی نمی شود .در نتیجه
سیستم بصورت وصله وصله در می آید نه یک تکه.
فاز تولید
فاز تولید :در این فاز بر روی چگونگی تاکید می شود و چگونگی تبدیل مرحله تحلیل) گام ) 3به
نرم افزار(برنامه ها(
مورد توجه قرار می گیرد.
ساختار داده ها و معماری نرم افزار تعیین می شود.جزئیات رویه ها تعیین می شود
چگونگی تبدیل طراحی به برنامه کامپیوتری مشخص می شود.
ایجاد داده های آزمایشی برای تست نرم افزارسه گام اصلی در این فاز وجود دارد :
-1طراحی نرم افزار :در این گام نیازمندیهای نرم افزار به صورت مجموعه ای از نمایشها( مانند
گرافیکی ،جدولی و غیره )که ساختمان داده ها و معماری والگوریتم ها را توضیح می دهد ،تبدیل
می شود.
-2تولید کد :در این گام ،نتایج طراحی با کمک یک زبان برنامه سازی به برنامه ها تبدیل می
شود معموال از 4GL , 3GLاستفاده می شود .البته این به پارامترهای بسیاری از جمله موقعیت
مکانی و زمانی سازمان ،تکنولوژی فعلی سازمان ،روش طراحی ( مثال شئی گرا )و ...بستگی
دارد.
-3تست نرم افزار :در این گام ،نرم افزار تولید شده را جهت بر آورده شدن
نیازهای مشتری تست می کنیم .
فاز تعمیر و نگهداری
فاز تعمیر و نگهداری :در این فاز روی تغییراتی که پس از تحویل به
مشتری پیش می آید تاکید می شود .این تغییرات عبارتند از:
-1تعمیرات اصالحی )(corrective maintenance
-2تعمیرات تطبیقی ) (adaptive maintenanceبه عنوان مثال
سیستم عامل تغییر کرد یا زبان برنامه سازی جدید آمد و یا تغییراتی
سخت افزاری اعمال گردید یا در قوانین سازمانی تغییراتی داده شد.
-3تعمیرات تکمیلی ) (perfective maintenanceبه عنوان مثال
دانشجویان شبانه هم اضافه شود و...
فرایند تولید نرم افزار
تمام کارهای توسعه و ارايه يک نرم افزار را می توان يک حلقه حل مشکل
طبق شکل زير توصيف کرد
فرایند تولید نرم افزار
چهار مرحله در شکل فوق:
وضع موجود :نمایانگر وضعیت موجود امور است.تعریف مساله :لیست نیازها و خواسته ها و مشکالت و کاستی هامشکل یا مشکالتی که باید حل شود
توسعه فنی :مشکل را از طریق بکارگیری فنآوری حل می کند.یکپارچه سازی راه حل :راه حل هایی که در طی فرایند توسعهبدست می آیند ،یکپارچه کرده و نتایج حاصل( مثل اسناد ،برنامه ها،
داده ها ،عملکرد کسب و کار جدید ،محصول جدید ) را به
کسانی که راه حل را در مرحله اول تقاضا کرده اند ،ارایه میدهد
مدل آبشاری خطی -ترتیبی
چرخه حیات نرم افزار بصورت کالسیک .:
نمونه سازی
وقتی نمونه نهایی ساخته شد و اهداف الزمه مثل تعیین
لیست خواسته ها و نیازهای مشتری /کاربران حاصل گردید،
می توان از یک مدل فرایند
دیگر استفاده کرد و نرم افزار را بصورت مهندسی تولید کرد
.
مدل نمونه سازی
معایب این روش:
مشتری یک نسخه کاری از نرم افزار را می بیند و نمی داند که این نمونه بدون در نظر گرفتن کیفیتکلی نرم افزار و یا قابلیت نگهداری دراز مدت ساخته شده .وقتی به او بگوئیم که این محصول بایستی دوباره
ساخته شود مشتری ناراحت می شود.
تولید کننده اغلب برای اینکه نمونه را سریع به پایان برساند به خیلی از مسایل توجه نمی کند .یک سیستمعامل نامناسب یا زبان برنامه نویسی نامناسب ،چون در دسترس و شناخته شده هستند بکار می روند .یک
الگوریتم ناکارامد فقط برای نمایش قابلیت انجام یک کار بکار می رود .بعد از مدتی تولید کننده با این
انتخابها آشنا شده و دالیل نامناسب بودن آنها را فراموش می کند.
توقف این سیکل مشکل است .مشتری دوست دارد دائم یکسری ویژگیها اضافه شود.مشتری فکر می کند تولید نرم افزار به سادگی همین نمونه( ماکت )می باشد .بنابراین در زمان تحویل نرمافزار و هزینه انجام پروژه ،ممکن است با مشتری با مشکل مواجه شویم.
ممکن است مشتری وقت الزم را برای تعامل و ارزیابی نگذارد یا مشتری بسادگی در دسترس نباشد.•بنابراین با اینکه مدل فرایند نمونه سازی یک الگوی موثر در مهندسی نرم افزاراست بایستی مسایلی را در
نظر گرفت .از ابتدا قوانینی را تعریف کرد .مشتری و تولید کننده بایستی هر دو موافقت کنند که این نمونه به
عنوان مکانیزمی برای تعریف نیازها تعریف شده است .پس از آن بایستی تمام آن یا قسمتی از آن دور
انداخته شود و نرم افزار مورد نظر با در نظر گرفتن کیفیت و قابلیت نگهداری تولید شود.
•از این مدل زمانی مناسب است استفاده کنیم که نیازهای مشتری واضح و مشخص نیست و ابهام در
خواسته های کاربر وجود دارد .همچنین اگر می خواهیم واسط کاربر مناسبی داشته باشیم یا کارایی یک
الگوریتمی و ...را بررسی کبنم ،نمونه سازی می تواند استفاده شود.
نمونه سازی
وقتی نمونه نهايی ساخته شد و اهداف الزمه مثل تعيين ليست خواسته ها ونيازهای مشتری /کاربران حاصل گرديد ،می
توان از يک مدل فرايند ديگر استفاده هرد و نرم افزار را بوورت مهندس ی توليد هرد.
تعریف شی گرایی
برنامه نويس ي ش ئ گرا يا oopيك روش جديد برنامه نويس ي ميباشد كه در آن از ويژگي
ساختيافته همراه با چند ويژگيهاي قوي جديد استفاده ميشود .زبان برنامه ن ويس ي
C++امكان استفاده از oopرا به راحتي فراهم مينمايد.
در ، oopبطور كلي مساله به تعدادي زيرگروه قطعات مربوط بهم ش سته ميشود كه
ً
براي هر زير گروه codeو dataتهيه شده و نهايتا اين زيرگروهها تبديل به unitها
يا واحدهائي ميشود كه ( objectsيا اشياء) ناميده ميشوند.
انواع داده
انواع داده اي پايه
در همه زبانهاي برنامه نويس ي وجود دارند در زبان C++و C
int
float
Char
اشياي دنيا واقعي را بايد با مجموعه اي از اين متغیر ها نمايش داد
مثال :صندلي داراي ويژگي هايي مانند وزن ،ابعاد ،رنگ ،مالك ،قيمت و ...است
انواع داده
• در زبان هاي برنامه نويس ي ش ي گرا ،مي توان انواع جديد را تعريف كرد •
انواع جديد ،نوع داده انتزاعي ( )ADTناميده مي شوند •
•ويژگي هاي ()ADT
–داراي مجموعه اي از ويژگي ها است
–مجموعه اي از عمليات دارد كه روي ويژگي ها كار مي كنند
–ويژگي ها بسته بندي مي شوند
•ويژگي ها تنها توسط عمليات تعريف شده براي ADTقابل دسترس هستند
• از بیرون ADTنمي توان به طور مستقيم به ويژگي ها دسترس ي داشت
•دسترس ي از بیرون ،به صورت غیر مستقيم و از طريق عمليات تعريف شده براي ADTمم ن است
انواع داده
انواع داده
در زبان ،C++انواع داده انتزاعي با استفاده از كالس ها تعريف مي شوند
ويژگي هاي ،ADTداده هاي عضو كالس يا فيلد ها يا صفت ها گفته مي شوند
عمليات ADTتوابع يا متدهاي كالس ناميده مي شوند ،
•كالس و ش ي
–كالس ،تعريف كلي براي يك ADTاست
–ش ي ،نمونه اي از كالس است و در زبانهاي برنامه نويس ي يك نهاد زمان
اجرا است
تعریف کالس
• داده ها و توابع خصوص ي تنها درون توابع
كالس در دسترس هستند
• داده ها و توابع عمومي ،هم درون كالس و هم
بیرون كالس در دسترس هستند
داده ها و توابع خصوص ي
public:
داده ها و توابع عمومي
private:
ويژگي بخش ها حفاظت شده نیز در ار ثبري
بررس ي خواهد شد
داده ها و توابع حفاظت شده
{class ClassName
•تعريف اشيايي از نوع كالس
داده ها و توابع خصوص ي
protected:
داده ها و توابع حفاظت شده
;اشيايي از كالس{
;نام ش ي نام كالس
کالس کارمند: مثال
Class employee{
char name[26]; // داده ها و توابع به صورت پیش فرض خصوصي هستند
public:
void PutName(char *s); // توابع عمومي
void GetName(char *s);
void PutAge(double age);
double GetAge();
private:
double Age; // داده خصوصي
} em1 , em2; // تعریف شي هنگام تعریف كالس
Employee em3 , em4; // تعریف شي پس از تعریف كالس
مثال :کالس کارمند
) void employee::PutName(char *s
{
…
}
هنگام تعریف توابع كالس ،باید نام كالس
و عملگر تفكیك دامنه( )::را قبل از نام تابع بیاوریم
) void employee::GetName(char *s
{
…
}
…
سازنده های کالس
•اعضاي داده اي كالس را چگونه مي توان مقدار دهي اولیه كرد
–مي توان یك تابع با نام دلخواه و بدون پارامتر ورودي تعریف كرد
كه متغیر ها را مقدار دهي اولیه كند( مثال همه را صفر كند)
•سازنده
–كالس مي تواند تابع عضو ویژه اي به نام سازنده داشته باشد
–تابع سازنده همنام كالسي است كه در آن تعریف شده است
–هنگام ایجاد اشیایي از كالس به طور خودكار اجرا مي شود
سازنده های کالس
سازنده های کالس
سازنده با پارامتر ورودي
•سازنده با پارامتر ورودي
–سازنده ها مي توانند پارامتر ورودي داشته باشند
–معموال ،این پارامترها براي مقدار اولیه دادن به اعضاي شي به
كار
مي روند
•چند نكته
–اگر هنگام تعریف یك شي ،آن را با یك شي دیگر مقداردهي كنیم،
سازنده آن فراخواني نمي شود
سازنده کالس
سازنده کالس
سازنده با یک پارامتر
•اگر یك سازنده داراي یك پارامتر باشد ،حالت ویژه اي از
سازنده است
تفسیر مي شود )ob(iبه صورت – ،ob = iدر این حالت
–تابع سازنده با یك پارامتر ،تبدیل نوعي از پارامتر به نوع كالس
انجام مي دهد
سازنده کپی
•هنگامي كه شي یك كالس به تابع فرستاده مي شود ،یك كپي از
شي محل فراخواني در شي داخل تابع ایجاد مي شود
این كار هنگام بازگرداندن ) (returnنیز صورت مي گیرد
–ایجاد یك كپي از شي داخل تابع كه بازگردانده مي شود در شي
موقتي كه در محل فراخواني ایجاد مي شود
•چه موقع نوشتن سازنده كپي ضروري است؟
–كالس داراي آرایه پویا باشد( مانند كالالس رشته با طول متغیر )و
–توابعي وجود داشته باشند( عضو یا غیر عضو )كه اشیایي از نوع
كالس را به عنوان ورودي بگیرند یا به عنوان خروجي باز گردانند
مخربها
• مخرب
– یك تابع عضو ویژه از كالس است
– همنام با كالس است و با یك كاراكتر ~شروع مي شود
– هنگامي كه یك شي از بین مي رود به صورت خودكار فراخواني
مي شود
• هنگام پایان یافتن عمر متغیرهاي محلي در انتهاي تابع
• هنگام بكار گرفتن عملگر deleteبراي از بین بردن یك متغیر با
فضاي پویا
• نوشتن مخرب براي كالس زماني كه برخي اعضاي داده اي آن
حافظه پویا دارند ،ضروري است
کالس رشته با طول متغیر
کالس رشته با طول متغیر
کالس رشته با طول متغیر
کالس رشته با طول متغیر
آرگومان های پیش فرض
•مي توان هنگام تعریف توابع ،مقدارهاي پیش فرضي به ورودي ها
نسبت داد
–اگر هنگام فراخواني توابع ،پارامتر مربوط قید نشود ،مقدار پیش فرض به
آرگومان اختصاص مي یابد
•آرگومان هاي پیش فرض در سازنده ها
–سازنده ها مي توانند آرگومان هاي پیش فرض داشته باشند
–در این حالت ،اگر هنگام فراخواني سازنده آرگوماني به آن داده نشود ،ارزش
دهي اولیه به كالس با استفاده از مقدارهاي پیش فرض انجام مي شود
–سازنده اي كه برنامه نویس همه آرگومان هاي آن را به صورت پیش فرض
مشخص مي كند ،سازنده پیش فرض نامیده مي شود
–در هر كالس تنها یك سازنده پیش فرض مي تواند وجود داشته باشد
آرگومان های پیش فرض
آرگومان های پیش فرض
آرگومان های پیش فرض
توابع دوست
• گاهي الزم است ،یك تابع غیر عضو به اعضاي خصوصي
كالالس دسترسي داشته باشد
• دوستي :هنگامي كه یك كالس دوست یك تابع غیر عضو یا
یك كالالس دیگر است ،امكان دسترسي به اعضاي خصوصي آن
در تابع یا كالس دوست فراهم مي شود
• friend <function signature>;
• Example: friend void Print(Myclass ,int );
توابع دوست
توابع دوست
کالس های دوست
• كالس ها را نیز مي توان دوست كالس هاي دیگري
تعریف كرد
• كالس دوست و همه توابع عضو آن به اعضاي خصوصي
كالالس دیگر دسترسي دارند
• friend class Circle;
کالس های دوست
کالس های دوست
کالس های دوست
نکته مهم :
تمام زبانهاي برنامه نويس ي ش يگرا داراي سه خصوصيت مشترك زير ميباشند :
الف( encapsulation :محوورسازي)
ب( polymorphism :چندريصتي)
ج( inheritance :ارث بري)
محصورسازی () Encapsulation
محصورســازي مكــانیزمي اســت كــه codeو dataرا بهــم وصــل نمــوده و هــر دوي آنهــا
را از اسـتفادههـاي غیرمجـاز مصــون نگـه مـيدارد .شـ ي يــك مهلفـه منطقـي اسـت كــه data
و codeرا محصور نموده و codeباعث دستكاري و پردازش dataميشود.
( polymorphismچند
ریختي)
چند ريختي مشخصهاي است كه بيك وسيله امكان ميدهد كه باتعدادي از سيستمها
يا عميات يا دستگاهها ،مورد استفاده قرار گیرد.
( inheritanceارث
بري)
ارث بري فرآيندي است كه بوسيله آن يك ش ي ( )objectميتواند خاصيتهاي ش ي
ديگري را دارا شود.
پشته ()stack
پشته ساختاري است كه داراي خاصيت last in first outميباشد .پشته فضاي پيوسته در
حافظه اشغال مينمايد .عملياتي كــه روي پشته انجام ميشوند عبارتند از :
الف ، push :كه باعث ميشود يك عنصر وارد پشته شده.
ب ، pop :كه باعث ميشود يك عنصر از پشته خارع گردد.
ایجاد
شي ()object
ظاهر شبيه
نظر
بمنظور ايجاد يك ش ي بايستي از كلمة رزروشده classاستفاده نمود class .از
نظر گرفت كه dataآن شامل يك
در
ساختار يا structميباشد .پشته را بعنوان يك objectميتوان
آرايه و يك ، tosو عملياتي كه روي اين objectانجام ميشود عبارتست از ، initialize ، push
popكردن پشته.
مثال :
بدين مع ي است كه 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
:
#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 ++ ;
}
stack کامل
int stack : : pop( )
{
if(tos = = 0) {
cout << stack underflow. ;
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; }
برنامه
ارث بری
ارث بري فرآيندي است كه بوسيله آن يك ش ي ( )objectميتواند خاصيتهاي ش ي
ديگري را دارا شود.
در اسالید بعد مثالی از ارث بری آورده شده است.
: مثال
class building {
int rooms;
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 is derived from 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( );
};
هر. تعريف گرديده استbuilding اي بنام ساختمان ياobject در روبرو
از. تعدادي طبقه و سطح زير بنا نیز ميباشد،ساختمان داراي تعدادي اطاق
: طرف ديگرتوابعي كه براي ش ي تعريف شده
تعريف مينمائيم كه نه تنها دارايhouse ديگري بنامobject حال
ميباشد بل ه ًدارای دو اقالم دادهbuilding تمام اعضاي ش ي
از ش يhouse دراينجا عمال ش ي.اضافي و چهار تابع اضافي ميباشد
: ارث ميبردbuilding
نکته :
در مثال قبل buildingرا base classو houseرا derived classمی نامند .ش ي houseتمام
اعضاي buildingرا دارا است بعالوه اين ه داراي متغیرهاي عضوي اضافي baths ، bedroomsو همچنین
توابع عضوي )(get_bedrooms() ،get_baths() ،set_bebrooms() ،set_bathsنیز
ميباشد. .
سازندهها و نابودكنندهها
( constructors
)and destructors
Initializationيا مقدار اوليه دادن بصورت اتوماتيك از طريق تابعي انجام ميشود بنام
تابع constructorيا تابع سازنده .تابع سازنده تابع مخصوص ي است كه عضوي از كالس
بوده و همنام با كالس ميباشد.
سازندهها و نابودكنندهها
( constructors
)and destructors
تابع نابود كننده يا ، destructorع س عمل تابع سازنده را انجام ميدهد .وقتي كه ش ياي
از بین ميرود بصورت اتوماتيك تابع نابود كننده آن فراخواني ميگردد.
توابع
دوست ()friend functions
با استفاده از كلمة friendاين امكان وجود دارد كه به تابعي كه عضو كالس نميباشد
اجازه دسترس ي به متغیرهاي privateكالس را داد .براي آن ه تابعي را دوست اعالن
نمائيم از كلمه friendقبل از تعريف تابع استفاده مينمائيم.
در اسالید بعد مثالی آورده شده است.
: مثال
#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 ; }
نکته
:
-1كالس ي كه از كالس ديگر ارث ميبرد ،توابع دوست آن كالس را به ارث
نميبرند .بعبارت ديگر يك ، derived classتوابع دوست را به
ارث نميبرد.
-2توابع دوست داراي مشخصه نوع ذخیره نميباشند يع ي توابع دوست را
نميتوان بصورت staticيا externalتعريف نمود.
كالسهاي
دوست ()friend classes
اين امكان وجود دارد كه يك كالس دوست كالس ديگري باشد .در چنین وضعيتي تابع دوست به كليه اسامي
privateتعريف شده در كالس ديگر دسترس ي دارد.
در اسالید بعد مثالی آورده شده است.
: مثال
#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 ;
}
توابع سازنده پارامتردار
ً
امكان انتقال آرگومانها به توابع سازنده وجود دارد .معموال از اين آرگومانها براي
initializeنمودن ش ي در زمان ايجاد آن استفاده ميگردد.
در اسالید بعد مثالی آورده شده است.
: مثال
#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;
}
توابع سازنده یك پارامتري
#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 ;
}
عضوهاي static
اگر عضو دادهاي بصورت staticاعالن گردد اين بدين مع ي است كه كامپيلر
فقط يك كپي از متغیر مذكور را نگهداري نموده و تمام objectها بايستي
بصورت اشتراكي از آن كپي استفاده نمايند .براي اينكار ميبايستي از كلمه
staticقبل از اعالن عضو استفاده نمود.
در اسالید بعد مثالی آورده شده است.
: مثال
#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;
}
}
( nested classesكالسهاي
تودرتو)
ميتوان يك كالس را در يك كالس ديگر تعريف نمود .اما بعلت
اين ه در C++ب ًراي كالسها خاصيت ارث بري وجود
دارد نيازي معموال به تعريف نمودن يك كالس در ك الس
ديگر نيست
( local classesكالسهاي
محلي)
وقتي كه كالس ي در درون يك تابع تعريف ميشود اين ك الس
فقط براي آن تابع شناخته شده است و براي توابع ديگر
ناشناخته ميباشد .چنین كالس ي را كالس محلي
مينامند.
در مورد كالسهاي محلي رعايت نكات زير ضروري است :
تمام توابع عضو بايستي در درون كالس تعريف گردند.
از متغیرهاي محلي ،تابعي كه كالس در آن تعريف شده نميتواند استفاده نمايد.
از متغیرهاي عضوي staticنميتوان استفاده نمود.
استفاده از objectها بعنوان
پارامترهاي توابع
از objectها ميتوان بعنوان پارامترهاي توابع استفاده نمود و مكانیزم انتقال آرگومانها و پارامترها بصورت call by
valueميباشد.
برگشت
اشیاء ()returning objects
مقدار برگشتي يك تابع ميتواند يك objectباشد.
در اسالید بعد مثالی آورده شده است.
: مثال
#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;
}
انتساب
اشیاء ()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 ;
}
آرایه
اشیاء ()array of objects
امكان استفاده از آرايه در مورد اشياء ميباشد.
بعبارت ديگر ميتوان در برنامه ها آرايهاي از objectها
داشته باشيم.
در اسالید بعد مثالی آورده شده است.
: مثال
#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;
}
اشارهگر به اشیاء ( pointers to
)
objects
در مورد اشياء نیز از اشارهگرها نیز ميتوان استفاده نمود.
از عملگر در اين مورد استفاده ميشود.
در اسالید بعد مثالی آورده شده است.
: مثال
#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;
}
اشارهگر )this pointer( this
هر تابع عضو يك كالس داراي يك پارامتر مخفي
بنام this pointerميباشد this .اشاره به object
خاص ي مينمايد.
در اسالید بعد مثالی آورده شده است.
: مثال
#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)
{
b=base; this
e=exp; this
val =1; this
if(exp = = 0) return;
) for(; exp > 0 ; exp
b; val *this val = this this
}
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; }
توابع مجازي و پلي مرفیسم
()virtual functions
تابع مجازي ،تابعي است كه در base classتعريف شد و
بوسيله derived classتغیر داده ميشود .براي اعالن يك
تابع مجازي بايستي از كلمه virtualاستفاده نمائيم.
تغیر تابع در كالس مشتق روي تابعي كه در كالس پايه () base class
تعريف شده انجام ميشود.
در اسالید بعد مثالی آورده شده است.
#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 ; }
: مثال
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