Welcome to MikeDaDev's Blog – notes on Java, backend & system design.

Explore
MikeDaDev's Blog
in java

hàm và câu lệnh điều kiện trong java

Tung Bui Thanh (TungDaDev)13 mins read

Java basic if else.webp

Helluuuuuu eveerybody, lại là mình tungdadev đây. Bài này mình tìm hiểu các câu lệnh rẽ nhánh (hay câu lệnh điều kiện) trong Java, để bắt chương trình chạy theo hướng mình muốn. Vào bài luôn nhé.

# câu lệnh rẽ nhánh

# if

Các bạn nhìn qua ví dụ này:

 public static void main(String[] args){
    // khai bao so nguyen
    int a = 10;
 
    // Kiểm tra xem a có bằng 9 không
    if(a == 9){
        // nếu bằng 9, in ra màn hình "Hello"
        System.out.println("Hello");
    }
    // Kiểm tra xem a có bằng 9 không
    if(a == 10){
        // nếu bằng 10, in ra màn hình "World"
        System.out.println("World");
    }
 
// Kết quả trên màn hình:
// World
}

Chạy ví dụ trên thì màn hình chỉ in ra chữ World. Lý do thì chắc bạn đoán được rồi 😗 Cái mình muốn bạn để ý là dấu ==. Sao lại == 🤔 mà không phải =?

Chuyện là thế này: if là câu lệnh điều kiện, nó nhận vào một điều kiện true hoặc false. Cú pháp như sau:

if ([điều kiện]){
    // Thực hiện đoạn code nếu [điều kiện] là `true`. Nếu `false` bỏ qua đi xuống dưới.
}
// Tiếp tục thực hiện đoạn code phía dưới

Giờ mà bạn viết if(a = 5) như trong sách giáo khoa toán thì nhận về kết cục cay đắng 😢, vì ở Bài #2 mình có nói dấu = là phép gán. Tức là gán a bằng 5, chứ không phải so sánh a với 5 để trả về true hay false. Với a kiểu int, Java còn không cho chạy luôn: trình biên dịch báo lỗi incompatible types: int cannot be converted to boolean, vì if chỉ nhận boolean. (Bên C/C++ thì câu này vẫn chạy, và đó là nguồn của biết bao bug.)

Vậy nên muốn so sánh thì bạn dùng mấy toán tử quan hệ dưới đây:

  • ==: Kiểm tra 2 toán hạng có bằng nhau không? (if(a==b))
  • !=: Kiểm tra 2 toán hạng có khác nhau không? (if(a!=b))
  • >: Kiểm tra toán hạng A có lớn hơn B không? (if(a>b))
  • <: Kiểm tra toán hạng A có nhỏ hơn B không? (if(a<b))
  • >=: Kiểm tra toán hạng A có lớn hơn hoặc bằng B không? (if(a>=b))
  • <=: Kiểm tra toán hạng A có nhỏ hơn hoặc bằng B không? (if(a<=b))

Lưu ý nhỏ: mấy toán tử này dùng cho số (và char). Còn so sánh nội dung hai chuỗi String thì dùng a.equals(b), vì == với String chỉ so xem hai biến có trỏ cùng một object không. Chuyện này để bài sau nói kỹ.

Mấy toán tử quan hệ trên chạy xong đều trả về kiểu boolean, nên bạn gán thẳng vào một biến cũng được, như lày:

int a = 5;
int b = 6;
 
boolean result = a == b; // false
 
System.out.println("Result: " + result);
 
// Kết quả in ra trên màn hình:
// "Result: false"
 
if(result){ // viết tắt của if(result == true)
    System.out.println("Result is true");
}

Tới đây thì thấy rồi: if thực chất chỉ nhận vào một giá trị boolean.

# else

Tiếp theo là dạng đầy đủ của if: cấu trúc if else.

if ([điều kiện]){
    // Thực hiện đoạn code nếu [điều kiện] là `true`.
}else{
    // Thực hiện đoạn code trong này nếu [điều kiện] là `false`
}
//Các đoạn code ở dưới thực hiện bình thường sau khi if hoặc else diễn ra

Ví dụ:

int a = 5;
if ( (a + 2) == 7 ){
    System.out.println("Bằng 7");
    // Sử dụng biến `a` ở ngay trong scope {} của `if`, như bài #2 mình có nói, biến được sử dụng trong các scope con hoặc bằng cấp
    System.out.println("Giá trị lúc này của a = " + a);
}else{
    System.out.println("Khác 7");
    System.out.println("Giá trị lúc này của a = " + a);
    int b = 7; // Tạo ra 1 biến b trong else
}
 
b = 50; // Lỗi, không biết b là gì, vì b ở scope nhỏ hơn, bên ngoài không hiểu.

Ví dụ trên vừa cho bạn thấy cách dùng if else, vừa ôn lại kiến thức của Bài #2 luôn.

# toán tử logic

Toán tử logic dùng để ghép nhiều [điều kiện] lại với nhau.

Ví dụ mình nói: "Nếu ab = 3 VÀ ac = 4 VÀ bc = 5 thì abc là tam giác vuông"

Thì viết code thế nào?

Cách 1: dùng if bình thường.

int ab = 3;
int ac = 4;
int bc = 5;
 
if(ab == 3){
    if(ac == 4){
        if(bc == 5){
            System.out.println("abc là tam giác cực vuông");
        }
    }
}

Ohhh loooo, my eyes 😱 mình đang nhìn cái rì thế này. Chương trình mà có vài trăm điều kiện thì chắc chết.

Cách 2: dùng if với toán tử logic

int ab = 3;
int ac = 4;
int bc = 5;
 
// Nếu ab = 3 VÀ ac = 4 VÀ bc = 5
if(ab == 3 && ac == 4 && bc==5){
    // thì abc là tam giác vuông
    System.out.println("abc là tam giác cực vuông");
}

Rất gì và này nọ phải không :))) miệng đọc sao thì code viết y xì vậy, quá hay. 😱😜

Nhìn ví dụ chắc bạn cũng đoán ra && là toán tử logic cho AND. Tổng cộng có mấy loại toán tử logic sau:

  • &&: AND
  • ||: OR
  • !: NOT

Toán tử logic lấy các biểu thức boolean rồi cho ra một giá trị boolean mới.

Một tính chất hay dùng: && và || là toán tử ngắn mạch (short-circuit). Với A && B, nếu A đã false thì Java không thèm tính B nữa, vì kết quả chắc chắn false. Tương tự A || B dừng ngay khi A là true. Nhờ vậy viết được kiểu if (b != 0 && a / b > 2) mà không sợ lỗi chia cho 0.

# phép and (&&)

Phép && chạy theo nguyên tắc chỉ cần 1 cái sai là tất cả đều sai, hay nói cách khác phải đúng hết mới là đúng.

Nếu "A đúng và B đúng và C sai thì kết quả vẫn là sai"

// Bạn chạy thử xem nó đi vào phần nào nhé
if(true && true && true && false){
    System.out.println("true");
}else{
    System.out.println("false");
}

# phép or (||)

Phép || thì dễ dãi hơn nhiều: chỉ cần 1 cái đúng là đủ.

// Bạn chạy thử xem nó đi vào phần nào nhé
if(false || false || true || false){
    System.out.println("true");
}else{
    System.out.println("false");
}

# phép not (!)

Phép ! lật ngược giá trị của biểu thức: đang true thì thành false, và ngược lại.

int a = 7;
if(!(a == 7)){ // (a==7) => true gặp thằng ! lại bị chuyển thành false. => vào vế else
    System.out.println("Đáng nhẽ ra nên vào đây");
}else{
    System.out.println("But nope, nó lại vào đây");
}

# hàm (function)

# giới thiệu

Nhìn ví dụ này nhé:

int a = 5 + 6;
System.out.println("In a ra màn hình: " + a);
 
a = 1 + 6;
System.out.println("In a ra màn hình: " + a);
 
a = 2 + 6;
System.out.println("In a ra màn hình: " + a);

Đây là chương trình tính tổng 2 số rồi in ra màn hình. Mình chưa học nhập xuất trong Java nên tạm fix cứng số trong code để làm ví dụ.

Bạn thấy đó, mình phải viết a = xx + yy 3 lần và System.out.println("In a ra màn hình: " + a); cũng 3 lần. Một việc mà cứ phải viết đi viết lại thì vừa mệt vừa dễ sai. Để khỏi phải lặp code như vậy, mình có khái niệm Hàm (Function).

Xem ví dụ trước, mình giải thích sau:

public class Calculation {
    public static void main(String[] args){
        f(5,6);
        f(2,3);
        f(1,10);
    }
 
    public static void f(int x, int y){
        int a = x + y;
        System.out.println("In a ra màn hình: " + a);
    }
}
// Kết quả khi chạy:
 
// In a ra màn hình: 11
// In a ra màn hình: 5
// In a ra màn hình: 11

Nhìn ví dụ là nhớ ngay hàm f(x) hồi học toán cấp 2. Đó là cách các nhà toán học ký hiệu một hàm số, sau đó chỉ cần thay x vào là được: hàm thì vẫn vậy, chỉ có tham số đầu vào thay đổi. Dùng hàm trong code cũng đúng tinh thần đó: viết một lần, gọi nhiều lần, gói gọn một chức năng vào một chỗ.

# cách khai báo

Khai báo một phương thức như sau:

[kiểu_truy_cập] [kiểu_trả_về] [tên_phương_thức] ([danh_sách_tham_số]){}

ví dụ:

public static void f(int x, int y){
 //Code của bạn
}
 
public static void main(String[] args){
 
}

Hàm được khai báo bên ngoài main(). Tới đây chắc bạn cũng hiểu main() cũng là một hàm (function), chỉ đặc biệt ở chỗ cú pháp của nó cố định và Java sẽ tìm tới nó để chạy đầu tiên.

1 - [kiểu_truy_cập]:

Trong ví dụ trên là phần public static. Nói cho đúng thì chỉ public là kiểu truy cập: nó quy định hàm được gọi từ những đâu (public là ở đâu cũng gọi được). Còn static nghĩa là hàm thuộc về class, gọi thẳng được mà không cần tạo object; main() là hàm static nên chỉ gọi thẳng được các hàm static khác. Phần này để các bài sau nói kỹ, giờ bạn cứ mặc định ghi public static trước mỗi hàm là dùng được. Tiện nói luôn: trong Java, hàm nằm trong class nên thường được gọi là phương thức (method), hai từ này bạn gặp ở đâu cũng hiểu là một.

2 - [kiểu_trả_về]:

Là phần void ở ví dụ trên. Kiểu trả về là kiểu của giá trị mình nhận lại sau khi gọi hàm.

Nhớ lại toán: đưa x vào f(x) thì nhận lại y. Hàm trong code cũng vậy, có thể trả lại một giá trị nào đó. Ví dụ:

// [kiểu trả về]: int
public static int tong(int x, int y){
    int t = x + y; // Tính tổng 2 số x, y
    return t; // trả số đó ra sử dụng câu lệnh `return {biến}`
}
 
public static void main(String[] args){
    int t = tong(5,6); // Lấy giá trị trả ra, gán nó vào t;
}

Mình định nghĩa hàm tính tổng tong(x,y), nhận vào 2 số nguyên và trả ra một số int.

Các kiểu trả về:

  • primitive: int, boolean, char, ...
  • Object: String, (còn rất nhiều, sẽ học ở bài tiếp theo)
  • void: Không trả về gì cả

Ở ví dụ đầu tiên mình dùng void để định nghĩa hàm.

public static void f(int x, int y){
    int a = x + y;
    System.out.println("In a ra màn hình: " + a);
}

Nghĩa là hàm này làm trọn việc của nó bên trong, không cần trả gì ra ngoài. Tính tổng xong in luôn ra màn hình, vậy thôi.

3 - [danh_sách_tham_số]

Tham số đầu vào là những thứ mình đưa vào hàm, mỗi tham số khai báo gồm [kiểu_dữ_liệu] [tên_biến]. Muốn truyền nhiều tham số vào hàm thì đặt dấu phẩy , giữa các tham số.

public static int f(int x, int y, int z, ... ){
    // code
}

Lưu ý phần [tên_biến] bạn đặt tên gì cũng được. Chẳng hạn:

// Hàm nhận vào 2 biến `x`, `y` và trả ra kết quả `boolean` xem nó có bằng nhau hay không
public static boolean bangnhau(int x, int y){
    return x == y;
}
 
public static void main(String[] args){
    int a = 5; // tên biến là `a`
    int b = 6; // tên biến là `b`
 
    boolean ketqua = bangnhau(a,b); // đưa `a` , `b` vào hàm.
    // bản chất khi gọi hàm `bangnhau`:
    // int x = a;
    // int y = b;
    // return x == y;
    //
    System.out.println("Kết quả: " + ketqua);
}

Bạn khai báo tham số đầu vào là x và y thì hai biến đó chỉ dùng được trong hàm, và giá trị truyền vào sẽ được gán cho x và y.

# thực hành

Giờ áp dụng những gì vừa học để viết một chương trình nho nhỏ:

Cho 3 số nguyên a, b, c là 3 cạnh AB, AC, BC của tam giác ABC. Kiểm tra ABC có phải tam giác không? Nếu phải thì là tam giác gì?

Nhắc lại: mình chưa học nhập xuất dữ liệu trong Java nên cứ gán giá trị thẳng trong code rồi chạy thử.

public class Calculation {
    public static void main(String[] args) {
        int a = 5, b = 5, c = 5; // trường hợp tam giác đều
        // Các bạn tự thay số vào để kiểm tra nhé.
 
        if (laTamgiac(a,b,c)){
            System.out.println("Là tam giác!");
            if(laTamgiacDeu(a,b,c)){
                System.out.println("Và còn đều nữa!");
                // Là tam giác đều thì không cần kiểm tra điều kiện còn lại nữa.
            }else {
                if (laTamgiacVuong(a, b, c)) {
                    System.out.println("Và còn vuông nữa!");
                    // Không thể xảy ra vuông cân. Vì chúng ta đầu vào chỉ là số nguyên.
                    // Còn muốn đầy đủ, bạn phải kiểm tra trường hợp vừa vuông vừa cân nữa.
                }
                if (laTamgiacCan(a, b, c)) {
                    System.out.println("Và còn cân nữa!");
                }
            }
        }else{
            System.out.println("Không phải là tam giác!");
        }
    }
 
    public static boolean laTamgiac(int a, int b, int c) {
        if ((a + b) > c && (a + c) > b && (b + c) > a) {
            // Tam giác: tổng 2 cạnh phải lớn hơn cạnh còn lại
            return true;
        } else {
            return false;
        }
    }
 
    public static boolean laTamgiacVuong(int a, int b, int c){
        if ((a*a + b*b) == c*c || (a*a + c*c) == b*b || (b*b + c*c) == a*a) {
            // Là tam giác vuông nếu có 1 trong các điều kiện thoả mãn Pythagore.
            return true;
        } else {
            return false;
        }
    }
 
    public static boolean laTamgiacCan(int a, int b, int c){
        if (a == b || b == c || c == a) {
            return true;
        }else{
            return false;
        }
    }
 
    public static boolean laTamgiacDeu(int a, int b, int c){
        if (a == b && b == c) {
            return true;
        }else{
            return false;
        }
    }
}

Mới học tới bài 3 mà đã viết được ứng dụng ra gì phết rồi đây hố hố 😂 Có điều vẫn còn chỗ chưa ổn: a,b,c đang fix cứng trong code thay vì nhập từ bàn phím. Yên tâm, bài sau mình học phần này rồi bổ sung vào bài tập này luôn nhé.

Chúc các bạn học tốt, nhớ chia sẻ cho bạn bè nha :3

Chỉ là những ghi chép cá nhân với hy vọng mang lại chút giá trị. Nếu thấy hữu ích, đừng ngại chia sẻ cho bạn bè & đồng nghiệp nhé!

Happy coding 😎 👍🏻 🚀 🔥.