Các chương trình đầu tiên của chúng tôi là một chuỗi các lệnh được thực hiện lần lượt. Không có dĩa. Điều này bao gồm HelloWorld, hiển thị lời chào. Nó bao gồm các phép tính số học. Sau những chương trình đầu tiên, chúng tôi đã học cách phân nhánh, tức là làm thế nào để chương trình thực hiện các hành động khác nhau tùy thuộc vào điều kiện cụ thể. Đây là mã để kiểm soát hệ thống điều hòa không khí và sưởi ấm trung tâm:
Tiếp tục.
if (tempRoom>tempComfort)
airConditionerOn();
if (tempRoom<tempComfort)
heaterOn();
Thực hiện bước tiếp theo. Trong cuộc sống hàng ngày, chúng ta thường thực hiện các hành động lặp đi lặp lại thống nhất, chẳng hạn như gọt táo để lấy bánh. Quá trình hấp dẫn này có thể được mô tả như sau:
-
Nếu có táo trong bát thì ta thực hiện các bước từ 1.1 đến 1.4:
- 1.1. Lấy một quả táo
- 1.2. Gọt vỏ và cắt thành lát
- 1.3. Sắp xếp các lát táo trong vỏ bánh trong chảo
- 1.4. Quay lại bước 1.
- Chúng tôi tự ràng buộc mình với số lượng táo, nhưng nếu chúng tôi không có đủ chúng, thì một số lệnh sẽ được thực thi mà không có "trọng tải" (và chúng tôi có thể tự cắt mình khi cố gắng gọt một quả táo không tồn tại).
- Nếu có nhiều quả táo hơn lệnh gọt vỏ, thì một số quả táo sẽ không được gọt vỏ.
- Mã như vậy là khó đọc. Nó có rất nhiều lần lặp lại và rất khó sửa đổi.
Vòng lặp là câu lệnh cho phép các hành động được thực hiện lặp đi lặp lại
Vòng lặp while của Java sẽ hoạt động tốt trong trường hợp của chúng ta. Cấu trúc này đặt nhiều hành động vào một cấu trúc ngắn gọn và dễ hiểu. Sử dụng vòng lặp while , thuật toán cắt lát táo cho một chiếc bánh có thể trông như thế này trong Java:
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.");
Cú pháp lệnh
Biến thể đầu tiên của câu lệnh while như sau:
while (Boolean expression) {
// Loop body — the statement(s) that are repeatedly executed
}
Dưới đây là giải thích từng bước về những gì sẽ xảy ra khi mã này được thực thi:
- Chúng tôi đánh giá biểu thức Boolean được tìm thấy trong dấu ngoặc đơn sau từ khóa while .
- Nếu biểu thức Boolean đánh giá là true, thì các câu lệnh trong thân vòng lặp sẽ được thực thi. Sau khi câu lệnh cuối cùng trong thân vòng lặp được thực thi, chúng ta chuyển sang bước 1
- Nếu biểu thức Boolean đánh giá là sai, thì chúng ta chuyển sang câu lệnh đầu tiên sau vòng lặp while .
Vòng lặp với một điều kiện tiên quyết
Bởi vì chúng ta luôn đánh giá biểu thức Boolean (điều kiện để vào vòng lặp) trước khi thực hiện phần thân vòng lặp, nên dạng vòng lặp while này thường được gọi là vòng lặp có điều kiện tiên quyết . Hãy lập bảng mười lũy thừa đầu tiên của một số:
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++;
}
}
Đầu ra bảng điều khiển:
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
Vòng lặp với một hậu điều kiện
Đây là biến thể thứ hai của vòng lặp này:
do {
// Loop body — the statement(s) that are repeatedly executed
} while (Boolean expression);
Đây là giải thích về những gì xảy ra khi mã này được thực thi:
- Thân vòng lặp được thực thi (ngay sau từ khóa do ).
- Chúng tôi đánh giá biểu thức Boolean được tìm thấy trong dấu ngoặc đơn sau từ khóa while .
- Nếu biểu thức Boolean đánh giá là true, thì chúng ta chuyển sang bước 1
- Nếu biểu thức Boolean đánh giá là sai, thì chúng ta chuyển sang câu lệnh đầu tiên sau vòng lặp 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
}
Đầu ra bảng điều khiển:
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
Hãy chú ý đến những thay đổi trong mã. So sánh điều này với vòng lặp có điều kiện tiên quyết.
Sự thật thú vị về làm việc với các vòng lặp
Các câu lệnh rẽ nhánh trong thân vòng lặp
Có hai câu lệnh ảnh hưởng đến việc thực hiện trong một vòng lặp: break (chúng ta sẽ thảo luận chi tiết hơn trong chương tiếp theo) và- tiếp tục — bỏ qua việc thực thi phần còn lại của thân vòng lặp trong lần lặp hiện tại và chuyển sang đánh giá biểu thức Boolean của câu lệnh while. Nếu biểu thức ước tính là đúng, thì vòng lặp tiếp tục.
- break — ngay lập tức chấm dứt việc thực thi vòng lặp hiện tại và chuyển quyền kiểm soát sang câu lệnh đầu tiên sau vòng lặp. Do đó, câu lệnh này kết thúc việc thực hiện vòng lặp hiện tại. Chúng tôi sẽ xem xét nó chi tiết hơn trong bài viết tiếp theo.
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());
}
Câu lệnh
continue thường được sử dụng khi các câu lệnh trong thân vòng lặp cần được thực hiện nếu một điều kiện nào đó được thỏa mãn. Ví dụ: chúng tôi có thể muốn thực hiện các hành động khi cảm biến phần cứng được kích hoạt (nếu không, chỉ cần tiếp tục vòng lặp trong đó chúng tôi đọc số liệu cảm biến) hoặc chúng tôi có thể chỉ muốn tính toán một biểu thức trên các lần lặp nhất định của vòng lặp. Một ví dụ về trường hợp thứ hai có thể được nhìn thấy khi chúng ta sử dụng vòng lặp while để tính tổng lập phương của các số tự nhiên có bình phương nhỏ hơn số lượng các số. Bối rối? Kiểm tra đoạn mã sau:
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
}
vòng lặp vô hạn
Các câu lệnh rẽ nhánh này được sử dụng thường xuyên nhất trong các vòng lặp vô hạn. Chúng ta gọi một vòng lặp là vô hạn nếu điều kiện Boolean để thoát khỏi vòng lặp không bao giờ được thỏa mãn. Trong mã, nó trông giống như thế này:
while (true) {
// Loop body
}
Trong trường hợp này, câu lệnh
break giúp chúng ta thoát khỏi vòng lặp. Loại vòng lặp này phù hợp khi chờ đợi các điều kiện bên ngoài được xác định bên ngoài thân vòng lặp. Ví dụ: trong hệ điều hành hoặc trò chơi (thoát khỏi vòng lặp có nghĩa là thoát khỏi trò chơi). Hoặc khi sử dụng các thuật toán cố gắng, với mỗi lần lặp của một vòng lặp, để cải thiện một số kết quả, nhưng giới hạn số lần lặp lại dựa trên thời gian đã trôi qua hoặc sự xuất hiện của một sự kiện bên ngoài (ví dụ: cờ đam, cờ vua hoặc dự báo thời tiết). Hãy nhớ rằng trong điều kiện bình thường, các vòng lặp vô hạn là không mong muốn. Để chứng minh, hãy quay lại phép lũy thừa:
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
}
}
Đầu ra bảng điều khiển:
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
Vòng lồng nhau
Và bây giờ chúng ta đến với chủ đề cuối cùng về vòng lặp. Hãy nhớ lại chiếc bánh táo đó (tôi hy vọng bạn không đói vào lúc này) và vòng lặp gọt vỏ táo của chúng ta:-
Nếu có táo trong bát thì ta thực hiện các bước từ 1.1 đến 1.4:
- 1.1. Lấy một quả táo
- 1.2. Gọt vỏ và cắt thành lát
- 1.3. Sắp xếp các lát táo trong vỏ bánh trong chảo
- 1.4. Quay lại bước 1.
- Số lát cắt = 0
-
Miễn là số lát < 12, sau đó thực hiện các bước 2.1 đến 2.3
- 2.1. Cắt một lát táo khác
- 2.2. Số lát ++
- 2.3. Quay lại bước 2
-
Nếu có táo trong bát thì ta thực hiện các bước từ 1.1 đến 1.6:
- 1.1. Lấy một quả táo
- 1.2. gọt vỏ
- 1.3. Số lát cắt = 0
- 1.4. Miễn là số lát < 12, sau đó thực hiện các bước 1.4.1 đến 1.4.3
- 1.4.1. Cắt một lát táo khác
- 1.4.2. Số lát ++ 1.4.3. Quay lại bước 1.4
- 1.5. Sắp xếp các lát táo trong vỏ bánh trong chảo
- 1.6. Quay lại bước 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)"
}
Đầu ra bảng điều khiển:
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
Các vòng lặp (đặc biệt là câu lệnh
while ) là một trong những khối xây dựng cơ bản của phần mềm. Bằng cách giải quyết các nhiệm vụ trên CodeGym, bạn sẽ tìm hiểu tất cả các loại vòng lặp khác nhau, hiểu được sự phức tạp của chúng và đạt được các kỹ năng thực tế trong việc sử dụng chúng.
GO TO FULL VERSION