• توجه: در صورتی که از کاربران قدیمی ایران انجمن هستید و امکان ورود به سایت را ندارید، میتوانید با آیدی altin_admin@ در تلگرام تماس حاصل نمایید.

++ C

!MAHSA!

کاربر ويژه
آموزشهای مربوط به ++ C


[h=2]الگوريتم ها

رای حل مسائل مختلف توسط کامپيوتر بايد اين مسائل را به صورت مراحل عملياتی و تصميم گيری ساده ای که کامپيوتر قادر به اجرای آن باشد تبديل کرد. بدين ترتيب ليست مرتبی از مراحل عملياتی بدست می آيد که اجرای مرتب آنها منجر به حل مسئله توسط کامپيوتر می شود. اين ليست مرتب از مراحل عملياتی و تصميم گيری ، الگوريتم ناميده می شود.

در حالت کلی الگوريتم ها بايد ويژگی های زير را داشته باشند:

الف) الگوريتم بايد ما را به نتيجه مورد نظر برساند.
ب) در زمان محدود پايان يابد.
ج) دستورالعملها بايد به ترتيب منطقی پشت سرهم قرار گيرند.
د) جملات الگوريتم ها بايد به صورت امری ، سؤالی باشند.
ه) هر الگوريتم بايد نقطه آغاز و پايان داشته باشد.

مثال : الگوريتمی بنويسيد که دو عدد از ورودی دريافت شود و سپس تعيين شود که مجموع دو عدد بزرگتر از 20 است يا نه.

0- شروع .
1- دو عدد a و b را از ورودی در يافت کن.
2- a+b را محاسبه کن.
3- آيا a+b>20 است؟ اگر بلی به مرحله 6 برو.
4- بنويس خير.
5- به مرحله 7 برو.
6- بنويس بلی.
7- پايان.
با برنامه ريزی و ساماندهی دقيق می توان به راه حلی مناسب جهت حل يک مسئله به کمک کامپيوتر رسيد. هرگونه کم توجهی و بی دقتی در نوشتن الگوريتم ضمن بروز مشکلات بسيار، برنامه نويس را نيز از هدف خود دور خواهد کرد؛ لذا برای به هدف رسيدن بايد درک صحيح و کاملی از صورت مسئله داشت و سپس راه حل مورد نظر را به صورت الگوريتم بنويسيم. و در نهايت الگوريتم مورد نظر را به زبان برنامه نويسی مورد نظر تبديل کنيم. برای درک بهتر شيوه حل مسائل و نوشتن الگوريتم به مثالهای زير توجه کنيد:

مثال : الگوريتمی بنويسيد که مجموع اعداد طبيعی مضرب 7 و کوچکتر از 50 را حساب کند.

برای نوشتن اين الگوريتم به دو خانه حافظه نياز داريم.

0- شروع.
1- در خانه حافظه sum عدد صفر را قرار بده.
2- در خانه حافظه index عدد 7 را قرار بده.
3- مقدار index را با مقدارsum جمع کن
و حاصل را در sum قرار بده.
4- مقدار 7 را با مقدار index جمع کن
و حاصل را در index قرار بده.
5- آياindex بزگتراز 50 است،اگر خير به مرحله 3 برو.
6- محتوای sum را چاپ کن.
7- پايان.
در الگوريتم فوق همانند شکل مقادير حافظه sum و index تغيير می کند، تا اينکه سرانجام شرط " آيا index بزرگتر از 50 است " بلی می شود لذا محتوای sum در خروجی چاپ خواهد شد و الگوريتم به پايان می رسد. اما در مراحل قبلی شرط فوق خير می باشد، لذا همانند شکل فوق الگوريتم ادامه پيدا می کند.

مثال : الگوريتمی بنويسيد که 1000 عدد را از ورودی دريافت کرده و کوچکترين را چاپ کند.

فرض کنيد که به شما ليستی از اعداد را می دهند، برای پيدا کردن کوچکترين عدد در ليست اولين عدد را به عنوان کوچکترين در نظر می گيريد سپس عدد بعدی را با آن مقايسه می کنيد، اگر عدد جديد از عدد قبلی کوچکتر بود عدد جديد را به عنوان کوچکترين در نظر می گيريد و گر نه همان عدد قبلی کوچکترين خواهد بود. اين روند را تا انتهای ليست ادامه می دهيد؛ در پايان عددی که در هر بررسی به عنوان کوچکترين عدد بود، جواب مورد نظر ما خواهد بود. توجه کنيد که در اين روال شما همواره يک عدد را در ذهن خود در نظر گرفته بوديد، برای نوشتن الگوريتم مورد نظر ما يک خانه حافظه را به کوچکترين عدد درهر مرحله اختصاص می دهيم.

0- شروع.
1- min را دريافت کن.
2- i =1 .
3- a را دريافت کن.
4- اگر a<min آنگاه min = a .
5- i = i + 1 .
6- اگر i>=1000 به مرحله 8 برو.
7- به مرحله 3 برو.
8- min را چاپ کن.
9- پايان.
الگوريتم های قبلی به صورت جملات فارسی بودند که سبب طولانی و حجيم شدن الگوريتم می شدند. ولی الگوريتم اخير بيشتر به صورت جملات رياضی بود. اين شيوه سبب راحتی درک الگوريتم و ساده شدن نگارش آن می شود. از اين به بعد نيز الگوريتم ها را به شيوه جديد نگارش خواهيم کرد. شما نيز سعی کنيد از اين شيوه استفاده کنيد.

مثال : الگوريتمی بنويسيد که سه عدد از ورودی دريافت شود و تعيين شود که اين اعداد می توانند اضلاع مثلث باشند يا خير.

0- شروع.
1- a وb وc را از ورودی بگير.
2- اگر a>b+c به 7 برو.
3- اگر b>a+c به 7 برو.
4- اگرc>a+b به 7 برو.
5- بنويس " بلی ".
6- به 8 برو.
7- بنويس " خير ".
8- پايان.
در عمل برای نمايش الگوريتم از يک فلوچارت ( شمای جريان عمليات ) استفاده می شود. در حقيقت فلوچارت روش تصويری و استاندارد نمايش الگوريتم است.

در رسم فلوچارت علائم و نمادهای استانداردی به کار می رود که هر کدام دارای معانی ويژه ای هستند.
 

!MAHSA!

کاربر ويژه
معرفی ساختاری زبان C++


معرفی ساختاری زبان C++




++c عموماً از سه بخش تشکيل شده است:

- محيطی برای نوشتن برنامه و ويرايش آن.
- کامپايلر ++c.
- کتابخانه استاندارد ++c.

يک برنامه زبان ++c برای رسيدن به مرحله اجرا از شش مرحله عبور می کند.

مرحله اول : برنامه نويس، برنامه را در محيط ويرايشگر می نويسد و آن را بر روی ديسک ذخيره می کند.

مرحله دوم : برنامه پيش پردازنده، خطوط برنامه را از لحاظ ايردات نگارشی بررسی می کند، و در صورت وجود اشکال در برنامه پيغام خطائی داده می شود، تا برنامه نويس نسبت به رفع آن اقدام نمايد.

مرحله سوم : کامپايلر، برنامه را به زبان ماشين ترجمه می کند و آن را بر روی ديسک ذخيره می نمايد.

مرحله چهارم : پيوند دهنده، کدهای زبان ماشين را، به فايلهای کتابخانه هايی که مورد استفاده قرار گرفته اند پيوند می دهد و يک فايل قابل اجرا بر روی ديسک می سازد.

مرحله پنجم : بار کننده برنامه را در حافظه قرار می دهد.

مرحله ششم : واحد پردازش مرکزی کامپيوتر دستورات برنامه را اجرا می کند.


مرحله اول

مرحله دوم

مرحله سوم

مرحله چهارم

مرحله پنجم

مرحله ششم


نکته : همانطور که گفته شد پيش پردازنده ايرادات برنامه را بررسی می کند و در صورتی که برنامه مشکلی نداشت در نهايت به زبان ماشين ترجمه می شود و قابليت اجرا پيدا می کند اما در هنگام اجرای برنامه نيز ممکن است خطايی بروز کند به عنوان مثال تقسيم بر صفر بوجود آيد. اين خطا قابل تشخيص توسط پيش پردازنده نيست و در زمان اجرای برنامه رخ می دهد و باعث خروج ناگهانی از برنامه می شود. به اينگونه خطاها، خطای زمان اجرا گفته می شود. تقسيم بر صفر جزء خطاهای مهلک است. خطای غير مهلک خطايی است که اجازه اجرای ادامه برنامه را می دهد ولی ممکن است نتايج غير صحيحی را به ما بدهد.
 

!MAHSA!

کاربر ويژه
اعمال رياضی و محاسباتی

اعمال رياضی و محاسباتی


در مبحث حافظه با انواع داده و شيوه اختصاص دادن حافظه به متغيرها آشنا شديم حال می توانيم متغيرها را در محاسبات به کار ببريم. برای نيل به اين هدف ++C عملگرهايی را در اختيار ما قرار داده است.

عملگر انتساب (=)

عملگر تساوی جهت اختصاص دادن يک مقدار به يک متغير به کار می رود ، مانند a = 5 که عدد 5 را به متغير a تخصيص می دهد. جزئی که در سمت چپ تساوی قرار دارد همواره بايد نام يک متغير باشد، وجزء سمت راست تساوی می تواند يک عدد، يک متغير و يا ترکيبی از هر دو باشد. مانند: a=b+5 ، که در ايجا حاصل b + 5 در متغير a قرار می گيرد. توجه داشته باشيد که همواره مقدار سمت راست تساوی در مقدار سمت چپ قرار می گيرد. به دستورات زير توجه کنيد.

int a,b;
a = 10;
b = 4;
a = b;
b = 7;
اگر از دستورات فوق استفاده کنيم در نهايت مقدار a برابر 4 و مقدار b برابر 7 خواهد بود. ++C قابليتهای زيادی دارد يکی از اين قابليتها اينست که می توانيم چند دستور را در يک دستور خلاصه کنيم ، به عنوان مثال دستور :

a = 2 + (b = 5);
برابر است با:

b = 5;
a = 2 + b;
که هر دو عبارت در نهايت عدد 7 را در متغير a قرار می دهند.

ضمناً استفاده از عبارت زير نيز در ++C مجاز می باشد:

a = b = c = 5
عبارت فوق عدد 5 را به سه متغير a و b و c اختصاص می دهد.

عملگر های محاسباتی

پنج عملگر محاسباتی که قابل استفاده در زبان ++C هستند عبارتند از:

+ جمع
- تفريق
* ضرب
/ تقسيم
% باقيمانده تقسيم

تنها عملگری که ممکن است برای شما ناشناس باشد عملگر % است. اين عملگر باقيمانده تقسيم دو عدد صحيح را به ما می دهد، به عنوان مثال اگر از دستور زير استفاده کنيم:

a = 11 % 3;
متغير a حاوی عدد 2 خواهد شد. چون عدد 2 باقيمانده تقسيم 11 بر 3 می باشد.

عملگر های انتساب مرکب

عملگرهای انتسال مرکب عبارتند از =+ ، =- ، =* ، =/ ، =% .اين عملگرها دو کار را با هم انجام می دهند و در کم شدن کد نويسی به ما کمک می کنند، به جای توضيح اضافی به مثال های زير که فهم مطلب را ساده تر می کند توجه کنيد:

value += increase;�برابر است با�value=value+increase;
a -= 5; �برابر است با�a = a - 5;
a /= b; �برابر است با�a = a / b;
price*=units+1; �برابر است با�price=price*(units+1);
x %= y * z; �برابر است با�x = x % (y * z);
عملگرهای افزايش و کاهش

گونه ای ديگر از عملگرها که در کم شدن کد نويسی به ما کمک می کنند عملگر افزايش(++) و عملگر کاهش(--) می باشند. عملگر افزايش(++) يک واحد به مقدار قبلی که در متغير بود اضافه می کند و عملگر کاهش(--) يک واحد از مقدار قبلی که در متغير بود کم می کند.

++a; a++; a += 1; a = a + 1;
هر چهار دستور فوق يک واحد به مقدار قبلی متغير اضافه می کنند.

--a; a--; a -= 1; a = a - 1;
هر چهار دستور فوق يک واحد از مقدار قبلی متغير کم می کنند.

اگر از دستورات ++a و a++ به تنهايی استفاده کنيم فرقی ندارد که ++ قبل از متغير قرار گيرد يا بعد از متغير. اما اگر از ++ در کنار عملگرهای ديگر استفاده شود، اگر ++ قبل از متغير قرار گيرد ابتدا يک واحد به متغير اضافه شده سپس در محاسبه استفاده می شود، ولی اگر ++ بعد از متغير قرار گيرد ابتدا متغير در محاسبه استفاده می شود سپس يک واحد به آن اضافه می شود. همين روال برای عملگر -- نيز برقرار است. به مثال های زير توجه کنيد:

b = 3;
a = ++b;
b = 3;
a = b++;


در مثال سمت چپ ابتدا يک واحد به b اضافه می شود، يعنی b مقدار 4 را می گيرد سپس عدد 4 در a قرار می گيرد؛ اما در مثال سمت راست ابتدا مقدار b يعنی عدد 3 در a قرار می گيرد سپس يک واحد به b اضافه می شود و مقدار 4 را می گيرد.

در اين مثال عدد 6 در m قرار می گيرد:

a = 2;
b = 3;
m = ++a + b--;
b مقدار 2 و a مقدار 3 را می گيرد.


--------------------------------------------------------------------------------

حال که با انواع عملگرهای محاسباتی آشنا شديد عبارت زير را در نظر بگيريد.

y = 5 * 3 + 2 - 1 * 3 / 2;

مقداری که در y قرار می گيرد چه عددی می تواند باشد؟ 30 يا 24 يا 15.5 يا 17.5 . نظر شما چيست؟ شما مقدار y را چگونه حساب می کنيد؟

کامپيوتر برای بررسی و محاسبه چنين عبارتی برای اينکه با چندين جواب مواجه نشود قواعدی را در نظر می گيرد و طبق قوانين تقدم عملگرها عمل می کند. اين قوانين که مشابه قوانين جبر می باشند به ترتيب عبارتند از:

1- عملگرهايی که درون پرانتز قرار دارند اول محاسبه می شوند. در صورتی که پرانتزها تودرتو باشند ابتدا داخلی ترين پرانتز مورد بررسی و محاسبه قرار می گيرد.

2- اگر عبارتی حاوی * ، / و % باشد پس از پرانتز اين عملگرها در اولويت قرار دارند. اگر عبارتی حاوی ترکيبی از اين عملگرها باشد چون اين عملگرها در تقدم يکسانی نسبت به يکديگر قرار دارند، محاسبه به ترتيب از چپ به راست انجام می شود.

3- اعمال + و - در انتها انجام می شوند. اگر عبارتی شامل ترکيبی از اين دو عملگر باشد چون اين دو عملگر در تقدم يکسانی نسبت به هم هستند، محاسبه به ترتيب از چپ به راست انجام می شود.

با توجه به قواعد گفته شده حاصل عبارت فوق عدد 15.5 خواهد بود.

y = 5 * 3 + 2 - 1 * 3 / 2; ----� y = 15.5
6 1 4 5 2 3
به مثال های زير توجه کنيد:

x = (2 + 1) * 3 + 5; ----� x = 14
4 1 2 3
z = 5 % 3 * (3 + 1); ----� z = 8
4 2 3 1
y = p * r % q + w / x - y;
6 1 2 4 3 5
 

!MAHSA!

کاربر ويژه
عبارات منطقی

عبارات منطقی


يک عبارت منطقی، عبارتی است با مقدار درست يا نادرست. به عنوان مثال 5 بزرگتر از 3 است، يک عبارت منطقی است با مقدار درست و 5 کوچکتر از 3 است، نيز يک عبارت منطقی است اما با مقدار نادرست. در کامپيوتر نتيجه عبارات منطقی درست عدد يک و نتيجه عبارات منطقی نادرست عدد صفر خواهد بود.

ضمناً کامپيوتر هر عدد مخالف صفر را به عنوان يک عبارت منطقی درست در نظر می گيرد.

عملگرهای رابطه ای


برای مقايسه دو متغير يا دو عبارت از عملگرهای رابطه ای استفاده می کنيم که همانطور که گفته شد دارای نتيجه درست يا نادرست می باشد. عملگرهای رابطه ای عبارتند از ==( مساوی )، =!( متفاوت )، <(بزرگتر از )، >( کوچکتر از )، =<( بزرگتر مساوی از )، =>( کوچکتر مساوی از ). به مثال های زير توجه کنيد.

(a==5) -----> نادرست
(a*b>=c) -----> درست
(b+4<a*c)) -----> نادرست
((b=2)==a)) -----> درست
توجه کنيد که عملگر = همانند عملگر == نمی باشد. اولی عملگر انتساب است که مقدار سمت راست را در متغير سمت چپ قرار می دهد و ديگری عملگر رابطه ای است که برابر بودن يا نبودن دو مقدار را با هم مقايسه می کند. بنابراين در عبارت ((b=2)==a)) ما ابتدا مقدار 2 را در متغير b قرار داديم سپس آن را با a مقايسه کرديم، لذا نتيجه اين مقايسه درست بود.
عملگرهای منطقی
عملگرهای منطقی عبارتند از ! ، || و && . نتيجه عملگر ! (NOT) وقتی درست است که عبارتی که اين عملگر بر روی آن عمل می کند نادرست باشد و نتيجه هنگامی نادرست است که عملوند آن درست باشد. ضمناً اين عملگر تنها يک عملوند دارد. در حقيقت اين عملگر نقيض عملوند خود را به عنوان نتيجه می دهد.
به مثال های زير توجه کنيد:

!(5 == 5) ----> نادرست
!(6 <= 4) ----> درست
!0 ----> درست
!1 ----> نادرست
عملگرهای &&(AND) و ||(OR) هنگامی مورد استفاده قرار می گيرند که بخواهيم از دو عبارت يک نتيجه را بدست آوريم. نbr#1578يجه اين عملگرها بستگی به ارتباط بين دو عملوندشان طبق جدول زير دارد:

عملوند اول
b
عملوند دوم
a
نتيجه
a&&b
نتيجه
a||b

درست
درست
درست
درست

درست
نادرست
نادرست
درست

نادرست
درست
نادرست
درست

نادرست
نادرست
نادرست
نادرست


به مثال های زير توجه نمائيد:


((5==5)&&(3>6)) -----> نادرست
((5==5)||(3>6)) -----> درست
((3-3)&&(3<5)) -----> نادرست
((3-3)||(3<5)) -----> درست
در مثال های زير به جای اعداد از متغير نيز استفاده شده است ( فرض کنيد a=1 و b=2 وc=3)


((b-2*a)&&(c==3)) -----> نادرست
((b==2*a)&&(c!=4)) -----> نادرست
((c==a+b)||(b<a)) -----> درست
((b-c==-a)||(b-c==a)) -----> درست
عملگر شرطی


اين عملگر يک عبارت را مورد ارزيابی قرار می دهد و براساس عبارت ارزيابی شده مقادير متفاوتی را به عنوان نتيجه بر می گرداند. ساختار اين عملگر به صورت زير می باشد:


نتيجه 2 : نتيجه 1 ? شرط
اگر شرط برقرار باشد نتيجه 1 به عنوان خروجی خواهد بود در غير اين صورت نتيجه 2 به عنوان خروجی در نظر گرفته می شود. به مثال های زير توجه نماييد:

7==6?4:3 --->خروجی عدد3 می باشد چون7 مساوی 6 نمی باشد
8==6+2?4:3 --->خروجی عدد4 می باشد چون8 مساوی 6+2می باشد
6>3?a:b --->خروجی a می باشد چون 6 از 3 بزرگتر است
a>b?a:b --->خروجی عدد بزرگتر می باشد a يا b

--------------------------------------------------------------------------------

همانطور که در عملگرهای محاسباتی ديديم درک تقدم عملگرها، اهميت ويژه ای داشت در اينجا نيز دانستن اين تقدم از اهميت خاصی برخوردار می باشد، تقدم عملگرهای رابطه ای ، منطقی و شرطی به ترتيب عبارتند از:
1- !
2- => > =< <
3- =! ==
4- &&
5- ||
6- :?

به عنوان مثال مراحل بررسی عبارت مقابل به صورت زير می باشد:

2 >= 3 && 2 == 2 || 2 != 3
1 4 2 5 3

1 نادرست
2 درست
3 درست
4 نادرست && درست ----> نادرست
5 نادرست || درست ----> درست

جواب نهايی درست می باشد
پيشنهاد می شود برای جلوگيری از پيچيدگی فهم عبارتهای منطقی و يا محاسباتی تقدم های مورد نظر را با به کار بردن پرانتز کاملاً مشخص کنيم ،

(((2 >= 3) && (2 == 2)) || (2 != 3)
 

!MAHSA!

کاربر ويژه
دستورات ورودی و خروجی

دستورات ورودی و خروجی


برای دريافت اطلاعات از صفحه کليد ، زبان ++C دستوری به نام cin را در اختيار ما قرار داده است، و برای ارسال اطلاعات به صفحه نمايش دستور cout موجود می باشد. توسط اين دو دستور شما می توانيد با نمايش اطلاعات بر روی صفحه نمايش و دريافت اطلاعات از صفحه کليد با کاربری که از برنامه شما استفاده می کند، در ارتباط باشيد.

دستور خروجی cout

دستور cout همراه علامت >> به کار می رود.


cout << "This is a test";
دستور فوق عبارت This is a test را بر روی صفحه نمايش چاپ می کند.


cout << 5120;
دستور فوق عدد 5120 را بر روی صفحه نمايش ظاهر می سازد.


cout << x;
دستور فوق محتويات متغير x را به صفحه نمايش می فرستد.
علامت >> با نام عملگر درج شناخته می شود و اطلاعاتی که بعد از اين علامت قرار می گيرند به واحد خروجی منتقل می شوند. در مثال های فوق يک عبارت رشته ای (This is a test) يک عدد (5120) و يک متغير (x) به واحد خروجی ارسال شدند. توجه داشته باشيد که در اولين مثال عبارت This is a test بين دو علامت (") قرار گرفت ، چون اين عبارت حاوی رشته ای از حروف می باشد؛ هرگاه که بخواهيم رشته ای از حروف را به کار ببريم بايد آنها را بين دو علامت (") قرار دهيم تا با نام متغيرها به اشتباه گرفته نشوند. به عنوان مثال، دستور زير:

cout << " Hello";
عبارت Hello را بر روی صفحه نمايش ظاهر می سازد ولی دستور زير:


cout << Hello;
محتويات متغيری با نام Hello را بر روی صفحه نمايش چاپ می کند.
عملگر درج ممکن است بيش از يک بار در يک جمله به کار رود، به عنوان مثال دستور زير:

cout << "Hello," << "I am" << "new in C++";
پيغام ++Hello, I am new in C را بر روی صفحه نمايش نشان می دهد.
تکرار استفاده از عملگر درج در يک دستور به ما اين امکان را می دهد که ترکيبی از متغير و رشته حروف را در کنار هم استفاده کنيم.


cout << "Hello, my code is" << code
<< "and I am" << age << "years old.";
به عنوان مثال دستور فوق با فرض اينکه متغير code حاوی عدد 116223 و متغير age حاوی عدد 16 باشد عبارت زير را در صفحه نمايش ظاهر می سازد:

Hello, my code is 116223 and I am 16 years old.
توجه داشته باشيد که دستور cout عبارات را به صورت خودکار به خط بعد منتقل نمی کند، به عنوان مثال دستورهای زير:

cout << "This is a text.";
cout << "This is another text.";
علارقم اينکه از دستور cout در دو خط استفاده شده است، به صورت زير در صفحه نمايش نشان داده خواهد شد:


This is a text. This is another text.
برای اينکه عبارتی را در چند خط نمايش دهيم، برای انتقال به هر خط جديد از علامت n\ استفاده می کنيم. به عنوان مثال دستورات زير:


cout << "First sentence.\n";
cout << "Second sentence.\n Third sentence.";
به شکل زير در صفحه نمايش ديده خواهد شد:


First sentence.
Second sentence.
Third sentence.
علاوه بر علامت n\ می توان از دستور endl برای انتقال به خط جديد استفاده کرد به عنوان مثال دستورات :


cout << "First sentence." << endl;
cout << "Second sentence." << endl;
در صفحه نمايش به صورت زير ديده می شوند:


First sentence.
Second sentence
دستور ورودی cin


دستور cin همراه علامت << به کار می رود.

int age;
cin >> age;
دستورات فوق ابتدا فضايی در حافظه برای متغير age در نظر می گيرند، سپس برنامه منتظر وارد کردن عددی از صفحه کليد می ماند تا عدد وارد شده را در متغير age قرار دهد. cin هنگامی قادر به دريافت اطلاعت از صفحه کليد خواهد بود که، کليد Enter بر روی صفحه کليد فشرده شود. به عنوان مثال اگر بخواهيم عدد 16 در متغير age قرار گيرد ابتدا عدد 16 را تايپ کرده سپس دکمه Enter را فشار می دهيم.
علامت >> با نام عملگر استخراج شناخته می شود، و اطلاعاتی که از واحد ورودی دريافت می شود در متغيری که بعد از اين علامت می باشد، قرار می گيرند. ضمناً شما می توانيد توسط يک دستور cin بيش از يک متغير را مقدار دهی کنيد.
به عنوان مثال دستورات زير معادل يکديگر می باشند:


cin >> a >> b;
cin >> a;
cin >> b;
 

!MAHSA!

کاربر ويژه
برنامه چاپ يک متن

برنامه چاپ يک متن




در مباحث قبلی با مفاهيم حافظه و انواع داده، اعمال محاسباتی، عبارات منطقی ودستورات ورودی وخروجی آشنا شديم. با اين مقدمات می توان نوشتن اولين برنامه را آغاز کرد و با اين برنامه نحوه اجرا و ساير جزئيات را مورد بررسی قرار خواهيم داد.

//first program in C++

#include <iostream.h>

int main ()
{
cout << "Hello, This is a C++ program.";
return 0;
}

قبل از هر گونه توضيح اضافی به شيوه نوشتن اين برنامه در ويرايشگر زبان ++C و نحوه اجرای آن می پردازيم


--------------------------------------------------------------------------------

برنامه ای که ما در اينجا نوشتيم يکی از ساده ترين برنامه هايی است که می توانيم به زبان ++C بنويسيم ، ضمن اينکه شامل دستوراتی است که تقريباً هر برنامه ++C به آنها نياز دارد. در اينجا به بررسی تک به تک دستورات برنامه فوق می پردازيم.

//first program in C++
دستور فوق شامل توضيحات می باشد و تأثيری بر نحوه اجرای برنامه نخواهد داشت. هر نوشته ای که بعد از علامت // در زبان ++C قرار گيرد به عنوان توضيحات در نظر گرفته می شود. توضيحی که در اينجا مورد استفاده قرار گرفته به ما می گويد که اين اولين برنامه ما به زبان ++C می باشد. علاوه بر علامت // ، توضيحات را می توان بين */ و /* قرار داد. از شيوه جديد هنگامی استفاده می کنيم که توضيحات ما بيش از يک خط باشد.

/* This is a comment line.
This is another comment line. */
قرار دادن دستورات فوق در برنامه تأثيری بر خروجی ندارد و تنها توضيحاتی برای فهم بهتر برنامه می باشد.

#include <iostream.h>
خطوطی که با علامت پوند # شروع می شوند دستوراتی برای پيش پردازنده می باشند. اين دستورات جزء خطوط اجرايی برنامه نمی باشند و نشانه هايی برای کامپايلر می باشند. در اينجا دستور فوق به پيش پردازنده می گويد که تعدادی از دستورات مورد استفاده در اين برنامه در فايل کتابخانه ای iostream.h قرار دارند. در اين مورد خاص فايل iostream.h شامل دستورات ورودی و خروجی ( مانند cin و cout) می باشد.

int main( )
اين دستور شروع بدنه اصلی برنامه را مشخص می کند. تابع main اولين جايی از برنامه است که زبان ++C شروع به اجرای آن می کند. فرقی ندارد که تابع main را در کجا مورد استفاده قرار دهيم. ابتدا وسط يا انتهای کدهای برنامه نويسی، در هر کجا که تابع main را قرار دهيم ، زبان ++C ابتدا به اين تابع مراجعه می کند. بعد از کلمه main يک جفت پرانتز ( ) قرار می دهيم، چون main يک تابع است. در زبان ++C تمام توابع دارای يک جفت پرانتز می باشند( در مبحث توابع به طور مفصل در باره نحوه ايجاد تابع و آرگومانها و ... صحبت خواهيم کرد). محتويات تابع main همانطور که در برنامه ديديد بين دو علامت { } قرار می گيرند.

cout << "Hello, This is a C++ program.";
اين دستور کار اصلی مورد نظر در اين برنامه را که چاپ عبارت داخل کوتيشن " " بر روی صفحه نمايش است را انجام می دهد. همانطور که گفته شد هنگامی که می خواهيم از دستورات ورودی و خروجی استفاده کنيم بايد در ابتدای برنامه از دستور #include<iostream.h> استفاده کنيم. توجه داشته باشيد که بعد از هر دستور زبان ++C ملزم به استفاده از علامت ( ; ) می باشيم.

return 0;
اين دستور باعث می شود که تابع main به پايان برسد و عدد صفر را به عنوان خروجی تابع بر می گرداند. اين مرسوم ترين روش برای پايان دادن به برنامه بدون دريافت هيچگونه پيغام خطا می باشد. همانطور که در برنامه های بعدی خواهيد ديد، تقريباً همه برنامه های زبان ++C با دستوری مشابه دستور فوق به پايان می رسند.

نکته: بهتر است هر دستور زبان ++C را در يک خط جداگانه بنويسيم. البته در انجام اينکار الزامی نداريم ولی برای خوانايی بيشتر برنامه توصيه می شود از اين شيوه استفاده کنيد.
 

!MAHSA!

کاربر ويژه
برنامه جمع دو عدد

برنامه جمع دو عدد


#include <iostream.h>

� int main()
� {
� cout << "Enter first integer\n";

� int integer1;
� cin >> integer1;

� cout << "Enter second integer\n";

� int integer2;
� cin >> integer2;

� int sum;
� sum = integer1 + integer2;

� cout << "Sum is " << sum << endl;

� return 0;
� }
 

!MAHSA!

کاربر ويژه
ساختار انتخاب if

در برنامه نويسی مواردی پيش می آيد که بخواهيم دستور يا دستوراتی، هنگامی که شرط خاصی برقرار است، توسط برنامه به اجرا در آيد. اين مورد در زندگی روزمره نيز ديده می شود؛ به عنوان مثال " اگر فردا باران نيايد، من به کوه خواهم رفت." شرط مورد نظر نيامدن باران است و عملی که قرار است انجام شود رفتن به کوه می باشد. شيوه پياده سازی ساختار انتخاب if به صورت زير می باشد:

if ( شرط مورد نظر )
دستور مورد نظر ;
به مثال زير توجه کنيد:

if (x == 50)
cout << "x is 50";
اگر از دستور فوق در برنامه استفاده کنيم، اگر مقدار متغير x قبل از رسيدن به شرط فوق برابر 50 باشد عبارت "x is 50" بر روی صفحه نمايش ظاهر خواهد شد وگرنه دستور cout << "x is 50" ; ناديده گرفته می شود و برنامه خط بعدی را اجرا می کند.


توجه داشته باشيد که شرط مورد استفاده در دستور if هر عبارت منطقی می تواند باشد. در مبحث عبارات منطقی ، اينگونه عبارات و شيوه کاربرد آنها را به طور کامل بررسی کرديم.

اگر بخواهيم هنگامی که شرط برقرار می شود، بيش از يک دستور اجرا شود، بايد دستورات مورد نظر را با علامت { } دسته بندی کنيم، به مثال زير توجه کنيد:

if ( x==50 )
{
cout << "x is ";
cout << x;
}
قطعه کد فوق هنگامی که مقدار x عدد 50 باشد، عبارت "x is 50" را در صفحه نمايش چاپ می کند.


ولی در دستورات زير:

if ( x == 50)
cout << "x is ";
cout << x ;
خط آخر برنامه به هر جهت اجرا می شود. به عنوان مثال اگر فرض کنيم x برابر 50 است برنامه به درستی عبارت "x is 50" را چاپ می کند، اما اگر مثلاً x برابر 20 باشد عدد 20 بر روی صفحه نمايش ظاهر خواهد شد. چون عبارت ;cout <<x جز دستورات if قرار ندارد و يک دستور مجزا می باشد.


مورد اخير که توضيح داده شد يکی از مواردی است که بعضی از برنامه نويسان به اشتباه مرتکب آن می شوند. پس در هنگام نوشتن برنامه های خود به دسته بندی دستورات دقت کنيد.
 

!MAHSA!

کاربر ويژه
ساختار انتخاب if/else

در دو مبحث قبلی ساختارهای if و if/else را بررسی کرديم. در برنامه نويسی گاهی به الگوريتمی نياز پيدا می کنيم که در آن متغيری به ازای هر مقدار صحيح ثابتی، باعث اجرای يک دستور خاص شود و به ازای هر مقدار اعمال مختلف انجام پذيرد. برای نيل به اين هدف ++C ساختار چند انتخابی switch را که به صورت زير می باشد در اختيار ما قرار داده است:

switch (عبارتی که بايد مورد بررسی قرار گيرد )
{
case مقدار ثابت 1 :
مجموعه دستورات 1
break;
case مقدار ثابت 2 :
مجموعه دستورات 2
break;

.
.
.

case n مقدار ثابت :
n مجموعه دستورات
break;
default :
مجموعه دستورات حالت پيش فرض
}
ساختار switch به شيوه زير عمل می کند:switch ابتدا عبارت داخل پرانتز را مورد ارزيابی قرار می هد و سپس آن را با مقدار ثابت 1 مورد مقايسه قرار می دهد. اگر برابر بودند مجموعه دستورات 1 را اجرا خواهد شد، تا هنگامی که برنامه به دستور break برسد، هنگامی که برنامه به دستور break رسيد از ساختار چند انتخابی switch خارج می شود. اگر عبارت داخل پرانتز با مقدار ثابت 1 برابر نبود ساختار switch عبارت داخل پرانتز را با مقدار ثابت 2 مورد مقايسه قرار می دهد، در صورت برابر بودن مجموعه دستورات 2 اجرا می گردد. اين روال همينطور ادامه پيدا می کند. در صورتی که عبارت داخل پرانتز با هيچ يک از مقادير ثابت برابر نباشد، مجموعه دستورات حالت default (پيش فرض) اجرا می گردد. به برنامه زير توجه کنيد:

#include <iostream.h>
int main( )
{
int x;
cout << "Please enter a number:";
cin >> x;

switch (x) {
case 1:
cout << "x is 1";
break;
case 2:
cout << "x is 2";
break;
default:
cout << "Unknown value";
}
return 0;
}
برنامه فوق را سه بار با سه عدد مختلف اجرا می کنيم. خروجی ها به صورت زير می باشند:

Please enter a number:1
x is 1
Please enter a number:2
x is 2
Please enter a number:5
Unknown value
توجه داشته باشيد که ساختار switch را می توان با ساختار if/else نيز پياده سازی کرد. به عنوان مثال ساختار switch به کار رفته در مثال فوف معادل ساختار if/else زير می باشد:

if (x == 1)
cout << "x is 1";
else
if (x == 2)
cout << "x is 2";
else
cout << Unknown value";
ما الزامی به استفاده از حالت default در ساختار switch نداريم ولی توصيه می شود که حالت پيش فرض را به کار ببريم چون معمولاً امکان دارد که عبارت برابر با هيچ يک از مقادير ثابت نباشد و با به کار بردن حالت پيش فرض می توانيد پيغام مناسبی در اين رابطه به صفحه نمايش بفرستيد.

توجه داشته باشيد اگر دستور break بعد از هر مجموعه از دستورات استفاده نکنيم برنامه از ساختار switch خارج نخواهد شد و مجموعه دستورات بعدی اجرا می گردد تا به اولين دستور break برسد. اين مورد به ما امکان ايجاد حالتهای ترکيبی را می دهد. البته در به کار بردن اين تکنيک دقت لازم را بکنيد.

#include <iostream.h>
int main( )
{
int x;
cout << "Please enter a number:";
cin >> x;

switch (x) {
case 1:
case 2:
case 3:
cout << "x is (1 or 2 or 3)";
break;
default:
cout << "x is not (1 or 2 or 3)";
}
return 0;
}
برنامه فوق را سه بار با سه عدد مختلف اجرا می کنيم. خروجی ها به صورت زير می باشند:

Please enter a number:1
x is (1 or 2 or 3)
Please enter a number:2
x is (1 or 2 or 3)
Please enter a number:5
x is not (1 or 2 or 3)
 

!MAHSA!

کاربر ويژه
ساختار چند انتخابی switch

در دو مبحث قبلی ساختارهای if و if/else را بررسی کرديم. در برنامه نويسی گاهی به الگوريتمی نياز پيدا می کنيم که در آن متغيری به ازای هر مقدار صحيح ثابتی، باعث اجرای يک دستور خاص شود و به ازای هر مقدار اعمال مختلف انجام پذيرد. برای نيل به اين هدف ++C ساختار چند انتخابی switch را که به صورت زير می باشد در اختيار ما قرار داده است:

switch (عبارتی که بايد مورد بررسی قرار گيرد )
{
case مقدار ثابت 1 :
مجموعه دستورات 1
break;
case مقدار ثابت 2 :
مجموعه دستورات 2
break;

.
.
.

case n مقدار ثابت :
n مجموعه دستورات
break;
default :
مجموعه دستورات حالت پيش فرض
}
ساختار switch به شيوه زير عمل می کند:

switch ابتدا عبارت داخل پرانتز را مورد ارزيابی قرار می هد و سپس آن را با مقدار ثابت 1 مورد مقايسه قرار می دهد. اگر برابر بودند مجموعه دستورات 1 را اجرا خواهد شد، تا هنگامی که برنامه به دستور break برسد، هنگامی که برنامه به دستور break رسيد از ساختار چند انتخابی switch خارج می شود. اگر عبارت داخل پرانتز با مقدار ثابت 1 برابر نبود ساختار switch عبارت داخل پرانتز را با مقدار ثابت 2 مورد مقايسه قرار می دهد، در صورت برابر بودن مجموعه دستورات 2 اجرا می گردد. اين روال همينطور ادامه پيدا می کند. در صورتی که عبارت داخل پرانتز با هيچ يک از مقادير ثابت برابر نباشد، مجموعه دستورات حالت default (پيش فرض) اجرا می گردد. به برنامه زير توجه کنيد:

#include <iostream.h>
int main( )
{
int x;
cout << "Please enter a number:";
cin >> x;

switch (x) {
case 1:
cout << "x is 1";
break;
case 2:
cout << "x is 2";
break;
default:
cout << "Unknown value";
}
return 0;
}
برنامه فوق را سه بار با سه عدد مختلف اجرا می کنيم. خروجی ها به صورت زير می باشند:

Please enter a number:1
x is 1
Please enter a number:2
x is 2
Please enter a number:5
Unknown value
توجه داشته باشيد که ساختار switch را می توان با ساختار if/else نيز پياده سازی کرد. به عنوان مثال ساختار switch به کار رفته در مثال فوف معادل ساختار if/else زير می باشد:

if (x == 1)
cout << "x is 1";
else
if (x == 2)
cout << "x is 2";
else
cout << Unknown value";
ما الزامی به استفاده از حالت default در ساختار switch نداريم ولی توصيه می شود که حالت پيش فرض را به کار ببريم چون معمولاً امکان دارد که عبارت برابر با هيچ يک از مقادير ثابت نباشد و با به کار بردن حالت پيش فرض می توانيد پيغام مناسبی در اين رابطه به صفحه نمايش بفرستيد.

توجه داشته باشيد اگر دستور break بعد از هر مجموعه از دستورات استفاده نکنيم برنامه از ساختار switch خارج نخواهد شد و مجموعه دستورات بعدی اجرا می گردد تا به اولين دستور break برسد. اين مورد به ما امکان ايجاد حالتهای ترکيبی را می دهد. البته در به کار بردن اين تکنيک دقت لازم را بکنيد.

#include <iostream.h>
int main( )
{
int x;
cout << "Please enter a number:";
cin >> x;

switch (x) {
case 1:
case 2:
case 3:
cout << "x is (1 or 2 or 3)";
break;
default:
cout << "x is not (1 or 2 or 3)";
}
return 0;
}
برنامه فوق را سه بار با سه عدد مختلف اجرا می کنيم. خروجی ها به صورت زير می باشند:

Please enter a number:1
x is (1 or 2 or 3)
Please enter a number:2
x is (1 or 2 or 3)
Please enter a number:5
x is not (1 or 2 or 3)
 

!MAHSA!

کاربر ويژه
ساختار تکرار while

ساختار تکرار (حلقه تکرار) به برنامه نويس اين امکان را می دهد که برنامه ، قسمتی از دستورات را تا هنگامی که شرط خاصی برقرار است، را تکرار کند. به عنوان مثال :

تا وقتی که مورد ديگری در ليست خريد من هست.
آن را بخر و از ليست خريد حذفش کن.
مورد فوق روال يک خريد را انجام می دهد. شرط مورد نظر " مورد ديگری در ليست خريد من هست" می باشد، که ممکن است درست يا نادرست باشد. اگر شرط برقرار باشد (يعنی مورد ديگری در ليست خريد باشد) عمل "خريد آن و حذفش از ليست" انجام می گيرد. اين عمل تا وقتی که شرط برقرار باشد ادامه می يابد. هنگامی که شرط برقرار نباشد (يعنی تمام موارد ليست خريد حذف شده باشند)، ساختار تکرار به پايان می رسد و اولين دستور بعد از حلقه تکرار، اجرا می گردد. ساختار تکرار while به صورت زير می باشد.

while (شرط مورد نظر )
{
مجموعه دستورات
}
تا وقتی که شرط داخل پرانتز برقرار باشد مجموعه دستورات اجرا خواهند شد. برای درک بهتر شيوه کاربرد حلقه های تکرار فرض کنيد می خواهيم اولين توانی از عدد 2 که بزرگتر از 1000 می باشد را بيابيم. برنامه به صورت زير خواهد بود.

#include <iostream.h>
int main( )
{
int product = 2;
while (product <= 1000)
product = 2 * product;

cout << "The first power of 2 larger than 1000 is "
<<product <<endl;
return 0;
}
در برنامه فوق ابتدا متغيری به نام product را با مقدار اوليه 2 مقدار دهی کرديم. در حلقه تکرار while با هر بار اجرای دستور product=2*product مقدار متغير product دو برابر می شود بدين ترتيب با پايان يافتن حلقه متغير product حاوی عدد 1024 يعنی اولين توانی از 2 که بزرگتر از 1000 می باشد، خواهد بود.

The first power of 2 larger than 1000 is 1024

نکته : در مثال فوق در حلقه while چون تنها از يک دستور استفاده شده بود از {} استفاده نشد، ولی اگر بيش از يک دستور داشتيم ملزم به استفاده از {} بوديم.

مثال : برنامه ای بنويسيد تا مجموع اعداد يک تا صد را محاسبه کند.

#include <iostream.h>
int main( )
{
int n=1, sum=0;
while (n <= 100)
{
sum += n; // sum = sum + n;
++n; // n = n + 1;
}
cout << "1 + 2 + ... + 100 =" <<sum << endl;
return 0;
}
در مثال فوق حلقه 100 بار اجرا می گردد و هر بار عدد n به متغير sum اضافه می گردد و عدد n نيز يک واحد افزايش می يابد تا در يکصدمين بار اجرای حلقه مقدار متغير n برابر 101 می شود و هنگام بررسی شرط (n <=100) توسط حلقه while شرط نادرست می شود و اولين دستور بعد از حلقه يعنی دستور خروجی cout اجرا می گردد.

1 + 2 + ... + 100 =5050
نکته :

در مثال فوق متغير n به عنوان شمارنده دفعات تکرار حلقه بکار گرفته شد. برحسب مورد شمارنده ها معمولاً با يک يا صفر مقدار دهی اوليه می شوند.
متغير sum حاوی مجموع حاصلجمع بود. چنين متغيرهايی که برای محاسبه يک حصلجمع به کار می روند معمولاً با صفر مقدار دهی اوليه می شوند.
مثال : برنامه ای بنويسيد که تعداد نامشخصی عدد مثبت را از ورودی دريافت نمايد و ميانگين آنها را محاسبه نمايد. عدد 1- را برای مشخص کردن انتهای ليست اعداد در نظر بگيريد.

#include <iostream.h>
int main( )
{ int num, counter = 0;
float average, sum = 0;

cout << "Enter a number (-1 to end):";
cin >>num;

while (num != -1){
sum += num ; // sum = sum + sum;
++counter;
cout << "Enter a number (-1 to end):";
cin >> num;
}

if (counter != 0){
average = sum / counter;
cout << "The average is " << average << endl;
}
else
cout << "No numbers were entered." << endl;

return 0;
}
خروجی برنامه به صورت زير خواهد بود.

Enter a number (-1 to end):20
Enter a number (-1 to end):50
Enter a number (-1 to end):65
Enter a number (-1 to end):70
Enter a number (-1 to end):90
Enter a number (-1 to end):100
Enter a number (-1 to end):1
Enter a number (-1 to end):6
Enter a number (-1 to end):-1
The average is 50.25
در برنامه مثال قبل عدد 1- به عنوان يک مقدار کنترلی به کار می رود و با وارد کردن اين عدد اجرای برنامه به پايان می رسد و ميانگين اعداد در خروجی به نمايش در می آيد. متغير num اعداد را از ورودی دريافت می کند. متغير counter وظيفه شمارش تعداد اعداد وارد شده را دارا می باشد و متغير sum مجموع حاصلجمع اعداد را در خود قرار می دهد و در نهايت متغير average، ميانگين را در خود قرار می دهد. ساختار کنترلی if به کار رفته در برنامه، جلوی بروز خطای زمان اجرای تقسيم بر صفر را می گيرد ، يعنی اگر در اولين دستور cin به کار رفته عدد 1- وارد شود خروجی برنامه به صورت زير خواهد بود :

Enter a number (-1 to end): -1
No numbers were entered.
 

!MAHSA!

کاربر ويژه
ساختار تکرار do/while

ساختار تکرار do/while مشابه ساختار تکرار while می باشد. در ساختار تکرار while شرط حلقه در ابتدا بررسی می شود ولی در ساختار تکرار do/while شرط در انتهای حلقه مورد بررسی قرار می گيرد، بدين ترتيب در ساختار تکرار do/while دستورات حلقه حداقل يکبار اجرا خواهند شد. ساختار تکرار do/while به صورت زير می باشد:

do {
مجموعه دستورات
}while ( شرط مورد نظر );

به عنوان مثال به برنامه زير توجه نماييد:

#include <iostream.h>

int main()
{
int counter = 1;
do {
cout << counter << " ";
}while ( ++counter <= 10 );
cout << endl;

return 0;
}
در اين برنامه اعداد 1 تا 10 با فاصله بر روی صفحه نمايش چاپ خواهند شد. دقت کنيد که متغير counter در قسمت شرط حلقه ، يک واحد اضافه می گردد سپس مقدارش با عدد 10 مقايسه می گردد.

1 2 3 4 5 6 7 8 9 10

مثال: برنامه ای بنويسيد که ليست نمرات يک کلاس را دريافت کرده و تعداد قبولی ها و مردودی ها را مشخص کند. ضمنا در ابتدای برنامه تعداد نمرات ليست پرسيده شود.

#include <iostream.h>
int main( )
{
float mark;
int howmany,counter=1;
int passes=0,failures=0;

cout << "How many marks : ";
cin >> howmany;

do {
cout << "Enter mark "<<counter<<" : ";
cin>>mark;
if (mark>=10)
++passes;
else
++failures;
}while (++counter <= howmany);

cout<<"Passed : "<<passes<<endl;
cout<<"Failed : "<<failures<<endl;

return 0;
}
خروجی برنامه به صورت زير می باشد :

How many marks : 10
Enter mark 1 : 18
Enter mark 2 : 15
Enter mark 3 : 9
Enter mark 4 : 17.5
Enter mark 5 : 9.75
Enter mark 6 : 8
Enter mark 7 : 11
Enter mark 8 : 13
Enter mark 9 : 5
Enter mark 10 : 13
Passed : 6
Failed : 4
 

!MAHSA!

کاربر ويژه
ساختار تکرار for

ساختار تکرار for نيز مانند دو ساختار قبلی يک حلقه تکرار می سازد. از ساختار تکرار for معمولاً هنگامی که دفعات تکرار حلقه براساس يک شمارنده می باشد استفاده می شود. ساختار تکرار for به صورت زير می باشد:

for ( افزايش يا کاهش ; شرط حلقه ; تعريف متغير )
مقدار شمارنده شمارنده و تعيين
مقدار اوليه
{
مجموعه دستورات
}
ساختار تکرار for را با ساختار تکرار while نيز می توان پياده سازی کرد به عنوان مثال دو برنامه زير اعداد 1 تا 5 را بر روی صفحه نمايش چاپ می کنند:

#include <iostream>

int main()
{
int counter = 1;

while ( counter <= 5 ) {
cout << counter << endl;
++counter;
}
return 0;
}
برنامه فوق با حلقه while نوشته شده بود. در برنامه زير معادل حلقه while فوق را با حلقه for پياده سازی می کنيم:

#include <iostream>

int main()
{

for ( int counter = 1; counter <= 5; counter++ )
cout << counter << endl;

return 0;
}
در برنامه فوق هنگامی که دستور for اجرا می شود متغير کنترلی counter تعريف می گردد و عدد 1 در آن قرار می گيرد. سپس شرط حلقه مورد بررسی قرار می گيرد (counter<=5) چون مقدار counter ، عدد 1 می باشد پس شرط درست است و دستور حلقه، يعنی دستور cout اجرا می گردد و اولين عدد يعنی 1 نمايش داده می شود. پس از آن دستور ++counter اجرا می گردد و مقدار متغير counter يک واحد اضافه می شود. سپس مجدداً شرط حلقه بررسی و در صورت برقرار بودن شرط دستور cout اجرا می گردد. اين روال تا وقتی که شرط برقرار باشد ادامه می يابد و به محض برقرار نبودن شرط يعنی هنگامی که counter حاوی عدد 6 شود خاتمه می يابد و برنامه به پايان می رسد.

1 2 3 4 5

در برنامه قبلی اگر حلقه for را به صورت زير بازنويسی کنيم:

for(int counter=10; counter>=1; counter=counter-2)
خروجی برنامه اعداد زوج 10 تا 1 به صورت معکوس می باشد، يعنی :

10 8 6 4 2
توجه داشته باشيد که در حلقه فوق به جای استفاده از دستور counter=counter-1 می توانستيم از دستور counter -= 2 استفاده کنيم.

مثال : برنامه ای بنويسيد که مجموع اعداد زوج 1 تا 100 را محاسبه کند.

#include <iostream.h>

int main ( )
{ int sum = 0;

for (int num = 2; num <= 100; num += 2)
sum += num;
cout << "2 + 4 + 6 + ... + 100 =" <<sum<<endl;

return 0;
}
2 + 4 + 6 + ... + 100 =2550
توجه داشته باشيد که حلقه for در برنامه فوق را با کمک عملگر کاما ( , ) می توانيم به صورت زير نيز بنويسيم:

for (int num = 2;
num <= 100;
sum += num, num +=2);
ضمناً شکستن حلقه به چند خط نيز مشکلی ايجاد نمی کند. البته دو مورد اخير توصيه نمی شوند، چون از خوانايی برنامه می کاهند.

مثال : برنامه ای بنويسيد که عددی را از ورودی دريافت کرده و 2 به توان آن عدد را محاسبه و در خروجی چاپ نمايد.

#include <iostream.h>
int main( )
{
unsigned long int x=1;
int power;

cout << "Enter power:";
cin >>power;

for (int counter=1;counter<=power;counter++)
x*=2;

cout << "2 ^ " << power << " = " << x <<endl;

return 0;
}
Enter power:25
2 ^ 25 = 33554432
در مثال های فوق، دستورات حلقه for را داخل { } قرار نداديم چون حلقه for تنها شامل يک دستور بود، توجه داشته باشيد که اگر بيش از يک دستور در حلقه به کار رود ملزم به استفاده از { } می باشيم.

مثال : برنامه ای بنويسيد که جدول ضرب 5X5 را ايجاد کند.

#include <iostream.h>
int main( )
{

for (int x=1;x<=5;x++)
{
for (int y=1;y<=5;y++)
cout <<x*y<<"\t";
cout<<endl;
}

return 0;
}
خروجی برنامه به صورت زير خواهد بود:

1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
در برنامه فوق حلقه شامل متغير x ، دارای دو دستور for و cout بود، به همين علت از { } استفاده شد. اما حلقه شامل متغير y تنها دارای يک دستور cout بود. اگر دقت کرده باشيد دستور ;"cout<<x*y<<"\t دارای علامت t\ بود. به کار بردن t\ باعث جدول بندی و مرتب شدن خروجی می شود. در حقيقت مکان نمای صفحه نمايش را در محل جدول بندی قرار می دهد. ضمناً در مثال فوق يک ساختار for در دل ساختار for ديگری استفاده شد به اين شيوه استفاده حلقه های تودرتو گفته می شود که در برنامه نويسی ها به کرات از آنها استفاده می شود. در ضمن توجه داشته باشيد که اگر از دستور ;cout <<endl استفاده نشود، خروجی به صورت نا مرتب زير خواهد بود:

1 2 3 4 5 2 4 6 8 10
3 6 9 12 15 4 8 12 16 20
5 10 15 20 25
نکته : در حلقه های تکرار ممکن است شرط حلقه را به اشتباه بنويسيم يا به عنوان مثال شمارنده حلقه را افزايش ندهيم در چنين حالاتی ممکن است پس از اجرای برنامه، برنامه به اتمام نرسد و حلقه همچنان تکرار شود. در صورت بروز چنين مشکلی با فشردن کليد Ctrl همراه با Break (Ctrl+Break) اجرای برنامه به صورت ناگهانی قطع می شود و به محيط ويرايشگر ++C باز می گرديد و می توانيد کد اشتباه را درست کنيد. سپس برنامه را مجدداً اجرا کنيد.
 

!MAHSA!

کاربر ويژه
دستور های break و Continue

دستور break هرگاه که در ساختارهای while و do/while و for يا switch اجرا گردد، باعث خروج فوری برنامه از آن ساختار خواهد شد و برنامه اولين دستور بعد از آن ساختار را اجرا خواهد کرد. به برنامه زير توجه کنيد:

#include <iostream.h>

int main()
{
int n;
for (n=10; n>0; n--)
{
cout << n << ",";
if (n==3)
{
cout << "countdown aborted!";
break;
}
}
return 0;
}
خروجی برنامه به صورت زير می باشد:

10,9,8,7,6,5,4,3,countdown aborted!
برنامه فوق اعداد 10 تا 4 را چاپ خواهد کرد و هنگامی که متغير n عدد 3 می شود، شمارش معکوس به پايان می رسد.

نکته : در برنامه فوق شمارنده حلقه يعنی n در خارج از دستور for تعريف شد. در چنين حالتی ، اين متغير خارج از حلقه نيز می تواند مورد استفاده قرار گيرد ولی اگر تنها در داخل حلقه تعريف شده بود ، تنها آنجا می توانستيم از آن استفاده کنيم و خارج حلقه تعريف نشده بود.

دستور continue هرگاه در ساختارهای while و do/while يا for اجرا گردد دستورات بعدی آن ساختار ناديده گرفته می شود و بار بعدی حلقه تکرار اجرا می شود. در دو ساختار while و do/while پس از اجرای دستور continue شرط حلقه مورد بررسی قرار می گيرد، اما در ساختار for ابتدا مقدار شمارنده افزايش يا کاهش می يابد، سپس شرط حلقه بررسی می شود. توجه داشته باشيد که در حلقه while وdo/while دستور continue همواره بعد از افزايش يا کاهش شمارنده به کار رود. به عنوان مثال برنامه زير مجموع اعداد 1 تا 20 به جز 10 را محاسبه می کند.

#include <iostream.h>

int main( )
{
int n=0, sum=0;
while (n < 20)
{
++n; // n = n + 1;
if (n==10) continue;
sum += n; // sum = sum + n;
}
cout << "1+2+ ...(except 10)...+20=" <<sum << endl;

return 0;
}
خروجی برنامه به صورت زير می باشد.

1+2+ ...(except 10)...+20=200
برنامه عمل جمع را تا رسيدن به عدد 10 ادامه می دهد به محض اينکه n برابر 10 می شود دوباره به شرط حلقه منتقل می شود و چون شرط همچنان برقرار است وارد حلقه شده و n يک واحد افزايش می يابد و جمع اعداد ادامه می يابد.
 

!MAHSA!

کاربر ويژه
توابع ریاضی

مفهوم تابع يکی از مهمترين مفاهيم در رياضيات و علوم کامپيوتر و نيز ساير علوم می باشد. تابع را می توان به عنوان دستگاهی در نظر گرفت که وروديهای مجازش را با تغييراتی که وظيفه آن دستگاه می باشد به خروجی متناظر با ورودی تبديل می کند. معادله خط y = 2x + 1 را در نظر بگيريد، اگر به جای f(x)، y را قرار دهيم معادله خط فوق به صورت f(x) = 2x + 1 در خواهد آمد. در اينجا دستگاه ما تابع f خواهد بود که هر ورودی (هر عدد حقيقی) را در 2 ضرب می کند و سپس يک واحد به آن اضافه می کند.

به عنوان مثال :

f(0) = 2 * (0) + 1 = 1
f(1) = 2 * (0) + 1 = 3
f(-1) = 2 * (-1) + 1 = -1
همانطور که در مثالهای فوق ديديد تابع f به هر ورودی تنها يک خروجی را نظير می کند.

مثال : تابعی بنويسيد که شعاع يک دايره به عنوان ورودی باشد و خروجی ، مساحت دايره باشد.

می دانيم که فرمول مساحت دايره s = 3.14*r2 می باشد پس تابع را به صورت زير تعريف می کنيم:

s(r) = 3.14*r2
بعضی از توابع ممکن است بر اساس شرط خاصی خروجی متفاوتی داشته باشند، اينگونه توابع معمولاً به صورت چند ضابطه ای تعريف می شوند. به عنوان مثال تابع قدر مطلق به این صورت می باشد

به عنوان نمونه :

abs(1) = 1
abs(-1) = 1
abs(0) = 0


زبان ++C برای انجام محاسبات رياضياتی ، توابع کاربردی فراوانی را در اختيار ما قرار داده است ، به عنوان مثال فرض کنيد که می خواهيد جذر يک عدد را بدست آوريد، تابعی که زبان ++C برای اينکار در اختيار ما قرار داده است، تابع sqrt می باشد. به عنوان مثال دستور زير :

cout << sqrt (900);
عدد 30 را چاپ خواهد کرد. در اينجا عدد 900 آرگومان تابع sqrt می باشد. برای استفاده از توابع رياضی در برنامه ملزم به استفاده از دستور:

#include <math.h>
در ابتدای برنامه می باشيم، چون توابع رياضی در فايل کتابخانه ای math.h قرار دارند. آرگومانهای توابع می توانند شامل اعداد ثابت، متغيرها و يا ترکيبی از آنها باشند؛ به عنوان مثال به برنامه زير توجه کنيد :

#include <iostream.h>
#include <math.h>
int main ( )
{
int x = 30;
double y = 5;
cout << sqrt (x+2*y+9)<<endl;
return 0;
}
خروجی برنامه فوق عدد 7 خواهد بود چون تابع sqrt جذر عبارت 30+2*5+9=49 را محاسبه خواهد کرد.

مثال : برنامه ای بنويسيد که sin و cos وtan زاويه های زوج 1 تا 90 درجه را در خروجی به صورت جدول بندی شده تا سه رقم اعشار چاپ نمايد.

#include <iostream.h>
#include <math.h>

int main( )
{
float r;
for (int d=2;d<=90;d+=2)
{
r = 3.1415 * d / 180;
cout<<"sin("<<d<<")="
<<floor(sin(r)*1000 + 0.5)/1000;
cout<<"\tcos("<<d<<")="
<<floor(cos(r)*1000 + 0.5)/1000;
cout<<"\ttan("<<d<<")="
<<floor(tan(r)*1000 + 0.5)/1000;
cout<<endl;
}
return 0;
}
خروجی برنامه به صورت زير می باشد:

sin(2)=0.035 cos(2)=0.999 tan(2)=0.035
sin(4)=0.07 cos(4)=0.998 tan(4)=0.07
sin(6)=0.105 cos(6)=0.995 tan(6)=0.105
sin(8)=0.139 cos(8)=0.99 tan(8)=0.141
sin(10)=0.174 cos(10)=0.985 tan(10)=0.176
sin(12)=0.208 cos(12)=0.978 tan(12)=0.213
sin(14)=0.242 cos(14)=0.97 tan(14)=0.249

. . .
. . .
. . .

sin(86)=0.998 cos(86)=0.07 tan(86)=14.292
sin(88)=0.999 cos(88)=0.035 tan(88)=28.599
sin(90)=1 cos(90)=0 tan(90)=21584.891
در برنامه فوق توسط فرمول r = 3.1415 * d / 180 زاويه بر حسب درجه را به راديان تبديل کرديم و توسط فرمول floor(sin(r)*1000 + 0.5)/1000 خروجی را تا سه رقم اعشار محاسبه کرديم. همانطور که می بينيد ورودی تابع، علاوه بر متغير و عدد ثابت خروجی تابع ديگری می باشد. به عنوان مثال sqrt(pow(2,2)) برابر با 2 خواهد بود و ترکيب توابع به اين شکل کاملاً مجاز می باشد و بر حسب نياز می توانيد از اين شيوه استفاده کنيد.
 

!MAHSA!

کاربر ويژه
تعریف توابع

تعریف توابع


اکثر برنامه های کاربردی ، خيلی بزرگتر از برنامه هايی می باشند که ما تا اکنون در مباحث قبلی نوشته ايم. تجربه نشان داده است که بهترين راه برای گسترش و نگهداری و ارتقاء برنامه های بزرگ، تق سيم کردن آنها به قطعات کوچکتر می باشد. هر کدام از قطعات راحتتر از برنامه اصلی مديريت می شوند و اعمال تغييرات و خطايابی در آنها نيز ساده تر می باشد. قطعات مورد نظر ما در زبان ++C همان توابع می باشند. اگر بياد داشته باشيد در مباحث قبلی گفتيم که main نيز يک تابع می باشد و اين تابع نقطه ای است که برنامه اجرای دستورات را از آن آغاز می کند. زبان ++C توابع آماده زيادی را در اختيار ما قرار داده که در فايلهای کتابخانه ای اين زبان موجود می باشند، که گوشه ای از آنها را در مبحث قبل ديديد. در برنامه نويسی ممکن است که نياز داشته باشيم مجموعه دستوراتی را عيناً در چند جای برنامه استفاده کنيم، در چنين حالتی بهتر است اين مجموعه دستورات را در تابعی قرار دهيم و تابع را در برنامه چندين باز صدا بزنيم و از تکرار دستورات که تنها حجم برنامه اصلی را زياد می کنند و از خوانايی آن می کاهند خودداری کنيم.

در زبان ++C توابع به شيوه زير تعريف می شوند :

آرگومانهای تابع) نام تابع نوع داده خروجی)
{
تعريف متغيرها
دستورات تابع
}
نام تابع از قواعد نام گذاری متغيرها پيروی می کند. برای آشنا شدن با نحوه تعريف توابع و شيوه به کار گيری آنها به برنامه زير توجه کنيد:

#include <iostream.h>

long int power2 (int x)
{
long int y;

y=x*x;

return y;
}

int main ()
{
for (int i=1;i<=10;i++)
cout<<power2(i)<<" ";

return 0;
}

خروجی برنامه مربع اعداد 1 تا 10 می باشد.

1 4 9 16 25 36 49 64 81 100
تابع power2(x) که در اين برنامه نوشتيم تقريباً شبيه تابع pow(x,2) از توابع کتابخانه ای ++C عمل می کند. ضابطه رياضياتی اين تابع f(x) = x2 می باشد. ورودی اين تابع اعداد صحيح (int) و خروجی آن اعداد بزرگ (long int) می باشد. هنگامی که برنامه به تابع power2(i) می رسد تابع فراخوانی می شود و مقدار آرگومان i را دريافت می کند و در متغيرx قرار می دهد. سپس متغير y تعريف می گردد و مقدار x*x در y قرار می گيرد و سرانجام مقدار y به عنوان خروجی تابع برگردانده می شود و توسط دستور cout چاپ می گردد. توجه داشته باشيد که تابع تغييری در مقدار متغير i ايجاد نمی کند و حلقه for تابع را 10 بار فراخوانی می کند، ضمناً متغيرهای x وy در تابع main قابل استفاده نمی باشند و نيز متغير i در تابع power2 تعريف نشده است.

نکته : توجه داشده باشيد که توابع داخل يکديگر قابل تعريف نمی باشند و جدا از هم بايد تعريف گردند.

مثال : تابعی بنويسيد که سه عدد را به عنوان ورودی دريافت کرده و بزرگترين آنها را به عنوان خروجی برگرداند. اين تابع را در برنامه ای به کار ببريد.

#include <iostream.h>

int maximum (int x,int y, int z)
{
int max=x;

if (y>max)
max=y;
if (z>max)
max=z;

return max;
}

int main ()
{
int num1,num2,num3;

cout << "Enter three numbers: ";
cin >> num1 >> num2 >> num3;
cout << "Max is :"
<< maximum(num1,num2,num3)<<endl;
cout << "Max of 5,20,1 is "
<< maximum(5,20,1)<<endl;

return 0;
}
Enter three numbers: -5 20 150
Max is :150
Max of 5,20,1 is 20
تابع maximum دارای سه آرگومان بود. هنگامی که اعداد num1 و num2 و num3 در برنامه از ورودی دريافت می شوند با فراخوانی تابع maximun(num1,num2,num3) اعداد آرگومانهای num1 و num2 و num3 به ترتيب در متغير های x و y و z قرار می گيرند و مقادير توسط تابع مقايسه می شوند و نهايتاً بزرگترين عدد در متغير max قرار می گيرد که توسط دستور return max; به عنوان خروجی تابع برگردانده می شود. سپس دستور cout خروجی تابع را بر روی صفحه نمايش چاپ می کند.
 

!MAHSA!

کاربر ويژه
پیش تعریف توابع

تا به حال توابع مورد استفاده در برنامه هايمان را قبل از اولين فراخوانی آنها تعريف کرديم و اين فراخوانی معمولا در تابع main بود. لذا تابع main را به عنوان آخرين تابع در برنامه نوشتيم. اگر بخواهيد که تابع main را قبل از هر تابع ديگری در برنامه بنويسيد. هنگام اجرای برنامه يک پيغام خطا دريافت خواهيد کرد. دليل وقوع خطا اين است که هنگامی که تابعی فراخوانی می شود بايد قبلا تعريف شده باشد، مانند شيوه ای که ما در برنامه های قبلی استفاده کرديم.

يک راه چاره برای اجتناب از نوشتن کد همه توابع قبل از استفاده آنها در تابع main يا ساير توابع وجود دارد. اين راهکار پيش تعريف توابع می باشد. پيش تعريف تابع به صورت زير می باشد:

نوع آرگومانهای تابع ) نام تابع نوع داده خروجی );
توجه داشته باشيد که پيش تعريف تابع شامل دستورات تابع نمی شود و تنها شامل نوع داده خروجی ، نام تابع و نوع آرگومانها می باشد و در پايان نياز به علامت (;) دارد. به عنوان مثال پيش تعريف تابع power2 در مبحث قبلی به صورت زير می باشد:

long int power2( int );
ويا پيش تعريف تابع maximum به صورت زير است :

int maximum( int, int, int );
در اينجا برنامه تابع maximum در مبحث قبلی را با روش پيش تعريف تابع باز نويسی می کنيم :

#include <iostream.h>

int maximum (int ,int,int);

int main ()
{
int num1,num2,num3;

cout << "Enter three numbers: ";
cin >> num1>>num2>>num3;
cout << "Max is :"
<< maximum(num1,num2,num3)<<endl;
cout << "Max of 5,20,1 is "
<< maximum(5,20,1)<<endl;

return 0;
}

int maximum (int x,int y, int z)
{
int max=x;

if (y>max)
max=y;
if (z>max)
max=z;

return max;
}
Enter three numbers: -5 20 150
Max is :150
Max of 5,20,1 is 20
همانطور که در برنامه می بينيد، تابع main قبل از تابع maximum نوشته شده است و اين امکانی است که پيش تعريف تابع maximum به ما داده است.

نکته: در بعضی از برنامه ها، نياز پيدا می کنيم که دو تابع يکديگر را فراخوانی کنند. در چنين حالتی ملزم به استفاده از پيش تعريف تابع می باشيم. اما به عنوان يک توصيه برنامه نويسی همواره از پيش تعريف توابع استفاده کنيد ، حتی اگر ملزم به استفاده از آن نبوديد.
 

!MAHSA!

کاربر ويژه
تعریف بازگشتی

برنامه هايی که تا کنون نوشتيم يک تابع، تابع ديگری را فراخوانی می کرد. در برنامه نويسی ممکن است نياز پيدا کنيم که تابعی خودش را به صورت مستقيم يا غير مستقيم فراخوانی کند. به چنين توابعی، توابع بازگشتی گفته می شود . ابتدا از ديد رياضياتی توابع بازگشتی را بررسی می کنيم. دنباله اعداد زير را در نظر بگيريد :

2 , 5 , 11 , 23 , ...

جمله پنجم دنباله اعداد فوق چه عددی می باشد؟ حدس شما چيست؟ اگر کمی دقت کنيد متوجه خواهيد شد که هر جمله از دنباله فوق برابر است با دو برابر جمله قبلی بعلاوه يک. پس جمله پنجم برابر است با 2*23+1=47 دنباله فوق را توسط فرمول زير نيز می توان مشخص کرد :

d1 = 2
dn = 2*dn-1+1

همانطور که متوجه شده ايد در اين دنباله هر جمله به جملات قبلی خود وابسته است و برای بدست آوردن آن نياز به بازگشت روی جملات قبلی داريم تا اينکه سرانجام به جمله اول که عدد 2 می باشد برسيم. فرمول فوق را به صورت تابعی زير بازنويسی می کنيم :

d(1) = 2
d(n) = 2*d(n-1)+1

همانطور که در تابع فوق می بينيد يک حالت پايه وجود دارد که همان d(1)=2 می باشد و يکه حالت بازگشتی که تابع با يک واحد کمتر دوباره فراخوانی می شود d(n) = 2*d(n-1)+1 . توابع بازگشتی به طور کلی دارای يک يا چند حالت پايه و يک بخش بازگشتی می باشند. که معمولاً در بخش بازگشتی تابع با مقداری کمتر مجدداً فراخوانی می شود. تابع بازگشتی فوق به زبان ++C به صورت زير می باشد :

long int d(long int n)
{
if (n == 1)
return 2;
else
return 2*d(n-1)+1;
}
در زير برنامه ای می نويسيم تا با استفاده از تابع فوق 20 جمله اول دنباله مذکور را نمايش دهد.

#include <iostream.h>

long int d(long int);
int main( )
{
for (int i=1;i<=20;i++)
{
cout<<d(i)<<"\t";
if (i%5==0) cout<<endl;
}

return 0;
}

long int d(long int n)
{
if (n == 1)
return 2;
else
return 2*d(n-1)+1;
}
2 5 11 23 47
95 191 383 767 1535
3071 6143 12287 24575 49151
98303 196607 393215 786431 1572863
تابع هانوی و برنامه ای که در آن اين تابع مورد استفاده قرار گرفته است به صورت زير می باشد :

#include <iostream.h>

int hanoi(int, char, char, char);

int main( )
{ int disks;

cout<<"Moving disks form tower A to C."<<endl;
cout<<"How many disks do you want to move?";
cin>>disks;
cout<<hanoi(disks,'A','B','C')<<endl;

return 0;
}

int hanoi(int n, char first, char help, char second)
{
if (n == 1) {
cout << "Disk " << n << " from tower " << first
<< " to tower " << second << endl;
}
else {
hanoi(n-1, first, second, help);
cout << "Disk " << n << " from tower " << first
<< " to tower " << second << endl;
hanoi(n-1, help, first, second);
}
return 0;
}
خروجی برنامه با فرض اينکه می خواهيم مراحل انتقال چهار ديسک را ببينيم به صورت زير می باشد :

Moving disks form tower A to C.
How many disks do you want to move?4
Disk 1 from tower A to tower B
Disk 2 from tower A to tower C
Disk 1 from tower B to tower C
Disk 3 from tower A to tower B
Disk 1 from tower C to tower A
Disk 2 from tower C to tower B
Disk 1 from tower A to tower B
Disk 4 from tower A to tower C
Disk 1 from tower B to tower C
Disk 2 from tower B to tower A
Disk 1 from tower C to tower A
Disk 3 from tower B to tower C
Disk 1 from tower A to tower B
Disk 2 from tower A to tower C
Disk 1 from tower B to tower C
0
 

!MAHSA!

کاربر ويژه
تولید اعداد تصادفی

کی از کاربردهای اساسی کامپيوتر، استفاده از آن در کارهای شبيه سازی می باشد. در اينجا به بررسی نحوه توليد اعداد تصادفی می پردازيم. اعداد تصادفی در مسائل شبيه سازی کاربرد فراوانی دارند، به عنوان مثال شبيه سازی پرتاب سکه، پرتاب تاس و مسائلی از اين قبيل.

برای توليد اعداد تصادفی زبان ++C تابعی با نام rand() را که در فايل کتابخانه ای stdlib.h قرار دارد، در اختيار ما گذاشته است. به عنوان مثال دستور زير :

i = rand();
يک عدد تصادفی بين 1 تا 32767 را در متغير i قرار می دهد . تابع rand() اعداد را با احتمال مساوی در اين بازه انتخاب می کند پس شانس انتخاب هر عددی در اين بازه با اعداد ديگر برابر است.

معمولاً بازه اعدادی که توسط تابع rand توليد می شود، با آنچه که مورد نياز ماست متفاوت می باشد. به عنوان مثال برای شبيه سازی پرتاب سکه به دو عدد تصادفی و برای تاس به شش عدد تصادفی نياز داريم. فرض کنيد که می خواهيد عدد 31250 را به عددی بين 1 تا 6 تبديل کنيد. چه راه کاری را در نظر می گيريد؟ راهی که برای اين تبديل وجود دارد استفاده از باقيمانده صحيح می باشد، همانطور که می دانيد باقيمانده صحيح تقسيم هر عددی بر 6 يکی از اعداد 0 تا 5 می باشد. پس با اضافه کردن 1 واحد به باقيمانده ، عددی بين 1 تا 6 خواهيم داشت.

حال اگر به جای متغير a ، تابع rand() را قرار دهيم عبارت rand()%6+1 عددی تصادفی بين 1 تا 6 به ما می دهد به طور کلی برای بدست آوردن عددی تصادفی در بازه [a,b] می توانيم از فرمول زير استفاده کنيم.

rand()%(b-a+1)+a
به عنوان مثال خروجی قطعه برنامه زير عدد صحيحی در بازه [20,100] می باشد.

int a = 20 , b = 100;
cout<< rand()%(b-a+1)+a;
برنامه زير 20 عدد تصادفی بين 1 تا 6 را ايجاد می کند. که اين برنامه را می توان 20 بار پرتاب يک تاس در نظر گرفت :

#include <iostream.h>
#include <stdlib.h>

int main()
{
for (int i = 1; i<= 20; i++ )
{
cout << rand() % 6 + 1<<"\t";

if ( i % 5 == 0 )
cout << endl;
}
return 0;
}
خروجی برنامه فوق به صورت زير می باشد :

5 5 3 5 5
2 4 2 5 5
5 3 2 2 1
5 1 4 6 4
يک بار ديگر برنامه فوق را اجرا کنيد و خروجی را مجدداً بررسی کنيد. خواهيد ديد خروجی دقيقاً همان اعداد قبلی می باشد. خروجی تابع rand() اعداد تصادفی می باشد ولی با اجرای دوباره برنامه همان اعداد مجدداً به همان ترتيب قبلی تکرار می شوند. اين تکرار يکی از قابليتهای تابع می باشد ودر اشکال زدايی برنامه کاربرد دارد.

اگر بخواهيم که تابع rand() اعداد کاملاً تصادفی ايجاد کند بايد از تابع srand() استفاده کنيم. اين تابع ورودی از نوع اعداد صحيح بدون علامت می گيرد و باعث تصادفی شدن تابع rand() بر اساس مقدار ورودی تابع srand() می شود. تابعsrand() نيز در فايل کتابخانه ای stdlib.h قرار دارد. در برنامه زير به نحوه استفاده از تابع srand() پی خواهيد برد.

#include <iostream.h>
#include <stdlib.h>

int main()
{
unsigned int num;

cout<<"Enter a number: ";
cin>>num;

srand(num);

for (int i = 1; i<= 20; i++ )
{
cout << rand() % 6 + 1<<"\t";

if ( i % 5 == 0 )
cout << endl;
}
return 0;
}
خروجی برنامه به صورت زير می باشد.

Enter a number: 251
3 4 1 4 6
6 4 6 2 5
5 3 1 4 5
1 6 6 6 1
Enter a number: 350
1 4 3 4 1
2 6 2 6 2
4 2 5 3 5
4 4 5 2 3
Enter a number: 251
3 4 1 4 6
6 4 6 2 5
5 3 1 4 5
1 6 6 6 1
همان طور که می بينيد بر اساس ورودی های مختلف خروجی نيز تغيير می کند. توجه داشته باشيد که ورودی های يکسان خروجی های يکسانی دارند.

اگر بخواهيم بدون نياز به وارد کردن عددی توسط کاربر، اعداد تصادفی داشته باشيم می توانيم از تابع time که در فايل کتابخانه ای time.h قرار دارد استفاده کنيم . تابع time ساعت کامپيوتر را می خواند و زمان را بر حسب ثانيه بر می گرداند ، به اين ترتيب دستور زير:

srand(time(0));
باعث می شود که تابع rand() در هر بار اجرای برنامه اعداد متفاوتی را ايجاد کند. اگر برنامه فوق را به صورت زير باز نويسی کنيم با هر بار اجرای برنامه اعداد تصادفی متفاوتی خواهيم داشت.

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int main()
{
srand(time(0));

for (int i = 1; i<= 20; i++ )
{
cout << rand() % 6 + 1<<"\t";

if ( i % 5 == 0 )
cout << endl;
}
return 0;
}
مثال : برنامه ای بنويسيد که پرتاب سکه ای را شبيه سازی کند ، بدين صورت که سکه را 2000 بار پرتاب کند و دفعات رو يا پشت آمدن سکه را چاپ کند.

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int main()
{
int back=0,front=0,face;

srand(time(0));

for (int i = 1; i<= 2000; i++ )
{
face=rand()%2+1;
switch(face)
{
case 1:
++back;
break;
case 2:
++front;
break;
default:
cout<<"Error!";
}
}

cout<<"Front: "<< front<<endl;
cout<<"Back : "<< back<<endl;

return 0;
}
 

!MAHSA!

کاربر ويژه
نوع داده ای enum

نوع داده ای enum


enum يک نوع داده ای تعريف شده توسط برنامه نويس را که به آن نوع داده شمارش می گويند، ايجاد می کند. نحوه ايجاد يک نوع داده شمارش به صورت زير می باشد.

enum {ثابت n و ... و ثابت 2 و ثابت 1} نام نوع داده
اين دستور به ترتيب در ثابت 1 ، ثابت 2 و ... و ثابتn اعداد صحيح متوالی 0 تا n را قرار می دهد . به صورت پيش فرض مقداردهی متغيرها در اين دستور از صفر شروع می شود.

enum TrueFalse {FALSE , TRUE}
دستور فوق به ثابت FALSE ، عدد صفر و به ثابت TRUE عدد 1 را تخصيص می دهد. حال اگر بخواهيم مقداردهی از عددی غير از صفر شروع شود بايد عدد مورد نظر را مشخص کنيم :

enum Days {SAT = 1, SUN, MON, TUE, WED, THU, FRI}
دستور فوق به روزهای هفته به ترتيب اعداد 1 تا 7 را نسبت می دهد. توصيه می شود که نام ثابت های شمارشی را با حروف بزرگ بنويسيد ، بدين صورت اين ثابتها با متغيرهای برنامه ، اشتباه نمی شوند. ضمناً enum را در ابتدای برنامه به کار ببريد.

در حقيقت اين نوع داده به هر يک از موارد ليستی از اعداد نامی را نسبت می دهد. به عنوان نمونه در مثال روزهای هفته هر يک از اعداد 1 تا 7 را با يکی از روزهای هفته نام گذاری کرديم.

مقدار دهی موارد ليست به صورت های مختلف امکان پذير می باشد.

enum Days { MON, TUE, WED, THU, FRI, SAT , SUN = 0}
دستور فوق SUN را با عدد صفر و SAT را با عدد 1- و ... و MON را با عدد -6 مقدار دهی می کند.

enum Colors {BLACK = 2, GREEN = 4, RED = 3,
BLUE = 5, GRAY,WHITE = 0}
در دستور فوق هر يک از موارد با عدد نسبت داده شده مقدار دهی می شوند و GRAY با عدد 6 مقدار دهی می شود چون بعد از BLUE = 5 آمده است.

به محض ساخته شدن ليست ، نوع داده نوشته شده توسط برنامه نويس قابل استفاده می گردد و می توان متغيرهايی را از نوع داده نوشته شده توسط برنامه نويس به همان شيوه ای که ساير متغيرها را تعريف می کرديم، تعريف کرد. به عنوان مثال :

TrueFalse tf1,tf2;
Days day1, day2 = SUN;
Colors color1 = BLACK , color2 = GRAY;
همچنين متغيرها را می توان هنگام ايجاد نوع داده، تعريف کرد. به عنوان مثال :

TrueFalse {FALSE, TRUE} tf1 ,tf2;
نکته : تبديل داده ای از نوع enum به عدد صحيح مجاز می باشد ولی بر عکس اين عمل غير مجاز است. به عنوان مثال :

enum MyEnum {ALPHA, BETA, GAMMA};
int i = BETA;
int j = 3+GAMMA;
دستورات فوق مجاز می باشند، و اين دستورات عدد 1 را در i و 5 را در j قرار می دهند.

enum MyEnum {ALPHA, BETA, GAMMA};
MyEnum x = 2;
MyEnum y = 123;
ولی دستورات فوق غير مجاز می باشند. البته بعضی از کامپايلرها اين موضوع را ناديده می گيرند و تنها يک پيغام اخطار می دهند ولی توصيه می شود که برای پيشگيری از وقوع خطاهای منطقی در برنامه از به کار بردن دستوراتی مانند کدهای فوق خودداری کنيد.

برنامه زير نحوه کاربرد نوع داده enum را نشان می دهد.

#include <iostream.h>
int main()
{
enum PizzaSize{SMALL,MEDIUM,LARGE,EXTRALARGE};
PizzaSize size;
size=LARGE;

cout<<"The small pizza has a value of "<<SMALL;
cout<<"\nThe medium pizza has a value of "<<MEDIUM;
cout<<"\nThe large pizza has a value of "<<size;

return 0;
}
خروجی برنامه به صورت زير می باشد:

The small pizza has a value of 0
The medium pizza has a value of 1
The large pizza has a value of 2
 
بالا