CodeGym /Blog Java /Ngẫu nhiên /Tuyên bố trong khi

Tuyên bố trong khi

Xuất bản trong nhóm
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:

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:
  1. 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.1. Lấy một quả táo
    2. 1.2. Gọt vỏ và cắt thành lát
    3. 1.3. Sắp xếp các lát táo trong vỏ bánh trong chảo
    4. 1.4. Quay lại bước 1.
Câu lệnh while - 2Giả sử bạn có mười quả táo, hai tay và một con dao. Trong cuộc sống thực, bạn tuần tự bóc cả chục quả táo, theo cùng một thuật toán cho từng quả táo. Nhưng làm thế nào để chúng ta tạo một chương trình thực hiện một hành động lặp đi lặp lại cho mỗi quả táo?
  • 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:
  1. 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 .
  2. 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
  3. 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:
  1. Thân vòng lặp được thực thi (ngay sau từ khóa do ).
  2. 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 .
  3. Nếu biểu thức Boolean đánh giá là true, thì chúng ta chuyển sang bước 1
  4. 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 .
Hai điểm khác biệt chính so với vòng lặp trước đó là: 1) thân vòng lặp được thực hiện ít nhất một lần và 2) biểu thức Boolean được đánh giá sau khi thân vòng lặp được thực thi. Theo đó, loại vòng lặp while này được gọi là vòng lặp có hậu điều kiện . Lần này chúng ta sẽ hiển thị một bảng lũy ​​thừa của một số không vượt quá 10000:

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.
  • 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.
Nhớ lại ví dụ trái cây của chúng tôi. Nếu chúng tôi không chắc chắn về chất lượng của những quả táo, chúng tôi có thể thay đổi mã bằng cách sử dụng câu lệnh tiếp tục :

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:
  1. 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.1. Lấy một quả táo
    2. 1.2. Gọt vỏ và cắt thành lát
    3. 1.3. Sắp xếp các lát táo trong vỏ bánh trong chảo
    4. 1.4. Quay lại bước 1.
Hãy mô tả quá trình cắt chi tiết hơn:
  1. Số lát cắt = 0
  2. Miễn là số lát < 12, sau đó thực hiện các bước 2.1 đến 2.3

    1. 2.1. Cắt một lát táo khác
    2. 2.2. Số lát ++
    3. 2.3. Quay lại bước 2
Và chúng tôi sẽ thêm điều này vào thuật toán làm bánh của chúng tôi:
  1. 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.1. Lấy một quả táo
    2. 1.2. gọt vỏ
    3. 1.3. Số lát cắt = 0
    4. 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. 1.4.1. Cắt một lát táo khác
      2. 1.4.2. Số lát ++
      3. 1.4.3. Quay lại bước 1.4
    5. 1.5. Sắp xếp các lát táo trong vỏ bánh trong chảo
    6. 1.6. Quay lại bước 1.
Bây giờ chúng ta có một vòng lặp trong một vòng lặp. Cấu trúc như thế này là rất phổ biến. Ví dụ cuối cùng, chúng ta hãy xây dựng một trong những bảng cửu chương mà chúng ta đã học yêu thích ở trường tiểu học.

 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.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION