Nhập môn ngôn ngữ lập trình Java – Phần 5: Toán tử quan hệ và toán tử điều kiện, Câu lệnh if, switch


Vấn đề sẽ đề cập trong những bài viết này:

Java là một ngôn ngữ lập trình hướng đối tượng (Object-oriented Programming), nhưng đôi khi nó thật sự không đối tượng hoàn toàn (một số ý kiến cho rằng như thế). Vì thế, Loạt bài viết sau này tôi sẽ trình bài là phương pháp lập trình hướng đối tượng  (OOP) bằng ngôn ngữ Java.

Chú ý: Nhắc lại là đây là bài hướng dẫn cá nhân tôi, nên đôi lúc cách sử dụng câu chữ theo cảm tính, vì thế, có những từ ngữ không hoàn toàn chính xác và khoa học nhất. Đôi khi lại không theo trình tự nhất định. Tuy nhiên, đó là điều tôi nghĩ sẽ dễ hiểu nhất có thể.

Kiến thức thu được từ các bài viết:

Hiểu rỏ cấu trúc ngôn ngữ Java theo hướng đối tượng.

Vận dụng vào ví dụ hướng dẫn đi xuyên suốt bài viết.

Và một số vấn đề để lập trình tốt ngôn ngữ Java theo OOP.

Bạn cần nhớ rằng khi học Java hay một số ngôn ngữ khác, có rất nhiều từ ngữ thông dụng làm cho người học trở nên mơ hồ, rồi từ đó rất khó để nắm bắt được ngôn ngữ này. ví dụ như: SDK, JDK,  J2SE (J2SE SDK),IDE,… Và việc bạn cần làm là cố gắng hiểu được các từ đó, thông qua cụm từ tiếng Anh viết tắt của nó. Nếu gặp một từ như thế, bảng hãy tìm cụm từ tiếng Anh của nó và hiểu nó.

Phần này làm rõ một vài thứ như toán tử quan hệ và toán tử điều kiện, cách bạn có thể sử dụng câu lệnh if và switch. Tuy nhiên, phần này cũng giống như các phần khác không hướng dẫn hết tất cả mà chỉ là tổng quát một cấu trúc quan trọng của vấn đề đưa ra, rồi từ đó người học có thể tìm hiểu sâu hơn những phần học này, nhưng theo tôi sẽ dễ dàng hơn khi bạn đã nắm được kiến thức từ bài học.

Các toán tử quan hệ và toán tử điều kiện

Java cung cấp cho bạn một vài toán tử và câu lệnh điều khiển luồng để cho phép bạn ra quyết định trong mã lệnh của mình. Thông thường, một quyết định lựa chọn trong mã lệnh bắt đầu bằng một biểu thức logic (là biểu thức được đánh giá bằng hai giá trị đúng hoặc sai – true/false). Những biểu thức đó sử dụng các toán tử quan hệ, chúng so sánh một toán hạng hoặc một biểu thức với một với một toán hạng hay biểu thức khác, và các toán tử điều kiện nữa. Dưới đây là danh sách:

Toán tử Cách sử dụng Trả về true nếu…
> a > b a lớn hơn b
>= a >= b a lớn hơn hay bằng b
< a < b a nhỏ hơn b
<= a <= b a nhỏ hơn hay bằng b
== a == b a bằng b
! = a != b a không bằng b
&& a && b ab cả hai đều true, tính b có điều kiện
(nếu a là false thì không cần tính b nữa)
|| a || b a hoặc b là true, tính b có điều kiện
(nếu a là true thì không cần tính b nữa)
! ! a a là false
& a & b ab cả hai là true, luôn luôn tính b
| a | b a hoặc b là true, luôn luôn tính b
^ a ^ b ab là khác nhau (true nếu a là true và b là false,
hoặc ngược lại, nhưng không được đồng thời là true hoặc false)

Bạn phải hiểu rõ các toán tử, nó đóng vai trò quan trọng khi sử dụng câu lệnh if cũng như các câu lệnh khác: switch, vòng lặp for, while, do…while,… Và tất nhiên là cần hiểu về cách sử dụng biến sao cho hợp lệ.

Ghi nhớ về phạm vi của biến: Tất cả các biến trong Java điều có phạm vi (scope). Nếu biến nằm trong vùng phạm vi bạn có thể tương tác với nó tại đó và ngược lại. Phạm vi là gói gọn trong class, trong phương thức hay trong khối lệnh (khối lệnh được bao trong  hai dấu ngoặc nhọn mở  { và đóng } ). Từ phạm vi của biến mà người ta xác định đó là biến toàn cục hay biến vùng (tôi tạm gọi biến bị giới hạn trong phương thức hay khối lệnh là biến vùng).

Câu lệnh if else (if)

Else luôn luôn đi cùng if, nhưng if thì có thể có một, nhiều hoặc không có else nào.

Sử dụng điều kiện if

if (  boolean expression ) {
	 câu lệnh thực thi...
} [else if{
	 câu lệnh thực thi... 
}]
  ...........................
[else{
         câu lệnh thực thi...
}]

Khi có nhiều điều kiện cần giải quyết (n điều kiện), chúng ta dùng if để xử lý và kèm theo else if (điều kiện i) để kiểm tra điều kiện thứ i. Và cuối cùng là else thực thi điều kiện ngoài điều kiện đã kiểm tra trước đó.

ví dụ:

Trường hợp 1: If không kèm theo else (if)

public String walk(int steps) {
	if (steps > 100)
		return "I can't walk that far at once";//return thứ 1
	
	progress = progress + steps;
	return "Just took " + steps + " steps."; //return thứ 2
}

điều kiện if ở đây kiểm tra steps > 100 hay không. Nếu lớn hơn, thực hiện điều kiện này (tức là return “I can’t walk that far at once”. Nếu steps nhỏ hơn 100 thì tính toán progress và trả về return thứ 2. Ở đây thực ra chúng ta có thể lồng else vào đây. (Xem trường hợp 2)

Trường hợp 2: Chỉ có một  if và một else

public String walk(int steps) {
	if (steps > 100){
		return "I can't walk that far at once";//return thứ 1
        }
	else{
        	progress = progress + steps;
	        return "Just took " + steps + " steps."; //return thứ 2
        }
}

Kết quả hoàn toàn giống trường hợp 1, tuy nhiên chỉ khi cần thiết thật sự chúng ta mới nên sử dụng cách này, vì trường hợp này làm code trở nên dài dòng khó hiểu. Dấu { và dấu } của if có thể bỏ bớt đi khi khối lệnh chỉ có một dòng như trong trường hợp này. Thay vì viết

if (steps > 100){
	return "I can't walk that far at once";//return thứ 1
}

ta có thể viết

if (steps > 100)
	return "I can't walk that far at once";//return thứ 1

Như vậy có thể lượt bớt đi những dòng thừa thải, điều này được gọi là gia vị cú pháp vô nghĩa.

Trường hợp 3: Cú pháp if có nhiều else…if.

if (steps > 100)
	return "I can't walk that far at once";
else if (steps > 50)
	return "That's almost too far";
else {
	progress = progress + steps;
	return "Just took " + steps + " steps.";
}

Và chúng ta có thể thêm nhiều else…if nữa nếu còn điều kiện xử lý. Tuy nhiên, nên viết ngắn gọn nhất có thể nhưng phải đảm bảo tính nhất quán của code khi viết (điều này sẽ đề cập ở phần cuối cùng).

Trường hợp khác của if

Có một dạng viết tắt của lệnh if trông hơi xấu, nhưng cùng đạt được mục đích, mặc dù dạng viết tắt này không cho phép có nhiều câu lệnh cả trong phần if lẫn trong phần else. Dó là dùng toán tử tam nguyên ?:. (Toán tử tam nguyên là toán tử có ba toán hạng). Chúng ta có thể viết lại câu lệnh if đơn giản theo cách sau:

return (steps > 100) ? "I can't walk that far" : "Just took " + steps + " steps.";

Nhược điểm của cách này: Làm cho câu lệnh trở nên khó hiểu và không thể viết được nếu câu lệnh quá nhiều điều kiện để xử lý.

Tôi đi chi tiết vào if để bạn (người mới nhập môn) có thể hiểu được cách dùng một câu lệnh (if), và sau đó khi tìm hiểu về câu lệnh khác: vòng lặp for, while sẽ không bị bỡ ngỡ và tôi cũng không trình bày chi tiết nữa.

Lệnh Switch

Nếu if kiểm tra điều kiện với số nguyên đơn lẻ(điều kiện truyền vào if là số nguyên) thì một câu lệnh khác cũng có thể giải quyết được vấn đề này. Đó là Switch. Như vậy, đây là sự khác nhau giữa if và switch. Switch chỉ xử lý điều kiện là một số nguyên đơn lẻ, nó không kiểm tra điều kiện bằng với một toán tử nào hết, chẳng hạn như ==, >, <,… Ngược lại if có thể làm được điều này. Như vậy switch giống như một câu lệnh chỉ xử lý được tập con cần giải quyết của if.

Sử dụng switch

switch ( integer expression ) {
	case 1:
		 statement(s) 
		[break;]
	case 2:
		 statement(s) 
		[break;]
	case n:
		 statement(s) 
		[break;]
	[default:
		 statement(s) 
		break;]
}

Không cần phân tích nhiều vào cú pháp khai báo switch, chúng ta đi đến một ví dụ điển hình sử dụng câu lệnh switch.

int month = 3;
switch (month) {
	case 1: System.out.println("January"); break;
	case 2: System.out.println("February"); break;
	case 3: System.out.println("March"); break;
	case 4: System.out.println("April"); break;
	case 5: System.out.println("May"); break;
	case 6: System.out.println("June"); break;
	case 7: System.out.println("July"); break;
	case 8: System.out.println("August"); break;
	case 9: System.out.println("September"); break;
	case 10: System.out.println("October"); break;
	case 11: System.out.println("November"); break;
	case 12: System.out.println("December"); break;
	default:  System.out.println("That's not a valid month number."); break;
}

Nhập vào một tháng (month) là tháng 3. Dùng switch kiểm tra và trả về kết quả. Nhắc lại, switch không kiểm tra một biểu thức logic như steps > 100 hay x == 3, chúng chỉ kiểm tra 1 số nguyên đơn lẻ.

Còn một (có thể hơn một) cách xử dụng switch khác, bạn hãy tự tìm hiểu về nó.

 

Phần tiếp theo: Nhập môn ngôn ngữ lập trình Java – Phần 6: Các câu lệnh vòng lặp for, while