اولین برنامه های ما دنباله ای از دستورالعمل ها بودند که یکی پس از دیگری اجرا می شدند. بدون چنگال این شامل HelloWorld است که یک تبریک را نمایش می دهد. این شامل محاسبات حسابی است. بعد از اولین برنامههایمان، نحوه شاخهبندی را یاد گرفتیم، یعنی چگونه کاری کنیم که یک برنامه بسته به شرایط خاص، اقدامات مختلفی را انجام دهد. در اینجا کد برای کنترل سیستم گرمایش مرکزی و تهویه مطبوع آمده است:
فرض کنید ده سیب، دو دست و یک چاقو دارید. در زندگی واقعی، شما به طور متوالی کل دوجین را پوست میکنید و از الگوریتم یکسانی برای هر سیب پیروی میکنید. اما چگونه میتوانیم برنامهای را وادار کنیم که یک عمل تکراری برای هر سیب انجام دهد؟
ادامه هید.
if (tempRoom>tempComfort)
airConditionerOn();
if (tempRoom<tempComfort)
heaterOn();
قدم بعدی را بردارید. در زندگی روزمره، ما اغلب کارهای تکراری یکنواخت انجام می دهیم، به عنوان مثال، پوست کندن سیب برای یک پای. این فرآیند جذاب را می توان اینگونه توصیف کرد:
-
اگر سیب در کاسه وجود دارد، مراحل 1.1 تا 1.4 را اجرا می کنیم:
- 1.1. یک سیب بگیر
- 1.2. پوست آن را بگیرید و به صورت ورقه ای برش دهید
- 1.3. برش های سیب را در پوسته پای در تابه بچینید
- 1.4. به مرحله 1 برگردید.

- ما خودمان را به تعداد سیبها میبندیم، اما اگر تعداد کافی از آنها را نداشته باشیم، برخی از دستورات بدون «بارگذاری» اجرا میشوند (و ممکن است در حالی که سعی میکنیم یک سیب موجود را پوست کنیم، خودمان را قطع کنیم).
- اگر تعداد سیبها بیشتر از دستور پوستگیری باشد، برخی از سیبها بدون پوست باقی میمانند.
- خواندن چنین کدی سخت است. تکرارهای زیادی دارد و اصلاح آن دشوار است.
حلقه ها عباراتی هستند که اجازه می دهند اقدامات به طور مکرر انجام شوند
حلقه while جاوا در مورد ما به خوبی کار خواهد کرد. این ساختار اقدامات متعدد را در یک ساختار مختصر و قابل درک قرار می دهد. با استفاده از حلقه while ، یک الگوریتم برش سیب برای یک پای ممکن است در جاوا شبیه به این باشد:
while (numberOfApplesInBowl > 0) {
apple = bowl.grabNextApple();
arrangeInPie(apple.peel().slice());
numberOfApplesInBow--; // "--" is the decrement operator, which reduces the number of apples by one
}
System.out.println("The apples for the pie have been processed.");
دستور دستور
اولین نوع دستور while به صورت زیر است:
while (Boolean expression) {
// Loop body — the statement(s) that are repeatedly executed
}
در اینجا توضیح گام به گام در مورد آنچه که هنگام اجرای این کد اتفاق می افتد آورده شده است:
- ما عبارت Boolean موجود در پرانتز را بعد از کلمه کلیدی while ارزیابی می کنیم .
- اگر عبارت بولی به درستی ارزیابی شود، دستورات موجود در بدنه حلقه اجرا می شوند. پس از اجرای آخرین دستور در بدنه حلقه، به مرحله 1 می رویم
- اگر عبارت Boolean به غلط ارزیابی شود، پس از حلقه while به اولین عبارت می پریم .
حلقه با یک پیش شرط
از آنجایی که ما همیشه عبارت Boolean (شرط ورود به حلقه) را قبل از اجرای بدنه حلقه ارزیابی می کنیم، این شکل از حلقه while اغلب یک حلقه با پیش شرط نامیده می شود . بیایید جدولی از ده توان اول یک عدد بسازیم:
public static void main(String[] args) {
int base = 3; // The number that will be exponentiated
int result = 1; // The result of exponentiation
int exponent = 1; // The initial exponent
while (exponent <= 10) { // The condition for entering the loop
result = result * base;
System.out.println(base + " raised to the power of " + exponent + " = " + result);
exponent++;
}
}
خروجی کنسول:
3 raised to the power of 1 = 3
3 raised to the power of 2 = 9
3 raised to the power of 3 = 27
3 raised to the power of 4 = 81
3 raised to the power of 5 = 243
3 raised to the power of 6 = 729
3 raised to the power of 7 = 2187
3 raised to the power of 8 = 6561
3 raised to the power of 9 = 19683
3 raised to the power of 10 = 59049
Process finished with exit code 0
حلقه با یک شرط پس
در اینجا دومین نوع از این حلقه است:
do {
// Loop body — the statement(s) that are repeatedly executed
} while (Boolean expression);
در اینجا توضیحی درباره اتفاقاتی که هنگام اجرای این کد رخ می دهد آورده شده است:
- بدنه حلقه (بلافاصله بعد از کلمه کلیدی do ) اجرا می شود.
- ما عبارت Boolean موجود در پرانتز را بعد از کلمه کلیدی while ارزیابی می کنیم .
- اگر عبارت Boolean برابر با true باشد، به مرحله 1 می رویم
- اگر عبارت Boolean به غلط ارزیابی شود، پس از حلقه while به اولین عبارت می پریم .
public static void main(String[] args) {
int base = 3; // The number that will be exponentiated
int result = base; // The result of exponentiation
int exponent = 1; // The initial exponent
do {
System.out.println(base + " raised to the power of " + exponent + " = " + result);
exponent++;
result = result * base;
} while (result < 10000); // The condition for exiting the loop
}
خروجی کنسول:
3 raised to the power of 1 = 3
3 raised to the power of 2 = 9
3 raised to the power of 3 = 27
3 raised to the power of 4 = 81
3 raised to the power of 5 = 243
3 raised to the power of 6 = 729
3 raised to the power of 7 = 2187
3 raised to the power of 8 = 6561
Process finished with exit code 0
به تغییرات کد دقت کنید. این را با حلقه با پیش شرط مقایسه کنید.
حقایق جالب در مورد کار با حلقه ها
عبارات انشعاب در بدنه حلقه
دو عبارت وجود دارد که بر اجرای درون یک حلقه تأثیر میگذارد: break (که در فصل بعدی با جزئیات بیشتر در مورد آن صحبت خواهیم کرد) و- ادامه - از اجرای بقیه بدنه حلقه در تکرار جاری می گذرد و به ارزیابی عبارت بولی دستور while می رود. اگر عبارت درست ارزیابی شود، حلقه ادامه می یابد.
- break - بلافاصله اجرای تکرار فعلی را خاتمه می دهد و کنترل را به اولین عبارت بعد از حلقه منتقل می کند. بنابراین، این عبارت اجرای حلقه جاری را پایان می دهد. در مقاله بعدی آن را با جزئیات بیشتری بررسی خواهیم کرد.
while (numberOfApplesInBowl > 0) {
apple = bowl.grabNextApple();
numberOfApplesInBow--; // "--" is the decrement operator, which reduces the number of apples by one
if (apple.isBad()) { // This method returns true for rotten apples
apple.throwInGarbage();
continue; // Continue the loop. Jump to evaluation of numberOfApplesInBowl > 0
}
arrangeInPie(apple.peel().slice());
}
دستور
continue اغلب زمانی استفاده می شود که دستورات موجود در بدنه حلقه در صورت برآورده شدن یک شرط خاص باید اجرا شوند. برای مثال، ممکن است بخواهیم زمانی که یک حسگر سختافزاری راهاندازی میشود، اقداماتی را انجام دهیم (در غیر این صورت، به سادگی حلقهای را که در آن خوانش حسگر را انجام میدهیم ادامه دهیم) یا ممکن است بخواهیم یک عبارت را فقط بر روی تکرارهای خاصی از یک حلقه محاسبه کنیم. نمونه ای از مورد دوم را می توان در استفاده ما از حلقه while برای محاسبه مجموع مکعب اعداد طبیعی که مربع آنها کمتر از تعداد اعداد است مشاهده کرد. سردرگم؟ کد زیر را بررسی کنید:
public static void main(String[] args) {
int sum = 0; // Total amount
int i = 0; // Initial number in the series
int count = 20; // Number of numbers
while (i <= count) {
i++; // Get the next number — "i++" is equivalent to "i = i + 1"
if (i * i <= count) // If the square of the number is less than
continue; // the number of numbers, then we won't calculate the sum
// Jump to the next number in the loop
sum += i * i * i; // Otherwise, we calculate the sum of the cubes of numbers
} // "sum += i * i * i" is notation that is equivalent to "sum = sum + i * i * i"
System.out.println(sum); // Print the result
}
حلقه بی نهایت
این عبارات انشعاب اغلب در حلقه های بی نهایت استفاده می شود. اگر شرط بولی برای خروج از حلقه هرگز برآورده نشود، یک حلقه را بی نهایت می نامیم. در کد، چیزی شبیه به این است:
while (true) {
// Loop body
}
در این مورد، دستور
break به ما کمک می کند تا از حلقه خارج شویم. این نوع حلقه زمانی مناسب است که منتظر شرایط خارجی تعیین شده خارج از بدنه حلقه باشید. مثلاً در سیستم عامل ها یا بازی ها (خروج از حلقه به معنای خروج از بازی است). یا زمانی که از الگوریتمهایی استفاده میکنید که سعی میکنند با هر تکرار یک حلقه، برخی از نتایج را بهبود بخشند، اما تعداد تکرارها را بر اساس زمان سپری شده یا وقوع یک رویداد خارجی (مانند چکرز، شطرنج، یا پیشبینی آبوهوا) محدود میکنند. به یاد داشته باشید که در شرایط عادی حلقه های بی نهایت مطلوب نیستند. برای نشان دادن، اجازه دهید به قدرت بازگردیم:
public static void main(String[] args) {
int base = 3; // The number that will be exponentiated
int result = 1; // The result of exponentiation
int exponent = 1; // The initial exponent
while (true) {
result = result * base;
System.out.println(base + " raised to the power of " + exponent + " = " + result);
exponent++;
if (exponent > 10)
break; // Exit the loop
}
}
خروجی کنسول:
3 raised to the power of 1 = 3
3 raised to the power of 2 = 9
3 raised to the power of 3 = 27
3 raised to the power of 4 = 81
3 raised to the power of 5 = 243
3 raised to the power of 6 = 729
3 raised to the power of 7 = 2187
3 raised to the power of 8 = 6561
3 raised to the power of 9 = 19683
3 raised to the power of 10 = 59049
Process finished with exit code 0
حلقه های تو در تو
و اکنون به موضوع نهایی خود در مورد حلقه ها می رسیم. آن پای سیب (امیدوارم در حال حاضر گرسنه نباشید) و حلقه پوست کندن سیب ما را به خاطر بیاورید:-
اگر سیب در کاسه وجود دارد، مراحل 1.1 تا 1.4 را اجرا می کنیم:
- 1.1. یک سیب بگیر
- 1.2. پوست آن را بگیرید و به صورت ورقه ای برش دهید
- 1.3. برش های سیب را در پوسته پای در تابه بچینید
- 1.4. به مرحله 1 برگردید.
- تعداد برش ها = 0
-
تا زمانی که تعداد برش ها کمتر از 12 باشد، مراحل 2.1 تا 2.3 را انجام دهید.
- 2.1. یک برش دیگر سیب را برش دهید
- 2.2. تعداد برش ها ++
- 2.3. به مرحله 2 برگردید
-
اگر سیب در کاسه وجود دارد، مراحل 1.1 تا 1.6 را اجرا می کنیم:
- 1.1. یک سیب بگیر
- 1.2. پوست آن را بگیرید
- 1.3. تعداد برش ها = 0
- 1.4. تا زمانی که تعداد برش ها کمتر از 12 باشد، مراحل 1.4.1 تا 1.4.3 را انجام دهید.
- 1.4.1. یک برش دیگر سیب را برش دهید
- 1.4.2. تعداد برش ها ++ 1.4.3. به مرحله 1.4 برگردید
- 1.5. برش های سیب را در پوسته پای در تابه بچینید
- 1.6. به مرحله 1 برگردید.
public static void main(String[] args) {
// Print the second factors in a row
System.out.println(" 2 3 4 5 6 7 8 9");
int i = 2; // Assign the first factor to the variable
while (i < 10) { // First loop: execute as long as the first factor is less than 10
System.out.print(i + " | "); // Print the first factor at the beginning of the line
int j = 2; // The starting value of the second factor
while (j < 10) { // Second loop: execute as long as the second factor is less than 10
int product = i * j; // Calculate the product of the factors
if (product < 10) // If the product is a single digit, then we print two spaces after the product
System.out.print(product + " ");
else // Otherwise, print the product and one space after it
System.out.print(product + " ");
j++; // Increment the second factor by one
} // Go to the beginning of the second loop, i.e. "while (j < 10)"
System.out.println(); // Move to the next line on the console
i++; // Increment the first factor by one
} // Go to the beginning of the first loop, i.e. "while (i < 10)"
}
خروجی کنسول:
2 3 4 5 6 7 8 9
2 | 4 6 8 10 12 14 16 18
3 | 6 9 12 15 18 21 24 27
4 | 8 12 16 20 24 28 32 36
5 | 10 15 20 25 30 35 40 45
6 | 12 18 24 30 36 42 48 54
7 | 14 21 28 35 42 49 56 63
8 | 16 24 32 40 48 56 64 72
9 | 18 27 36 45 54 63 72 81
Process finished with exit code 0
حلقه ها (به ویژه عبارت
while ) یکی از بلوک های ساختمانی اساسی نرم افزار هستند. با حل وظایف در CodeGym، انواع مختلف حلقه ها را یاد می گیرید، پیچیدگی های آنها را درک می کنید و مهارت های عملی در استفاده از آنها به دست می آورید.
GO TO FULL VERSION