تماس درباره   صفحه اصلی
  زبان ++C > دستورات کنترلی  
 
 

دستورات کنترلی


اين بخش دستورات کنترلی که راهی برای کنترل اجرای برنامه ها در ++C هستند را می پوشاند. اين دستورات شامل دستورات شرطی if-else و switch و حلقه های تکرار while، do-while و for هستند.

دستور if-else
دستور switch
حلقه for
حلقه while
حلقه do-while
دستورات break و continue


ترتيب اجرای برنامه ها در ++C به صورت top-down است. بدين معنی که اجرا از ابتدای تابع ()main آغاز می شود دستور به دستور ادامه پيدا می کند تا به انتهای ()main برسد. دستورات کنترلی موجود در ++C اجازه تغيي ترتيب اجرای برنامه را می دهند.

دستورات شرطی که از ساختارهای تصمیم گیری هستند دستوراتی هستند که در صورت برقرار بودن شرطی دستوری را اجرا می کنند. دو دستور شرط در ++C وجود دارد: ‌if و switch.

دستور if-else

معمول ترین نوع ساختار تصمیم گیری if است. یک دستور if می گوید "اگر شرطی برقرار است کد معینی را انجام بده". دستور if-else به دو شکل می تواند باشد: همراه با else يا بدون آن.

if(expression)
   {
   statement
   }

يا

if(expression)
   {
   statement
   }
else
   {
   statement
   }

بدنبال کلمه if یک پرانتز می آید که عبارت شرط در آن قرار دارد و يک مقدار بولين false يا true توليد می کند (در C به صورت صفر و غير صفر ارزيابی می شود). با درست و غلط بودن عبارت شرطی مسير اجرا تعيين می شود. اگر درست باشد دستور بعد از if اجرا می شود. اگر else وجود داشته باشد در صورت برقرار نبودن شرط دستور بعد از else اجرا می شود.


مثال. شرط ساده.

if(age==18)
   {
   cout <<"Yahoo…. You old enough to drive!\n";
   }

مثال. شرط کامل.

#include <iostream>

int main()
{
   cout << "Enter your age: ";
   int age;
   cin >> age;
   if(age < 20)
      {
      cout << "You are still young!\n";
      }
   else
      cout << "You are not so young anymore.\n";
}


ممکن است دستور if-else بدون محصور شدن در آکولاد بیاید. آکولاد محدوده بلاک کد را معین می کند. اگر بلاک کد تنها شامل یک دستور باشد کامپایلر فرض می کند اولین جمله بعد از if (يا بعد از else) بلاک کد است که باید اجرا شود.


مثال. در شرط زير وقتی شرط برقرار است فقط ;++y اجرا می شود. خط دوم جز دستور if نیست و صرفنظر از درست بودن شرط همواره اجرا می شود.

if(x == 7)
y++;
z++;


شرط موردنياز در دستور if توسط عملگرهای رابطه ای <، >، <=، >=، == و != ساخته می شود. دو يا چند شرط می توانند توسط عملگرهای منطقی &&( AND)، || (OR) و ! (NOT) با هم ترکيب شوند.


مثال. چند نمونه عبارت شرطی.

if (x>6)
if (x !=6)
if (5<j<10)
if (j== 5 && I == 6)
if (j<4 || j>10)


بخاطر داشته باشید که یک علامت مساوی عملگر انتساب است و دوتا مساوی عملگر هم ارزی به معنی "آیا مساوی است با". a==b درست است اگر a برابر با b باشد. a=b مقدار b را به a نسبت می دهد. یکی از بیشترین خطاهائی که مبتدیان می کنند استفاده از علامت = به جای = = است. اگر تک مساوی را استفاده کنید شرط if همیشه درست است.


برنامه محاسبه مربع و مکعب يک عدد


شرط های تودرتو

یک امکان دیگر دستور if دستورات if تودرتو است یعنی یک if درون دیگری.


مثال. اگر Num مثبت باشد عبارت positive اگر صفر باشد عبارت zero و درغيراينصورت اگر منفی باشد عبارت negative‌ نمايش داده می شود.

if (Num > 0)
   cout << " is positive" << endl << endl;
else if (Num == 0)
   cout << " is zero" << endl << endl;
else
   cout << " is negative" << endl << endl;


دستور switch

دستورات if و if-else برای یک یا دو حالت انتخاب مناسب هستند اما برای انتخاب های بیشتر به جای یک سری از if های تودرتوانتخاب دیگری هم وجود دارد. دستور switch بر اساس مقدار يک متغير يا عبارت صحيح روی کدی که می خواهید سوئیچ می کند. شکل کلی آن به صورت زير است:

switch(selector)
{
   case integral-value1 : statement; break;
   case integral-value2 : statement; break;
   case integral-value3 : statement; break;
   case integral-value4 : statement; break;
   (...)
   default: statement;
}

selector بايد يک متغيرصحيح يا عبارتی باشد که يک عدد صحيح توليد می کند. اين مقدار با مقادير صحيح بعد از case ها مقايسه می شود اگر برابر با يکی از آنها بود دستور مربوط به آن اجرا می شود. اگر برابر با هيچکدام از مقادير نبود دستور بعد از default اجرا می شود.

دستور switch دارای یک بلاک از کد است. آکولاد درست بعد از switch شروع و بعد از آخرین دستور آن تمام می شود.


مثال.

int choice;
switch(choice)
   {
   case 1:
      cout << "you chose 1\n";
      break;
   case 2:
      cout << "you chose 2\n";
      break;
   case 3:
      cout << "you chose 3\n";
      break;
   default:
      cout << "you made an invalid choice \n";
   }


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


مثال.

char Choice;
cout << "Enter the letter for your choice: ";
cin >> Choice;

switch(Choice)
   {
   case 'A':
   case 'a':
      DoOptionA();
      break;
   case 'B':
   case 'b':
      DoOptionB();
      break;
   case 'C':
   case 'c':
      DoOptionC();
   }


دستور switch راهی برای ساختن شرط های تودرتو است اما به selector احتياج دارد که بر اساس مقدار آن تصميم گيری کند. وقتی مفيد است که می خواهيد مقدار يک متغير يا عبارت صحيح با يک سری ثابت مقايسه و کد مربوط به آن اجرا شود.

نکته. در هر case تنها از يک مقدار ثابت می توان استفاه کرد.
نکته. عبارت رشته ای به عنوان selector نمی تواند بکار رود. برای يک عبارت رشته ای بايد از شرط های تودرتو استفاده کرد.
نکته. می توان دستورات switch تودرتو نیز داشت.
نکته. دستورات درون هر case می تواند بيشتر از يکی باشد و به آکولاد برای محصور کردن آنها نيازی نيست.


برنامه محاسبه مساحت دايره، مثلث يا مستطيل


حلقه for

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

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

در C++ فرم کلی حلقه for به صورت زير است:

For (initial; condition; update)
   {
   loop_body
   }

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

حلقه for طبق دياگرام زير اجرا می شود:

دياگرام اجراي حلقه for

همانطور که ديده می شود ابتدا مرحله initial اجرا می شود. سپس condition بررسی می شود. اگر شرط برقرار نباشد حلقه به پايان می رسد و اجرا از دستور بعدی حلقه ادامه پيدا می کند. اگر شرط درست باشد loop_body اجرا می شود. سپس قسمت update اجرا می شود.

قسمت initial تنها يکبار در ابتدای ورود به حلقه اجرا می شود و معمولا برای اعلان و مقداردهی اوليه شمارنده ها و متغيرهای داخل حلقه استفاده می شود. قسمت condition عبارت شرطی است و هربار قبل از تکرار بدنه حلقه ارزيابی می شود. اگر در آغاز غلط باشد بدنه حلقه اصلا اجرا نخواهد شد. قسمت update در هربار تکرار حلقه اجرا می شود و معمولا برای افزايش يا کاهش شمارنده حلقه استفاده می شود.

نکته. قسمت های initial، condition و update هر کدام می توانند حذف شوند.
نکته. اگر قسمت شرط حذف شود هميشه درست فرض می شود.
نکته. برای خوانائی آکولادها زير هم قرار می گيرند و دستورات داخل آنها سه space جلوتر نوشته می شود.


مثال. قطعه کد زير اعداد 1 تا 20 را نمايش می دهد.

for (count = 1; count <= 20; count++)
   cout << count << endl;


با وجوديکه کاربرد اصلی دستور for برای حلقه های با تکرار معلوم است کارهای ديگری را هم می توان با آن انجام داد.


مثال. در حلقه زير چون قسمت شرط حذف شده است هميشه درست درنظر گرفته می شود و عبارت Hello را دائما چاپ می کند.

for ( ; ; )
   cout << "Hello" << endl;

مثال. برنامه زير کاراکترهای اسکی را نمايش می دهد.

#include <iostream.h> int main()
{
   for(int i = 0; i < 128; i++)
      if (i != 26) // ANSI Terminal Clear screen
         cout << " value: " << i
                 << " character: " << char(i) << endl;
   return 0;
}

توجه کنيد که متغير i درون for اعلان شده است و تنها در بدنه حلقه قابل استفاده است.


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


مثال. در حلقه زير شمارنده حلقه هر بار يک واحد کم می شود.

for (count = 100; count > 0; count--)

مثال. در حلقه زير شمارنده حلقه هر بار 5 واحد زياد می شود.

for (count = 0; count < 1000; count += 5)

مثال. قسمت initial نه تنها برای مقداردهی اوليه بلکه برای اعمال ديگر هم می تواند بکار برود.

count = 1;
for (cout << count ; count < 1000; count++);

مثال. در قسمت شرط حلقه می توان از عملگرهای رابطه ای و منطقی استفاده کرد.

for ( count = 0; count < 1000 && array[count] != 0; )
   cout << array[count++]

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

for ( count = 0; count < 1000 ; array[count++] = 50 )
   ;

مثال. عملگر کاما را می توان برای مقداردهی يا بروزرسانی دو متغير در دستور for استفاده کرد.

for (i = 0, j = 999; i < 1000; i++, j--)
   b[j] = a[i];

مثال. تا وقتی که کاربر عدد 99 را وارد کند حلقه تکرار می شود.

int nbr = 0;
for ( ; nbr != 99; )
   cin >> nbr;


for تودرتو

حلقه ها مانند دستورات شرطی می توانند تودرتو باشند. يک دستور for می تواند درون دستور ديگری قرار بگيرد. در این حالت حلقه داخلی به تعداد تکرار شمارنده خود ضرب در شمارنده حلقه بیرونی تکرار می شود.


مثال. دستور cout درون حلقه داخلی 5×3=15 بار تکرار می شود.

for (int i = 1 ; i < 3 ; i++ )
   {
   for(int j=0 ; j < 4 ; j++ )
      {
      cout << "This is inner loop " << j ;
      cout << " of outer loop " << i << endl;
      }
   }

مثال. برنامه زير با کاراکتر ستاره (*)‌ يک مستطيل 3×20 رسم می کند.

#include <iostream.h>
int main()
{
   int col=3, row=20;
   for ( ; row > 0; row--)
      {
      for ( ; col > 0; col--)
         cout << "*";
      cout << endl;
      }
   return 0;
}


برنامه جدول ضرب


حلقه while

حلقه while بلاکی از کد را تا زمانی که شرط معينی true است (غير صفر) اجرا می کند. شکل کلی آن به صورت زير است:

while (condition)
   {
   loop_body
   }

condition يک عبارت شرطی است. اگر اين عبارت false (يا صفر) باشد حلقه به پايان می رسد و دستور بعد از while اجرا می شود. body_loop دستوراتی است که تا زمان درست بودن شرط تکرار می شوند. اگر بدنه حلقه تنها يک دستور باشد نيازی به آکولاد نيست.

دياگرام زير نحوه اجرای حلقه while را نشان می دهد. توجه کنيد که شرط در ابتدای حلقه بررسی می شود و اگر false باشد وارد حلقه نمی شود. اگر شرط true باشد بدنه حلقه اجرا می شود.

دياگرام اجراي حلقه while


مثال. قطعه کد زير اعداد 1 تا 20 را نمايش می دهد.

int count = 1;
while (count <= 20) {
   cout << count << endl;
   count++;
   }


حلقه while مانند يک حلقه for بدون قسمت های initial و update است: بنابراين هرکاری که با حلقه for می شود انجام داد با حلقه while هم می شود. اگر مقداردهی اوليه و افزايش متغيرها درون حلقه موردنياز است حلقه for را بهتر است استفاده کنيد. اگر حلقه while را استفاده می کنيد مقداردهی اوليه موردنياز قبل و افزايش درون حلقه بايد انجام بگيرد.

for ( ; condition ; ) معادل است با while (condition)


مثال. حلقه زير تا زمان وارد شدن عدد 99 ورودی دريافت می کند. عدد 99 که انتهای داده ورودی را معين می کند sentinel ناميده می شود.

int nbr=0;
while (nbr <= 99)
   cin >> nbr ;


While تودرتو

مشابه دستورات if و for دستور while هم می تواند تودرتو باشد.


مثال. برنامه زير 5 عدد که بايد مابين 1 تا 10 باشد از ورودی دريافت می کند.

#include <iostream.h>

main()
{    int array[5];
   int ctr = 0,
   nbr = 0;

   cout << "This program prompts you to enter 5 numbers" << endl;
   cout << "Each number should be from 1 to 10" << endl;

   while ( ctr < 5 ) {
      nbr = 0;
      while (nbr < 1 || nbr > 10) {
         cout << endl << "Enter number " << ctr + 1 << " of 5: ";
         cin >> nbr ;
         }

      array[ctr] = nbr;
      ctr++;
      }

   for (ctr = 0; ctr < 5; ctr++)
      cout << "Value " << ctr + 1 << " is " << array[ctr]; << endl

   return 0;
}


حلقه do-while

سومين ساختار حلقه در C++ حلقه do- while است که بلاکی از کد را تا زمانی که شرط معينی true است اجرا می کند. حلقه do-while تقریبا مشابه حلقه while است با این تفاوت که شرط حلقه در انتهای حلقه است برخلاف حلقه while که در ابتدای قرار دارد. ساختار کلی آن به شکل زير است:

do {
   loop_body
}
while (condition);

condition يک عبارت شرطی است و تا وقتی که درست (يا غيرصفر) باشد بدنه حلقه تکرار می شود. چون شرط در انتها بررسی می شود بدنه حلقه حداقل يکبار اجرا می شود. اگر شرط برقرار نباشد حلقه به پايان می رسد و کنترل به دستور بعد از do-while منتقل می شود. بدنه حلقه می تواند يک دستور ساده باشد که در اينصورت نيازی به آکولاد نمی باشد.

دياگرام حلقه do-while به صورت زير است:

دياگرام اجراي حلقه do-while


مثال. قطعه کد زير اعداد 1 تا 20 را نمايش می دهد.

int count = 1;
do {
   cout << count << endl;
   count++;
} while (count <= 20);

مثال. حلقه زير تا زمان وارد شدن عدد 99 ورودی دريافت می کند.

Do {
   cin >> nbr ;
} while (nbr <= 99);


حلقه های do-while هم مشابه حلقه های for و while می توانند تودرتو باشند. دقت کنيد که ساختار حلقه بايد کاملا درون حلقه ديگر باشد و نبايد overlap باشد.


برنامه حدس عدد

برنامه توليد منو


دستورات break و continue

در C++ دو دستور وجود دارد که باعث ايجاد وقفه در اجرای عادی حلقه می شود؛ break و continue. دستور break را قبلا در switch آشنا شديد. به طور مشابه اين دستور در حلقه های for، while و do-while باعث می شود کنترل بلافاصله از بدنه حلقه خارج شده به دستور بعد از حلقه منتقل شود.


مثال. در برنامه زير به کاربر اجازه داده می شود 100 عدد را وارد کند يا برای پايان يک عدد منفی وارد کند.

#include <iostream.h>


int main() {
   cout << "Enter 100 positive numbers, or a "
       <<" negative number to abort.\n";

   int i;

   for (i = 1; i <= 100; ++i) {
      cout << "Enter the number #" << i << ": ";
      int n;
      cin >> n;
      if (n < 0)
         break;
      }

   if (i == 100)
      cout << "You are a real man.\n";
   else
      cout << "You stopped after " << i
      << " numbers, coward!\n";
}


دستور continue باعث پرش از روی دستورات بعد از خود و انتقال کنترل به ابتدای حلقه می شود.


مثال. برنامه زير مضارب غير 7 مابين اعداد 0 تا 100 نمايش می دهد.

#include <iostream.h>

int main() {
   for (int i = 0; i < 100; ++i) {
      // Skip the multiples of 7
      if ((i % 7) == 0)
         continue;

      cout << i << " ";
      }
}


 


 


صفحه اصلی| PDF| درباره| تماس