مشخصات مقاله
-
1311
-
0.0
-
8379
-
0
-
0
آموزش انواع Loop در C++
آموزش انواع Loop / حلقه در ++C
گاهی در یک برنامه لازم می شود که قطعه کدی معین را چندین بار تکرار (مجدد اجرا) نمایید. به طور کلی، دستورات به ترتیب و پی در پی اجرا می شوند به گونه ای که ابتدا اولین دستور در یک تابع اجرا می شود، سپس دومین و همین طور ادامه می یابد.
زبان های برنامه نویسی تعدادی ساختار کنترلی در اختیار توسعه دهنده قرار می دهند که امکان تغییر روند و ترتیب اجرا را برای برنامه فراهم می نماید.
دستور تکرار یا ساختار کنترلی حلقه این قابلیت را به برنامه نویس می دهد تا یک یا مجموعه ای از دستورات را چندین بار اجرا کند. در زیر شکل کلی دستور حقله را در بیشتر زبان های برنامه نویسی مشاهده می کنید:

زبان برنامه نویسی ++C دستورات تکرار زیر را پشتیبانی می کند.
(حلقه های تودرتو)
ساختار کنترلی حلقه (دستورات کنترل جریان اجرای برنامه)
دستورات کنترلی حلقه روند اجرای برنامه را از ترتیب معمول آن خارج می سازد. زمانی که اجرا برنامه، یک محدوده (scope) را ترک می کند، تمامی آبجکت هایی که به صورت خودکار در آن محدوده ایجاد شده اند، از حافظه پاک می شوند (destroy).
++C از دستورات زیر جهت مدیریت و کنترل روند اجرای برنامه استفاده می کند.
حلقه ی بی پایان (Infinite Loop)
یک حلقه زمانی بی نهایت محسوب می شود که شرط هیچگاه غلط نشده یا به عبارتی همیشه برقرار باشد. حلقه ی for از ابتدا برای این منظور بکار گرفته می شد. از آنجایی که هیچ یک از سه دستوری که ساختمان for را تشکیل می دهند، الزامی نیستند، می توانید به راحتی با خالی گذاشتن دستور شرطی در حلقه ی for، یک شرط بی پایان طراحی کنید.
#includeusing 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 می شود، کنترل برنامه به خطی که بلافاصله پس از حلقه قرار گرفته انتقال می یابد.
نمودار نشان دهنده ی جریان اجرای برنامه

در اینجا، نکته ی اصلی درباره ی حلقه ی while این است که دستورات داخل ساختمان آن ممکن است هیچگاه اجرا نشوند. به عبارت دیگر زمانی که شرط بررسی شده و نتیجه ی آن false می باشد، بدنه ی حلقه به طور کلی نادیده گرفته شده و اولین دستور پس از ساختمان حلقه اجرا می شود.
مثال:
#includeusing 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 پایان می یابد.
نمودار نمایش جریان اجرا:

مثال:
#includeusing 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

مثال:
#includeusing 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 بهره می گیرد:
#includeusing 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:

مثال:
#includeusing 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

مثال:
#includeusing 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:

مثال:
#includeusing 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 دیگر اینجا کاربردی ندارد چرا که صرفا سبب می شود برنامه از عمیق ترین حلقه (تودرتوترین حلقه) خارج شود.