Transcript C++
برنامه سازی پیشرفته
نام درس :
برنامه سازی پیشرفته
استاد :مهندس کاری
نمونه پروژه پایان ترم
.1پروژه کتابخانه مجازی در C++بکمک (structureساختار)
امکانات این پروژه به شرح زیر می باشد:
-1درج عضو و کتاب
-2ویرایش عضو و کتاب
-3جستجو...
-4مرتب سازی......
-5حذف عضو و کتاب
-6امانت دادن کتاب
-7تحویل کتاب با محاسبه دیر کرد و جریمه
-8گزارشگیری
-9ذخیره در فایل
نمونه پروژه پایان ترم
.1پروژه کتابخانه مجازی در C++بکمک (classکالس)
امکانات این پروژه به شرح زیر می باشد:
-1درج عضو و کتاب
-2ویرایش عضو و کتاب
-3جستجو...
-4مرتب سازی......
-5حذف عضو و کتاب
-6امانت دادن کتاب
-7تحویل کتاب با محاسبه دیر کرد و جریمه
-8گزارشگیری
-9ذخیره در فایل
سازمان کامپیوتر
-1واحد ورودی
-2واحد خروجی
-3واحد حافظه
-4واحد محاسبه و منطق
-5واحد پردازش مرکزی
-6واحد حافظه ثانویه
انواع زبانهای برنامه نویسی
• زبانهای ماشین
• زبانهای اسمبلی
• زبانهای سطح باال
زبانهای ماشین
•
•
•
•
وابسته بودن به سخت افزار
وجود مشکل در فهم و درک آن
دشوار بودن خطایابی
جمع دو متغیر و قراردادن نتیجه در متغیر سوم
زبانهای اسمبلی
• استفاده از کلمات بجای اعداد
• اسمبلر
• جمع دو متغیر و قراردادن نتیجه در متغیر سوم
زبانهای سطح باال
•
•
•
•
استفاده از کلمات ،عالیم و نمادهای محاوره
کامپایلر
سهولت کارکردن و خطایابی
جمع دو متغیر و قراردادن نتیجه در متغیر سوم
الگوریتم
• لیست مرتبی از مراحل عملیاتی که اجرای مرتب آنها منجر به حل
مساله گردد
• الگوریتم تعویض چرخ پنچر
الگوریتم(ادامه)
مثال:الگوریتمی بنویسید که دو عدد را از ورودی دریافت نموده و مشخص نماید که مجموع دو عدد بزرگتر از 20میباشد
الگوریتم(ادامه)
•
مثال:الگوریتمی بنویسید که مجموع اعداد طبیعی مضرب 7و کوچکتر از 50را حساب نماید
الگوریتم(ادامه)
•
مثال:الگوریتمی بنویسید که 1000عدد را از ورودی دریافت نموده و کوچکترین را چاپ نماید.
الگوریتم(ادامه)
•
مثال:الگوریتمی بنویسید که سه عدد را دریافت نموده و مشخص نماید که این اعداد میتوانند اضالع مثلث باشند؟
فلوچارت
• روش تصویری و استاندارد نمایش الگوریتم
•
بیضی افقی برای نمایش شروع و پایان عملیات
•
مستطیل برای نمایش مراحل پردازشی
•
لوزی برای نمایش مراحل تصمیم گیری
•
متوازی االضالع برای نمایش ورودی و خروجی
فلوچارت(ادامه)
• مثال :فلوچارت الگوریتم اضالع مثلث
تمرینات
•
فلوچارتي رسم نمائيد كه ضرايب يك معادله درجه دوم را از ورودي دريافت كرده ،ريشههاي
آن را محاسبه در خروجي چاپ كند.
•
فلوچارتي رسم كنيد كه سه عدد c , b, aرا از ورودي دريافت كرده ،محتويات آنها را جابجا
نموده ،حاصل را در خروجي چاپ كند.
•
فلوچارتي رسم نمائيد كه ،n , xدو عدد صحيح مثبت را از ورودي دريافت كرده سپس xبه
توان nرا محاسبه كند.
•
فلوچارتي رسم نمائيد كه دو عدد از ورودي دريافت كرده ،سپس محتويات دو عدد را بدون
استفاده از متغير كمكي جابجا كند.
•
فلوچارتي رسم كنيد كه عددي را از ورودي دريافت كرده سپس تعداد ارقام آن را شمرده در
خروجي چاپ نمايد.
فهرست مطالب
فصل اول :مقدمات زبان 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بايت
يك كاراكتر
char
1بايت
127تا –128
unsigned char
4بايت
3.4e38تا 1.2e-38
8بايت
1.8e308تا 2.2e-308
int
unsigned int
long int
unsigned long int
float
double
اعالن متغیرها
قبل از آنكه در برنامه به متغيرها مقدداري تخصديص داده
شود و از آنها استفاده گردد بايستي آنها را در برنامه اعالن
نمود.
در اساليد بعد مثال هايي از اعالن متغير ذكر شده است.
چند مثال از اعالن متغیر ها :
براي اعالن متغير xاز نوع : int
;x
int
براي اعالن متغيرهاي pو qرا از نوع floatكه هر كدام چهار بايت از
حافظه را اشغال ميكنند :
; float p , q
براي اعالن متغير nextاز نوع كاراكتر كه ميتوان يكي از 256كاراكتر را
به آن تخصيص داد و يك بايت را اشغال ميكند.
; Char next
تخصيص مقادير به متغيرها
با استفاده از عملگر = ميتوان به متغيرها مقدار اوليه تخصيص نمود.
در اساليد بعد مثال هايي از اعالن متغير ذكر شده است.
مثال :
در دستورالعمل
Xرا از نوع intبا مقدار اوليه 26اعالن نموده .
;int x=26
;long int 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
; ’cout << ‘x
مثال :
مثال :
دریافت مقادیر متغیرها
به منظور دریافت مقادیر برای متغیرها در ضمن اجرای برنامه از فحه کلید ،از cin
که بدنبال آن عملگر استخراج یعنی >> قید شده باشد میتوان استفاده نمود.
: مثال
int x;
cout << "Enter a number:" ;
cin >> x;
عملگر انتساب
عملگر انتساب = ميباشد كه باعث ميگردد
مقدار عبارت در طرف راست اين عملگر ارزيابي
شده و در متغير طرف چپ آن قرار گيرد.
مثال :
;x=a+b
; x=35
; x=y=z=26
از عملگرهای انتساب چندگانه نیطز مطی تطوان اسطتفاده
نمود .کطه مقطدار سطه متغیطر zو yو xبرابطر بطا 26
میشود.
تمرینات
-1فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده ،سري فيبونداچي قبدل از آندرا توليدد
نمايد.
-2فلوچارتي رسم نمائيد كه دو عدد N , Mرا از ورودي خوانده ،بزرگترين مقسومعليده مشدتر
دو عدد را محاسبه و چاپ كند.
-3فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده مقلوب عدد را محاسبه و در خروجي
چاپ كند.
عملگرهای محاسباتی
در 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=10
عملگر 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
d
math.h
exp(d)
log(d)
log10(d)
double
double
double
math.h
math.h
math.h
sin(d)
double
ex
loge d
Log10 d
d
sqrt(d)
double
strlen(s)
int
tan(d)
double
toascii( c)
int
tolower(c )
int
stdlib.h
toupper(c )
int
stdlib.h
d
s
math.h
math.h
string.h
d
c
math.h
stdlib.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;
}//end of main
.دو عدد از نوع اعشاری را گرفته مجموع و حاصلضرب آنها را محاسبه و نمایش میدهد
#include <iostream.h>
int main( )
{
float
x,y,s,p ;
cout <<“Enter 2 float number\n”;
cin >> x >> y ;
s = x+y ;
p =x*y;
cout << s << endl << p;
return 0 ;
}
فصل دوم
ساختارهاي تصميم گيري و تكرار
فهرست مطالب فصل دوم
.1
.2
.3
.4
.5
عملگر هاي رابره اي
عملگر شرطي
دستورالعمل شرطي
عملگر هاي منرقي
دستورالعمل For
عملگرهای رابطه ای
از اين عملگرها براي تعيين اينكه آيا دو عدد با
هم معادلند يا يكي از ديگري بزرگتر يا كوچكتر
ميباشد استفاده ميگردد .عملگرهاي رابرهاي
عبارتند از:
مساوي
==
مخالف
=!
بزرگتر
>
بزرگتر يا مساوي
=>
كوچكتر
<
كوچكتر يا مساوي
=<
عملگرهای رابطه ای
عملگر شرطی
شكل كلي عملگر شرطي بصورت زير ميباشد:
عملگر شرطي تنها عملگري در C++ميباشد كه داراي سه عملوند ميباشد.
مثال : 1
;int x=10, y=20, b
; b=(x>y) ? x +1: y
اين دو دستور العمل باعث ميشوند كه ماكزيمم مقادير yو xدر bقرار بگيرد.
مثال : 2
; "x>=10 ? cout << "passed" : cout << "failed
رشته
اگر مقدار xبزرگتر يا مساوي ده باشد رشتة passedدر غير اينصورت
failedنمايش داده ميشود.
مثال : 2
IF
دستورالعمل شرطی
توسط اين دستور شرطي را تست نموده و بسته به
آنكه شرط درست يا غلدط باشدد عكدس العمدل
خاصي را نشان دهيم.
)عبارت شرطي (
if
{
; دستورالعمل 1
.
;دستورالعمل n
}
مثال : 1
مثال :3
دستورالعمل شرطی
IF-ELSE
توسط اين دستور شرطي را تست نموده و بسته به
آنكه شرط درست يا غلدط باشدد عكدس العمدل
خاصي را نشان دهيم.
)عبارت شرطي (
if
{
; دستورالعمل 1
.
;دستورالعمل n
}
else
{
; دستورالعمل 1
.
;دستورالعمل n
}
:1 مثال
If (x != y)
{
cout << x ;
++ x ;
}
else
{
cout << y ;
--y;
}
:2 مثال
مثال :3
مثال:4
برنامه زير عددي را از ورودي دريافت نموده و مثبت ،منفي و يا صفر بودن آن را مشخص مينمايد.
:5 مثال
.برنامه زير يك عدد اعشاري را از ورودي گرفته جذر آنرا محاسبه مينمايد
#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;
}
عملگرهای منطقی
با استفاده از عملگرهاي منرقي ميتوان شرطهاي تركيبي در برنامه ايجاد نمود.
عملگرهاي منرقي عبارتست از :
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 ;
}
اولویت عملگرهای رابطه ای،منطقی و شرطی
ارزيابي مقدار يك عبارت منرقي براساس جدول اولويت عملگرها انجام ميگردد .در ذيل جدول اولويت
عملگرها براساس بترتيب از بيشترين اولويت به كمترين اولويت داده شده است.
) (
NOT
!
<
OR AND
=<
==
>
=!
&&
=>
||
:
اولویت عملگرهای رابطه ای،منطقی و شرطی(مثال)
دستورالعمل For
از دستور العمل forبراي تكرار دستورالعملها معموال زماني كه تعداد تكرار از قبل
مشخص باشد استفاده ميشود .شكل كلي دستور forبصورت زير ميباشد:
( افزايش و يا كاهش مقدار شمارنده ; شرط حلقه ; تعريف متغير شمارنده و تعيين مقدار اوليه ) for
{
; دستورالعمل 1
; دستورالعمل 2
.
.
.
;دستورالعمل n
}
for عملكرد ساختار تكرار
(≠
)بعد0)اجرا ( از اجراي دوم به
) فقط در شروع حلقهfalse
(true
=(? اجرا
for (<exp1>;<exp2>;<exp3>) {
<statement 1>
<statement 2>
…
<statement n>
}
<next statement>
برنامه زير ارقام 1تا 5را نمايش ميدهد.
مثال (ادامه)
. را نمايش ميدهد9 تا0 برنامه زير ارقام
#include <iostream.h>
int main( )
{
int j=0 ;
for( ; j <= 9 ; ) cout << j++ << endl;
return 0 ;
}
برنامه زير مجموع اعداد زوج 1تا 100را نمايش ميدهد.
برنامه زير عددي را از ورودي دريافت كرده و 2به توان آن عدد را محاسبه نموده و نمايش ميدهد.
برنامه زير يك جدول ضرب 5*5را نمايش ميدهد.
برنامه زير مجموع اعداد صحيح و متوالي بين 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
}
. را از ورودي گرفته فاكتوريل آنرا محاسبه ونمايش ميدهد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 ;
}
. ايجاد ميشوند را نمايش ميدهد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را حل نماید.
.2برنامه ای بنویسید که یک عدد 5رقمی را از ورودی خوانده،
مجموع ارقام آن عدد را چاپ نماید.
فصل سوم
ساير ساختارهاي تكرار
فهرست مطالب فصل سوم
.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 عملكرد ساختار تكرار
false(?(≠=00))
true
while (<expression>)
{
<statement 1>
<statement 2>
…
<statement n>
}
<next statement>
تفاوت دستورهای whileو for
دسددتورالعمل forزمدداني اسددتفاده
ميشود كه تعداد دفعات تكرار از قبدل
مشخص و معدين باشدد .در صدورتيكه
تعداد دفعات تكدرار مشدخص نباشدد
بايسددددتي از دسددددتورالعمل while
استفاده نمود.
مثال :
int x=0
)while(x<5
;cout << x ++<< endl
با اجراي قرعه برنامه فوق مقادير زير نمايش داده ميشود :
0
1
2
3
4
مثال :برنامة زیر اولین توان 2بزرگتر از 1000را در خروجی نمایش می دهد.
نكته :چون در حلقه Whileتنها يك
دستور داشتيم ،از {} استفاده نكرديم.
. قرار میدهد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 ;
}
مثال :برنامة زیر مجموع اعداد 1تا 100را محاسبه می نماید.
مثال :برنامة زیر تعداد نامشخصی از اعداد مثبت را از ورودی دریافت نموده میانگین آنها را
محاسبه می نماید( .عدد -1برای مشخص نمودن انتهای لیست اعداد استفاده میشود)
خروجی مثال قبل
دستورالعمل do while
این دستور العمل نیز برای تکرار یک دستورالعمل سطاده
یا ترکیبی استفاده میشود .شکل کلی این دستورالعمل
بصورت زیر میباشد.
do
}
; دستورالعمل 1
; دستورالعمل 2
.
.
; دستورالعمل n
;)شرط (} while
do .. While
نحوه عملكرد حلقه
do {
<statement 1> ;
<statement 2> ;
…
<statement n> ;
} while (<expression>)
<next statement> ;
false
true
(≠
(= 0)
0)
?
تفاوت دستورهای 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شده و
كنترل به خارج از اين دستورالعملها منتقل مينمايد.
break نحوه عملكرد دستور
while (<expression>)
{
<statements … >
true (? ≠ 0 )
…
if (<exp1>) break ;
…
}
<next statement>
: 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 ;
}
: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استفاده نمدود .ايدن دسدتورالعمل
باعث مي شود كه كنترل بابتداي دستورالعملهاي تكدرار منتقدل
گردد .يعني دستورات بعدي ساختار ناديد گرفته شده و بار ديگر
شرط حلقه كنترل ميگردد.
continue نحوه عملكرد دستور
while (<expression>)
{
<statements … >
true (? ≠ 0 )
…
if (<exp1>) continue ;
…
}
<next statement>
مثال :برنامة زیر مجموع اعداد 1تا 20به استثناء 10را محاسبه و نمایش می دهد.
#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 ;
}//end of main
:1 مثال
#include <iostream.h>
int main( )
{
int n , counter = 0 ;
float x, average, sum = 0 ;
cin >> n ; / * عبارت از تعداد اعداد وروديn * /
for ( int count = 1 ; count <=n ; ++ count )
{
cin >> x ;
if (x < 0 )
continue ;
sum += x ;
++ counter ;
}
average = sum / counter;
cout << average << endl ;
return 0 ;
}
:2 مثال
دستورالعمل switch
همانرور كه مي دانيد از دستورالعمل شرطي( )if elseمي توان بصورت تودرتو
استفاده نمود ولي از طرفي اگر عمق استفادة تو در تو از اين دستورالعمل زيداد
گردد ،در آنها مشكل ميشود .براي حدل ايدن مشدكل ، C++دسدتورالعمل
switchكه عمالً يك دستورالعمل چند انتخابي ميباشد را ارائه نموده است.
شكل کلی دستور العمل Switch
) عبارت كه بايد مورد بررسي قرار گيرد( Switch
{
:مقدار ثابت Case 1
;مجموعه دستورات 1
;break
:مقدار ثابت Case 2
;مجموعه دستورات2
;break
;مجموعه دستوراتn
;break
:مقدار ثابت n
Case
Default :
; مجموعه دستورات پیش فرض
}
#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 مثال
switch / case عملكرد ساختار
<expression> == <exp1> ?
false
switch (<expression>) {
case <exp1> : <statement 1> ;
<statement 2> ;
…
<statement n> ;
<expression> == <exp2> ?
case <exp2> : <statement 1> ;
<statement 2> ;
…
<statement n> ;
…
true
if there is no match
default : <statement 1> ;
<statement 2> ;
…
<statement n> ;
}
#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;
}//end of switch
}
: 2 مثال
تابع )(: cin.get
اين تابع يك كاراكتر را از صفحه
كليد ميگيرد .براي استفاده از اين
تابع در ابتداي برنامه بايستي داشته
باشيم:
#include
><iostream.h
قرعه برنامه ذيل يك كاراكتر را از صفحه كليد گرفته و نمايش ميدهد.
char
;x
;) (x = cin.get
; cout << x
برنامة ذيل يك سرر متن انگليسي كه به CTRL Zختم ميشود را گرفته دقيقاً نمايش ميدهد.
#include
><iostream.h
) (int main
{
;char x
) While ( (x = cin.get ( ) ) != EOF
; cout << x
; return 0
}
EOFبه معني End of Fileميباشد كده در
iostream.hتعريف شده و مقدار آن برابر بدا
-1ميباشدد .مقددار آن در سيسدتم عامدل
DOSعبارتست از . ctrl z
. استفاده شده است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 ;
}
تمرینات :
-1برنامه ای بنویسید که یک ماشین حساب ساده را شبیه سازی
کند(دو عدد حیح و یک کاراکتر را خوانده و بر اساس آن کاراکتر
محاسبه را انجام دهد).
-2برنامه ای بنویسید که اعمال تقسیم و باقیمانده را بدون استفاده از
عملگرهای /و %پیاده سازی نماید.
-3برنامه ای بنویسید که عددی را از کاربر دریافت نموده و با استفاده
از یک حلقه while /forمجموع مربعات متوالی تا آن عدد را پیدا
کند.
-4برنامه ای بنویسید که عمل ضرب را بدون استفاده از عملگر * برای
اعداد حیح مثبت پیاده سازی نماید.
فصل چهارم
اعداد تصادفي
فهرست مطالب فصل چهارم
.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يك نوع داده شمارشي ميباشد.
: چند مثال
enum 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
.3
.4
.5
.6
تعريف تابع
تابع بازگشتي
توابع درون خري
انتقال پارامترها از طريق ارجاع
كالس هاي حافظه ( ) storage classes
سربارگذاري توابع
تعریف توابع
استفاده از توابع در برنامهها به برنامهنويس اين امكان را ميدهدد كده
بتواند برنامههاي خدود را بده صدورت قرعده قرعده برنامده بنويسدد.
مديريت،خرايابي وتغييرات توابع كوچك ساده تر ميباشد .تدا كندون
كليه برنامههدائي كده نوشدتهايدم فقدط از تدابع ) ( mainاسدتفاده
نمودهايم .
شكل کلی توابع بصورت زیر میباشند :
نوع مقدار برگشتي
ليست پارامتر ها جهت انتقال اطالعات از تابع احضار كننده به تابع فراخوانده شده
) ( parameter-list
نام تابع
return-value-type function-name
{
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;
}
a
b
10
15
x
y
10
15
z
15
maximum آرگومانهاي تابعa, b
اسامي پارامترها و آرگومانهاي يك تابع
ميتوانند همنام باشند.
.برنامه زير يك مقدار مثبت را گرفته فاكتوريل آنرا محاسيه نموده نمايش ميدهد
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تابع يعني پيش
نمونة تابع(پيش تعريف) كه شامل نوع مقدار
برگشتي تابع ،نام تابع ،تعداد پارامترهائي
ورودي به تابع و انواع پارامترها و ترتيب
قرارگرفتن اين پارامترها را به اطالع كامپايلر
برساند.
پيش تعريف ) (Prototypeدر : C++
( نوع ،ترتيب و تعداد آرگومانهاي تابع ) نام تابع
در اساليد بعد مثالي در اين زمينه آورده شده است.
نوع داده خروجي تابع
#include <iostream.h>
#include <conio.h>
long int factorial (int); // function prototype
int main( )
{
int n;
cout << "Enter a positive integer:\t" << endl;
cin >> n;
cout << “factorial of your number is:\t”<<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;
}
مثال Prototype :تابع مجذور
Prototypeتابع ماکزیمم
مثال :برنامه ماكزيمم با معرفي Prototypeتابع مورد استفاده
تابع بازگشتی ()recursive functions
توابع بازگشتي يا recursiveتوابعي هستند كه
وقتي احضار شوند باعث ميشوند كه خود را
به صورت مستقيم و يا غير مستقيم فراخواني نمايند.
محاسبه يك دنباله ساده رياضي به كمك مفهوم توابع بازگشتي
… d(n)= 2, 5, 11, 23, 47,
برور كلي توابع بازگشتي
يك حالت بازگشتي و
يك يا چند حالت پايه
دارند.
حالت پايه (ثابت)
اگر n=1
در غير اينصورت
2
2 * d(n-1) + 1
حالت بازگشتي
در اساليد بعد تابع بازگشتي مورد نظر پياده سازي شده است.
= )d(n
تابع بازگشتي فوق به زبان C++بصورت زير ميباشد :
مثال :برنامه زير با استفاده از تابع فوق 20جمله اول دنباله فوق را نمايش ميدهد
نحوه محاسبه فاکتوریل از طریق تابع بازگشتی
! f (n) = n
n! = 1 * 2 * 3 * … * (n-2) * (n-1) * 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 << your number, N is:\t ;
cin >> n ;
cout << endl << factorial of N= \t << 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( )
{
int n ;
cout << Enter an integer value << endl ;
cin >> n ;
cout << Term << n << 'th fibonacci tail is :/t <<fib(n)<< endl;
return 0 ;
}
long int fib (long int n)
{
if (n = = 1 || n= = 2)
return 1 ;
else
return ( fib(n-1) + fib(n-2) ) ;
}
فراخوانی های متوالی توابع بازگشتی
long int factorial (4) {
if (4 ==0) return(1) ;
else return(4 * factorial(3));
}
6
long int factorial (3) {
if (3 ==0) return(1) ;
else return(3 * factorial(2));
}
2
long int factorial (2) {
if (2 ==0) return(1) ;
else return(2 * factorial(1));
}
factorial(4) = 24
?
1
long int factorial (0) {
if (0 ==0) return(1) ;
else return(0 * factorial(-1));
}
1
long int factorial (1) {
if (1 ==0) return(1) ;
else return(1 * factorial(0));
}
فراخوانی های متوالی توابع بازگشتی
n=4
factorial(4)
factorial(3)
n=3
factorial(1)
factorial(0)
return (6)
n=2
factorial(2)
return (24)
return (2)
return (1)
n=1
n=0
return (1)
مساله كالسيك توابع بازگشتي “ :برجهاي هانوي”
1
3
0
2
مساله كالسيك “برجهاي هانوي ” با 4پارامتر :تعداد ديسكها ،ستون مبدا ،ستون كمكي و ستون مقصد
به زبان C++
روال فراخواني تابع هانوي براي 4ديسك
.برنامه زیر یك خط متن انگلیسی را گرفته آنرا وارون نموده نمایش میدهد
#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 ;
}
در صورتي كه تابع مقداري بر نگرداند نوع
مقدار برگشتي تابع را voidاعالن ميكنيم .و
در صورتيكه تابع مقداري را دريافت نكند بجاي
parameter- listاز voidيا ( ) استفاده
ميگردد.
در اساليد بعد مثالي در اين زمينه آورده شده است.
تابع )( ، mainبدون خروجي (از نوع )void
مثال :بازنويسي مساله برجهاي هانوي با استفاده از شيوه void
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;
}
.تابع مقداري بر نمي گرداند
. را محاسبه نمايدk بهn تابعي بنويسيد كه تركيب: مثال
k 0 or n k
1
n
n 1 n 1
otherwise
k
k 1 k
int combination (int n, int k)
{
if (k==0 || n==k) return(1);
else return ( combination(n-1,k-1) + combination(n-1,k) ) ;
}
مثال :تابعي بنويسيد كه دو عدد را دريافت و بزرگترين مقسوم عليه مشتر
y0
آن دو را بازگرداند.
y0
x
gcd ( x, y)
)gcd ( y , x % y
)int gcd (int x , int y
{
;)if (y == 0) return (x
;) )else return ( gcd ( y, x%y
}
توابع درون خطی ()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
aدر main
20
aدر فراخواني
modify
20
aدرmodify
40
خروجي برنامه :
20
40
20
>#include <iostream.h
)int modify (int
) (int main
{
;int a=20
;cout << a << endl
; )modify(a
;cout << a << endl
; return 0
}
)int modify (int a
{
;a *= 2
;cout << a << endl
;return 0
}
در اين نوع احضار تابع ،حافظههاي مورد استفاده آرگومانها
و پارامترها از هم متمايزند و هرگونه تغيير در پارامترها
باعدددث تغيديددر در آرگومانهاي متناظر نميگردد.
انتقال پارامترها از طریق ارجاع
تاكنون وقتي تابعي را احضار ميكرديم يك كپي از مقادير آرگومانها درپارامترهاي متناظر
قرار ميگرفت .اين روش احضار بوسيله مقدار يا call by valueناميده شد.
در انتقال پارامترها از طريق ارجاع در حقيقت حافظه مربوط به آرگومانها و پارامترهاي متناظر
بصورت اشتراكي مورد استفاده قرار ميگيرد .اين روش call by reference
ناميده ميشود .
انتقال پارامترها از طریق ارجاع
در اين روش پارامترهائي كه از طريق call by referenceعمل مينمايند در
پيش نمونه تابع بعد از نوع چنين پارامترهائي از & استفاده ميشود و در تعريف
خود تابع نيز پس از نوع پارامتر و قبل از نام آن از عالمت & استفاده خواهد شد.
#include <iostream.h>
int vfunct (int);
// for call by value example
void rfunct (int &) ;
//for call by reference example
int main( )
{
int x=5, y=10;
cout << x << endl << vfunct (x) << endl << x << endl ;
cout << y << endl ;
rfunct (y) ;
cout << y << endl ;
return 0 ;
}
int vfunct (int a)
{
return a *= a ;
}
void rfunct ( int &b )
{
b *= b ;
}
: مثال
x
y
5
10
: خروجي
5
25
5
. تغيير نمي كندx مقدار متغيرvfunct پس از فراخواني تابع:تذكر
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;
}
مثال :برنامه زیر با استفاده از تابع duplicateو به شیوه ارسال با ارجاع ،مقدار دو آرگومان
ورودی را 2برابر مینماید.
کالسهای حافظه ()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 << endl;
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آرايه دو بعدي ( ماتريس ها )
آرایه یك بعدی
آرايه يك فضاي پيوسته و متوالي از خانه هاي حافظه اصلي ميباشد
كه داراي يك نام و يك نوع ميباشند.
كليه عناصر يك آرايه از يك نوع ميباشند.
عناصر آرايه بوسيله انديس آنها مشخص ميشوند.
در ، 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
num
0
0
0
0
0
0
0
0
0
1
9
8
7
6
5
4
3
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
چند مثال از کار کردن با خانه های آرایه
•
با فرض مقدار 2برای متغیر aو مقدار 3برای متغیر b
مثال :در برنامه زير طول آرايه توسط عدد ثابتي تعيين ميگردد و عناصر آرايه توسط حلقه forمقدار دهي
شده و سپس نمايش داده مي شود.
مثال :در برنامه زير 10عدد صحيح را از ورودي دريافت نموده ،در آرايه قرار ميدهد و سپس مجموع عناصر
آرايه را محاسبه نموده و نمايش ميدهد.
عدد اعشاری را گرفته تشكیل یك آرایه داده سپس کوچكترین عنصر آرایه را20 برنامه زیر: مثال
.مشخص و نمایش میدهد
#include <iostream.h>
#include <conio.h>
int main( )
{
clrscr( ) ;
float x[20], min;
int j ;
for ( j=0 ; j<20 ; ++j )
cin >> x[ j ] ;
min = x [ 0 ] ;
for ( j=1 ; j<20 ; ++j )
if ( x [ j ] < min )
min = x[ j ];
cout << min << endl;
return 0;
}
مثال :برنامه اي بنويسيد كه توسط آرايه ،نمودار ميله اي افقي براي اعداد { ،11 ،9 ،13 ،5 ،17 ،1
3 ،15 ،7و }19رسم نمايد.
مثال :برنامه اي بنويسيد كه يك تاس را 6000بار پرتاب كرده و توسط آرايه اي ،تعداد آمدن هر
وجه را حساب كند (براي هر شماره ،يك خانه از آرايه را در نظر بگيريد).
.) بصورت صعودی مرتب مینمایدBubble sort( عدد اعشاری را گرفته به روش حبابی100 برنامه زیر
#include <iostream.h>
#include <conio.h>
int main ( )
{
clrscr( );
float x[100] , temp;
int i,j ;
for( i=0 ; i<100 ; ++i)
cin >> x[ i ];
for( i=0 ; I < 99 ; i++ )
for( j=i+1 ; j<100 ; j++ )
if ( x[ j ] < x[ i ] )
{
temp = x[ j ] ;
x[ j ] = x[ i ] ;
x[ i ] = temp ;
}
for ( i=0 ; i<=99 ; i++ )
cout << x[ i ] << endl;
return 0 ;
}
آرایههای دوبعدی (ماتریسها)
ماتريسها بوسيله آرايههاي دوبعدي در كامپيوترنمايش داده ميشوند.
;]int a[3][4
ستون
3
ستون
2
ستون
1
ستون
0
]a[0][3
]a[0][2
]a[0][1
]a[0][0
سرر
0
]a[1][3
]a[1][2
]a[1][1
]a[1][0
سرر
1
]a[2][3
]a[2][2
]a[2][1
]a[2][0
سرر
2
تخصیص مقادیر اولیه به عناصر آرایه :
; } }int a[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12
3
2
1
0
4
3
2
1
0
8
7
6
5
1
12
11
10
9
2
int a[3][4]= { {1}, {2,3} , {4,5,6} } ;
0
1
2
3
0
1
0
0
0
1
2
3
0
0
2
4
5
6
0
int a[3][4]= {1, 2, 3, 4,5 } ;
0
1
2
3
0
1
2
3
4
1
5
0
0
0
2
0
0
0
0
در يك آراية دوانديسي ،هر سرر ،در حقيقت آرايهاي يك انديسي است .در
اعالن آرايههاي دوانديسي ذكر تعداد ستونها الزامي است.
;}int a[ ][4]={1,2,3,4,5
3
2
1
0
4
3
2
1
0
0
0
0
5
1
. را گرفته مجموع عناصر آن را مشخص نموده و نمايش ميدهد3*4 برنامه زير يك ماتريس
#include <iostream.h>
#include <conio.h>
int main( )
{
float x[3][4], total= 0.0;
int i, j ;
// generate matrix x.
for ( i=0 ; i<3 ; ++I )
for ( j=0 ; j<3 ; j++ )
cin >> x[ i ][ j ];
// calculate the sum of elements.
for ( i=0 ; i<3 ; ++i )
for ( j=0 ; j<4 ; j++ )
total + = x [ i ][ j ];
cout << "total = " << total << endl;
return 0 ;
}
مثال :در برنامه زیر مقادیر یك جدول ضرب 10*10در یك آرایه دوبعدی ذخیره شده سپس نمایش داده میشوند.
استفاده از آرايهها بعنوان پارامتر تابع مجاز است.
جهت اين امر،نام آرايه را بدون عالمت براكت( ] [ )
استفاده مينماييم:
شيوه رفتار توابع با آرايه ها بعنوان آرگومان در C++
• ارسال کل آرایه بعنوان آرگومان تابع
ارسال از طریق ارجاع)(Call by reference
• ارسال عنصری از آرایه بعنوان آرگومان تابع
ارسال بوسیله مقدار )(Call by value
تذکر :در این روش تغییر بر روی آرگومان ارسالی تاثیری بر روی عناصر آرایه ندارد.
نحوه تعريف يک تابع و پيش تعريف آن جهت دريافت يک آرايه بعنوان آرگومان
مثال :در برنامه زیر که برای نشان دادن تفاوت ارسال یك عنصر آرایه به تابع و ارسال کل آرایه به تابع ارائه شده ،در هر دو تابع
استفاده شده محتوای دریافتی در 2ضرب میگردد.
ادامه کد مثال قبل :
. را بعنوان پارامتر ميگيرد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 ;
}
: خروجي
3
4
5
6
7
3
4
5
6
7
در صورتيكه آرايه بيش از يك بعد داشته باشد
بعدهاي دوم به بعد بايستي در تعريف تابع و پيش
نمونه تابع ذكر گردد.
در اساليد بعد به يك مثال توجه نماييد.
مثال (جستجو در آرایه) :نمونه ای از یك برنامه جستجوی خطی در یك آرایه همراه با خروجی آن نمایش داده شده است
مثال (جستجو در آرایه) :نمونه ای از یك برنامه جستجوی دودویی در یك آرایه مرتب شده ،همراه با خروجی آن
نمایش داده شده است
ادامه مثال برنامه جستجوی دودویی در یك آرایه مرتب شده ،همراه با خروجی
فصل هفتم
ساختار ها و اشاره گرها
فهرست مطالب فصل هفتم
.1
.2
.3
.4
.5
.6
.7
ساختارها
Unionها
اشاره گرها ( ) Pointer
تعريف آرايه
آرايه هاي دو بعدي و اشاره گرها
تخصيص حافظه بصورت پويا ( عملگر ) new
رشته ها و توابع مربوطه
اشارهگرها ()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
متغيرهاي اشاره گر ،آدرس خانه هاي حافظه را در خود نگهداري مي
كنند در حقيقت آدرس متغيرها را نگهداري ميكنند.
متغير برور مستقيم به يك مقدار اشاره مي كنند اما يك اشاره گر
برور غير مستقيم به يك مقدار اشاره ميكند.
با داشتن آدرس داده در حافظة اصلي ميتوان براحتي به آن داده
دسترسي پيدا نمود
X
7
Xptr
X
7
نحوه تعريف كردن اشاره گرها
نكته :استفاده از ptrدر نامگذاری اشاره گرها الزامی نمیباشد و صرفا جهت قابل درک و خوانا بودن برنامه هاست
عملگرهاي اشاره گر
عملگر آدرس ( & ) :آدرس خانه حافظه عملوند خود را بر میگرداند
مثال :
; int y , x , *px
x
px
26
حال اگر دستور العمل ; x += 10را بدهيم :
x
px
36
حال اگر دستورالعمل ; *px = *px + 7بدهيم.
x
43
px
; x = 26
; px = &x
مثالي از نحوه استفاده از اشاره گرها
ارسال آرگومان به تابع توسط اشاره گر
•
از اشاره گرها میتوان برای تغییر متغیرهای ارسال شده ،درون توابع مشابه روش ارسال با ارجاع استفاده نمود
. جابهجا مينمايدswap برنامه زير دو مقدار اعشاري را گرفته مقادير آنها را بكمك تابع
#include
<iostream.h>
#include
<conio.h>
void swap ( float * , float * );
int main( )
{
float a,b;
cin >> a >> b;
cout << “a is: “<< a<<“\n” <<“b is: ”<< b << endl;
swap( &a , &b);
cout << “a is: “<< a<<“\n” <<“b is: ”<< b << endl ;
return 0;
}
void swap ( float *px , float *py )
{
float t;
t = *px;
*px = *py;
*py = t ;
return;
}
آرایه ها و اشاره گرها
•
نکته :نام آرایه (بدون اندیس) معادل یک اشاره گر ثابت به عنصر اول آرایه میباشد لذا از طریق اشاره گر
میتوان به تک تک عنا ر آرایه دسترسی پیدا کرد:
;]Int b[5
;Int *bptr
;bptr = b
;]bptr = &b[0
برای دستیابی به عنصر ] b[3توس اشاره گر bptrداریم:
•
) *( bptr + 3
نکته :اشاره گرها را نیز میتوان مانند آرایه ها اندیس دار نمود
مثال :مشابهت آرایه ها و اشاره گرها
خروجی برنامه :
آرایههای دوبعدی و اشارهگرها
يك آرايه دوبعدي بصورت تعدادي آرايه يك بعدي ميتوان تعريف نمود.
اگر xيك ماتريس 5سرري و 4ستوني از نوع اعشاري باشد قبالً اين ماتريس را با
;]float x[5][4
معرفي كرديم .حال با استفاده از اشارهگرها بصورت زير معرفي نمائيم:
;]float (*x)[4
آرایههای دوبعدی و اشارهگرها
;]float (*x)[4
آرايه يك بعدي اول
x
آرايه يك بعدي دوم
)(x+1
آرايه يك بعدي سوم
)(x+2
آرايه يك بعدي چهارم
)(x+3
آرايه يك بعدي پنجم
)(x+4
رشتهها و توابع مربوطه
رشتهها در ، 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باشد مقدار صفر در غير
اينصورت يك مقدار مثبت برميگرداند.
strncmp() وstrcmp() استفاده از توابع رشته ای:مثال
#include
<iostream.h>
#include
<string.h>
#include
<conio.h>
int main( )
{
char *s1= happy birthday ;
char *s2= happy holidays ;
clrscr( );
cout << “ strcmp(s1, s2) is: ”<< strcmp(s1, s2) << endl;
cout << “ strncmp(s1, s2, 7) is: “<< strncmp(s1, s2, 7) << endl ;
return 0;
}
تابع (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را برميگرداند.
مثال :استفاده از توابع رشته ای )(strcatو)(strncat
خروجی مثال قبل :
تابع (strlen(s
رشتة sرا بعنوان آرگومان گرفته طول رشته را مشخص مينمايد.
strlen() استفاده از تابع رشته ای:مثال
#include
<iostream.h>
#include
<string.h>
#include
<conio.h>
int main( )
{
char *s = sara;
clrscr( );
cout << strlen(s);
return 0;
}
: مثال
تابع )strcpy(s1,s2
دو رشتة s1و s2را بعنوان آرگومان گرفته رشتة s2را در رشتة s1كپي مينمايد و
نهايتاً مقدار رشتة s1را بر ميگرداند.
تابع (strncpy(s1, s2,n
دو رشتة s1 , s2و مقدار صحيح و مثبت nرا بعنوان آرگومان گرفته ،حداكثر nكاراكتر
را از رشتة s2در رشتة s1كپي نموده ،نهايتاً مقدار رشتة s1را برميگرداند.
مثال :استفاده از توابع رشته ای )(strcpyو)(strncpy
براي استفاده از توابع مربوط به
رشتهها بايستي حتماً در ابتدا برنامه
> #include <string.hرا قرار
دهيم.
. می باشد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] );
}
ساختارها
ساختارها يك نوع داده گروهي متشكل از تعدادي عضو (عنصر) است كه فضاي
پيوسته از حافظه اصلي را اشغال مينمايد .اما عناصر ساختار الزاماً از يك نوع
نميباشند بلكه اعضاي يك ساختار ميتوانند از نوعهاي مختلفي از قبيل ، 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
nameمشخصات صاحب حساب از نوع رشتة 80كركتري
balanceمانده حساب از نوع float
: به دو صورت می توان اعالن یك متغیر از نوع ساختار را نمایش داد
: روش اول
struct account {
int acc_no;
char acc_type;
char name[80];
float balance;
} cust1, cust2, cust3;
: روش دوم
struct account {
int
Char
Char
float
acc_no ;
acc_type;
name[80];
balance;
};
account cust1, cust2, cust3;
به ساختارها ميتوان مقدار اوليه نيز تخصيص داد
;}account cust = {4236, r, Nader Naderi , 7252.5
دسترسي به عناصر يك ساختار
براي دستيابي به عناصر يك ساختار از عملگر نقره ( ) .و يا عملگر پيكان (< )-استفاده ميكنيم .عملگر نقره براي
دستيابي به عنصر يك ساختار از طريق نام يك متغير و عملگر پيكان براي دستيابي از طريق اشاره گر مورد استفاده
قرار ميگيرد.
بجاي استفاده از timePtr -> hourبراي دستيابي به عنصر hourميتوان از (*timePtr).hourاستفاده نمود.
نكته :استفاده از پرانتز در كنار شيء ساختار فوق الزامي است.
: نكته
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
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ميباشد.
نكته :
ميتوان آرايهاي تعريف نمود كه هر عضو آن يك ساختار باشد و حتي به آنها مقادير اوليه تخصيص نمود.
{ struct struc1
;]char name[40
;int pay1
;int pay2
;}
struc1 cust[ ] = {nader, 3000 , 40000,
sara, 4200, 6000,
susan, 3700, 25000,
;} saman, 4800 , 2000,
برنامه زير هر عدد مختلط را بصورت يك ساختار در نظر گرفته ،دو عدد مختلط را ميگيرد و
مجموع آنها را مشخص و نمايش ميدهد.
ادامه کد مثال قبل:
در مبحث بعدی (کالسها) مشاهده خواهید نمود که امكان کنترل مقدار دهی به اعضاء وجود دارد
union
unionاز نظر ساختاري شبيه structمي باشد .با اين تفاوت كه عضدوهائي
كه تشكيل unionميدهد همگي از حافظه مشدتركي در كدامپيوتر اسدتفاده
مينمايند .بنابراين استفاده از unionباعث صرفهجوئي در حافظه ميگردد.
مثال :
{ union id
;]char color [10
;int size
;} x , y
هر كدام از متغيرهاي xو yيك رشدته
10كاراكتري يا يك مقددار از ندوع int
ميباشد وكامپيوتر يك بلو حافظه كه
بتواند رشته 10كركتري رادر خود جداي
دهددد ،بددراي colorو sizeدر نظددر
ميگيرد.
: مثال
union x {
int x ;
char y[2] ;
}p;
x
باي ت دوم
y[1]
باي ت اول
y[0]
تخصیص حافظه به صورت پویا یا (عملگر )new
از عملگر newبراي تخيصيص حافظه به صورت پويا
مي توان استفاده نمود ،در ضمن ميتوان براي
بلوكي از حافظه كه تخصيص يافته مقدار اوليه تعيين
نمود.
دو عملگر newو deleteدر فايل new.hقرار
دارند .لذا براي بكارگيري اين دو عملگر بايد از
دستور > #include <new.hاستفاده نماييم.
مثالهایی از بكارگیری دستورات newوdelete
نكته :برای آزادسازی حافطه تخصیص داده شده به یك آرایه از ][ deleteاستفاده نمایید
براي تخصيص حافظه باندازه 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 ;
delete[ ] ptr ; // in order to free the space use
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? ;
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 ;
}
فصل هشتم
برنامه نويس شي گرا
فهرست مطالب فصل هشتم
.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