Sunday, June 28, 2015

Bài 5 : Cấu trúc Rẽ nhánh (Selection Statements)

OK , chúng ta đã đi qua 4 bài tutorial của Java. Hôm nay mình sẽ giới thiệu cho các bạn về cấu trúc rẽ nhánh trong Java.
Trong chương trình Java các dãy lệnh được bố trí theo một trình tự nhất định nào đó , nhưng đôi muốn điều khiển chương trình thì tùy thuộc vào điều kiện gì đó . Để đưa chương trình thực hiện theo một hướng mà programer muốn thực hiện.
Điều kiện ở đây là gì . Điều kiện là các giá trị đúng/sai (boolean) khi thực hiện một đoạn lệnh , hoặc một câu lệnh nào đó.
I. Kiểu dữ liệu boolean và Toán tử (operations)
  • kiểu dữ liệu boolean chỉ nhận một trong 2 giá trị : true or false
  • Trong Java kiểu dữ liệu boolean không thể chuyển thành kiểu nguyên và ngược lại
  • Giá trị mặc định của kiểu boolean là false
  • Dùng một bit để xác định kiểu dữ liệu này . 0 or 1
  • Ví dụ cách khai báo một biến boolean : boolean lightsOn = true; or boolean isCheck = false;
  • Cách đặt tên biến boolean thông thường là is[...] đây cũng là một điểm lưu ý , nếu các bạn có ý định thi các Certificate của Java
Ta có thể nhận được các kết quả boolean từ việc thực hiện các toán tử
  • Toán tử so sánh Comparison Operator
Operator Name Example Answer
< less than 1 < 2 true
<= less than or equal to 1 <= 2 true
> greater than 1 > 2 false
>= greater than or equal to 1 >= 2 false
== equal to 1 == 2 false
!= not equal to 1 != 2 true

  • Toán tử logic (Logical operators)
Table 1. Boolean Operators
Operator Name Description
! not logical negation
&& and logical conjunction
|| or logical disjunction
^ exclusive or logical exclusion

Table 2. Truth Table for Operator !
p !p Example
true false !(1 > 2) is true, because (1 > 2) is false.
false true !(1 > 0) is false, because (1 > 0) is true.

Table 3. Truth Table for Operator &&

p1 p2 p1 && p2 Example
false false false (2 > 3) && (5 > 5) is false, because either (2 > 3) or (5 > 5) is false.
false true false
true false false (3 > 2) && (5 > 5) is false, because (5 > 5) is false.
true true true (3 > 2) && (5 >= 5) is true, because (3 > 2) and (5 >= 5) are both true.

Table 4. Truth Table for Operator ||

p1 p2 p1 || p2 Example
false false false (2 > 3)||(5 > 5) is false, because (2 > 3) and (5 > 5) are both false.
false true true
true false true (3 > 2)||(5 > 5) is true, because (3 > 2) is true.
true true true

Table 3.6. Truth Table for Operator ^

p1 p2 p1^p2 Example
false false false (2 > 3)^(5 > 5) is true, because (2 > 3) is false and (5 > 1) is true.
false true true
true false true (3 > 2)^(5 > 1) is false, because both (3 > 2) and (5 > 1) are true.
Đây là một ví dụ nhỏ tham khảo về kiểu dữ liệu boolean

import javax.swing.JOptionPane;

public class UseBoolean {

public static void main(String[] args) {

int number1 = (int) (System.currentTimeMillis() % 10);
int number2 = (int) (System.currentTimeMillis() * 7 % 10);
String answerString = JOptionPane.showInputDialog("What is " + number1
+ " + " + number2 + "?");
int answer = Integer.parseInt(answerString);
JOptionPane.showMessageDialog(null, number1 + " + " + number2 + " = "
+ answer + " is " + (number1 + number2 == answer));
}
}

II . Cấu trúc điều khiển IF ... ELSE
Như đã trình bày ở trên . Muốn thực hiện các đoạn lệnh mã lênh mong muốn thì sẽ đưa vào các cấu trúc điều khiển rẽ nhánh . Tương tự các ngôn ngữ khác . Java cũng cung cấp cho chúng ta một công cụ đó là điều kiện rẽ nhánh if... else.
Cú pháp dùng if: (Nếu điều kiện đúng thì mới thực hiện trong dòng lệnh kế tiếp hoặc trong ngoặc)
if (booleanExpression) {
  statement(s);
}
flow chart :
Cú pháp if... else lồng nhau:(Ở đây else sẽ bắt tất cả các trường hợp còn lại mà if không bắt được)
if (booleanExpression) {
  statement(s)-for-the-true-case;
}
else {
  statement(s)-for-the-false-case;
}
flow chart :
Chúng ta có thể thực hiện các dòng lệnh if... else lồng nhau như thế này :
if (i > k) {
  if (j > k)
    System.out.println("i and j are greater than k");
}
else
  System.out.println("i is less than or equal to k");

Hoặc
public static void main(String[] args) {
 int a = 1 ,b = 3;
 if(a > b){
  System.out.println(false);
 }else if (a == b) {
  System.out.println("humm.....");
 }else {
  System.out.println(true);
 }
}
Tuy nhiên theo chuẩn coding convention thì ta không nên viết cấu trúc rẽ nhánh if else quá 3 lần. Vì như vậy sẽ làm cho code bị bẩn , và rối. Và cần phải tìm một phương án khác.

III. Cấu trúc điều khiển switch... case
Cú pháp
switch (status) {
  case 0: compute taxes for single filers;
          break;
  case 1: compute taxes for married file jointly;
          break;
  case 2: compute taxes for married file separately;
          break;
  case 3: compute taxes for head of household;
          break;
  default: System.out.println("Errors: invalid status");
           System.exit(0);
}
trong đó status là kiểu số nguyên , char , byte , short
folow chart
Nếu status trùng với các giá trị nào trong case thì sẽ thực hiện khối lệnh trong khối đó . Kết thúc khối lệnh không gặp câu lệnh break thì sẽ thực hiện case kế tiếp cho tới khi nào gặp lệnh break. Nếu không trùng với case nào sẽ vào default (nếu có).

import java.util.Scanner;
public class DemoSwitch {

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("nhập số cần chọn:");
int a = in.nextInt();
switch (a) {
case 1:
System.out.println("bạn đã chọn 1!");
break;
case 2:
System.out.println("bạn đã chọn 2!");
case 3:
System.out.println("bạn đã chọn 3!");
break;
default:
System.out.println("bạn đã chọn default!");
break;
}
}
}

IV . Các cấu trúc rẽ nhánh khác.
a. if ...else rút gọn.
Khi biểu diễn khối lệnh dạng thế này
if (x > 0)
  y = 1
else
  y = -1;

Ta có thể biểu diễn dưới dạng này
y = (x > 0) ? 1 : -1;
Cú pháp
booleanExpression ? expression1 : expression2;
hoặc
max = (num1 > num2) ? num1 : num2;
Kết quả sẽ trả về là expression1 nếu booleanExpression trả về là true , tất cả các kết quả còn lại trả về expression2
b. Sự ưu tiên trong điều kiện rẽ nhánh.
Trong một điều kiện rẽ nhánh ta có thể thực hiện các phép toán tử . Miễn là kết quả cuối cùng trong dấu () phải là kiểu boolean là được.
Ví dụ 3 + 4 * 4 > 5 * (4 + 3) – 1
thì đó là một biểu thức . Vậy thứ tự ưu tiên thực hiện sẽ là gì
Ví dụ :
public class DemoOtherSeletion {

 public static void main(String[] args) {
  int a = 1 , b = 5;
  if(4*3 + ++a > (a + 3) + b--)
   System.out.println(true);
  else
   System.out.println(false);
 }
}
Các bạn có thể tự debug chương trình này để xem luồng xử lý thế nào . Hoặc có thể xem kết quả nó thế nào tại đây (here)
Sau đây là bài tập để các bạn luyện tập
Bài 1 : Viết chương trình giúp người dùng nhập vào tháng và năm . Và hiển thị ra tháng đó có bao nhiêu ngày . Ví dụ : nhập vào tháng 2 năm 2000 . Hiển thị ra tháng 2 có 29 ngày
Bài 2 : Kiểm tra điều kiện nhập vào 3 cạnh của một tam giác . Tính chu vi , diện tích của tam giác đó . Gợi ý : tổng 2 cạnh không bao giờ lớn hơn cạnh còn lại.
Bài 3 : Viết chương trình nhập vào 3 số . Sắp xếp nó thành một dãy tăng dần . Ví dụ  n1 = 1 , n2 = 3 , n3 = 2. Sắp xếp thành n1 , n3 , n2

English langue
Ex1Write a program that prompts the user to enter the month and year, and displays 
the number of days in the month. For example, if the user entered month 2 and year 2000, the program should display that February 2000 has 29 days. If the user entered month 3 and year 2005, the program should display that March 2005 has 31 days. 
Ex2 :Write a program that reads three edges for a triangle and computes the perimeter 
if the input is valid. Otherwise, display that the input is invalid. The input 
is valid if the sum of any two edges is greater than the third edge
Ex3 :Write a program that sorts three integers. The integers are entered from the 
input dialogs and stored in variables num1, num2, and num3, respectively. The program sorts the numbers so that num1 <= num2 <= num3
Source code tham khảo : here

No comments:

Post a Comment