در این مقاله، به آموزش حلقه ی for در جاوا می پردازیم و توضیحاتی را در مورد آن ارائه می دهیم.
حلقه ی for یک حلقه ی خاص است که وقتی نیاز به تعداد محدودی تکرار حلقه باشد، مورد استفاده قرار می گیرد. حلقه ی for یک راه آسان برای استفاده از حلقه های کنترل شونده ی شمارشی ارائه می دهد. با اینکه برای انجام این کار، می توانیم از حلقه ی while نیز استفاده کنیم، اما حلقه ی for برای این نوع حلقه، یک علامت گذاری مختصر ارائه می دهد.
وقتی که ما از یک حلقه ی for استفاده می کنیم، می توانیم مقدار شروع را برای متغیر کنترل حلقه، مشخص کنیم. و می توانیم یک تست شرطی را تعریف کنیم که ورودی حلقه را کنترل کند و یک عبارت که متغیر کنترل حلقه را تغییر دهد. همه ی این موارد، در یک جا انجام می شود.
برای ایجاد یک حلقه ی for، می توانیم یک دستور for را بنویسیم و پس از آن یک جفت پرانتز قرار دهیم. در داخل پرانتزها سه بخش وجود دارد که توسط دو سمی کالن، از یکدیگر جدا شده اند. از این سه بخش، معمولاً برای انجام موارد زیر استفاده می شود:
- مقداردهی اولیه دادن به متغیر کنترل حلقه.
- تست کردن متغیر کنترل حلقه.
- به روز کردن متغیر کنترل حلقه.
بدنه ی دستور for پس از پرانتزها قرار می گیرد. درست مانند یک دستور if یا یک حلقه while ، برای یک حلقه ی for نیز می توانیم از یک دستور تک خطی، بعنوان بدنه یا از یک بلوک از دستورات که در یک جفت آکولاد قرار می گیرند، بعنوان بدنه استفاده کنیم. حلقه ی for نشان داده شده در تصویر 6.15 همان خروجی را ایجاد می کند که با استفاده از دستور while، در زیر آن نشان داده شده است. هردو دستور، اعداد صحیح از 1 تا 10 را نمایش می دهند.
( تصویر 6.15 : یک حلقه ی for و یک حلقه while که اعداد صحیح از 1 تا 10 را نمایش می دهند)
نکته: حتماً لازم نیست متغیر val در داخل دستور for تعریف(declared) شود. اگر متغیر val از قبل، در داخل بلوک برنامه تعریف می شد، دستور for ما باید به صورت زیر نوشته می شد:
for(val = 1; val < 11; ++val)
به عبارت دیگر، دستور for نیازی به تعریف(declare) یک متغیر کنترل حلقه ندارد. بلکه باید به سادگی، یک مقدار شروع را در قالب یک متغیر که از قبل تعریف شده است، به آن بدهیم. اما برنامه نویسان به دفعات مکرر، یک متغیر را در داخل دستور for تعریف می کنند؛ به طوری که تنها در داخل آن حلقه مورد استفاده قرار می گیرد.
نکته: اگر یک متغیر را در داخل یک دستور for تعریف کنیم، تنها می توانیم از این متغیر، در بلوکی که به این حلقه ی for مربوط می شود، استفاده کنیم. وقتی که این بلوک به انتها برسد، متغیر مذکور از میدان دید(scope) خارج می شود.
در بین پرانتزهای دستور for که در تصویر 6.15 نشان داده شده است،در اولین بخش، قبل از اولین سمی کالن، یک متغیر به نام val تعریف(declare) شده است و مقدار 1 بعنوان مقداردهی اولیه، به آن داده شده است. برنامه این دستور را فقط یک بار اجرا می کند؛ بدون توجه به اینکه بدنه ی حلقه ی for چند بار اجرا خواهد شد.
پس از مقدار دهی اولیه، به بخش وسط یا همان بخش تست از حلقه ی for می رسیم، که بین دو سمی کالن قرار دارد. اگر ارزش این عبارت بولین true ارزیابی شود، بدنه ی حلقه ی for وارد عمل می شود.
در برنامه ی نوشته شده در تصویر 6.15، متغیر val برابر با 1 قرار می گیرد، بنابراین پس از آن، شرط val < 11
تست می شود، و ارزش آن برابر با true خواهد بود. حالا کدهای بدنه ی حلقه، مقدار val را نمایش می دهد. در این مثال، بدنه ی حلقه، یک دستور تکی است؛ بنابراین نیاز نیست از یک جفت آکولاد استفاده کنیم(با اینکه می توانیم آنها را نیز اضافه کنیم).
پس از اینکه بدنه ی حلقه اجرا شد، سومین بخش از دستورات بین پرانتزها، که پس از دومین سمی کالن قرار دارد، اجرا می شود و مقدار val به 2 افزایش می یابد. پس از اینکه این بخش سوم، از دستور for اجرا شد؛ کنترل برنامه به بخش دوم برمی گردد، و در آن برای بار دوم، مقدار val با مقدار 11 مورد مقایسه قرار می گیرد. چونکه val هنوز کمتر از 11 است، ارزش این عبارت true می شود و بدنه ی حلقه اجرا می شود و val (که اکنون 2 است) نمایش داده می شود. حالا برای بار سوم، مقدار val با 11 مقایسه شده و دوباره بدنه ی حلقه اجرا می شود و پس از آن مقدار val برابر با 3 می شود و حلقه ی for ادامه پیدا می کند.
در نهایت، وقتی که val کمتر از 11 نباشد( پس از اینکه مقادیر از 1 تا 10 نمایش داده شدند) حلقه ی for پایان می یابد و برنامه، با دستوراتی که پس از این حلقه ی for می آیند، ادامه پیدا می کند. با اینکه بسیار رایج است که از این سه بخش از حلقه ی for (در بین پرانتزها) برای مقدار دهی اولیه، تست کردن و افزایش، استفاده شود، اما همچنین می توانیم با استفاده از آنها، کارهای زیر انجام دهیم:
1. مقدار دهی اولیه کردن بیش از یک متغیر، با قرار دادن کاما بین دستورات جدای از هم، مانند زیر:
for(g = 0, h = 1; g < 6; ++g)
2. انجام بیش از یک تست با استفاده از عملگرهای AND یا OR مانند زیر:
for(g = 0; g < 3 && h > 1; ++g)
3. کاهش یا انجام برخی کارهای دیگر، مانند زیر:
for(g = 5; g >= 1; ––g)
4. تغییر دادن بیش از یک مقدار، مانند زیر:
for(g = 0; g < 10; ++g, ++h, sum += g)
5. ما می توانیم یک یا بیش از یک بخش را از یک حلقه ی for خالی بگذاریم. اما هردو سمی کالن باید سرجای خود باشند و حذف نشوند. بعنوان مثال، در برنامه ی قبلی، اگر x از قبل مقدار دهی اولیه شده باشد، می توانیم دستورات زیر را بنویسیم:
for(; x < 10; ++x)
اما، برای کسی که دارد برنامه ی شما را می خواند، اگر یک بخش از دستور for خالی گذاشته شود، نسبت به زمانی که هرسه بخش نوشته شده باشند، وضوح کمتری برای او حاصل می شود.
به طور کلی، ما باید در تمام سه بخش از یک دستور for از متغیر کنترل حلقه ی مشابهی استفاده کنیم؛ با اینکه ممکن است برنامه هایی که توسط دیگران نوشته شده اند را مشاهده کنید که اهمیتی به این نکته نمی دهند. همچنین باید از تغییر دادن متغیر کنترل حلقه، در بدنه ی این حلقه اجتناب کنید.
اگر یک متغیر هم در داخل دستور for و هم در داخل بدنه ی این حلقه تغییر داده شود، پیروی کردن از منطق برنامه بسیار سخت خواهد شد. همچنین این روش، می تواند باعث ایجاد باگ هایی در برنامه شود که پیدا کردن آنها مشکل است. به طور معمول، ما باید از حلقه ی for برای دستیابی به هدف طراحی آن، استفاده کنیم. یعنی بعنوان یک راه خلاصه برای ایجاد یک حلقه ی محدود.
گاهی اوقات، با یک حلقه ی for مواجه می شوید که هیچ بدنه ای ندارد، مانند زیر:
for(x = 0; x < 100000; ++x);
از این نوع حلقه ها، برای گذر زمان استفاده می شود- یعنی برای مشغول کردن CPU. از این روش، وقتی استفاده می کنیم که بعنوان مثال، نیاز داریم یک وقفه ی کوچک در حین اجرای برنامه انجام شود. معمولاً مانند دستورات if و while، در دستور for نیازی به قرار دادن یک سمی کالن در انتهای این دستور، قبل از بدنه ی حلقه نیست(مانند کد بالا).
جاوا همچنین حاوی یک متد داخلی است که باعث توقف اجرای برنامه می شود. یعنی متد sleep()
که بخشی از کلاس Thread در پکیج java.lang است؛ و در ادامه ی آموزش جاوا، روش استفاده از آن را فرا خواهید گرفت.
نکته: جاوا همچنین از یک حلقه ی for تقویت شده پشتیبانی می کند. در فصل مقدمه ای در مورد آرایه ها، این موضوع را آموزش خواهید دید.
دو عبارت صحیح و یک عبارت اشتباه
موضوع: ایجاد یک حلقه ی for
1. یک حلقه ی for همواره باید حاوی دو سمی کالن در بین پرانتزهای خود باشد.
2. بدنه ی یک حلقه ی for ممکن است هرگز اجرا نشود.
3. در داخل پرانتزهای یک حلقه ی for، آخرین بخش باید متغیر کنترل حلقه را تغییر دهد.
پاسخ:
گزینه ی 3 اشتباه است. اغلب از بخش سوم یک حلقه ی for برای تغییر دادن متغیر کنترل حلقه استفاده می شود اما انجام این کار الزامی نیست.