Cấu trúc vòng lặp, rẽ nhánh và ra quyết định
- 28-07-2023
- Toanngo92
- 0 Comments
Mục lục
Giới thiệu
Một chương trình Java bao gồm một tập hợp các câu lệnh, được thực hiện tuần tự theo thứ tự mà chúng xuất hiện. Tuy nhiên, trong một số trường hợp, thứ tự thực hiện các câu lệnh có thể thay đổi dựa trên việc đánh giá các điều kiện nhất định. Sự thay đổi trong luồng câu lệnh đạt được bằng cách sử dụng các câu lệnh luồng điều khiển khác nhau. Có ba loại câu lệnh luồng điều khiển được hỗ trợ bởi ngôn ngữ lập trình Java.
- Câu lệnh điều kiện – Những câu lệnh loại này còn được gọi là câu lệnh ra quyết định. Chúng cho phép chương trình thực hiện một tập hợp các câu lệnh cụ thể tùy thuộc vào kết quả đánh giá biểu thức điều kiện hoặc trạng thái của một biến.
- Câu lệnh lặp – Các loại câu lệnh này còn được gọi là cấu trúc lặp. Chúng cho phép chương trình lặp lại một tập hợp các câu lệnh cụ thể trong một số lần nhất định.
- Câu lệnh rẽ nhánh – Các loại câu lệnh này được gọi là câu lệnh nhảy. Chúng cho phép chương trình bỏ qua hoặc tiếp tục thực hiện các câu lệnh lặp. Chương trình được thực hiện theo kiểu phi tuyến tính.
Câu lệnh ra quyết định
Ngôn ngữ lập trình Java sở hữu các khả năng ra quyết định khác nhau. Các câu lệnh ra quyết định cho phép chúng ta thay đổi luồng thực thi của một chương trình Java. Dựa trên kết quả đánh giá một điều kiện trong quá trình thực hiện chương trình, một câu lệnh hoặc một chuỗi các câu lệnh được thực hiện. Các loại tuyên bố ra quyết định khác nhau được hỗ trợ bởi Java như sau:
- Câu lệnh if
- Câu lệnh switch-case
Cấu trúc if
Câu lệnh if là dạng cơ bản nhất của câu lệnh ra quyết định. Câu lệnh if đánh giá một điều kiện nhất định và dựa trên kết quả đánh giá sẽ thực thi một đoạn mã nhất định. Nếu điều kiện đánh giá là đúng, thì các câu lệnh có trong khối if sẽ được thực thi. Nếu điều kiện đánh giá là sai, điều khiển được chuyển trực tiếp đến câu lệnh bên ngoài khối if.
Cú pháp:
if (condition){
// one or more statements;
}
Trong đó:
- condition: Là biểu thức boolean
- statements: Là các hướng dẫn/câu lệnh được đặt trong dấu ngoặc nhọn. Các câu lệnh này được thực thi khi biểu thức boolean đánh giá là đúng.
Ví dụ:
public class IfExample {
public static void main(String[] args) {
int age = 25;
if (age >= 18) {
System.out.println("You are an adult.");
}
}
}
Cấu trúc if-else
Câu lệnh if chỉ định một khối câu lệnh sẽ được thực thi khi điều kiện được đánh giá là đúng. Tuy nhiên, đôi khi cần phải xác định một khối câu lệnh sẽ được thực thi khi một điều kiện được đánh giá là sai. Điều này được thực hiện bằng cách sử dụng câu lệnh if-else.
Câu lệnh if-else bắt đầu bằng khối if theo sau là khối else. Khối else chỉ định một khối câu lệnh sẽ được thực thi khi một điều kiện được đánh giá là false.
Cú pháp:
if(condition){
// một hoặc nhiều câu lệnh
} else{
// one or more statements;
}
Ví dụ:
public class IfElseExample {
public static void main(String[] args) {
int score = 85;
if (score >= 60) {
System.out.println("Congratulations! You passed.");
} else {
System.out.println("Sorry, you failed.");
}
}
}
Cấu trúc Nested-if
Câu lệnh if-else kiểm tra kết quả của một điều kiện, nghĩa là một biểu thức boolean và thực hiện các hành động thích hợp dựa trên kết quả. Một câu lệnh if cũng có thể được sử dụng trong một câu lệnh if khác, Điều này được gọi là if lồng nhau. Một câu lệnh if lồng nhau là một câu lệnh if là mục tiêu của một câu lệnh if hoặc else khác.
Các điểm quan trọng cần nhớ về câu lệnh if lồng nhau như sau:
- Một câu lệnh khác phải luôn tham chiếu đến câu lệnh if gần nhất.
- Câu lệnh if phải nằm trong cùng một khối với câu lệnh else và nó không được liên kết với một số câu lệnh else khác.
Cú pháp:
if (condition) {
if (condition){
// todo true-blockstatements
}else{
// todo false-blockstatements
}
}else{
// todo false-blockstatements
}
Ví dụ:
import java.util.Scanner;
public class NestedIfExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter your age: ");
int age = scanner.nextInt();
if (age >= 18) {
System.out.println("You are an adult.");
System.out.print("Do you have a driving license? (yes/no): ");
String hasLicense = scanner.next();
if (hasLicense.equalsIgnoreCase("yes")) {
System.out.println("You can drive!");
} else if (hasLicense.equalsIgnoreCase("no")) {
System.out.println("You need to get a driving license.");
} else {
System.out.println("Invalid input for driving license status.");
}
} else {
System.out.println("You are a minor.");
}
scanner.close();
}
}
Cấu trúc if-else-if
Cấu trúc nhiều if được gọi là bậc thang if-else-if. Các điều kiện được đánh giá tuần tự bắt đầu từ đỉnh của thang và di chuyển xuống dưới.
Khi một điều kiện kiểm soát câu lệnh if được đánh giá là đúng, các câu lệnh liên quan đến điều kiện if được thực thi và tất cả các câu lệnh if khác được bỏ qua. Nếu không có điều kiện nào là đúng, thì câu lệnh khác cuối cùng sẽ được thực thi. Câu lệnh khác cuối cùng cũng hoạt động như một câu lệnh mặc định.
Trong trường hợp, nếu tất cả các cấu trúc if là sai và không có câu lệnh cuối cùng nào khác được chỉ định, thì chương trình sẽ không thực hiện hành động nào.
Cú pháp:
if(condition){
// one or more statements
}else if(condition){
// one or more statements
}else{
// one or more statements
}
Ví dụ:
public class IfElseIfExample {
public static void main(String[] args) {
int number = 5;
if (number > 0) {
System.out.println("Positive number.");
} else if (number < 0) {
System.out.println("Negative number.");
} else {
System.out.println("Zero.");
}
}
}
Cấu trúc switch case
Một chương trình khó hiểu khi có quá nhiều câu lệnh if đại diện cho nhiều cấu trúc lựa chọn. Để tránh điều này, các câu lệnh switch-case có thể được sử dụng thay thế cho. Một chương trình khó hiểu khi có quá nhiều câu lệnh if đại diện cho nhiều cấu trúc lựa chọn. Để tránh điều này, các câu lệnh switch có thể được sử dụng như một giải pháp thay thế cho nhiều lựa chọn. Việc sử dụng câu lệnh switch-case mang lại hiệu suất tốt hơn.
Câu lệnh switch-case chứa một biến dưới dạng một biểu thức có giá trị được so sánh với các giá trị khác nhau. Nó có thể có một số đường dẫn thực thi tùy thuộc vào giá trị của biểu thức được cung cấp cùng với câu lệnh chuyển đổi. Biểu thức được đánh giá có thể chứa các kiểu dữ liệu nguyên thủy khác nhau, chẳng hạn như byte, short, int và char.
Từ Java SE 7 trở đi, câu lệnh switch-case cũng hỗ trợ việc sử dụng các chuỗi và có thể được chuyển dưới dạng biểu thức cho câu lệnh switch. Lớp String được sử dụng để tạo các giá trị chuỗi trong chương trình Java.
Ngoài các lớp chuỗi, Nó cũng hỗ trợ các đối tượng của một số lớp có trong API Java. Các lớp là Ký tự, Byte, Ngắn và Số nguyên và được gọi là các lớp bao bọc. Lớp trình bao bọc bao quanh hoặc bao bọc kiểu dữ liệu nguyên thủy thành một đối tượng thuộc kiểu đó. Ví dụ, lớp trình bao bọc, Integer cho phép bạn sử dụng giá trị int làm đối tượng, ví dụ:
Integer y = new Integer(10);
Nó cũng hỗ trợ việc sử dụng các kiểu liệt kê làm biểu thức.
Cú pháp switch-case:
switch(<expression>){
case value1:
// todo
break;
case value1:
// todo
break;
case value1:
// todo
break;
default:
// todo
break;
}
Trong đó:
switch: Từ khóa switch được theo sau bởi một biểu thức được đặt trong ngoặc đơn.
case: Từ khóa case được theo sau bởi một hằng số và dấu hai chấm. Mỗi giá trị case là một chữ duy nhất. Câu lệnh case có thể được theo sau bởi một chuỗi mã được thực thi khi biểu thức chuyển đổi và giá trị trường hợp khớp với nhau.
default: nếu không có giá trị trường hợp nào khớp với giá trị biểu thức chuyển đổi, việc thực thi sẽ tiếp tục ở mệnh đề mặc định. Điều này tương đương với else của cấu trúc if-else-if.
break: Các câu lệnh break được sử dụng bên trong câu lệnh switch-cace để chấm dứt việc thực thi chuỗi câu lệnh. Câu lệnh break là tùy chọn. Nếu không có câu lệnh ngắt, quá trình thực thi sẽ tuần tự chuyển sang các trường hợp tiếp theo. Đôi khi, nhiều trường hợp có thể xuất hiện mà không có câu lệnh ngắt giữa chúng. Việc sử dụng câu lệnh break làm cho việc sửa đổi mã dễ dàng hơn và ít lỗi hơn.
Giá trị của biểu thức được chỉ định với câu lệnh switch được so sánh với giá trị hằng số của từng trường hợp. nếu bất kỳ giá trị trường hợp nào khớp, các câu lệnh tương ứng trong trường hợp đó sẽ được thực thi. Nếu không có trường hợp phù hợp, thì trường hợp mặc định sẽ được thực thi.
Khi gặp câu lệnh break, nó sẽ kết thúc khối switch-case và điều khiển chuyển sang các câu lệnh theo sau khối. Câu lệnh break phải được cung cấp với từng trường hợp, vì nếu không có chúng, các khối chuyển đổi sẽ bị bỏ qua. Điều này có nghĩa là ngay cả sau khi trường hợp khớp được thực hiện; tất cả các trường hợp khác sau trường hợp phù hợp cũng được thực thi, cho đến khi gặp câu lệnh break.
Câu lệnh break là tùy chọn. Nếu nó bị bỏ qua, thì việc thực thi sẽ tiếp tục với các trường hợp khác, ngay cả sau khi tìm thấy trường hợp phù hợp. Tuy nhiên, đôi khi bắt buộc phải có nhiều câu lệnh case mà không có câu lệnh break. Điều này thường được sử dụng khi cùng một tập hợp các câu lệnh được yêu cầu thực thi cho nhiều trường hợp.
Ví dụ:
import java.util.Scanner;
public class SwitchCaseExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a day number (1-7): ");
int dayNumber = scanner.nextInt();
String dayName;
switch (dayNumber) {
case 1:
dayName = "Sunday";
break;
case 2:
dayName = "Monday";
break;
case 3:
dayName = "Tuesday";
break;
case 4:
dayName = "Wednesday";
break;
case 5:
dayName = "Thursday";
break;
case 6:
dayName = "Friday";
break;
case 7:
dayName = "Saturday";
break;
default:
dayName = "Invalid day number";
}
System.out.println("The day is: " + dayName);
scanner.close();
}
}
- The switch-case statement differs from the if statement, as it can only test for equality. The if statement can test any type of boolean expression. In other words, the switch-case statement looks only for a match between the value of the expression and one of its case constants.
- No two case constants in the same witch statement can have identical values, except the nested switch-case statements.
- A switch statement is more efficient and executes faster than a set of nested-if statements.
So sánh giữa câu lệnh if và switch-case
Mặc dù, câu lệnh ra quyết định if và switch-case có cách sử dụng tương tự nhau trong một chương trình, nhưng giữa chúng có sự khác biệt rõ rệt.
Bảng mô tả sự khác biệt giữa cấu trúc if và switch case
if | switch-case |
Mỗi câu lệnh if có biểu thức logic riêng để được đánh giá là true hay false | Mỗi trường hợp tham chiếu trở lại giá trị ban đầu của biểu thức trong câu lệnh switch |
Các biến trong biểu thức có thể đánh giá thành một giá trị thuộc bất kỳ kiểu nào | Biểu thức phải đánh giá toa byte, short, char, int, of String |
Chỉ một trong các khối mã được thực thi | Nếu câu lệnh break bị bỏ qua, quá trình thực thi sẽ tiếp tục được thực hiện trong khối tiếp theo |
Vòng lặp
Một chương trình máy tính bao gồm một tập hợp các câu lệnh, thường được thực hiện tuần tự. Tuy nhiên, trong một số tình huống nhất định, cần phải lặp lại các bước nhất định để đáp ứng một điều kiện cụ thể.
Các vòng lặp cho phép các lập trình viên phát triển các chương trình ngắn gọn, nếu không sẽ yêu cầu hàng nghìn câu lệnh chương trình. Một vòng lặp bao gồm câu lệnh hoặc khối câu lệnh được thực hiện lặp đi lặp lại cho đến khi một điều kiện được đánh giá là đúng hoặc sai. Các câu lệnh vòng lặp được hỗ trợ bởi ngôn ngữ lập trình Java như sau:
- Câu lệnh while
- Câu lệnh do-while
- Câu lệnh for
- Câu lệnh for-each
Vòng lặp While
Vòng lặp while là câu lệnh lặp cơ bản nhất trong Java. Nó được sử dụng để thực hiện một câu lệnh hoặc một khối câu lệnh cho đến khi điều kiện được chỉ định là đúng. Thông thường nó được sử dụng khi không biết số lần khối phải được thực thi.
Cú pháp:
while(expression){
// one or more statements
}
Trong đó:
expression: Là một biểu thức điều kiện phải trả về một giá trị boolean, nghĩa là true hoặc false
Việc sử dụng dấu ngoặc nhọn ({}) là tùy chọn. Chúng có thể tránh được nếu chỉ có một câu lệnh duy nhất trong phần thân của vòng lặp. Tuy nhiên, việc cung cấp các câu lệnh trong dấu ngoặc nhọn làm tăng khả năng đọc mã.
Phần thân của vòng lặp chứa một tập hợp các câu lệnh. Các câu lệnh này sẽ được thực thi cho đến khi biểu thức điều kiện được đánh giá là đúng. Khi biểu thức điều kiện cho kết quả sai, vòng lặp kết thúc và quyền điều khiển được chuyển đến câu lệnh ngay sau vòng lặp.
Ví dụ:
public class WhileLoopExample {
public static void main(String[] args) {
int count = 1;
// The while loop will continue as long as the condition (count <= 5) is true
while (count <= 5) {
System.out.println("Count: " + count);
count++; // Increment the count by 1 in each iteration
}
System.out.println("Loop finished!");
}
}
Quy tắc sử dụng vòng lặp While
Cần lưu ý những điểm sau khi sử dụng câu lệnh while:
- Giá trị của các biến được sử dụng trong biểu thức phải được đặt tại một số điểm trước khi đạt đến vòng lặp while. Quá trình này được gọi là khởi tạo biến và phải được thực hiện một lần trước khi
việc thực hiện vòng lặp. Ví dụ: num = 1; - Phần thân của vòng lặp phải có biểu thức thay đổi giá trị của biến là một phần của biểu thức của vòng lặp. Ví dụ: numt++; hoặc num–
Vòng lặp vô hạn
Vòng lặp vô hạn là vòng lặp không bao giờ kết thúc. Vòng lặp chạy vô tận khi biểu thức điều kiện hoặc biểu thức tăng/giảm của vòng lặp bị thiếu. Bất kỳ loại vòng lặp nào cũng có thể là vòng lặp vô hạn.
public class InfiniteLoopExample {
public static void main(String[] args) {
// Infinite loop using while
while (true) {
System.out.println("This is an infinite loop!");
// No termination condition, the loop will run forever
}
}
}
Vòng lặp do-while
Trong vòng lặp while, việc đánh giá biểu thức điều kiện được thực hiện ở đầu vòng lặp. Do đó, nếu điều kiện ban đầu là sai, thì phần thân của vòng lặp sẽ không được thực hiện. Do đó, để thực hiện phần thân của vòng lặp ít nhất một lần, nên sử dụng vòng lặp do-while.
Câu lệnh do-while kiểm tra điều kiện ở cuối vòng lặp thay vì ở đầu. Điều này đảm bảo rằng vòng lặp được thực hiện ít nhất một lần. Điều kiện của câu lệnh do-while thường bao gồm một biểu thức điều kiện đánh giá một giá trị boolean.
Cú pháp:
do {
//todo statements;
}
while (expression);
Trong đó:
Expression: biểu thức điều kiện phải trả về giá trị boolean, nghĩa là true hoặc false.
Statement: Chỉ ra phần thân của vòng lặp với một tập hợp các câu lệnh.
Đối với mỗi lần lặp, vòng lặp do-while đầu tiên thực hiện phần thân của vòng lặp và sau đó, biểu thức điều kiện được ước tính. Khi biểu thức điều kiện có giá trị true, phần thân của vòng lặp sẽ được thực thi. Khi biểu thức điều kiện được đánh giá thành false, vòng lặp kết thúc và câu lệnh theo sau vòng lặp được thực thi.
Ví dụ:
import java.util.Scanner;
public class DoWhileLoopSum {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = 1;
int sum = 0;
System.out.println("Enter 10 numbers:");
do {
System.out.print("Number " + count + ": ");
int number = scanner.nextInt();
sum += number;
count++;
} while (count <= 10);
System.out.println("Sum of the 10 numbers: " + sum);
scanner.close();
}
}
Vòng lặp for
Vòng lặp for đặc biệt được sử dụng khi người dùng biết số lần các câu lệnh được yêu cầu thực hiện. Nó tương tự như câu lệnh while trong chức năng của nó. Các câu lệnh trong phần thân của vòng lặp được thực hiện miễn là điều kiện còn đúng. Ở đây cũng vậy, điều kiện được kiểm tra trước khi các câu lệnh được thực thi.
Cú pháp:
for (initialization; condition; increment/decrement) {
// Code to be executed in each iteration
}
Trong đó:
- initialization: Là một biểu thức sẽ thiết lập giá trị ban đầu của biến điều khiển vòng lặp.
- condition: Là một biểu thức boolean kiểm tra giá trị của biến điều khiển vòng lặp. Nếu biểu thức điều kiện đánh giá là đúng, vòng lặp sẽ thực hiện. nếu biểu thức điều kiện đánh giá là sai, vòng lặp sẽ kết thúc.
- increment /decrement: Bao gồm câu lệnh thay đổi giá trị của (các) biến điều khiển vòng lặp trong mỗi lần lặp, cho đến khi đạt được điều kiện được chỉ định trong phần điều kiện. Thông thường, các toán tử tăng và giảm, chẳng hạn như ++, –, và các toán tử tắt, chẳng hạn như += hoặc -= được sử dụng trong phần này. Không có dấu chấm phẩy ở cuối biểu thức tăng/giảm. Cả ba phần khai báo được phân tách bằng dấu chấm phẩy (;).
Việc thực hiện vòng lặp bắt đầu với phần khởi tạo. Nói chung, đây là một biểu thức thiết lập giá trị của biến điều khiển vòng lặp và hoạt động như một biến đếm điều khiển vòng lặp. Biểu thức khởi tạo chỉ được thực hiện một lần, nghĩa là khi vòng lặp bắt đầu. Tiếp theo, biểu thức boolean được đánh giá và kiểm tra biến điều khiển vòng lặp dựa trên giá trị được nhắm mục tiêu.
Nếu biểu thức là đúng thì phần thân của vòng lặp được thực thi và nếu biểu thức là sai thì vòng lặp kết thúc. Cuối cùng, phần lặp của vòng lặp được thực hiện. Biểu thức này thường tăng hoặc giảm giá trị của biến kiểm soát. Trong lần lặp tiếp theo, một lần nữa phần điều kiện được đánh giá và tùy thuộc vào kết quả đánh giá, vòng lặp sẽ được tiếp tục hoặc kết thúc.
Ví dụ:
public class ForLoopExample {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
System.out.println("Number: " + i);
}
}
}
Phạm vi của biến điều khiển trong vòng lặp for
Hầu hết các biến điều khiển được sử dụng trong vòng lặp for và có thể không được sử dụng thêm trong chương trình. Trong tình huống như vậy, có thể hạn chế phạm vi của các biến bằng cách khai báo chúng tại thời điểm khởi tạo.
Câu lệnh for có thể được mở rộng bằng cách bao gồm nhiều hơn một biểu thức khởi tạo hoặc gia tăng trong đặc tả vòng lặp for. Các biểu thức được phân tách bằng cách sử dụng toán tử ‘dấu phẩy’ (,) và được đánh giá từ trái sang phải. Thứ tự đánh giá là quan trọng, nếu giá trị của biểu thức thứ hai phụ thuộc vào giá trị mới được tính toán.
Ví dụ:
public class ForLoopWithVariables {
public static void main(String[] args) {
int product; // Declare the product variable outside the for loop
// The counter variable, num, is declared inside the for loop
for (int num = 1; num <= 5; num++) {
product = num * 10;
System.out.printf("%d * 10 = %d%n", num, product);
} // End of the for loop
}
}
Biến thể trong vòng lặp for
Vòng lặp for rất mạnh mẽ và linh hoạt trong cấu trúc của nó. Điều này có nghĩa là cả ba phần của vòng lặp for không bắt buộc phải khai báo và chỉ được sử dụng trong vòng lặp.
Biến thể phổ biến nhất liên quan đến biểu thức điều kiện. Hầu hết, biểu thức điều kiện được kiểm tra với các giá trị được nhắm mục tiêu, nhưng nó cũng có thể được sử dụng để kiểm tra các biểu thức boolean. Ngoài ra, phần khởi tạo hoặc phần lặp trong vòng lặp for có thể để trống, nghĩa là chúng không bắt buộc phải có mặt trong vòng lặp for.
Vòng lặp for vô hạn
Nếu để trống cả ba biểu thức thì sẽ dẫn đến một vòng lặp vô tận. Vòng lặp for vô hạn sẽ chạy liên tục vì không có điều kiện nào được chỉ định để chấm dứt nó.
Ví dụ:
for(;;){
// infinitive loop
}
Vòng lặp for nâng cao
Java SE 5 trở đi hỗ trợ vòng lặp nâng cao để tăng khả năng đọc của vòng lặp. Phiên bản vòng lặp for này thực hiện vòng lặp kiểu ‘for-each’.
Vòng lặp for nâng cao được thiết kế để truy xuất hoặc duyệt qua một tập hợp các đối tượng, chẳng hạn như mảng. Nó cũng được sử dụng để lặp lại các phần tử của đối tượng tập hợp, chẳng hạn như ArrayList, LinkedList, HashSet, v.v. Các lớp này được định nghĩa trong khung bộ sưu tập (collection framework) và được sử dụng để lưu trữ các đối tượng.
Cú pháp:
for(type var:collection){
// todo
}
Trong đó:
- type: Chỉ định kiểu (kiểu dữ liệu) bộ sưu tập được duyệt qua.
- var: Là một biến lặp lưu trữ các phần tử từ tập hợp. Vòng lặp for-each đi từ đầu đến cuối và trong mỗi lần lặp, phần tử được truy xuất và lưu trữ trong biến var.
Vòng lặp nâng cao tiếp tục cho đến khi tất cả các phần tử từ một bộ sưu tập được truy xuất.
import java.util.ArrayList;
public class ForEachExample {
public static void main(String[] args) {
// Example using an array
int[] numbers = { 1, 2, 3, 4, 5 };
System.out.println("Printing array elements using foreach loop:");
for (int num : numbers) {
System.out.print(num + " ");
}
System.out.println();
// Example using an ArrayList
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
System.out.println("Printing ArrayList elements using foreach loop:");
for (String name : names) {
System.out.println(name);
}
}
}
Vòng lặp lồng nhau (nested loop)
Việc đặt một câu lệnh vòng lặp bên trong phần thân của một câu lệnh vòng lặp khác được gọi là lồng các vòng lặp. Ví dụ, một câu lệnh while có thể được đặt trong một câu lệnh do-while và một câu lệnh for có thể được đặt trong một câu lệnh while. Khi bạn lồng hai vòng lặp, vòng lặp bên ngoài sẽ kiểm soát số lần vòng lặp bên trong được thực hiện. Đối với mỗi lần lặp của vòng lặp bên ngoài, vòng lặp bên trong sẽ được thực hiện cho đến khi phần điều kiện của nó đánh giá là sai.
Có thể có bất kỳ số lượng kết hợp nào giữa ba vòng lặp. Trong khi tất cả các loại câu lệnh vòng lặp có thể được lồng vào nhau, các vòng lặp lồng nhau phổ biến nhất được hình thành bởi câu lệnh for. Vòng lặp for có thể được lồng trong vòng lặp for khác tạo thành vòng lặp for lồng nhau.
Ví dụ:
public class NestedLoopExample {
public static void main(String[] args) {
int rows = 5; // Number of rows in the triangle
// Outer loop for each row
for (int i = 1; i <= rows; i++) {
// Inner loop for each column in the current row
for (int j = 1; j <= i; j++) {
System.out.print("* ");
}
// Move to the next line after each row is printed
System.out.println();
}
}
}
So sánh các vòng lặp
Một vòng lặp được viết bằng câu lệnh while cũng có thể được viết lại bằng câu lệnh for và ngược lại. Câu lệnh do-while có thể được viết lại bằng câu lệnh while hoặc for. Tuy nhiên, điều này không được khuyến khích vì câu lệnh do-while được thực hiện ít nhất một lần. Khi biết số lần các câu lệnh trong vòng lặp sẽ được thực thi, câu lệnh for được sử dụng.
while/for | do-while |
Vòng lặp được kiểm tra trước. Điều kiện được kiểm tra trước khi các câu lệnh trong vòng lặp được thực thi. | Vòng lặp được kiểm tra sau. Điều kiện được kiểm tra sau khi các câu lệnh trong vòng lặp được thực thi. |
Vòng lặp không được thực hiện nếu điều kiện không được thỏa mãn ngay từ đầu. | Vòng lặp được thực hiện ít nhất một lần ngay cả khi điều kiện không được thỏa mãn ngay từ đầu. |
Câu lệnh nhảy
Đôi khi, số lần chính xác vòng lặp phải được thực hiện chỉ được biết trong thời gian chạy. Trong trường hợp như vậy, điều kiện để kết thúc vòng lặp có thể được đặt trong phần thân của vòng lặp. Vào những thời điểm khác, dựa trên một điều kiện, các câu lệnh còn lại có trong phần thân của vòng lặp phải được bỏ qua. Java hỗ trợ các câu lệnh nhảy chuyển điều khiển vô điều kiện tới các vị trí trong chương trình được gọi là mục tiêu của các câu lệnh nhảy.
Java cung cấp hai từ khóa: break và continue phục vụ các mục đích khác nhau. Tuy nhiên, cả hai đều được sử dụng trong các vòng lặp để thay đổi luồng điều khiển dựa trên các điều kiện.
Câu lệnh break
Câu lệnh break trong Java được sử dụng theo hai cách. Đầu tiên, nó có thể được sử dụng để kết thúc một trường hợp trong câu lệnh switch case. Thứ hai, nó buộc kết thúc vòng lặp ngay lập tức, bỏ qua kiểm tra điều kiện thông thường của vòng lặp.
Khi gặp câu lệnh break bên trong vòng lặp, vòng lặp lập tức kết thúc và quyền điều khiển chương trình được chuyển cho câu lệnh theo sau vòng lặp. Nếu được sử dụng trong một tập hợp các vòng lặp lồng nhau, câu lệnh break sẽ kết thúc vòng lặp trong cùng.
Ví dụ:
public class BreakStatementExample {
public static void main(String[] args) {
int targetNumber = 5;
// Example of using break in a for loop
for (int i = 1; i <= 10; i++) {
System.out.print(i + " ");
if (i == targetNumber) {
System.out.println("\nTarget number found!");
break; // Exit the loop when the target number is found
}
}
// Example of using break in a while loop
int count = 0;
while (true) {
count++;
System.out.print(count + " ");
if (count >= 10) {
System.out.println("\nReached the maximum count.");
break; // Exit the loop when the count reaches 10
}
}
}
}
Output:
1 2 3 4 5
Target number found!
1 2 3 4 5 6 7 8 9 10
Reached the maximum count.
Câu lệnh continue
Java cung cấp một từ khóa khác có tên là tiếp tục bỏ qua các câu lệnh trong một vòng lặp và chuyển sang bước lặp tiếp theo của vòng lặp. Trong vòng lặp while và do-while, câu lệnh continue chuyển điều khiển sang biểu thức điều kiện điều khiển vòng lặp.
public class ContinueKeywordExample {
public static void main(String[] args) {
// Example using continue in a for loop
System.out.println("Using continue in a for loop:");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // Skip the rest of the code for i=3 and proceed to the next iteration
}
System.out.print(i + " ");
}
System.out.println("\n");
// Example using continue in a while loop
System.out.println("Using continue in a while loop:");
int count = 0;
while (count < 5) {
count++;
if (count == 2) {
continue; // Skip the rest of the code for count=2 and proceed to the next iteration
}
System.out.print(count + " ");
}
}
}
Output:
Using continue in a for loop:
1 2 4 5
Using continue in a while loop:
1 3 4 5
Các câu lệnh được dán nhãn (labeled statements)
Java không hỗ trợ câu lệnh goto vì chúng khó hiểu và khó bảo trì. Tuy nhiên, có một số tình huống mà câu lệnh goto tỏ ra hữu ích. Nó có thể được sử dụng trong các cấu trúc để kiểm soát luồng câu lệnh. Ví dụ: để thoát khỏi một tập hợp các vòng lặp được lồng sâu, câu lệnh goto có thể hữu ích.
Java định nghĩa một dạng mở rộng của câu lệnh break và continue. Các hình thức mở rộng này có thể được sử dụng trong bất kỳ khối nào. Không nhất thiết các khối phải là một phần của vòng lặp hoặc switch case.
Những hình thức này được gọi là câu lệnh dán nhãn. Sử dụng các câu lệnh được gắn nhãn, bạn có thể chỉ định chính xác điểm mà từ đó quá trình thực thi sẽ tiếp tục.
Cú pháp:
break label;
Trong đó:
- label: Là một mã định danh được chỉ định để đặt tên cho một khối. Nó có thể là bất kỳ mã định danh Java hợp lệ nào được theo sau bởi dấu hai chấm.
Khối được gắn nhãn phải chứa câu lệnh break, nhưng không nhất thiết phải có trong khối kèm theo ngay lập tức. Câu lệnh break có label có thể được sử dụng để thoát khỏi một tập hợp các khối lồng nhau.
Ví dụ:
public class LabelAndBreakExample {
public static void main(String[] args) {
outerLoop: // Define the label for the outer loop
for (int i = 1; i <= 3; i++) {
innerLoop: // Define the label for the inner loop
for (int j = 1; j <= 3; j++) {
System.out.println("i = " + i + ", j = " + j);
if (i == 2 && j == 2) {
break outerLoop; // Break out of both loops when i=2 and j=2
}
}
}
}
}
Output:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
Bài tập
Bài 1:
Lifemaxi là một công ty bảo hiểm có trụ sở tại Leeds, Vương quốc Anh. Nó đã thuê các đại lý bảo hiểm cung cấp thông tin cho khách hàng về các chính sách và số tiền cho vay khác nhau. Để tăng tốc độ kinh doanh của họ và cũng giúp các đại lý giải quyết các truy vấn của khách hàng, công ty đã quyết định thiết kế một ứng dụng phần mềm bằng Java.
ạn là một nhà phát triển trong nhóm đã được giao nhiệm vụ phát triển ứng dụng Java. Ứng dụng sẽ giúp đại lý cho vay tính toán xem khách hàng có đủ điều kiện vay hay không.
Các tiêu chí cần được xem xét để tự động hóa chính sách cho vay như sau:
Bài 2:
Viết chương trình nhập vào một ký tự và kiểm tra xem ký tự nhập vào là nguyên âm hay phụ âm.
Bài 3:
Viết chương trình nhận số tiền gửi từ người dùng và tính số tiền lãi thu được trong một năm. Ngân hàng trả lãi suất sau tùy thuộc vào số tiền gửi:
a. 4% cho các khoản tiền gửi lên đến 2000
b. 4,5% cho các khoản tiền gửi lên tới 7000
c. 5% cho tiền gửi hơn 7000