در حالت عادی دستورات برنامه از اولین دستور به آخرین دستور اجرا میشود اگر بخواهیم بعضی از دستورات چندین بار اجرا شوند و بعضی تحت شرایط خاص اجرا شده و بعضی دیگر اجرا نشوند ساختارهای تکرار و تصمیم استفاده می کنیم. حلقه های تکرار، برای تکرار اجرای دستورات مورد استفاده قرار میگیرد. حلقه های تکرار تحت شرایط خاصی یک یا چند دستور را چندین بار اجرا می کند. به عنوان مثال اگر بخواهیم تعداد ۱۰۰ عدد را از ورودی بخوانیم و آنها را باهم جمع کنیم، باید عمل خواندن عدد را ۱۰۰ بار تکرار کنیم. ساختارهای تکرار در زبان های برنامه سازی مختلف به شکل های گوناگون مورد استفاده قرار میگیرد، که در این بخش، حلقه های تکرار در زبان C را مورد بررسی قرار میدهیم.
اصولا حلقه های تکرار در زبان C را میتوان به دو دسته تقسیم کرد:
- حلقه تکرار For : در این حلقه ها تعداد تکرار دستورات داخل حلقه از قبل برای ما مشخص است.
- حلقه تکرار While : تعداد تکرار دستورات داخل حلقه برای ما مشخص نیست. تا زمانی که شرط حلقه نقض نگردد، دستورات داخل حلقه ادامه دارند.
۱- حلقه تکرار For
ساختار تکرار FOR یکی از امکانات ایجاد حلقه است و معمولاً در حالتی که تعداد دفعات تکرار حلقه، از قبل مشخص باشد به کار می رود. در این ساختار متغیر ی وجود دارد که تعداد دفعات تکرار حلقه را کنترل میکند این متغیر را شمارنده یا اندیس حلقه تکرار می گوییم.
اندیس حلقه دارای یک مقدار اولیه می باشد، و در هر بار اجرای دستورات حلقه، مقداری به آن اضافه می شود این مقدار را که پس از هر بار اجرای حلقه، به شمارنده اضافه می شود گام حرکت گفته می شود.
یکی دیگر از اجزای حلقه،شرط حلقه می باشد، که مشخص می کند که دستورات داخل حلقه تا کی باید اجرا شود. اگر این شرط دارای ارزش درستی باشد، دستورات داخل حلقه اجرا می شوند و گرنه کنترل برنامه از حلقه تکرار خارج می شود. اندیس حلقه میتواند عدد منفی ، یا مثبت، صحیح و یا اعشاری و کارکتری باشد.
به صورت خلاصه می توان گفت که یک حلقه for سه بخش دارد :
- تنظیم
- شرط خروج برای اینکه حلقه کی تمام شود.
- بخشی که تکرار می شود که دستوراتی که باید تکرار شوند، هستند.
زمانی از حلقه for استفاده می کنیم که تعداد دفعات تکرار حلقه رو از قبل بدانیم و شکل کلی این ساحتار به صورت زیر هست که مشاهده می کنید :
for( مقدار اولیه شمارنده ; شرط حلقه ; گام حرکت شمارنده ) { دستور اول ; دستور دوم ; . . . . امn دستور ; }
در این ساختار همان طور که مشاهده می کنید، حلقه for سه، مقدار دارد که با سیمیکالون از هم جدا شده اند، که اولین مقدار شمارنده یا اندیس حلقه نام دارد، که باید بهش مقدار اولیه داده شود ، در قسمت دوم شرط حلقه رو قرار می دهیم، در قسمت سوم به وسیله یه عبارت محاسباتی مقدار شکارنده رو تعیین می کنیم.
۱-۱- نکات حلقه for در c :
- شمارنده حلقه میتواند از هر نوعی باشد.
- حلقه for تازمانی اجرا میشود که شرط حلقه برقرار باشد.
- اگر در جلوی for سیمیکلون یا ; بگذاریم این دستور تا موقعی که شرط حلقه برقرار باشد اجرا میشود، و پـس از نقض شرط حلقه از حلقه خارج شده و دستورات بعد از اون اجرا میشوند.
- اگر بعد از for یک دستور داشته باشیم نیازی به کلوشه { } نداریم.
- ( ; ; )for برای ایجاد حلقه بی نهایت مورد استفاده قرار میگیرد. حلقه بی نهایت فاقد شرط پایان است پس هیچ وقت متوقف نخواهد شد. در چنین مواقعی توقف اجرای برنامه از کلید هایBreak + Ctrl مورد استفاده قرار می گیرند.
for (int i=0;i<3;i++ ) printf("%i",i); printf("ok");
در این مثال چون {} نداریم پس فقط دستور اول بعد از for مربوط به حلقه و لوپ ما میشود.
پس خروجی ۰ تا ۲ را شمارش کرده و چاپ میکند، هر موقع از حلقه خارج شد به دستور پرینت ok خواهد رسید و و آنرا نیز چاپ خواهد کرد.
خروجی کد بالا:
0 1 2 ok
#include <stdio.h> int main () { int a; /* for loop execution */ for( a = 10; a < 20; a = a + 1 ){ printf("value of a: %d\n", 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
۱-۲- حلقه های تکرار تودرتو:
اگر حلقه تکراری داخل حلقه تکرار دیگری قرار بگیرد اصطلاحا، حلقه های تودرتو گفته می شود. قانونی که بر حلقه های تکرار تو در تو حاکم است این است که، به ازای هر بار اجرای حلقه تکرار خارجی، حلقه تکرار داخلی به طور کامل اجرا می شود. ضمناً، انتهای حلقه تکرار داخلی، زودتر از حلقه تکرار خارجی مشخص میشود
مثلا در دستور زیر حلقه تکرار با اندیس i حلقه خارجی است و حلقه تکرار با اندیس j حلقه تکرار داخلی می باشد.
for (i=0; i>5: i++){ ..... for (j=0; j>6: j++){ ... } ... }
اگر حلقه های تکرار تو در تو، از یک جا شروع و به یک جا ختم شوند حلقه خارجی نیاز به آکولاد ندارد. به مثال زیر توجه کنید:
for (i=0; i>5: i++) for (j=0; j>6: j++){ ... }
۱-۳– عملگر کاما , :
عملگر کاما انعطاف پذیری بیشتری به حلقه ی for می بخشد.با استفاده از این عملگر می توان در قسمت های مقدار اولیه و گام حرکت , دو یا چند عبارت را با هم ترکیب کرد.مثال:
for(i=0 , m+=i ; i<10 ; i++ , m++){ ... }
در این حلقه تکرار اولین کاما، دو متغییر i و m را مقدار اولیه می دهد و دومین کاما، در هر تکرار، یک واحد به i و یک واحد به m اضافه میکند.
ساختار تکرار while یکی دیگر از امکاناتی که برای تکرار اجرای دستورات به کار می رود. ساختار تکرار while به صورت زیر قابل استفاده می باشد:
while(شرط یا شروط) { ;مجموعه دستورات }
// Program to find factorial of a number // For a positive integer n, factorial = 1*2*3...n #include <stdio.h> int main() { int number; long long factorial; printf("Enter an integer: "); scanf("%d",&number); factorial = 1; // loop terminates when number is less than or equal to 0 while (number > 0) { factorial *= number; // factorial = factorial*number; --number; } printf("Factorial= %lld", factorial);http://sourceiran.com/wp-admin/post.php?post=23815&action=edit# return 0; }
خروجی کد بالا:
Enter an integer: 5 Factorial = 120
۳- حلقه تکرار do…while
حلقه do…while، کاملا شبیه حلقه While است، با یک تفاوت کوچک. در حلقه do…while شرط حلقه در انتهای آن بررسی می شود و این امر باعث می شود که همیشه کدهای داخل حلقه do…while حداقل یک مرتبه اجرا شود.(حتی اگر شرط از اول غلط باشد). اگر شرط برقرار باشد، تکرار کدها ادامه پیدا می کند، اما اگر شرط برقرار نباشد برنامه از حلقه خارج می شود.
ساختار این حلقه به صورت زیر است :
do { کد هایی که در زمان برقراری شرط حلقه تکرار می شوند } While( شرط حلقه );
do { PORTD=a; a++; } While( a<16 );
- دقیقا مانند مثال حلقه while است اما با یک تفاوت:
- بار اول بدون بررسی شرط، یک بار دستورات حلقه اجرا می شوند.
- در انتهای حلقه شرط بررسی می شود. اگر شرط برقرار بود دوباره حلقه تکرار می شود و این روال تا زمانی که شرط حلقه برقرار باشد تکرار خواهد شد.
#include <stdio.h> int main () { /* local variable definition */ int a = 10; /* do loop execution */ do { printf("value of a: %d\n", a); a = a + 1; }while( a < 20 ); return 0; }
تنها تفاوت استفاده ا زحلقه do while است. پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می شود:
خروجی کد بالا:
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
از کدام حلقه تکرار استفاده کنیم ؟
حال که با دستورات و ساختار حلقه های تکرار در زبان C، آشنا شدیم این پرسش به وجود می آید که از کدام حلقه در چه موقع باید استفاده کرد؟
معمولا وقتی که تعداد حلقه تکرار مشخص، وگام حرکت نیز معین باشد، از حلقه FOR استفاده می شود. در موارد دیگر سعی کنید از حلقه های while و do…while استفاده کنید.اگر شرایطی وجود داشت که، چه شرط حلقه درست باشد و چه نادرست، دستورات حلقه حداقل یک بار باید اجرا شوند، از حلقه do…while و گرنه از حلقه while استفاده کنید.