VII. Ngôn ngữ Java
6. Các câu lệnh điều khiển:
Java kế thừa và phát triển các câu lệnh điều khiển của C/C++. Chúng ta sẽ lần lợt xem xét các câu lệnh này ở phần này.
6.1. Các câu lệnh điều kiện: a. Phát biểu if:
if (biểu-thức-điều-kiện) phát-biểu-if
else
phát-biểu-else
Phát biểu if đầu tiên sẽ kiểm tra biểu thức điều kiện. Nếu biểu thức này trả về giá trị true, phát biểu (hoặc khối các phát biểu) trong phần phát-biểu-if sẽ đợc thực hiện. Ngợc lại, phần phát-biểu-if sẽ đợc thực hiện. Các lệnh if có thể lồng nhau.
Đôi khi ngời ta còn sử dụng toán tử ? : để thay cho lệnh if, nhằm đơn giản hoá câu lệnh. Chúng ta có thể xem ví dụ sau:
int mark = 8; char grade;
if (mark >= 9) // Nếu đạt điểm trên 9
grade = 'A'; // xếp loại A
else if (mark >= 8) // Nếu đạt điểm trên 8 (nhng < 9)
grade = 'B'; // xếp loại B
else if (mark >= 5) // Nếu đợc điểm trên 5 (nhng < 8)
grade = 'C'; // xếp loại C
else grade = 'D'; // Còn lại, xếp loại D
Tất cả các lệnh if ở trên đợc thay bằng toán tử ? :
int mark = 8;
char grade= (mark >= 9) ? 'A' : (mark >= 8) ? 'B' : (mark >= 5) ? 'C' : 'D'
b. Phát biểu switch: switch (biểu-thức) { case giá-trị-1: Đoạn-mã-1; case giá-trị-2: Đoạn-mã-1; case giá-trị-3: Đoạn-mã-1; ... default: Đoạn-mã-mặc-định; }
Khi thực hiện lệnh switch, biểu thức trong ngoặc đợc đánh giá. Quyền điều khiển sẽ chuyển đến thân của các phát biểu có từ khoá case với hằng theo sau nó có giá trị giống với biểu thức.
Nếu nh biểu thức không thoả mãn bất kỳ hằng số case nào, quyền điều khiển trả về cho đoạn mã mặc định đặt sau default.
Lu ý: Nếu không dùng phát biểu break, quyền điều khiển sẽ chuyển cho case kế tiếp.
Ví dụ về cách sử dụng lệnh switch :
char ch; switch (ch) {
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
is_digit = true; break; case ' ' : case '\t': case '\n': is_space = true; break; default: is_other = true; }
Nếu nh không có câu lệnh break sau is_digit = true, các ký tự kiểu số (digit) sẽ có is_space = true.
6.2. Các câu lệnh lặp:
Các câu lệnh lặp cho phép thực hiện lặp đi lặp lại một khối mã lệnh nào đó. Có 3 kiểu lệnh lặp: for, while và do. Phần sau đây sẽ trình bày các lệnh này một cách chi tiết hơn..
a. Phát biểu for:
for (phát-biểu-khởi-tạo; biểu-thức-điều-kiện; phát-biểu-tăng) thân-vòng-lặp
Khi đi vào một câu lệnh for, đầu tiên phát-biểu-khởi-tạo đợc thực hiện nhằm thiết lập giá trị ban đầu cho biến đếm. Kế đến, phát-biểu-tăng và biểu-thức-
điều-kiện đợc liên tục xét đến: nếu nh điều kiện sai, vòng lặp sẽ kết thúc. Java cũng cho phép nhiều phát biểu khởi tạo và biểu thức điều kiện một lúc (phân cách bằng dấu phảy) giống C++. Lấy ví dụ:
// Số ngày trong từng tháng
int[] month_days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // Mảng nhiệt độ cao nhất từng ngày
int[][] daily_high = new int[month_days.length][] for (int i = 0; i < month_days.length; i++) {
// tạo mảng
daily_high[i] = new int [month_days[i]]; }
b. Phát biểu while:
while (biểu-thức-điều-kiện) { thân-vòng-lặp
}
Để thực hiện một phát biểu while, biểu-thức-điều-kiện sẽ đợc tính toán trớc. Nếu biểu thức là true, thân vòng lặp sẽ đợc thực hiện. Quá trình này lặp đi lặp lại cho đến khi biểu thức chứa giá trị false. Ví dụ sau đây sẽ in ra mời dòng trắng: int i = 10; while (i-- > 0) System.out.println(); c. Phát biểu do: do thân-vòng-lặp while (biểu-thức-điều-kiện);
Điểm khác biệt duy nhất giữa phát biểu do và phát biểu while là trật tự thực hiện: Thân vòng lặp sẽ đợc thực hiện trớc, sau đó mới tính đến biểu thức điều kiện. Do vậy, phần thân vòng lặp đợc thực hiện ít nhất là một lần. Đoạn chơng trình sau đợi cho đến khi ngời sử dụng đánh vào xâu "exit":
String buffer;
DataInputStream my_in = new DataInputStream(System.in); do { System.out.print("Nhập lệnh : "); System.out.flush(); buffer = my_in.readLine(); } while (! buffer.equals("exit")); 6.3. Các phát biểu ngắt vòng lặp:
Trong Java có ba kiểu phát biểu để ngắt vòng lặp: break, continue và return. Sau đây chúng ta sẽ lần lợt xem xét các phát biểu này:
a. Phát biểu break:
break nhãn; // nhãn có thể có hoặc không..
Nếu nh không có kèm nhãn, phát biểu break sẽ chuyển quyền điều khiển đến phát biểu sau vòng lặp trong nhất. Nếu nh có nhãn, quyền điều khiển đợc
chuyển tới phát biểu kế tiếp của khối lệnh chứa nhãn. Ví dụ minh hoạ sau dùng để in ra ngày thứ 3 trong năm có nhiệt độ lớp hơn 70oF:
vong_lap_ngoai:
for (int i = 0, count = 0; i < daily_high.length; i++) for (int j = 0; j < daily_high.length; j++)
if ((daily_high[i][j] > 70) & (++count == 3)) {
System.out.println("Ngày đó là:" + (i+1)+"/"+(j+1)); break vong_lap_ngoai; // Nhảy ra ngoài cả 2 vòng lặp }
// nếu nh lệnh break đợc thực hiện,
// quyền điều khiển sẽ đợc chuyển tới đây
b. Phát biểu continue:
continue nhãn; // nhãn có thể có hoặc không
Phát biểu này chuyển quyền điều khiển cho đoạn mã đi kèm với thân vòng lặp. Với while và do, phát biểu điều kiện sẽ đợc kiểm tra lại. Với vòng lặp for, phát biểu tăng sẽ đợc thực hiện. Nếu nh có nhãn đa vào, quyền điều khiển đợc trao cho vòng lặp bên ngoài cùng có chứa nhãn.
c. Phát biểu return:
return biểu-thức;
Một phát biểu return sẽ trả quyền điều khiển về cho đoạn mã gọi hàm đó. Nếu nh hàm đợc định nghĩa là sẽ trả về giá trị, biểu-thức phải có kiểu giá trị đó. Ngợc lại, chúng ta phải dùng lệnh return không kèm theo biểu-thức.