JavaRush /Blog Java /Random-VI /Phân nhánh trong Java

Phân nhánh trong Java

Xuất bản trong nhóm
Trong bài này chúng ta sẽ xem xét khái niệm phân nhánh trong các chương trình máy tính nói chung và các chương trình được viết bằng Java. Hãy nói về các cấu trúc điều khiển như:
  • if-then(hoặc if)
  • if-then-else(hoặc if-else)
  • switch-case
Phân nhánh trong Java - 1

Phân nhánh

Hãy bắt đầu với những khái niệm cơ bản. Bất kỳ chương trình nào cũng là một tập hợp các lệnh được thực thi bởi máy tính. Thông thường, các lệnh được thực hiện tuần tự, lần lượt từng lệnh một. Các tình huống ít thường xuyên hơn (nhưng vẫn khá thường xuyên) phát sinh khi bạn cần thay đổi luồng lệnh chương trình tuần tự. Đôi khi, tùy thuộc vào những điều kiện nhất định, có thể cần phải thực thi một khối lệnh này thay vì một khối lệnh khác. Và khi những điều kiện này thay đổi, hãy làm ngược lại. Ví dụ: có một số trang web cấm người dưới 18 tuổi truy cập. Thông thường, khi truy cập một tài nguyên như vậy lần đầu tiên, người dùng sẽ được chào đón bằng một số hình thức trong đó người dùng được cảnh báo về giới hạn độ tuổi và được yêu cầu nhập ngày sinh của mình. Sau đó, tùy thuộc vào dữ liệu mà người dùng nhập vào mà có được phép nhập tài nguyên hay không. Chức năng này được cung cấp bởi cái thường được gọi là phân nhánh. Hãy đưa ra một sự tương tự khác. Chúng ta hãy tưởng tượng mình đang ở ngã tư của bảy con đường. Chúng ta phải đối mặt với sự lựa chọn: rẽ trái, rẽ phải hoặc đi thẳng. Sự lựa chọn của chúng tôi dựa trên những điều kiện nhất định. Chúng ta cũng không có cơ hội đi nhiều con đường cùng một lúc. Những thứ kia. tùy theo điều kiện nào đó mà chúng ta sẽ phải chọn một con đường. Nguyên tắc tương tự áp dụng cho việc phân nhánh. Bây giờ chúng ta thử đưa ra định nghĩa về phân nhánh. Phân nhánh là một thiết kế thuật toán, trong đó, tùy thuộc vào tính đúng đắn của một số điều kiện, một trong nhiều chuỗi hành động sẽ được thực hiện. Việc phân nhánh được thực hiện (rất có thể) bằng tất cả các ngôn ngữ lập trình. Ngôn ngữ lập trình Java có một số cái gọi là cấu trúc điều khiển cho phép bạn triển khai phân nhánh trong chương trình của mình. Có 3 cấu trúc như vậy trong ngôn ngữ lập trình:
  • Nhà điều hànhif-then
  • Nhà điều hànhif-then-else
  • Toán tử bậc ba? :
Trong bài này chúng ta sẽ xem xét các toán tử if-elseswitch-case.

nếu-thì

Toán tử if-thenhoặc đơn giản ifcó lẽ là toán tử phổ biến nhất. Cụm từ “có, viết 1 nếu” đã trở nên phổ biến. Toán tử ifcó cấu trúc như sau:
if (bool_condition) {
	statement
}
Trong thiết kế này:
  • bool_conditionlà một biểu thức boolean đánh giá là đúng hoặc sai. Biểu thức này được gọi là một điều kiện.
  • statement— một lệnh (có thể có nhiều hơn một) phải được thực thi nếu điều kiện đúng ( bool_statement==true)
Cấu trúc này có thể được đọc như thế này:

Если (bool_condition), то {statement}
Dưới đây là một số ví dụ:
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
    int a = scanner.nextInt();

    if (a < 10) {
        System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
    }
}
Trong chương trình này, người dùng được yêu cầu nhập phần trăm pin trên điện thoại thông minh của mình. Nếu pin vẫn còn dưới 10 phần trăm, chương trình sẽ cảnh báo người dùng về việc cần phải sạc điện thoại thông minh. Đây là một ví dụ về thiết kế đơn giản nhất if. Điều đáng chú ý là nếu biến `a` lớn hơn hoặc bằng 10 thì sẽ không có gì xảy ra. Chương trình sẽ tiếp tục thực thi mã theo sau tệp if. Cũng lưu ý rằng trong trường hợp này, cấu trúc ifchỉ có một chuỗi hành động để thực thi: in văn bản hoặc không làm gì cả. Đây là một biến thể của việc phân nhánh với một “nhánh”. Điều này đôi khi là cần thiết. Ví dụ: khi chúng ta muốn bảo vệ bản thân khỏi những giá trị không chính xác. Ví dụ: chúng ta không thể tìm ra số chữ cái trong một chuỗi nếu chuỗi đó là null. Ví dụ dưới đây:
public static void main(String[] args) {
    String x = null;
    printStringSize(x);
    printStringSize("Не представляю своей жизни без ветвлений...");
    printStringSize(null);
    printStringSize("Ифы это так захватывающе!");
}

static void printStringSize(String string) {
    if (string != null) {
        System.out.println("Кол-во символов в строке `" + string + "`=" + string.length());
    }
}
Kết quả của việc thực thi phương thức chính, kết quả sau sẽ được xuất ra bàn điều khiển:

Количество символов в строке `Не представляю своей жизни без ветвлений...`=43
Количество символов в строке `Ифы это так захватывающе!`=25
Nhờ kiểm tra điều đó mà string != nullchúng ta đã tránh được lỗi trong chương trình. Và không làm gì trong trường hợp biến stringbằng null.

nếu-thì-khác

Nếu trong trường hợp thông thường, ifchương trình có lựa chọn: “làm gì đó hoặc không làm gì cả”, thì khi if-elsechọn chương trình, nó sẽ trở thành “làm việc này hoặc việc kia”. Tùy chọn “không làm gì” biến mất. Có hai hoặc nhiều biến thể thực thi (hoặc số nhánh) với kiểu phân nhánh này. Hãy xem xét trường hợp khi có hai lựa chọn. Khi đó cấu trúc điều khiển có dạng sau:
if (bool_condition) {
	statement1
} else {
	statement2
}
Đây:
  • bool_statementlà một biểu thức boolean đánh giá là đúng hoặc sai. Biểu thức này được gọi là một điều kiện.
  • statement1— một lệnh (có thể có nhiều hơn một) phải được thực thi nếu điều kiện đúng ( bool_statement==true)
  • statement2— một lệnh (có thể có nhiều hơn một) phải được thực thi nếu điều kiện sai ( bool_statement==false)
Cấu trúc này có thể được đọc như thế này:

Если (bool_condition), то {statement1}
Иначе {statement2}
Đây là một ví dụ:
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
    int a = scanner.nextInt();

    if (a < 10) {
        System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
    } else {
        System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
    }
}
Ví dụ tương tự về mức pin trên điện thoại thông minh. Chỉ khi lần trước chương trình chỉ cảnh báo về việc cần sạc điện thoại thông minh thì lần này chúng ta mới có thêm thông báo. Chúng ta hãy nhìn vào cái này if:
if (a < 10) {
    System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
} else {
    System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
}
Nếu a < 10đúng (mức pin dưới 10), chương trình sẽ in một văn bản. a < 10Ngược lại, nếu không đáp ứng điều kiện , chương trình sẽ xuất ra văn bản hoàn toàn khác. Chúng ta cũng hãy hoàn thiện ví dụ thứ hai, trong đó chúng ta hiển thị số lượng chữ cái trong một dòng. Lần trước chương trình không xuất ra bất cứ thứ gì nếu chuỗi được truyền bằng null. Hãy khắc phục điều này bằng cách biến cái bình thường ifthành if-else:
public static void main(String[] args) {
    String x = null;
    printStringSize(x);
    printStringSize("Не представляю своей жизни без ветвлений...");
    printStringSize(null);
    printStringSize("Ифы это так захватывающе!");
}

static void printStringSize(String string) {
    if (string != null) {
        System.out.println("Кол-во символов в строке `" + string + "`=" + string.length());
    } else {
        System.out.println("Ошибка! Переданная строка равна null!");
    }
}
Trong phương pháp này , chúng tôi đã thêm một khối printStringSizevào công trình . Bây giờ, nếu chúng ta chạy chương trình, nó sẽ xuất ra bảng điều khiển không phải 2 dòng mà là 4 dòng, mặc dù đầu vào (phương thức ) vẫn giữ nguyên như lần trước. Văn bản mà chương trình sẽ xuất ra: ifelsemain

Ошибка! Переданная строка равна null!
Кол-во символов в строке `Не представляю своей жизни без ветвлений...`=43
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Ифы это так захватывающе!`=25
Các tình huống có thể chấp nhận được khi elsechúng được theo sau không phải bởi các lệnh thực thi mà bởi một lệnh khác if. Khi đó việc xây dựng có dạng sau:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
} else {
	statementN+1
}
Thiết kế này có một số điều kiện:
  • bool_condition1
  • bool_condition2
  • bool_conditionN
Số lượng các điều kiện như vậy là không giới hạn. Mỗi điều kiện có các lệnh riêng:
  • tuyên bố 1
  • tuyên bố2
  • tuyên bốN
Mỗi cái statementcó thể chứa 1 hoặc nhiều dòng mã. Các điều kiện được kiểm tra từng cái một. Khi điều kiện đúng đầu tiên được xác định, một loạt lệnh “gắn” với điều kiện đúng sẽ được thực thi. Sau khi thực hiện các lệnh này, chương trình sẽ thoát khỏi khối if, ngay cả khi phía trước có nhiều bước kiểm tra hơn. Biểu thức “câu lệnhN+1” sẽ được thực thi nếu không có điều kiện nào được xác định ở trên là đúng. Cấu trúc này có thể được đọc như thế này:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Иначе {statementN+1}
Dòng cuối cùng trong trường hợp này là tùy chọn. Bạn có thể làm mà không có người cô đơn cuối cùng else. Và sau đó thiết kế sẽ có dạng sau:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
}
Và nó sẽ đọc như thế này:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Theo đó, nếu không có điều kiện nào đúng thì sẽ không có một lệnh nào được thực thi. Hãy chuyển sang các ví dụ. Hãy quay lại tình huống với mức sạc trên điện thoại thông minh. Hãy viết một chương trình sẽ thông báo chi tiết hơn cho chủ sở hữu về mức sạc của thiết bị của anh ấy:
public static void main(String[] args) {
    String alert5 = "Я скоро отключусь, но помни меня бодрым";
    String alert10 = "Я так скучаю по напряжению в моих жилах";
    String alert20 = "Пора вспоминать, где лежит зарядка";
    String alert30 = "Псс, пришло время экономить";
    String alert50 = "Хм, больше половины израсходовали";
    String alert75 = "Всё в порядке, заряда больше половины";
    String alert100 = "Я готов к приключениям, если что..";
    String illegalValue = "Такс, кто-то ввел некорректное meaning";

    Scanner scanner = new Scanner(System.in);
    System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
    int a = scanner.nextInt();

    if (a <= 0 || a > 100) {
        System.out.println(illegalValue);
    } else if (a < 5) {
        System.out.println(alert5);
    } else if (a < 10) {
        System.out.println(alert10);
    } else if (a < 20) {
        System.out.println(alert20);
    } else if (a < 30) {
        System.out.println(alert30);
    } else if (a < 50) {
        System.out.println(alert50);
    } else if (a < 75) {
        System.out.println(alert75);
    } else if (a <= 100) {
        System.out.println(alert100);
    }
}
Ví dụ: trong trường hợp này, nếu người dùng nhập 15, chương trình sẽ hiển thị trên màn hình: “Đã đến lúc phải nhớ bộ sạc ở đâu”. Mặc dù thực tế là 15 nhỏ hơn và 30 và 50 và 75 và 100, đầu ra trên màn hình sẽ chỉ là 1. Hãy viết một ứng dụng khác sẽ in ra bảng điều khiển hôm đó là ngày nào trong tuần:
public static void main(String[] args) {
    // Определим текущий день недели
    DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

    if (dayOfWeek == DayOfWeek.SUNDAY) {
        System.out.println("Сегодня воскресенье");
    } else if (dayOfWeek == DayOfWeek.MONDAY) {
        System.out.println("Сегодня понедельник");
    } else if (dayOfWeek == DayOfWeek.TUESDAY) {
        System.out.println("Сегодня вторник");
    } else if (dayOfWeek == DayOfWeek.WEDNESDAY) {
        System.out.println("Сегодня среда");
    } else if (dayOfWeek == DayOfWeek.THURSDAY) {
        System.out.println("Сегодня четверг");
    } else if (dayOfWeek == DayOfWeek.FRIDAY) {
        System.out.println("Сегодня пятница");
    } else if (dayOfWeek == DayOfWeek.SATURDAY) {
        System.out.println("Сегодня суббота");
    }
}
Tất nhiên, điều đó rất tiện lợi, nhưng lượng văn bản đơn điệu quá nhiều sẽ khiến bạn lóa mắt một chút. Trong trường hợp chúng ta có nhiều tùy chọn, tốt hơn nên sử dụng toán tử, điều này sẽ được thảo luận bên dưới.

hộp đựng công tắc

Một cách thay thế cho kiểu in đậm ifvới nhiều nhánh là toán tử switch-case. Toán tử này dường như muốn nói “Vì vậy, chúng ta có biến này. Hãy nhìn xem, nếu giá trị của nó bằng `x`, thì chúng ta làm điều này và điều kia, nếu giá trị của nó bằng `y`, thì chúng ta làm khác đi, và nếu nó không bằng bất kỳ điều nào ở trên, chúng ta chỉ làm nó như thế này…” Toán tử này có cấu trúc như sau.
switch (argument) {
	case value1:
		statement1;
		break;
	case value2:
		statement2;
		break;
	case valueN:
		statementN;
		break;
	default:
		default_statement;
		break;
}
Chúng ta hãy xem xét cấu trúc này chi tiết hơn. argument là một biến có giá trị mà chúng ta sẽ so sánh với các tùy chọn giả định khác nhau. Biến phải là final. Cũng cần phải nói rằng toán tử switchkhông hỗ trợ bất kỳ kiểu dữ liệu nào làm đối số. Các loại hợp lệ được liệt kê dưới đây:
  • byte và byte
  • ngắn và ngắn
  • int và số nguyên
  • char và nhân vật
  • liệt kê
  • Sợi dây
case value1 (value2, valueN)- đây là những giá trị, những hằng số cụ thể mà chúng ta dùng để so sánh giá trị của một biến argument. Ngoài ra, mỗi trường hợp xác định một tập hợp các lệnh cần được thực thi. statement1, statement2, statementNlà các lệnh sẽ cần được thực thi nếu argumentnó bằng một trong value. Ví dụ: nếu argumentnó bằng value2, thì chương trình sẽ thực thi statement2. defaultdefault_statementlà “giá trị mặc định”. Nếu argumentnó không bằng bất kỳ cái nào được trình bày valuethì nhánh sẽ được kích hoạt defaultvà lệnh sẽ được thực thi default_statement. defaultdefault_statementlà các thuộc tính tùy chọn của toán tử switch-case. break— bạn có thể nhận thấy rằng ở cuối mỗi khối trường hợp có một câu lệnh break. Toán tử này cũng là tùy chọn và dùng để phân biệt mã của các trường hợp khác nhau. Đôi khi cần phải thực hiện các hành động tương tự trong các trường hợp khác nhau: khi đó những trường hợp này có thể được kết hợp lại. Trong trường hợp này, từ khóa breakbị bỏ qua và cấu trúc của toán tử switch-casesẽ như sau:
switch (argument) {
	case value1:
		statement1;
		break;
	case valueX:
	case valueY:
		statementXY;
		break;
}
Điều đáng chú ý là không có toán tử nào giữa `case valueX:` và `case valueY:` break. Ở đây, nếu argumentnó bằng value1, nó sẽ được thực thi statement1. Và nếu đối số valueXbằng một trong hai valueY, statementXY. Hãy biến lý thuyết khó hiểu thành thực hành dễ hiểu. Hãy viết lại ví dụ về ngày trong tuần bằng cách sử dụng toán tử switch-case.
public static void main(String[] args) {
    // Определим текущий день недели
    DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

    switch (dayOfWeek) {
        case SUNDAY:
            System.out.println("Сегодня воскресенье");
            break;
        case MONDAY:
            System.out.println("Сегодня понедельник");
            break;
        case TUESDAY:
            System.out.println("Сегодня вторник");
            break;
        case WEDNESDAY:
            System.out.println("Сегодня среда");
            break;
        case THURSDAY:
            System.out.println("Сегодня четверг");
            break;
        case FRIDAY:
            System.out.println("Сегодня пятница");
            break;
        case SATURDAY:
            System.out.println("Сегодня суббота");
            break;
    }
}
Bây giờ hãy viết một chương trình hiển thị hôm nay là ngày trong tuần hay cuối tuần bằng cách sử dụng toán tử switch-case.
public static void main(String[] args) {
    // Определим текущий день недели
    DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

    switch (dayOfWeek) {
        case SUNDAY:
        case SATURDAY:
            System.out.println("Сегодня выходной");
            break;
        case FRIDAY:
            System.out.println("Завтра выходной");
            break;
        default:
            System.out.println("Сегодня рабочий день");
            break;

    }
}
Hãy để tôi giải thích một chút. Trong chương trình này enum DayOfWeek, chúng tôi nhận được , biểu thị ngày hiện tại trong tuần. Tiếp theo, chúng tôi xem liệu giá trị của biến của chúng tôi có bằng dayOfWeekgiá trị của SUNDAYmột trong hai hay không SATURDAY. Nếu đúng như vậy, chương trình sẽ hiển thị “Hôm nay là ngày nghỉ”. Nếu không thì chúng ta kiểm tra xem giá trị của biến có bằng dayOfWeekgiá trị của FRIDAY. Nếu đúng như vậy, chương trình sẽ hiển thị “Ngày mai là ngày nghỉ”. Nếu trường hợp này không có thì chúng ta có ít lựa chọn, ngày còn lại là ngày trong tuần nên mặc định nếu hôm nay KHÔNG phải thứ sáu, KHÔNG phải thứ bảy và KHÔNG phải Chủ nhật thì chương trình sẽ hiển thị “Hôm nay là ngày làm việc”.

Phần kết luận

Vì vậy, trong bài viết này chúng ta đã xem xét phân nhánh trong một chương trình máy tính là gì. Chúng tôi cũng đã tìm ra cấu trúc điều khiển nào được sử dụng để triển khai phân nhánh trong Java. Chúng tôi đã thảo luận về các thiết kế như:
  • if-then
  • if-then-else
  • switch-case
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION