Bài 3.1. Cấu trúc ra quyết định if-else
Nội dung bài học
Mục đích sử dụng
- Cấu trúc if hoặc if-else hoặc if-else-if dùng để đưa ra quyết định có thực hiện chương trình hay không.
- Nó còn có tên là cấu trúc rẽ nhánh, câu lệnh ra quyết định.
- Ví dụ vấn đề: nếu điểm trung bình >= 3.20 thì sinh viên A sẽ được học bổng. Như vậy ta sẽ có một điều kiện là điểm trung bình >= 3.20 để xét xem sinh viên A có đạt học bổng không. Nếu có thì ta quyết định trao học bổng cho sinh viên A. Ngược lại sinh viên A sẽ không được học bổng. Làm sao để chương trình biết mà thực hiện thay chúng ta?
- Khi nào thì sử dụng cấu trúc nào?
- Nếu muốn chương trình chỉ thực hiện khi điều kiện thỏa mãn. Ta sử dụng cấu trúc if.
- Nếu muốn khi điều kiện thỏa, thực hiện phương án A. Nếu không, thực hiện phương án B, ta dùng cấu trúc if-else.
- Nếu có nhiều hơn 2 phương án để thực hiện và các phương án mang tính loại trừ nhau, dùng if-else-if.
- Loại trừ nhau có nghĩa là các điều kiện có sự ràng buộc với nhau, không là cái này thì có thể là cái kia.
- Ví dụ: phân loại điểm chữ chỉ có thể là A, B, C, D, F. Xét từ cao xuống thấp, nếu không phải điểm A thì chỉ có thể là B trở xuống, nếu không phải A, B thì chỉ có thể là C trở xuống. Nếu không phải là A, B, C thì chỉ có thể là D trở xuống… Vậy với một mức điểm ta có nhiều khả năng và chỉ 1 trong số các khả năng là chính xác.
- Ví dụ 2: tiền giấy hiện hành chỉ có các mệnh giá 1k, 2k, 5k, 10k, 20k, 50k, 100k, 200k, 500k. Vậy nếu người khác đưa cho ta một tờ tiền thật, tờ tiền đó chỉ có thể là một trong các mệnh giá đã liệt kê ở trên. Khi xét từ cao xuống thấp: nếu ko phải 500k thì chỉ có thể là 200k hoặc nhỏ hơn, nếu ko phải 200k thì chỉ có thể là 100k hoặc nhỏ hơn.
- Như vậy ta thấy có mối liên hệ ràng buộc giữa các điều kiện và điều kiện đứng trước loại trừ khỏi các điều kiện đứng sau.
Cú pháp tổng quát
Cú pháp tổng quát cấu trúc if:
if (condition) {
// các câu lệnh cần thực hiện
}
- Trong đó:
- Luôn bắt đầu cấu trúc này với từ khóa if
- Theo sau if là cặp ngoặc tròn ( ) và trong đó chứa điều kiện
- condiion là các điều kiện cần thỏa mãn để phần thân if được thực hiện. Điều kiện của if luôn là giá trị hoặc biểu thức có tính đúng hoặc sai.
- Phần thân if bao bởi cặp ngoặc { } chứa các câu lệnh cần thực hiện nếu điều kiện thỏa mãn
- Cấu trúc if kết thúc bởi dấu }
- Ví dụ 1: xét số number nhập vào từ bàn phím xem nó âm, dương, chẵn, lẻ và có chia hết cho số nguyên k hay không.
import java.util.Scanner;
public class Lesson31 {
public static void main(String[] args) {
var scanner = new Scanner(System.in);
System.out.println("Nhập số nguyên n: ");
var number = scanner.nextInt();
// kiểm tra xem number có phải số chẵn không
if (number % 2 == 0) {
System.out.println(number + " là số chẵn.");
}
// number là số lẻ
if (number % 2 == 1) {
System.out.println(number + " là số lẻ.");
}
// number là số âm
if (number < 0) {
System.out.println(number + " là số âm.");
}
// number là số dương
if (number > 0) {
System.out.println(number + " là số dương.");
}
System.out.println("Nhập số nguyên k: ");
var k = scanner.nextInt();
// number là số chia hết cho k
if (number % k == 0) {
System.out.println(number + " chia hết cho " + k);
}
}
}
Nhập số nguyên n:
2025
2025 là số lẻ.
2025 là số dương.
Nhập số nguyên k:
5
2025 chia hết cho 5
- Ví dụ 2: xét học bổng theo điểm gpa nhập vào từ bàn phím. Giả sử điều kiện để đạt học bổng là điểm gpa >= 3.2 ở hệ 4.
public class Lesson31 {
public static void main(String[] args) {
var scanner = new Scanner(System.in);
var gpa = scanner.nextFloat();
if(gpa >= 3.2f) {
System.out.println("Sinh viên A đạt học bổng.");
}
}
}
Cú pháp tổng quát cấu trúc if-else:
if(condition) {
// làm gì đó nếu điều kiện thỏa mãn
} else {
// làm gì đó nếu điều kiện không thỏa
}
- Trong đó các thành phần giống với if và thêm:
- else là một từ khóa đi liền sau dấu ngoặc } của if trước nó.
- Mỗi if chỉ có nhiều nhất 1 else.
- Mỗi else chỉ thuộc về duy nhất 1 if liền trước nó.
- Nếu condition không xảy ra thì nội dung khối else sẽ được thực hiện
- Ví dụ 1: xét một số nguyên number nhập vào từ bàn phím xem nó chẵn hay lẻ, âm hay dương, chia hết cho số nguyên k hay không.
import java.util.Scanner;
public class Lesson31 {
public static void main(String[] args) {
var scanner = new Scanner(System.in);
System.out.println("Nhập số nguyên n: ");
var number = scanner.nextInt();
// kiểm tra xem number có phải số chẵn không
if (number % 2 == 0) {
System.out.println(number + " là số chẵn.");
} else { // number là số lẻ
System.out.println(number + " là số lẻ.");
}
// number là số âm
if (number < 0) {
System.out.println(number + " là số âm.");
}
// number là số dương
if (number > 0) {
System.out.println(number + " là số dương.");
}
System.out.println("Nhập số nguyên k: ");
var k = scanner.nextInt();
// number là số chia hết cho k
if (number != 0 && number % k == 0) {
System.out.println(number + " chia hết cho " + k);
} else {
System.out.println(number + " KHÔNG chia hết cho " + k);
}
}
}
Nhập số nguyên n:
101
101 là số lẻ.
101 là số dương.
Nhập số nguyên k:
5
101 KHÔNG chia hết cho 5
- Ví dụ 2: Nếu sinh viên đạt điểm gpa >= 3.20 thì được học bổng. Nếu không thì được giấy chứng nhận. Điểm gpa là điểm trung bình tích lũy thường ở hệ 4.
public class Lesson31 {
public static void main(String[] args) {
float gpa = 3.75f;
if (gpa >= 3.2f) { // nếu điểm TB >= 3.2
// kết luận A đạt học bổng
System.out.println("Sinh viên A đạt học bổng.");
} else {
// tặng cho sinh viên A cái giấy chứng nhận
System.out.println("A đạt giấy chứng nhận.");
}
}
}
Cú pháp tổng quát cấu trúc if-else-if:
if (điều_kiện1) {
// làm gì đó nếu điều_kiện1 thỏa mãn
} else if (điều_kiện2) {
// làm gì đó nếu điều_kiện2 thỏa mãn
} else if (điều_kiện3) {
// làm gì đó nếu điều_kiện3 thỏa mãn
} else {
// làm gì đó nếu tất cả điều kiện không thỏa mãn
}
- Trong đó giống cấu trúc if-else và thêm:
- Cấu trúc else if nối liền sau cấu trúc if trước đó. Nếu không phải là else if mà chỉ là if thì nó trở về cấu trúc if đơn đầu tiên ở trên.
- Cấu trúc else cuối cùng là tùy chọn, tức có thể có hoặc không tùy bài toán.
- Nếu điều_kiện1 thỏa, nội dung thân if đầu tiên được thực hiện.
- Nếu không, biểu thức điều_kiện2 sẽ được đánh giá. Nếu thỏa(tức true) thì khối if thứ hai sẽ được thực hiện.
- Nếu không, biểu thức điều_kiện3 sẽ được đánh giá. Nếu thỏa, khối if thứ 3 sẽ được thực hiện.
- Tương tự đánh giá được thực hiện cho biểu thức if thứ n.
- Sau cùng, nếu mọi điều kiện trên không thỏa. Khối code của vế else ở cuối(nếu có) sẽ được thực hiện.
- Ví dụ 1: kiểm tra số nguyên: một số nguyên chỉ có thể thuộc 3 loại là âm, dương hoặc bằng 0.
// kiểm tra số âm
if (number < 0) {
System.out.println(number + " là số âm.");
} else if (number > 0) { // số dương
System.out.println(number + " là số dương.");
} else { // không dấu
System.out.println(number + " là số không âm, không dương.");
}
- Ví dụ 2: Giả sử có 3 mức học bổng là Khá, Giỏi và Xuất sắc. Điều kiện điểm gpa của 3 mức lần lượt là:
- Khá: >= 3.0 và < 3.2: thưởng 3.5 triệu đ.
- Giỏi: >= 3.2 và < 3.6: thưởng 5.0 triệu đ.
- Xuất sắc: >= 3.6 đến 4.0: thưởng 10 triệu đ.
- Nếu không đạt mức nào thì thông báo không được học bổng.
- Nếu điểm gpa > 4.0 hoặc < 0 thì điểm không hợp lệ.
import java.util.Scanner;
public class Lesson31 {
public static void main(String[] args) {
var scanner = new Scanner(System.in);
System.out.println("Nhập điểm gpa của sinh viên: ");
var gpa = scanner.nextFloat();
if (gpa > 4.0f || gpa < 0) {
System.out.println("Điểm gpa không hợp lệ!");
} else if (gpa >= 3.6f) {
System.out.println("Sinh viên đặt học bổng loại xuất sắc, trị giá 10.000.000đ");
} else if (gpa >= 3.2f) {
System.out.println("Sinh viên đặt học bổng loại giỏi, trị giá 5.000.000đ");
} else if (gpa >= 3.0f) {
System.out.println("Sinh viên đặt học bổng loại khá, trị giá 3.500.000đ");
} else {
System.out.println("Sinh viên không đạt học bổng.");
}
}
}
Nhập điểm gpa của sinh viên:
0.5
Sinh viên không đạt học bổng.
Nhập điểm gpa của sinh viên:
3.78
Sinh viên đặt học bổng loại xuất sắc, trị giá 10.000.000đ
Nhập điểm gpa của sinh viên:
3.56
Sinh viên đặt học bổng loại giỏi, trị giá 5.000.000đ
Nhập điểm gpa của sinh viên:
3.15
Sinh viên đặt học bổng loại giỏi, trị giá 3.500.000đ
Nhập điểm gpa của sinh viên:
4.75
Điểm gpa không hợp lệ!
Sơ đồ khối
- Các khối chức năng cơ bản:
- Hình thoi: khối kiểm tra điều kiện.
- Hình bình hành: khối nhập xuất dữ liệu.
- Hình chữ nhật: thực hiện lệnh: gán, tính toán…
- Hình oval: bắt đầu, kết thúc chương trình.
- Hình tròn nhỏ: một điểm nào đó trong chương trình.
- Mũi tên: hướng thực hiện các lệnh chương trình kế tiếp.
- Sơ đồ khối của cấu trúc if:
- Sơ đồ khối của cấu trúc if-else:
- Sơ đồ khối của cấu trúc if-else-if:
- Trong sơ đồ trên thể hiện rõ rằng trong khi xét các khối if thành phần nếu thấy điều kiện của if nào thỏa mãn thì phần thân của khối if đó sẽ được thực thi.
- Sau khi thực thi xong thì sẽ chuyển tới các đoạn lệnh bên dưới khối if-else-if. Không tiếp tục kiểm tra các if khác trong chuỗi lệnh if-else-if khi đã thấy một if được thỏa mãn.
- Sau cùng nếu không có bất kì điều kiện của khối if thành phần nào thỏa mãn, vế else của if sau cùng sẽ được thực thi sau đó chuyển tới các lệnh ngay phía bên dưới đó.
- Nếu không có vế else thì chương trình sẽ đi tới khối lệnh ngay phía dưới chuỗi if-else-if để tiếp tục thực hiện các lệnh còn lại.
Ví dụ minh họa
- Yêu cầu: Giả sử có 3 mức học bổng là Khá, Giỏi và Xuất sắc. Điều kiện của 3 mức lần lượt là:
- Khá: >= 3.0 và < 3.2: thưởng 3.5 triệu đ.
- Giỏi: >= 3.2 và < 3.6: thưởng 5.0 triệu đ.
- Xuất sắc: >= 3.6 đến 4.0: thưởng 10 triệu đ.
- Nếu không đạt mức nào thì thông báo không được học bổng.
- Hãy vẽ sơ đồ khối cho chức năng kiểm tra xem sinh viên với điểm gpa cho trước có đạt học bổng không.
- Phân tích khả năng có thể xảy ra của điểm gpa do nó được nhập tùy ý từ bàn phím:
- TH1: nếu gpa > 4.0 hoặc gpa < 0.0 thì điểm gpa này không hợp lệ. Theo hệ quy chiếu 4, điểm gpa chỉ từ 0.0 đến 4.0.
- TH2: điểm gpa thuộc loại xuất sắc.
- TH3: điểm gpa thuộc loại giỏi.
- TH4: điểm gpa thuộc loại khá.
- TH5: điểm gpa không đạt học bổng, tức dưới mức khá 3.0.
- Sơ đồ khối phần xét duyệt học bổng dựa trên điểm gpa của bài này như sau:
- Code mẫu:
import java.util.Scanner;
public class Lesson31 {
public static void main(String[] args) {
var scanner = new Scanner(System.in);
System.out.println("Họ và tên sinh viên: ");
var fullName = scanner.nextLine();
System.out.println("Nhập điểm gpa: ");
var gpa = scanner.nextFloat();
// bắt đầu khởi tạo và xét duyệt
var level = ""; // loại học bổng
int scholarship; // số tiền được thưởng tính theo vnđ
if (gpa > 4.0f || gpa < 0) {
level = "Gpa không hợp lệ";
scholarship = 0;
} else if (gpa >= 3.6f) { // điều kiện học bổng xuất sắc
level = "Xuất sắc";
scholarship = 10_000_000;
} else if (gpa >= 3.2f) { // điều kiện học bổng giỏi
level = "Giỏi";
scholarship = 5_000_000;
} else if (gpa >= 3.0f) { // điều kiện học bổng khá
level = "Khá";
scholarship = 3_500_000;
} else { // không đạt
level = "Không đạt";
scholarship = 0;
}
// kết luận
if (scholarship > 0) {
System.out.printf("Chúc mừng sinh viên \"%s\" đã đạt học bổng!", fullName);
System.out.printf("Cấp độ học bổng: %s.", level);
System.out.printf("Mức thưởng: %sđ", String.format("%,d", scholarship));
} else {
System.out.printf("Rất tiếc sinh viên \"%s\" không đạt học bổng.", fullName);
System.out.printf("Lý do: %s", level);
}
}
}
Họ và tên sinh viên:
Nguyễn Thị Ngọc Mai
Nhập điểm gpa:
3.87
Chúc mừng sinh viên "Nguyễn Thị Ngọc Mai" đã đạt học bổng!
Cấp độ học bổng: Xuất sắc.
Mức thưởng: 10,000,000đ
===
Họ và tên sinh viên:
Lê Bá Nam
Nhập điểm gpa:
3.16
Chúc mừng sinh viên "Lê Bá Nam" đã đạt học bổng!
Cấp độ học bổng: Khá.
Mức thưởng: 3,500,000đ
===
Họ và tên sinh viên:
Hoàng Ngọc Ánh
Nhập điểm gpa:
3.54
Chúc mừng sinh viên "Hoàng Ngọc Ánh" đã đạt học bổng!
Cấp độ học bổng: Giỏi.
Mức thưởng: 5,000,000đ
===
Họ và tên sinh viên:
Trần Khánh Tùng
Nhập điểm gpa:
2.99
Rất tiếc sinh viên "Trần Khánh Tùng" không đạt học bổng.
Lý do: Không đạt
===
Họ và tên sinh viên:
Ma Thị Hải
Nhập điểm gpa:
5.6
Rất tiếc sinh viên "Ma Thị Hải" không đạt học bổng.
Lý do: Gpa không hợp lệ
===
Họ và tên sinh viên:
Lưu Viết Sơn
Nhập điểm gpa:
-3.66
Rất tiếc sinh viên "Lưu Viết Sơn" không đạt học bổng.
Lý do: Gpa không hợp lệ
Bài tập thực hành
Tải đề bài: nhấn vào đây.
Lời giải mẫu: nhấn vào đây