در آموزش قبل با مفهوم حلقهها و کاربر آنها در برنامهنویسی آشنا شدیم و نحوۀ پیادهسازی یکی از انواع آنها تحت عنوان حلقۀ for
در زبان برنامهنویسی جاوا را بررسی نمودیم. حال در این آموزش قصد داریم تا نوع دیگری حلقهها به نام while
را معرفی نموده و کاربرد آن در نحوۀ انجام تَسکهایی که نیاز به تکرار دارند را تشریح نماییم.
به طور کلی، بیشترین وجه تمایز حلقههای for
و while
تفاوت ساختاری آنها است به طوری که در حلقهای از جنس while
بر خلاف حلقۀ for
ابتدا به ساکن میباید متغیر مورد نظر را تعریف نماییم سپس داخل علائم ( )
در مقابل دستور while
شرط مربوطه یا همان نقطۀ پایانی حلقه را بنویسیم و در ادامه داخل علائم { }
مقدار افزایشی برای متغیر مورد نظر در هر بار تکرار حلقه را تعریف کنیم.
برای روشنتر شدن مطالب فوق، پروژهای تحت عنوان WhileLoop ایجاد کرده سپس یک کلاس تحت عنوان WhileLoop
در آن میسازیم و برای پیادهسازی مثالی به منظور چاپ اعداد با شروع از عدد 1 تا 10، کدی به صورت زیر در آن پیادهسازی میکنیم:
public class WhileLoop {
public static void main(String[] args) {
int number = 1;
while (number <= 10) {
System.out.println("My Number Is: " + number);
}
}
}
همانطور که مشاهده میکنیم، با بهکارگیری دیتا تایپ int
متغیری تحت عنوان number
خارج از حلقۀ while
تعریف کردهایم و مقدار اولیۀ آن را معادل عدد 1 قرار دادهایم سپس ساختار حلقۀ while
را بدین صورت پیادهسازی کردهایم که کیورد while
را نوشته و در ادامه دو علامت ( )
قرار داده و داخل آنها شرط حلقۀ while
یا همان نقطۀ پایانی حلقه را درج کردهايم و بدین ترتیب گفتهایم حلقۀ مذکور تا زمانی ادامه یابد که مقدار اختصاصیافته به متغیر number
کوچکتر از 10 یا برابر با آن باشد. در ادامه، علائم { }
را به منظور نوشتن دستورات مرتبط با حلقۀ while
درج کرده و داخل آنها نیز دستوری مبنی بر چاپ مقدار منتسب به متغیر number
به همراه استرینگ «:My Number Is» در کنسول نوشتهایم. بنابراین با اجرای برنامۀ فوق انتظار داریم تا زمانی که مقدار متغیر number
کوچکتر یا مساوی با عدد 10 باشد، این حلقه اجرا شود. حال برنامۀ فوق را اجرا کرده و در خروجی داریم:
My Number Is: 1
My Number Is: 1
My Number Is: 1
My Number Is: 1
My Number Is: 1
My Number Is: 1
My Number Is: 1
My Number Is: 1
My Number Is: 1
.
.
.
در حقیقت، در حلقۀ while
برنامۀ فوق مقدار افزایشی متغیر number
در هر بار تکرار حلقه را تعریف نکردهایم و از همین روی حلقۀ مذکور تا بینهایت ادامه مییابد که برای رفع این مشکل نیاز داریم تا مقدار افزایشی متغیر مد نظر در هر بار تکرار حلقه را به برنامۀ فوق اضافه نماییم.
نکتهای که در اینجا میباید مد نظر قرار دهیم این است که در حلقۀ while
بر خلاف حلقۀ for
پارامتر مربوط به مقدار افزایشی داخل علائم { }
نوشته میشود به علاوه اینکه محل قرارگیری دستور مربوط به مقدار افزایشی در نحوۀ اجرای برنامه و نتیجۀ حاصل در خروجی بسیار تعیینکننده است. برای روشن شدن این نکته، کد فوق را به شکل زیر تکمیل میکنیم:
public class WhileLoop {
public static void main(String[] args) {
int number = 1;
while (number <= 10) {
number++;
System.out.println("My Number Is: " + number);
}
}
}
در کد فوق، همچون مثال پیشین و با استفاده از دیتا تایپ int
متغیری به نام number
تعریف کرده و قصد داریم تا با استفاده از حلقۀ while
مقادیر منتسب به آن را تا رسیدن به عدد 10 به همراه با استرینگ «:My Number Is» در کنسول چاپ نماییم که به منظور تعریف پارامتر مربوط به مقدار افزایشی، دستور سطر پنجم را به کد خود اضافه کردهایم به طوری که با اجرای برنامۀ فوق در خروجی داریم:
My Number Is: 2
My Number Is: 3
My Number Is: 4
My Number Is: 5
My Number Is: 6
My Number Is: 7
My Number Is: 8
My Number Is: 9
My Number Is: 10
My Number Is: 11
در کد فوق، ابتدا عدد 1 به متغیر number
اختصاص داده شده سپس شرط حلقه چک میشود که آیا مقدار منتسب به متغیر number
کوچکتر از 10 یا مساوی با آن است یا خیر که میبینیم شرط برقرار بوده و دستورات داخلی آن اجرا میشوند و ابتدا یک واحد به مقدار قبلیِ منتسب به متغیر number
افزوده شده و مقدار جدید معادل عدد 2 بدان منتسب میشود سپس دستور سطر بعد اجرا میشود که اجرای این دستور منجر به چاپ عدد 2 به همراه استرینگ مذکور در کنسول میگردد.
حال مجدداً حلقه تکرار شده و مقدار جدید منتسب به متغیر number
معادل عدد 2 چک میشود تا بررسی شود که مقدار آن کوچکتر از 10 یا مساوی با آن است یا خیر که باز هم شرط برقرار بوده و دستورات داخلی حلقه اجرا میشوند و بدین ترتیب مقدار متغیر number
یک واحد افزایش یافته و مقدار جدید معادل عدد 3 بدان منتسب شده و با اجرای دستور سطر بعد به همراه استرینگ مربوطه در کنسول چاپ میشوند.
این فرآیند تا زمانی ادامه مییابد که مقدار منتسب به متغیر number
برابر با عدد 10 شده و مجدداً شرط حلقۀ while
برقرار بوده و دستورات داخلی آن اجرا میشوند و بدین ترتیب مقداری معادل عدد 11 به متغیر مذکور اختصاص یافته و مقدار جدید به همراه استرینگ «:My Number Is» در کنسول چاپ میشود و در ادامه مجدداً شرط حلقۀ while
چک میشود که مقدار اختصاصیافته به متغیر number
برابر با عدد 11 بوده و شرط حلقه برابر با مقدار بولین false
ارزیابی شده و در نتیجه مفسر از حلقه خارج میشود.
اکنون جای دستور مربوط به مقدار افزایشی در كد فوق را تغيير میدهیم و آن را به سطر ششم منتقل میکنیم که بدین ترتیب برنامۀ فوق را به صورت زیر بازنویسی میکنیم:
public class WhileLoop {
public static void main(String[] args) {
int number = 1;
while (number <= 10) {
System.out.println("My Number Is: " + number);
number++;
}
}
}
برنامۀ فوق را اجرا کرده و در خروجی خواهیم داشت:
My Number Is: 1
My Number Is: 2
My Number Is: 3
My Number Is: 4
My Number Is: 5
My Number Is: 6
My Number Is: 7
My Number Is: 8
My Number Is: 9
My Number Is: 10
همانطور که ملاحظه میکنیم، خروجی برنامۀ فوق با مثال پیشین کاملاً متفاوت است که برای روشن شدن این وجه تمایز به بررسی خطبهخط کد فوق میپردازیم. در واقع، پس از اجرای برنامه مقدار اولیۀ 1 به متغیر number
اختصاص داده شده و شرط حلقۀ while
مبنی بر کوچکتر بودن مقدار منتسب به این متغیر از عدد 10 یا برابر بودن با آن برقرار بوده و از همین روی دستورات داخلی آن اجرا شده و در ابتدا مقدار منتسب به متغیر number
معادل عدد 1 به همراه استرینگ مربوطه در کنسول چاپ میشود و در ادامه یک واحد به متغیر number
افزوده شده و مقدار جدیدی معادل عدد 2 بدان منتسب شده و حلقۀ while
مجدداً تکرار شده و در ابتدا چک میشود که مقدار متغیر number
کوچکتر از 10 يا برابر با آن است يا خير كه شرط برقرار بوده و عدد 2 به همراه استرينگ مذكور در كنسول چاپ میگردد.
فرآیند فوقالذکر تا زمانی ادامه میيابد كه مقدار اختصاصیافته به متغیر number
برابر با عدد 10 بوده و شرط حلقه برابر با true
ارزیابی شده و از همین روی عدد 10 به همراه استرینگ «:My Number Is» در کنسول چاپ شده و در ادامه یک واحد به آن افزوده میشود که در نتیجه مقدار جدیدی معادل عدد 11 بدان منتسب شده سپس حلقه مجدداً تکرار میشود اما این بار شرط حلقۀ while
برقرار نبوده و در نتیجه مفسر از حلقه خارج میشود.