Transcript C++
بـرنامـه سازی پیشـرفتـه
نام درس :
برنامه سازی پیشرفته ( رشته مهندسـی کامپیوتر )
تعداد واحد درسی :
3واحد
نام تهیه کننده اسالیدها :
صـالح جـوان – علـی میـر
وب سایت گروه مهندسـی نرم افزار:
WWW.SOFTWARE-ZB.IR
فهرست مطالب
فصل اول :مقدمات زبان C++
فصل دوم :ساختار های تصمیم گیری و تکرار
فصل سوم :سایر ساختار های تکرار
فصل چهارم :اعداد تصادفی
فصل پنجم :آرایه ها
فصل ششم :توابع
فصل هفتم :ساختارها و اشاره گرها
فصل هشتم :برنامه نویسی شی گرا
فصل اول
مقدمات C++
فهرست مطالب فصل اول
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
تاریخچه مختصر
قانون نامگذاری شناسه ها
متغیر ها
اعالن متغیر
تخصیص مقادیر به متغیر
داده های از نوع کرکتر
کرکتر های مخصوص
رشته ها
نمایش مقادیر داده ها
دریافت مقادیر
.11
.12
.13
.14
.15
.16
.17
.18
.19
عملگر انتساب
عملگر های محاسباتی
عملگرهای افزایش و کاهش
عملگر sizeof
عملگرهای جایگزینی محاسباتی
اولویت عملگرها
توضیحات ()Comments
توابع کتابخانه
برنامه در C++
تاریخچه مختصر C++
این زبان در اوائل دهه 1980توسط Bjarne stroustrupدر آزمایشطاا
بل طراحي شد .این زبان عمالً توسعه یافته زبان برنامه نویسي Cمي باشد كه
امكان نوشتن برنامههاي ساخت یافته شئ گرا را ميدهد.
قانون نامگذاری شناسهها
(1
حروف کوچك و بزرگ در نامگذاری شناسهها متفاوت میباشند.
بنابراین xy ، xY ، XY ، Xyچهار شناسه متفاوت
از نظر C++میباشد.
قانون نامگذاری شناسهها
)2در نامگذاری شناسهها از حروف الفباء ،ارقام وزیر خط ()underscore
استفاده میشود و حداکثر طول شناسه 31میباشد و شناسه بایستی با
یك رقم شروع نگردد.
قانون نامگذاری شناسهها
در زیر بعضي از كلمات.) براي ناماذاري شناسهها از كلمات كليدي نبایستي استفاد نمود3
.كليدي داد شد است
And
Sizeof
then
xor
Template
Float
False
Friend
While
continue
extern
Private
Switch
Default
Const
delete
typedef
if
this
Virtual
متغيرها
متغيططرم مكططاني در حافصططه ا ططلي
كامپيوتر ميباشد كطه در آناطا یطك
مقدار را ميتوان ذخير و در برنامطه
از آن استفاد نمود .قانون ناماذاري
متغيرهططا همططان قططانون ناماططذاري
شناسهها ميباشد.
در اسالید بعد به انواع داده ها اشاره می شود.
انواع داده ها
حافظه الزم
مقادیر
2بایت
32767تا –32768
2بایت
65535تا 0
4بایت
2147483647تا –2147483648
4بایت
4294967295تا 0
1بایت
یك کارکتر
1بایت
127تا –128
4بایت
3.4e38تا 1.2e-38
8بایت
1.8e308تا 2.2e-308
نوع داده
int
unsigned int
long int
unsigned long int
char
unsigned char
float
double
اعالن متغیرها
قبل از آنکه در برنامه به متغیرها مقدداری تخصدیص داده
شود و از آنها استفاده گردد بایستی آنها را در برنامه اعالن
نمود.
در اسالید بعد مثال هایی از اعالن متغیر ذکر شده است.
چند مثال از اعالن متغیر ها :
برای اعالن متغیر xاز نوع : int
;x
int
برای اعالن متغیرهای pو qرا از نوع floatکه هر کدام چهار بایت از
حافظه را اشغال میکنند :
; float p , q
برای اعالن متغیر nextاز نوع کرکتر که میتوان یکی از 256کرکتر را به
آن تخصیص داد و یك بایت را اشغال میکند.
; char next
تخصيص مقادير به متغيرها
با استفاده از عملگر = میتوان به متغیرها مقدار اولیه تخصیص نمود.
در اسالید بعد مثال هایی از اعالن متغیر ذکر شده است.
مثال :
در دستورالعمل
Xرا از نوع intبا مقدار اولیه 26اعالن نموده .
;int x=26
;long a=67000 , b=260
در دستورالعمل
متغیرهای bو aرا از نوع long intتعریف نموده با مقادیر بترتیب
260و .67000
دادههای از نوع کرکتر
برای نمایش دادههای از نوع charدر حافظه کامپیوتر از جدول
ASCIIاستفاده میشود .جدول اسکی به هر یك از 256کرکتر
یك عدد منحصر بفرد بین 0تا 255تخصیص میدهد.
کرکترهای مخصوص
كامپيلر C++بعضي از كركترهاي مخصوص كه در برنامه ميتوان از
آنها براي فرمت بندي استفاد كرد را تشخيص ميدهد .تعدادي از
این كركترهاي مخصوص به همرا كاربرد آنها در اسالید بعد آورد
شد است .
کرکترهای مخصوص
\n
Newline
\t
Tab
\b
Backspace
\a
Beep sound
\”
Double quote
\’
Single quote
\0
Null character
\?
Question mark
\\
Back slash
\ میتوان برای ایجاد صدایa بعنوان مثال از کرکتر
. استفاده نمودbeep
char
x = '\a ;
رشتهها
رشته یا stringعبارتست از دنبالهاي از كركترها كه بين " " قرار داد
ميشود .در حافصه كامپيوتر انتهاي رشتهها بوسيله \0ختم ميگردد.
در اسالید بعد به دو مثال دقت نمایید.
مثال : 1
" "BOOK STOREیك رشته د كركتري مطيباشطد
كه با توجه به كركتر \0كه به انتهاي آن در حافصه
اضافه مي شود جمعططاً یازد بایت را اشغال ميكند.
مثال : 2
دقت نمایيد كه " "wیك رشته ميباشد كه دو بایت از
حافصه را اشغال ميكند در حاليكه ' 'wیك كركتر
ميباشد كه یك بایت از حافصه را اشغال مينماید.
نمایش مقادیر دادهها
براي نمایش داد ها بر روي فحه مانتور از coutكطه بطدنبال آن عملاطر
درج یعني << قيد شد باشد استفاد ميگردد .بایستي توجه داشطت كطه
دوكركتر < پشت سر هم توس C++بصورت یك كركتر تلقي ميگردد.
مثال :
براي نمایش پيغام good morningبر روي فحه نمایش :
;"cout << "good morning
براي نمایش مقدار متغير Xبر روي فحه نمایش :
; cout << x
دریافت مقادیر متغیرها
به منصور دریافت مقادیر براي متغيرها در ضمن اجراي برنامه از فحه كليدم از cin
كه بدنبال آن عملار استخراج یعني >> قيد شد باشد ميتوان استفاد نمود.
: مثال
int x;
cout << "Enter a number:" ;
cin >> x;
عملگر انتساب
عملگر انتساب = میباشد که باعث میگردد
مقدار عبارت در طرف راست این عملگر ارزیابی
شده و در متغیر طرف چپ آن قرار گیرد.
مثال :
;x=a+b
; x=35
; x=y=z=26
از عملارهاي انتساب چندگانه نيط مطي تطوان اسطتفاد
نمود .كطه مقطدار سطه متغيطر zو yو xبرابطر بطا 26
ميشود.
عملگرهای محاسباتی
در C++پنج عملگر محاسباتی وجود دارد که عبارتند از :
+
جمع
-
تفریق
*
ضرب
/
تقسیم
%
باقیمانده
این عملگرها دو تائی میباشند زیرا روی دو عملوند عمل مینمایند .از طرف
دیگر عملگرهای +و – رامیتوان بعنوان عملگرهای یکتائی نیز در نظر گرفت.
مثال : 1
در حالتی که هر دو عملوند عملگرهای – ، + ، * ، / ، %از نوع صحیح باشد نتیجه
عمل از نوع صحیح میباشد.
نتیجه
عبارت
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
توضیحات ()Comments
توضیحات در برنامه باعث خوانائی بیشتر و درك بهتر برنامه میشود .بنابراین
توصیه بر آن است که حتی االمکان در برنامهها از توضیحات استفاده نمائیم .در
،C++توضیحات بدو صورت انجام میگیرد که در اسالیدهای بعد به آن اشاره
شده است.
توضیحات ()Comments
الف :این نوع توضیح بوسیله //انجام میشود .که کامپیوتر هر چیدزی را
که بعد از //قرار داده شود تا انتهای آن خط اغماض مینماید.
مثال :
c=a+b;//c is equal to sum of a and b
ب:توضیح نوع دوم با * /شروع شده و به */ختم میشود و هر چیزی که
بین* /و */قرار گیرد اغماض مینماید .
مثال :
/ * this is a program
to calcufate sum of
n integer numbers */
توابع کتابخانه
زبان C++مجهز به تعدادی توابع کتابخانه می باشد .بعنوان مثدال
تعدادی توابع کتابخانه برای عملیات ورودی و خروجی وجود دارند.
معموالً توابع کتابخانه مشابه ،بصورت برنامدههدای هددف (برنامده
ترجمه شده بزبان ماشین) در قالب فایلهای کتابخانه دسته بنددی و
مورد استفاده قرا رمیگیرند .این فایلها را فایلهای headerمینامند
و دارای پسوند .hمیباشند.
نحوه استفاده از توابع کتابخانه ای
برای استفاده از توابع کتابخانه خاصی بایستدددی
نام فایل headerآنرا در ابتدای برنامه در دستور
#includeقرار دهیم.
> اسم فایل < header
#include
تابع
نوع
شرح
فاي ل هي در
abs(i)
int
i ق درمطل ق
stdlib.h
cos(d)
double
math.h
exp(d)
log(d)
log10(d)
double
double
double
sin(d)
double
d ك سينوس
ex
loge d
Log10 d
d سينوس
sqrt(d)
double
d ج ذر
math.h
strlen(s)
int
s تع داد كركترهاي رشته
string.h
tan(d)
double
d تانژانت
math.h
toascii( c)
int
cك داس ك ي كركتر
stdlib.h
tolower(c )
int
تب دي ل به حروف كوچ ك
stdlib.h
toupper(c )
int
تب دي ل به حرف بزرگ
stdlib.h
math.h
math.h
math.h
math.h
برنامه در C++
اکنون باتوجه به مرالب گفته شده قادر خواهیم بود که تعدادی برنامه ساده و کوچدك بده زبدان
C++بنویسیم .برای نوشتن برنامه بایستی دستورالعملها را در تابع ) ( mainقرار دهیم و بدرای
اینکار میتوان به یکی از دو طریقی که در اسالیدهای بعد آمده است ،عمل نمود.
روش اول :
>
#include
<
) (int main
}
; دستورالعمل 1
; دستورالعمل 2
.
.
.
;دستورالعمل n
; return 0
}
روش دوم :
>
#include
<
) (void main
{
; دستورالعمل 1
; دستورالعمل 2
.
.
.
;دستورالعمل n
}
را روی صفحهC++ is an object oriented language برنامه ای که پیغام
.مانیتور نمایش می دهد
#include <iostream.h>
int main( )
{
cout <<"C++ is an object oriented language \n" ;
return 0 ;
}
.برنامه زیر یك حرف انگلیسی کوچك را گرفته به حرف بزرگ تبدیل مینماید
#include <iostream.h>
#include <stdlib. h>
int main( )
{
char c1 , c2;
cout << "Enter a lowercase letter:"
cin >> c1;
c2 = toupper(c1);
cout << c2 << endl;
return 0; }
.دو عدد از نوع اعشاری را گرفته مجموع و حاصلضرب آنها را محاسبه و نمایش میدهد
#include <iostream.h>
int main( )
{
float
x,y,s,p ;
cin >> x >> y ;
s= x+y ;
p=x*y;
cout << s <<endl << p;
return 0 ;
}
فصل دوم
ساختارهای تصمیم گیری و تکرار
فهرست مطالب فصل دوم
.1
.2
.3
.4
.5
.6
عملگر های رابره ای
عملگر شرطی
دستورالعمل شرطی
عملگر کاما
عملگر های منرقی
دستورالعمل For
عملگرهای رابطه ای
از این عملگرها برای تعیین اینکه آیا دو عدد با
هم معادلند یا یکی از دیگری بزرگتر یا کوچکتر
میباشد استفاده میگردد .عملگرهای رابرهای
عبارتند از:
مساوي
==
مخالف
=!
بزرگتر
>
بزرگتر يا مساوي
=>
كوچكتر
<
كوچكتر يا مساوي
=<
عملگر شرطی
شکل کلی عملگر شرطی بصورت زیر میباشد:
expression _ test ? expression _ true : expression _ false
عملگر شرطی تنها عملگری در C++میباشد که دارای سه عملوند میباشد.
مثال : 1
;int x=10,y=20,b
; b=(x>y) ? x : y
این دو دستور العمل باعث میشوند که ماکزیمم مقادیر yو xدر bقرار بگیرد.
مثال : 2
; "x>=10 ? cout << "passed" : cout << "failed
رشته
اگر مقدار xبزرگتر یا مساوی ده باشد رشتة passedدر غیر اینصورت
failedنمایش داده میشود.
IF
دستورالعمل شرطی
توسط این دستور شرطی را تست نموده و بسته به
آنکه شرط درست یا غلدط باشدد عکدس العمدل
خاصی را نشان دهیم.
) عبارت
(if
{
; دستورالعمل 1
.
;دستورالعمل n
}
else
{
; دستورالعمل 1
.
;دستورالعمل n
}
: 1 مثال
if(x != y)
{
cout << x ;
++ x ;
}
else
{
cout << y ;
--y;
}
:2 مثال
.برنامه زیر یك عدد اعشاری را از ورودی گرفته جذر آنرا محاسبه مینماید
#include <iostream.h>
#include <math . h>
int main( )
{
float x,s;
cin >> x ;
if( x < 0 )
cout << " x is negative" << endl ;
else
{
s = sqrt(x) ;
cout << s << endl ;
}
return 0;
}
عملگر کاما
تعدادی عبارت را می توان با کاما بهدم متصدل نمدود و
تشکیل یك عبارت پیچیدهتری را داد .این عبارتها بده
ترتیب از چپ به راست ارزیابی شدده و مقددار عبدارت
معادل عبارت nمیباشد.
(عبارت , .… , nعبارت , 3عبارت , 2عبارت )1
مثال :
اگر داشته باشیم
; int a=2 , b=4 , c=5عبارت زیر را در نظر بگیرید:
)(++ a , a+b, ++ c, c+b
مقدار عبارت برابر است با b+cکه معادل 10میباشد.
عملگرهای منطقی
با استفاده از عملگرهای منرقی میتوان شرطهای ترکیبی در برنامه ایجاد نمود.
عملگرهای منرقی عبارتست از :
AND
OR
NOT
که در C++به ترتیب بصورت زیر نشان داده میشود.
&&
||
!
جدول درستی سه عملگر شرطی
a
true
true
false
false
a
true
true
false
false
b
true
false
true
false
b
true
false
true
false
a && b
True
False
False
False
a
true
false
!a
False
True
a || b
True
True
True
False
چند مثال :
))if ((x= = 5) ||(y != 0
; cout << x << endl
اگر xبرابر با 5یا yمخالف صفر باشد مقدار xنمایش داده شود .
)if(x
;x=0
اگر مقدار xمخالف صفر باشد ،آنگاه xبرابر با صفر شود .
برنامه زیر طول سه پارهخط را از ورودی گرفته مشخص مینماید که آیا تشكیل یك مثلث میدهد یا خیر؟
#include
< iostream.h >
int main( )
{
float a, b, c;
cout << "Enter three real numbers" << endl ;
cin >> a >> b >> c; //
if(( a < b + c) &&(b < a+c) &&(c < a+b))
cout << "It is a triangle" ;
else
cout << "Not a triangle" ;
return 0 ;
}
دستورالعمل For
از دستور العمل forبرای تکرار دستورالعملها استفاده میشود .شکل کلی دستور
forبصورت زیر میباشد:
(عبارت ; 3عبارت ; 2عبارت for )1
{
; دستورالعمل 1
; دستورالعمل 2
.
.
.
;دستورالعمل n
}
. را از ورودی گرفته فاکتوریل آنرا محاسبه ونمایش میدهد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 ; }
را روی ده خط نمایش میدهد9 تا0 ارقام
دستورالعمل break
این دستورالعمل باعث توقف دستورالعملهای تکرار( )for , while ,do whileشده و
کنترل به خارج از این دستورالعملها منتقل مینماید.
: 1 مثال
#include <iostream.h>
int main( )
{
float x, s=0.0 ;
cin >> x ;
while(x <= 1000.0) {
if(x < 0.0){
cout << "Error-Negative Value" ;
break;
}
s += x ;
cin >> x ;}
cout << s << endl ;
return 0 ; }
:2 مثال
#include <iostream.h>
int main( )
{
int count = 0 ;
while( 1 )
{
count ++ ;
if(count > 10 )
break ;
}
cout << "counter : " << count << "\n";
return 0 ;
}
:3 مثال
#include <iostream.h>
void main( )
{
int count;
float x, sum = 0;
cin >> x ;
for(count = 1; x < 1000 . 0; ++ count )
{
cin >> x ;
if(x < 0.0) {
cout << "Error – Negative value " <<endl;
break ;
}
sum += x ; }
cout << sum << \n ; }
:4 مثال
#include <iostream.h>
int main( )
{
float x , sum = 0.0 ;
do
{
cin >> x ;
if(x < 0.0)
{
cout << "Error – Negative Value" << endl ;
break ;
}
sum += x ;
} while(x <= 1000.0);
cout << sum << endl ;
return 0 ; }
دستورالعمل continue
از دستورالعمل continueمی توان در دستورالعملهای تکرار
for ، while ، do whileاستفاده نمدود .ایدن دسدتورالعمل
باعث می شود که کنترل بابتدای دستورالعملهای تکدرار منتقدل
گردد.
: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 ; }
: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 ;
}
دستورالعمل switch
همانرور که می دانید از دستورالعمل شرطی( )if elseمی توان بصورت تودرتو
استفاده نمود ولی از طرفی اگر عمق استفادة تو در تو از این دستورالعمل زیداد
گردد ،درك آنها مشکل میشود .برای حدل ایدن مشدکل ، C++دسدتورالعمل
switchکه عمالً یك دستورالعمل چند انتخابی میباشد را ارائه نموده است.
Switch شكل کلی دستور العمل
switch()عبارت
{
case valueone : statement;
break;
case
valuetwo: statement;
break;
case
valuen : statement;
break;
default: statement ;
}
#include <iostream.h>
void main( )
{
unsigned int n ;
cin >> n;
switch(n)
{
case 0:
cout << "ZERO" << endl ;
break;
case 1:
cout << "one" << endl ;
break ;
case 2:
cout << "two" << endl ;
break;
default :
cout << "default" << endl;
}
/ * end of switch statement * /
}
: 1 مثال
#include <iostream.h>
void main( )
{
unsigned int n;
cin >> n ;
switch(n) {
case 0 :
case 1:
case 2:
cout << "Less Than Three" << endl;
break;
case 3:
cout << "Equal To Three" << endl ;
break;
default:
cout << "Greater Than Three" << endl;
}
}
: 2 مثال
تابع )(: cin.get
این تابع یك کرکتر را از صفحه
کلید میگیرد .برای استفاده از این
تابع در ابتدای برنامه بایستی داشته
باشیم:
#include
><iostream.h
قرعه برنامه ذیل یك کرکتر را از صفحه کلید گرفته و نمایش میدهد.
char
;x
;) (x = cin.get
; cout << x
برنامة ذیل یك سرر متن انگلیسی که به CTRL Zختم میشود را گرفته دقیقاً نمایش میدهد.
><iostream.h
#include
) (int main
{
;char x
)while((x = cin.get( ) !=EOF
; cout << x
; return 0
}
EOFبه معنی End of Fileمیباشد کده در
iostream.hتعریف شده و مقدار آن برابر بدا
-1میباشدد .مقددار آن در سیسدتم عامدل
DOSعبارتست از . ctrl z
. استفاده شده استswitch و دستورcin.get() در قطعه برنامه ذیل ازتابع
char
x;
x = cin.get( );
switch(x) {
case r :
case R :
cout << RED << \n ;
break ;
case b :
case B :
cout << BLUE << endl ;
break ;
case y :
case Y :
cout << YELLOW << endl;
}
.) آنرا حذف نموده و نمایش میدهدblank( برنامة ذیل یك سرر متن انگلیسی را گرفته کرکترهای خالی
#include
<iostream.h>
int main( )
{
char next;
while((next = cin.get( ) ) !=EOF)
if(next != )
cout << next ;
return 0 ;
}
عملگر static_cast
از این عملگر برای تبدیل موقت یك نوع dataبه نوع دیگر
استفاده میشود .این عملگر یك عملگر یکتائی میباشد.
مثال :1
; int x = 25
; float y
y = static_cast
; )< float >(x
مقدار xموقتاً بصورت اعشداری در
می آید و در نتیجه مقدار yبرابدر بدا
25.0می شود .بایستی توجه داشدت
که نوع متغیر xعوض نمی شود بلکده
موقتاً مقدار آن بصدورت اعشداری در
آمده است.
مثال :2
; float x = 14.75
<< cout
static_cast < int
;>(x) << endl
; cout << x
ابتدا مقدار 14نمایش داده میشود و
سددپس مقدددار 14.75نمددایش داده
میشود.
جدول اولویت عملگرها
(
چ پ به راس ت
راس ت به چ پ
)
sizeof
-
+
Static_cast < >( ) ++
--
چ پ به راس ت
* / %
چ پ به راس ت
+ -
چ پ به راس ت
چ پ به راس ت
<<
>>
=> > =<
چ پ به راس ت
=!
==
راس ت به چ پ
:
?
راس ت به چ پ
چ پ به راس ت
=-
=*= /= %
,
<
=+
=
فصل چهارم
اعداد تصادفی
فهرست مطالب فصل چهارم
.1
.2
.3
.4
تولید اعداد تصادفی
تعریف نوع داده ( ) typedef
داده های از نوع شمارشی
فرمت های مختلفه مقادیر خروجی
اعداد تصادفی
مقادیر تصادفی یا شانسی در اکثر برنامدههدای کداربردی در زمینده شدبیه سدازی و بازیهدای
کامپیوتری نقش مهمی را ایفا مینمایند .برای ایجاد یك عدد تصادفی صدحیح بدین 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آرایه دو بعدی ( ماتریس ها )
آرایه یك بعدی
آرایه یك فضای پیوسته از حافظه اصلی کامپیوتر میباشد که میتواند
چندین مقدا را در خود جای دهد.
کلیه عناصر یك آرایه از یك نوع میباشند.
عناصر آرایه بوسیله اندیس آنها مشخص میشوند.
در ، 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
ستون
3
ستون
2
ستون
1
ستون
0
]a[0][3
]a[0][2
]a[0][1
]a[0][0
سرر
0
]a[1][3
]a[1][2
]a[1][1
]a[1][0
سرر
1
]a[2][3
]a[2][2
]a[2][1
]a[2][0
سرر
2
تخصیص مقادیر اولیه به عناصر آرایه :
; } }int a[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12
3
2
1
0
4
3
2
1
0
8
7
6
5
1
12
11
10
9
2
int a[3][4]= { {1}, {2,3} , {4,5,6} } ;
0
1
2
3
0
1
0
0
0
1
2
3
0
0
2
4
5
6
0
int a[3][4]= {1, 2, 3, 4,5 } ;
0
1
2
3
0
1
2
3
4
1
5
0
0
0
2
0
0
0
0
در یك آرایة دواندیسی ،هر سرر ،در حقیقت آرایهای یك اندیسی است .در
اعالن آرایههای دواندیسی ذکر تعداد ستونها الزامی است.
;}int a[ ][4]={1,2,3,4,5
3
2
1
0
4
3
2
1
0
0
0
0
5
1
. را گرفته مجموع عناصر آن را مشخص نموده و نمایش میدهد3*4 برنامه زیر یك ماتریس
#include <iostream.h>
#include <conio.h>
int main( )
{
float x[3][4], total= 0.0;
int i, j ;
// generate matrix x.
for(i=0; i<3; ++i)
for (j=0; j<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
احضار بوسیله مقدار ( ) Call By Value
aدر main
20
aدرmodify
20
aدرmodify
40
در این نوع احضدار تدابع حافظده هدای مدورد
اسدددددتفاده آرگومانهدددددا و پارامترهدددددا
از هم متمایزند و هرگونه تغییدر در پارامترهدا
باعددددددددددددددث تغیددددددددددددددر
در آرگومانهای متناظر نمیگردد.
>#include <iostream.h
)int modify(int
) (int main
{
;int a=20
;cout << a << endl
; )modify(a
;cout << a << endl
; return 0
}
)int modify(int a
{
;a *= 2
;cout << a << endl
; return
}
هر زمان که نوع مقدار برگشتی تابع 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)
{
if(n = = 1 || n= = 2)
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( )
x
{
int x=5, y=10;
5
cout << x << endl << vfunct(x) << endl << x << endl ;
cout << y << endl ;
rfunct(y) ;
cout << y << endl ;
.تغییر نمی کندx مقدار آرگومان
return 0 ;
}
int vfunct(int a)
{
return a *= a ;
}
x
void rfunct(int &b)
5
{
b *= b ;
}
: مثال
y
10
: خروجی
5
25
5
10
y b
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 ;
w=x+y;
cout << endl << w << enld;
return x%y ;
}
int main( )
{
int a, b, c, d;
cin >> a >> b ;
c=functa(a, b) ;
d=functa(w, b+1);
cout << endl << c << endl << d << endl << w ;
return 0 ;
}
: مثال
بایستی توجه داشت که اگر در
توابددع بدده متغیرهددای از نددوع
مقدددددار اولیددددهexternal
تخصیص ندهیم مقددار صدفر
بصورت اتوماتیك برای آنها در
.نظر گرفته میشود
وقتی متغیری از نوع registerاعالن میشود از کامپیوتر عمالً درخواست
میشود که به جای حافظه از یکی از رجیسترهای موجود استفاده نماید.
کاربرد کالس register
معموالً از نوع رجیستر برای شاخصهای دستور تکرار و یا اندیسهای آرایهها
استفاده میشود .بایستی توجه داشت که متغیرهای از نوع رجیستر قابل استفاده
دردستور cinنمیباشند
سربارگذاری توابع ()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
رشته ها و توابع مربوطه
ساختارها
ساختارها شبیه آرایهها بوده بدین صورت که یك نوع داده گروهی است که فضای
پیوسته از حافظه اصلی را اشغال مینماید .اما عناصر ساختار الزاماً از یك نوع
نمیباشند بلکه اعضای یك ساختار میتوانند از نوعهای مختلفه از قبیل ، char
… ، float ، intباشند.
تعریف ساختار
نام ساختار
struct time
{
int hour ; // 0 – 23
int minute ; // 0 – 59
int second; //
};
اعضا ساختار
مثال :
{ struct account
; int acc_no
;char acc_type
; ]char name[80
; float balance
;}
ساختار accountدارای چهار عضو میباشد.
acc_noشماره حساب از نوع int
acc_typeنوع حساب از نوع char
مشخصات صاحب حساب از نوع رشتة 80کرکتری
name
balanceمانده حساب از نوع float
: به دو صورت می توان اعالن یك متغیر از نوع ساختار را نمایش داد
: روش اول
struct account {
int acc_no;
char acc_type;
char name[80];
float balance;
} cust1, cust2, cust3;
: روش دوم
struct account {
int acc_no ;
char acc_type;
char name[80];
float balance;
};
account cust1, cust2, cust3;
به ساختارها میتوان مقدار اولیه نیز تخصیص داد
;}account cust = {4236, r, Nader Naderi , 7252.5
دسترسی به عناصر یك ساختار
.
بمنظور دسترسی به عناصر یك ساختار از عملگر استفاده
میگردد .عملگر .جزء عملگرهای یکتائی میباشد.
: مثال
cust .acc_no = 4236
cust .acc_type = r
cust . name = Nader Naderi
cust . balance = 7252.5
: نكته
.عضو یك ساختار خود میتواند یك ساختار دیگر باشد
struct date {
int month;
int day;
int year;
};
struct account {
int acc_no ;
char acc_typer;
char name[80];
float balance ;
date lastpay ; };
اگرداشته باشیم
account x, y ;
بوسیلهlastpay آنگاه عضو
x.lastpay.day
x.lastpay.month
x.lastpay.year
.مشخص میگردد
نكته :
میتوان آرایهای تعریف نمود که هر عضو آن یك ساختار باشد و حتی به آنها مقادیر اولیه تخصیص نمود.
{ struct struc1
;]char name[40
;int pay1
; } ;int pay2
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 ;
}
x = a + ib
i2= -1 بروریکه
y = c + id
x+y =(a+c) + i(b+d)
union
unionاز نظر ساختاری شبیه structمی باشد .با این تفاوت که عضدوهائی
که تشکیل unionمیدهد همگی از حافظه مشدترکی در کدامپیوتر اسدتفاده
مینمایند .بنابراین استفاده از unionباعث صرفهجوئی در حافظه میگردد.
مثال :
union id
{
;]char color [10
;int size
;} x , y
هر کدام از متغیرهای xو yیك رشته
10کرکتری یا یك مقدار از نوع int
میباشد وکامپیوتر یك بلوك حافظه که
بتواند رشته 10کرکتری رادر خود جای
دهد ،برای colorو sizeدر نظر
میگیرد.
: مثال
union xpq
{
int x ;
char y[2] ;
}p;
x
باي ت دوم
y[1]
باي ت اول
y[0]
اشارهگرها ()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
x
px
26
حال اگر دستور العمل ; x += 10را بدهیم :
x
px
36
حال اگر دستورالعمل ; *px = *px + 7بدهیم.
x
43
px
; x = 26
; px = &x
آرایه یك بعدی و اشاره گرها
x
اولین عنصر آرایه بوسیله ] x[0مشخص میشود.
آدرس اولین عنصر آرایه بوسیله ] &x[0یا بوسیله xمشخص میشود.
آدرس iامین عنصر آرایه بوسیله ] &x[i-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
در برنامه زیر یك آرایه5 عنصری از نوعint ایجاد شده و مقادیر عناصر آرایه را به چهار طریق نمایش
.میدهد
#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باشد مقدار صفر و اگر رشته s1کوچکتر از رشته s2باشد یك مقدار
منفی در غیر اینصورت یك مقدار مثبت بر میگرداند.
تابع ) strcmp(s1, s2
رشتههای s1و s2را با هم مقایسه نموده اگر s1برابر با s2باشد مقدار صفر و اگر رشته
s1کوچکتر از رشته s2باشد یك مقدار منفی در غیر اینصورت یك مقدار مثبت
برمیگرداند.
تابع ) strncmp(s1, s2,n
حداکثر nکرکتر از رشتة s1را با nکرکتر از رشتة s2مقایسه نموده در صورتیکه s1
کوچکتر از s2باشد یك مقدار منفی ،اگر s1مساوی با s2باشد مقدار صفر در غیر
اینصورت یك مقدار مثبت برمیگرداند.
تابع (strcat(s1, s2
دو رشتة s1و s2را بعنوان آرگومان گرفته رشتة s2را به انتهای رشتة s1اضافه
مینماید .کرکتر اول رشتة s2روی کرکتر پایانی \0رشتة s1نوشته میشود ونهایتاً
رشتة s1را برمیگرداند.
تابع (strncat(s1, s2,n
دو رشته s1و s2ومقدار صحیح و مثبت nرا بعنوان آرگومان گرفته ،حداکثر nکرکتر
از رشتة s2را در انتهای رشتة s1کپی مینماید .اولین کرکتر رشته s2روی کرکتر
پایانی \0رشتة s1مینویسد ونهایتاً مقدار رشتة s1را برمیگرداند.
تابع (strlen(s
رشتة sرا بعنوان آرگومان گرفته طول رشته را مشخص مینماید.
تابع (strlen(s
رشتة sرا بعنوان آرگومان گرفته طول رشته را مشخص مینماید.
تابع )strcpy(s1,s2
دو رشتة s1و s2را بعنوان آرگومان گرفته رشتة s2را در رشتة s1کپی مینماید و
نهایتاً مقدار رشتة s1را بر میگرداند.
تابع (strncpy(s1, s2,n
دو رشتة s1 , s2و مقدار صحیح و مثبت nرا بعنوان آرگومان گرفته ،حداکثر nکرکتر
را از رشتة s2در رشتة s1کپی نموده ،نهایتاً مقدار رشتة 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
.3
.4
.5
.6
.7
.8
.9
.10
.11
تعریف شی گرایی
چند ریختی ()polymorphism
خاصیت ارث بری
پشته ()stack
ایجاد شی
ارث بری
سازنده ها و نابود کننده ها
توابع دوست
کالس های دوست
توابع سازنده پارامتر دار
توابع سازنده یك پارامتری
.12
.13
.14
.15
.16
.17
.18
.19
.20
.21
عضوهای static
کالسهای تودرتو
کالس های محلی
استفاده از objectها بعنوان
پارامترهای تابع
برگشت اشیاء
انتساب اشیاء
آرایه اشیاء
اشاره گر به اشیاء
اشاره گر this
توابع مجازی و پلی مرفیسم
تعریف شی گرایی
برنامه نویسی شئ گرا یا oopیك روش جدید برنامه
نویسی میباشد که در آن از ویژگی
ساختیافته همراه با چند ویژگیهای قوی جدید استفاده
میشود .زبان برنامه نویسی C++امکان استفاده از oop
را به راحتی فراهم مینماید.
تعریف شی گرایی
در ، oopبرور کلی مساله به تعدادی زیرگروه قرعات
مربوط بهم شکسته میشود که برای هر زیر گروه codeو
dataتهیه شده و نهایتاً این زیرگروهها تبدیل به unitها
یا واحدهائی میشود که ( objectsیا اشیاء) نامیده
میشوند.
نكته مهم :
تمام زبانهای برنامه نویسی شیگرا دارای سه
خصوصیت مشترك زیر میباشند :
الف( encapsulation :محصورسازی)
ب( polymorphism :چندریختی)
ج( inheritance :ارث بری)
محصورسازی () Encapsulation
محصورسازی مکانیزمی است که codeو dataرا بهم وصل نموده و هر دوی آنها را از استفادههای
غیرمجاز مصون نگه میدارد .شی یك مؤلفه منرقی اسدت کده dataو codeرا محصدور نمدوده و
codeباعث دستکاری و پردازش dataمیشود.
( polymorphismچند ریختی)
چند ریختی مشخصهای است که بیك وسیله امکان میدهد که باتعدادی
از سیستمها یا عمیات یا دستگاهها ،مورد استفاده قرار گیرد.
( inheritanceارث بری)
ارث بری فرآیندی است که بوسیله آن یك شی ( )objectمیتواند
خاصیتهای شی دیگری را دارا شود.
پشته ()stack
پشته ساختاری است که دارای خاصیت last in first out
میباشد .پشته فضای پیوسته در حافظه اشغال مینماید .عملیاتی
کدده روی پشته انجام میشوند عبارتند از :
الف ، push :که باعث میشود یك عنصر وارد پشته شده.
ب ، pop :که باعث میشود یك عنصر از پشته خارج گردد.
ایجاد شی ()object
بمنظور ایجاد یك شی بایستی از کلمة رزروشده
classاستفاده نمود class .از نظر ظاهر شبیه
ساختار یا structمیباشد .پشته را بعنوان یك
objectمیتوان در نظر گرفت که dataآن شامل
یك آرایه و یك ، tosو عملیاتی که روی این
objectانجام میشود عبارتست از ، push
pop ، initializeکردن پشته.
در اسالید بعد مثالی از نحوه ایجاد شی آورده شده است.
مثال :
بدین معنی است که stckو tos
بوسیله توابعی که عضو object
نباشند غیر قابل دسترسی
هستند .و این یکی از روشهای
محصور سازی اقالم دادههاست.
بدین معنی است که بوسیله سایر
قرعات برنامه قابل دسترسی
میباشد.
#define SIZE 100
// this creates the class stack.
{ class stack
private :
;]int stck[SIZE
;int tos
public:
;) (void init
;)void push(int i
;) (int pop
;}
نكته :
فقط توابع عضو میتوانند به متغیرهای عضو از نوع private
دسترسی داشته باشند .بایستی توجه داشت که اگر نوع عضوی
مشخص نگردد آن عضو به صورت اتوماتیك privateمی باشد.
نحوه تعریف تابع عضو یك کالس
)void stack : : push(int i
{
{ ) if(tos = = SIZE
;cout << stack is full.
;return
}
; stck[tos]= i
; tos ++
}
عملگر : :مشخص مینماید که تابع متعلق به کدام objectمیباشد .عملگر : :عملگر
scope resolutionنامیده میشود.
: stack برنامه کامل
#include <iostream.h>
#define SIZE 100
// this creates the class stack.
class stack {
int stck[SIZE];
int tos;
public:
void init(int i);
int pop( );
void push(int i);
};
void stack : : init( )
{
tos = 0 ;
}
void stack : : push(int i)
{
if(tos = = size) {
cout << stack is full. ;
return ;
}
stck[tos] = i ;
tos ++ ;
}
int stack : : pop( )
{
if(tos = = 0) {
cout << stack 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 دارای تمام اعضای شی
دراینجا عمالً شی.داده اضافی و چهار تابع اضافی میباشد
: ارث میبردbuilding از شیhouse
نكته :
در مثال قبل buildingرا base classو houseرا derived classمی نامند .شی
houseتمام اعضای buildingرا دارا است بعالوه اینکه دارای متغیرهای عضوی اضافی
baths ، bedroomsو همچنین توابع عضوی )(،set_bebrooms() ،set_baths
)(get_bedrooms() ،get_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کالسهای محلی)
وقتی که کالسی در درون یك تابع تعریف میشود این
کالس فقط برای آن تابع شناخته شده است و برای
توابع دیگر ناشناخته میباشد .چنین کالسی را کالس
محلی مینامند.
در مورد کالسهای محلی رعایت نكات زیر ضروری است :
.1
.2
.3
تمام توابع عضو بایستی در درون کالس تعریف گردند.
از متغیرهای محلی ،تابعی که کالس در آن تعریف شده نمیتواند استفاده نماید.
از متغیرهای عضوی 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)
{
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; }
: مثال
توابع مجازی و پلی مرفیسم ()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