کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش انواع Loop در C++

آموزش انواع Loop / حلقه در ++C

گاهی در یک برنامه لازم می شود که قطعه کدی معین را چندین بار تکرار (مجدد اجرا) نمایید. به طور کلی، دستورات به ترتیب و پی در پی اجرا می شوند به گونه ای که ابتدا اولین دستور در یک تابع اجرا می شود، سپس دومین و همین طور ادامه می یابد.

زبان های برنامه نویسی تعدادی ساختار کنترلی در اختیار توسعه دهنده قرار می دهند که امکان تغییر روند و ترتیب اجرا را برای برنامه فراهم می نماید.

دستور تکرار یا ساختار کنترلی حلقه این قابلیت را به برنامه نویس می دهد تا یک یا مجموعه ای از دستورات را چندین بار اجرا کند. در زیر شکل کلی دستور حقله را در بیشتر زبان های برنامه نویسی مشاهده می کنید:


آموزش c++

زبان برنامه نویسی ++C دستورات تکرار زیر را پشتیبانی می کند.


شرح
نوع حلقه
یک یا چندین دستور را مادام اینکه شرط معینی برقرار است تکرار می کند. این حلقه ابتدا صحت شرط را بررسی می کند و سپس به اجرای دستور می پردازد.
while
یک مجموعه دستور را چندین بار تکرار می کند. این حلقه کدی که متغیر حلقه را مدیریت می کند، کوتاه و مختصر می نماید.
for
کارکردی مشابه دستور while دارد، با این تفاوت که شرط را در انتهای بدنه ی حلقه بررسی می کند.
do...while loop
می توان یک یا چندین حلقه را در بدنه ی حلقه ی دیگر گنجاند. برای مثال یک حلقه ی do..while را در بدنه ی یک do..while دیگر قرار داد که به آن حلقه های تودرتو می گویند.
nested loops
(حلقه های تودرتو)

ساختار کنترلی حلقه (دستورات کنترل جریان اجرای برنامه)

دستورات کنترلی حلقه روند اجرای برنامه را از ترتیب معمول آن خارج می سازد. زمانی که اجرا برنامه، یک محدوده (scope) را ترک می کند، تمامی آبجکت هایی که به صورت خودکار در آن محدوده ایجاد شده اند، از حافظه پاک می شوند (destroy).

++C از دستورات زیر جهت مدیریت و کنترل روند اجرای برنامه استفاده می کند.


شرح
دستور کنترل روند اجرای برنامه
اجرا را در حلقه یا ساختمان switch خاتمه داده و روند اجرا را به دستوری که بلافاصله پس از حلقه یا ساختمان switch قرار گرفته، انتقال می دهد.
دستور break
وجود این دستور در ساختمان سبب می شود که اجرا باقی بدنه ی حلقه ی را رد کرده (دستورات را نادیده گرفته و اجرا نکند) و سپس بلافاصله شرط را قبل از تکرار دستورات، مجددا بررسی نماید.
دستور Continue
اجرای برنامه را به دستور label یا نام گذاری شده انتقال می دهد. استفاده از این دستور در کد برنامه چندان توصیه نمی شود.
دستور goto

حلقه ی بی پایان (Infinite Loop)

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


#include 
using namespace std;
int main () {
   for( ; ; ) {
      printf("This loop will run forever.\n");
   }
   return 0;
}

زمانی که عبارت شرطی از دستور کلی حلقه ی for غایب است، کامپایلر فرض می گیرد که شرط برقرار بوده و صحیح می باشد. در صورت تمایل می توانید یک دستور مقداردهی اولیه و عبارت افزایش (++) در بدنه ی حلقه داشته باشید، اما برنامه نویسان C++ اغلب تریج می دهند که از for(;;) برای طراحی حلقه ی بی پایان استفاده کنند.


نکته:

جهت خاتمه دادن اجرای حلقه ی بی پایان، کافی است کلیدهای Ctrl + C را همزمان فشار دهید.


نمونه های کاربردی

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


حلقه While

این حلقه دستور مد نظر را تا زمانی که شرط برقرار باشد اجرا می کند.

ساختار دستوری این حلقه را در ++C مشاهده می کنید:


while(condition){
   statement(s);
}

در اینجا، statement(s)، می تواند یک دستور واحد یا قطعه کد متشکل از مجموعه ای از دستورات باشد. شرط می تواند هر عبارتی باشد، هر مقدار غیر صفری نیز true محسوب می شود. مادام اینکه شرط برقرار یا صادق باشد، حلقه مجموعه دستورات را تکرار می کند.

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

نمودار نشان دهنده ی جریان اجرای برنامه


آموزش c++

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


مثال:
#include 
using namespace std;
int main () {
   // Local variable declaration:
   int a = 10;
   // while loop execution
   while( a < 20 ) {
      cout << "value of a: " << a << endl;
      a++;
   }
   return 0;
}

خروجی این کد به صورت زیر می باشد:


value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19

حلقه ی for

حلقه ی for یک ساختار جهت مدیریت کنترل اجرای برنامه است مجموعه ای از دستورات را به دفعات معینی تکرار می کند.

ساختار نحوی استفاده از حلقه ی for به شرح زیر می باشد:


for ( init; condition; increment ) {
   statement(s);
}

ذیل روند اجرا در یک حلقه ی for به تفصیل شرح داده شده است:

  • گام init (مقداردهی اولیه ی یک loop variable)، اول و تنها یکبار اجرا می شود. در این مرحله شما می توانید متغیرهای لازم برای کنترل اجرای حلقه را اعلان و مقداردهی اولیه کنید. مادام اینکه یک نقطه ویرگول در انتها ظاهر می شود، لازم نیست دستوری درج نمایید.
  • گام بعدی، condition، شرط ارزیابی می شود. چنانچه شرط صحیح و برقرار باشد، بدنه ی شرط که حاوی دستورات می باشد، به دفعات معین اجرا می شود. اما چنانچه شرط دیگر صادق نباشد، مجموعه دستورات نیز اجرا نخواهند شد و روند یا کنترل اجرا به دستور پس از ساختمان انتقال می یابد.
  • بعد از اینکه بدنه ی حلقه ی for کامل اجرا شد، جریان اجرای برنامه به دستور افزایش یا increment بازمی گردد. این دستور به شما امکان می دهد تا متغیرهای کنترلی حلقه را هر بار یک واحد افزایش داده و بروز رسانی نمایید. مادام اینکه یک نقطه ویرگول در انتها قرار گیرد، می توان این دستور را خالی گذاشت.
  • گام ارزیابی شرط یا condition، در این مرحله از حلقه، شرط بار دیگر مورد بررسی قرار می گیرد. اگر شرط برقرار بود، حلقه اجرا شده و فرایند خود را تکرار می کند (بدنه ی حلقه اجرا شده، متغیر یک واحد افزایش می یابد و بار دیگر شرط ارزیابی می شود). زمانی که شرط دیگر برقرار نبود (false شد)، حلقه ی for پایان می یابد.

نمودار نمایش جریان اجرا:


آموزش c++
مثال:
#include 
using namespace std;
int main () {
   // for loop execution
   for( int a = 10; a < 20; a = a + 1 ) {
      cout << "value of a: " << a << endl;
   }
   return 0;
}

قطعه کد جاری خروجی زیر را تولید می کند:


value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19

حلقه ی do…while

بر خلاف دو حلقه ی for و while که ابتدا شرط را در بالای ساختمان بررسی می کنند، حلقه ی حاضر شرط را انتهای بدنه مورد ارزیابی قرار می دهد.

حلقه ی do…while بسیار شبیه while عمل می کند با این تفاوت که دستور داخل بدنه ی حلقه حداقل یکبار اجرا می شود.

نحوه ی استفاده از دستور do…while به شرح زیر می باشد:


do {
   statement(s);
}while( condition );

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

حال چنانچه شرط صحیح بود، کنترل یا روند اجرا به do بازمی گردد و دستورات موجود در حلقه بار دیگر اجرا می شوند. این فرایند همین طور تکرار می شود تا شرط دیگر برقرار نباشد و نتیجه ارزیابی آن غلط شود.

روند اجرای حلقه ی do…while

آموزش c++
مثال:
#include 
using namespace std;
int main () {
   // Local variable declaration:
   int a = 10;
   // do loop execution
   do {
      cout << "value of a: " << a << endl;
      a = a + 1;
   }while( a < 20 );
   return 0;
}

خروجی قطعه کد حاضر به شرح زیر می باشد:

value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19

حلقه های تودرتو (nested loops)

یک حلقه می تواند داخل بدنه ی حلقه ی دیگری گنجانده شود که در اصطلاح به آن nesting یا تودرتو کردن حلقه ها گفته می شود. C++ به شما این اجازه را می دهد تا 256 حلقه را در داخل هم قرار دهید (256 levels of nesting).

ساختار نگارشی حلقه های for تودرتو در C++ به صورت زیر می باشد:

for ( init; condition; increment ) {
   for ( init; condition; increment ) {
      statement(s);
   }
   statement(s); // you can put more statements.
}

ساختار نگارشی حلقه های while تودرتو در ++C به صورت زیر می باشد:


while(condition) {
   while(condition) {
      statement(s);
   }
   statement(s); // you can put more statements.
}

ساختار نگارشی حلقه های تودرتو do…while در ++C نیز به صورت زیر می باشد:


do {
   statement(s); // you can put more statements.
   do {
      statement(s);
   }while( condition );
}while( condition );

مثال:

برنامه ی زیر از یک حلقه ی تودرتوی for جهت بدست آوردن عدد اول از 2 تا 100 بهره می گیرد:


#include 
using namespace std;
int main () {
   int i, j;
   for(i = 2; i<100; i++) {
                     for(j=2; j<= (i/j); j++)
         if(!(i%j)) break; // if factor found, not prime
         if(j > (i/j)) cout << i << " is prime\n";
   }
   return 0;
}

خروجی:
2 is prime
3 is prime
5 is prime
7 is prime
11 is prime
13 is prime
17 is prime
19 is prime
23 is prime
29 is prime
31 is prime
37 is prime
41 is prime
43 is prime
47 is prime
53 is prime
59 is prime
61 is prime
67 is prime
71 is prime
73 is prime
79 is prime
83 is prime
89 is prime
97 is prime

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

دستور break به دو منظور زیر در برنامه های تحت ++C مورد استفاده قرار می گیرد:

  • زمانی که کنترل اجرا به دستور break داخل حلقه می رسد، حلقه بلافاصله خاتمه داده شده و کنترل اجرای برنامه به دستور موجود پس از ساختمان حلقه انتقال می یابد.
  • می توان از آن برای خاتمه دادن به اجرای دستور case در ساختمان switch استفاده کرد.
  • در صورت استفاده از حلقه های تودرتو، دستور break اجرای درونی ترین حلقه را متوقف کرده و سپس اجرای برنامه را از دستوری که پس از ساختمان حلقه قرار دارد، از سرمی گیرد.
  • نحوه ی استفاده از دستور break در ++C به شرح زیر می باشد:


break;

نمودار جریان اجرا برای دستور break:


آموزش c++
مثال:
#include 
using namespace std;
int main () {
   // Local variable declaration:
   int a = 10;
   // do loop execution
   do {
      cout << "value of a: " << a << endl;
      a = a + 1;		
      if( a > 15) {
         // terminate the loop
         break;
      }
   }while( a < 20 );
   return 0;
}

خروجی:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15

دستور continueعملکردی مشابه دستور break دارد، با این تفاوت که سبب می شود گام بعدی اجرای حلقه رخ داده و تمامی دستورات این بین در گام جاری نادیده گرفته شود (اجرا نشود) .

در حلقه ی for، دستور continue سبب می شود که تست شرطی (عبارت بررسی شرط) و دستور افزایش (++) از ساختمان حلقه اجرا شود.

در حلقه ی while و do…while، کنترل اجرای برنامه به عبارت بررسی صحت شرط (conditional test) انتقال می یابد.

نحوه ی استفاده ازدستور continue در ++C:


continue;

نمودار جریان اجرا برای دستور continue


آموزش c++
مثال:
#include 
using namespace std;
int main () {
   // Local variable declaration:
   int a = 10;
   // do loop execution
   do {
      if( a == 15) {
         // skip the iteration.
         a = a + 1;
         continue;
      }		
      cout << "value of a: " << a << endl;
      a = a + 1;
   }while( a < 20 );
   return 0;
}

خروجی:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19

دستور goto

هنگامی که اجرا به کلیدواژه ی goto می رسد، کنترل از این دستور ناگهان به دستور نام گذاری (label گذاری شده) داخل بدنه ی تابع جاری انتقال می یابد.


نکته:

استفاده از دستور goto چندان توصیه نمی شود چرا که ردیابی (trace) جریان اجرا (کنترل) برنامه و متعاقبا درک کد یا ویرایش آن را بسیار دشوار می سازد.


نحوه ی استفاده از دستور goto در ++C به صورت زیر می باشد:


goto label;
..
.
label: statement;

label یک شناسه یا اسم است که دستور پس از خود را معرفی می کند. دستور label گذاری شده، هر دستوری است که پس از یک اسم و عملگر دو نقطه قرار گیرد.

نمودار جریان اجرای برنامه با دستور goto:

آموزش c++
مثال:
#include 
using namespace std; 
int main () {
   // Local variable declaration:
   int a = 10;
   // do loop execution
   LOOP:do {
      if( a == 15) {
         // skip the iteration.
         a = a + 1;
         goto LOOP;
      }		
      cout << "value of a: " << a << endl;
      a = a + 1;
   }while( a < 20 );
   return 0;
}

خروجی:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19

یکی از موارد صحیح و مناسب استفاده از دستور goto، خروج از یک routine (روند یا ساختمان کد) بسیار عمیق و تودرتو است. به قطعه کد زیر دقت کنید:


for(...) {
   for(...) {
      while(...) {
         if(...) goto stop;
         .
         .
         .
      }
   }
}
stop:
cout << "Error in program.\n";

حذف دستور goto سبب می شود صحت تعدادی شرط اضافی بررسی شود. یک دستور ساده ی break دیگر اینجا کاربردی ندارد چرا که صرفا سبب می شود برنامه از عمیق ترین حلقه (تودرتوترین حلقه) خارج شود.

1396/04/08 8380 1311
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...