1. Giới thiệu
Trong lập trình, bạn thường phải thực hiện đi thực hiện lại cùng một thao tác nhiều lần. Ví dụ:
- Duyệt qua tất cả phần tử của một danh sách.
- Đọc từ bàn phím các giá trị cho đến khi người dùng nhập đúng giá trị cần thiết.
- Tính tổng tất cả các số từ 1 đến 100.
- Yêu cầu người dùng nhập mật khẩu cho đến khi đúng.
Nếu cố gắng thực hiện tất cả những việc này mà không dùng vòng lặp, mã sẽ dài, nhàm chán và khó mở rộng. Hãy tưởng tượng bạn đang viết một chương trình máy tính bỏ túi và quyết định cộng các số từ 1 đến 10 bằng tay:
int sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
// ... và như vậy 10 lần. Ừm.
Bạn sẽ chán trước khi hoàn thành! Giải pháp — vòng lặp. Chúng cho phép mô tả việc lặp lại hành động một cách ngắn gọn và dễ hiểu. Hôm nay chúng ta sẽ làm quen với vòng lặp cơ bản nhất nhưng cực kỳ hữu ích — while.
2. Làm quen với vòng lặp while
Cú pháp và sơ đồ cơ bản
Vòng lặp while là “con vẹt” trong thế giới lập trình: nó lặp lại cùng một đoạn mã cho đến khi một điều kiện nào đó còn đúng. Ngay khi điều kiện không còn đúng, con vẹt im lặng (vòng lặp kết thúc).
Cú pháp:
while (điều kiện)
{
// Thân vòng lặp
}
Sơ đồ
Dưới đây là một lưu đồ đơn giản để hiểu cách vòng lặp while hoạt động:
3. Ví dụ: vòng lặp while trong thực tế
Bộ đếm cổ điển
Hãy viết một chương trình đơn giản đếm từ 1 đến 5 và in ra các số:
int i = 1;
while (i <= 5)
{
System.out.println("Bước số " + i);
i++; // Đừng quên tăng bộ đếm!
}
// Sẽ in ra:
// Bước số 1
// Bước số 2
// Bước số 3
// Bước số 4
// Bước số 5
Lưu ý: nếu quên tăng biến i, vòng lặp sẽ không bao giờ kết thúc (con vẹt của chúng ta sẽ bất tử và lặp mãi mãi). Điều này gọi là vòng lặp vô hạn — một điều đáng sợ.
Nhập từ bàn phím cho đến khi đạt giá trị mong muốn
Không hiếm khi vòng lặp được dùng để “ép” người dùng tới câu trả lời đúng:
String password = "";
while (!password.equals("qwerty"))
{
System.out.print("Nhập mật khẩu: ");
password = console.nextLine();
}
System.out.println("Chào mừng!");
Ở đây chương trình yêu cầu nhập mật khẩu cho đến khi bạn gõ đúng "qwerty". Đừng quên: nếu xóa dòng password = console.nextLine();, vòng lặp sẽ lại trở thành vô hạn (sẽ hỏi mật khẩu nhưng không đọc đầu vào — treo mãi như robot hỏng).
4. Các loại và kịch bản sử dụng vòng lặp while
Vòng lặp while thông thường
Vòng lặp này, như đã minh họa ở trên, kiểm tra điều kiện trước lần lặp đầu tiên. Nếu điều kiện sai ngay — thân vòng lặp sẽ không chạy lần nào.
Ví dụ: điều kiện sai ngay từ đầu
int i = 10;
while (i < 5)
{
System.out.println(i); // Sẽ không bao giờ chạy!
}
Điều này hoàn toàn hợp lý. Đúng như những gì viết ở đây.
Vòng lặp while lồng nhau
Đôi khi cần đặt vòng lặp trong vòng lặp. Ví dụ, duyệt tất cả các dòng và trong mỗi dòng kiểm tra mọi ký tự. Ở giai đoạn này thì hơi mạo hiểm, nhưng đây là ví dụ đơn giản:
int i = 1;
while (i <= 3)
{
int j = 1;
while (j <= 2)
{
System.out.println("i = " + i + ", j = " + j);
j++;
}
i++;
}
// i = 1, j = 1
// i = 1, j = 2
// i = 2, j = 1
// i = 2, j = 2
// i = 3, j = 1
// i = 3, j = 2
Chúng ta sẽ tìm hiểu kỹ hơn về vòng lặp lồng nhau sau vài bài giảng nữa, giờ chỉ muốn dọa bạn chút thôi :)
Vòng lặp vô hạn
Đôi khi vòng lặp kết thúc, nhưng đôi khi — sống mãi.
while (true)
{
System.out.println("Tôi bất diệt!");
}
Ít khi dùng, thường cho các tiến trình nền (ví dụ, chạy máy chủ), nhưng vẫn áp dụng trong thực tế.
5. Đừng viết dở hơi: các lỗi thường gặp với while
Trong lập trình, vòng lặp giống như điện: rất tuyệt, nhưng cần biết các quy tắc an toàn.
Vấn đề 1: vòng lặp vô hạn do bất cẩn
Người mới rất hay quên cập nhật biến mà điều kiện phụ thuộc vào nó. Kết quả là vòng lặp chạy “vô hạn”, và phải dừng chương trình cưỡng bức (ví dụ, bằng tổ hợp Ctrl + C).
int i = 1;
while (i <= 5)
{
System.out.println(i);
// i++; // ÔI! Quên tăng i rồi
}
Vấn đề 2: đặt điều kiện sai
Đôi khi lập trình viên tự đào hố: điều kiện lại không bao giờ đúng. Kết quả là vòng lặp không chạy chút nào.
int i = 10;
while (i < 5)
{
System.out.println(i); // Đoạn mã này sẽ không bao giờ chạy.
i++;
}
Vấn đề 3: lỗi về kiểu dữ liệu
Trong điều kiện của vòng lặp luôn phải là một biểu thức boolean — tức kết quả phải là true hoặc false.
int number = 5;
while (number) // Lỗi! Cần boolean, không phải int.
{
number--;
}
GO TO FULL VERSION