JavaRush /Java блог /Random UA /Розгалуження в Java

Розгалуження в Java

Стаття з групи Random UA
У цій статті ми розглянемо таке поняття як розгалуження в комп'ютерних програмах і написаних на ЯП Java. Поговоримо про такі керуючі конструкції, як:
  • if-then(або ж if)
  • if-then-else(або ж if-else)
  • switch-case
Розгалуження в Java - 1

Розгалуження

Почнемо із базових понять. Будь-яка програма є набором команд, що виконуються комп'ютером. Найчастіше команди виконуються послідовно, один за одним. Трохи рідше (але досі часто) виникають ситуації, коли потрібно змінити послідовний хід виконання команд програми. Іноді, залежно від деяких умов, необхідно виконувати один блок команд замість іншого. А коли ці умови змінюються, чинити навпаки. Наприклад, є низка сайтів, відвідування яких заборонено особам, які не досягли віку 18 років. Зазвичай при першому відвідуванні такого ресурсу користувача зустрічає деяка форма, в якій користувача попереджають про вікове обмеження і просять ввести дату його народження. Тоді, залежно від даних, які ввів користувач, йому дозволять увійти на ресурс, або ні. Такий функціонал забезпечується тим, що прийнято називати розгалуженням. Наведемо ще одну аналогію. Уявімо себе на перехресті семи доріг. Перед нами стоїть вибір: повернути ліворуч або праворуч, або ж піти прямо. Наш вибір спирається на певні умови. Також ми не маємо можливості йти кількома дорогами одночасно. Тобто. Залежно від деяких умов нам доведеться вибрати одну дорогу. Такий самий принцип і з розгалуженням. Тепер спробуємо навести визначення розгалуження. Розгалуження - це алгоритмічна конструкція, в якій в залежності від істинності деякої умови, виконується одна з кількох послідовностей дій. Розгалуження реалізовано (швидше за все) абсолютно у всіх мовах програмування. У мові програмування Java є кілька так званих керуючих конструкцій, завдяки яким можна реалізувати розгалуження у своїй програмі. Таких конструкцій у мові програмування 3:
  • Операторif-then
  • Операторif-then-else
  • Тернарний оператор? :
У цій статті ми розглянемо оператори if-elseта switch-case.

if-then

Оператор if-then, або просто мабуть ifнайпоширеніший оператор. Вираз “так там 1 if написати” вже став крилатим. Оператор ifмає таку конструкцію:
if (bool_condition) {
	statement
}
У цій конструкції:
  • bool_condition- boolean вираз, результатом якого є true або false. Цей вираз називають умовою.
  • statement— команда (може бути не одна), яку необхідно виконати, якщо умова істинна ( bool_statement==true)
Дану конструкцію можна прочитати так:

Если (bool_condition), то {statement}
Наведемо приклади:
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 процентов, подключите ваш смартфон к зарядному устройству");
    }
}
У цій програмі користувачеві пропонується ввести кількість відсотків заряду акумулятора на його смартфоні. Якщо залишилося менше 10 відсотків заряду, програма попередить користувача про необхідність зарядити смартфон. Це приклад найпростішої конструкції if. Якщо змінна `а` буде більше або дорівнює 10, то нічого не станеться. Програма продовжить виконувати код, який слідує за конструкцією if. Також зауважимо, що в даному випадку, конструкція ifмає лише одну послідовність дій для виконання: надрукувати текст, або не робити нічого. Ця варіація розгалуження з однією "гілкою". Таке часом буває необхідним. Наприклад, коли ми хочемо убезпечити себе від неправильних значень. Наприклад, ми не можемо дізнатися кількість букв у рядку, якщо рядок дорівнюєnull. Приклади нижче:
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());
    }
}
В результаті виконання методу main у консоль буде виведено:

Количество символов в строке `Не представляю своей жизни без ветвлений...`=43
Количество символов в строке `Ифы это так захватывающе!`=25
Завдяки перевірці на те, що string != nullнам вдалося уникнути помилок у програмі. І не робити нічого в тих випадках, коли змінна stringдорівнювала null.

if-then-else

Якщо при звичайному ifу програми є вибір: "зробити щось, або не робити нічого", то при if-elseвиборі програми зводиться тому, щоб "зробити або одне або інше". Варіант "не робити нічого" відпадає. Варіантів виконання (або кількість гілок) за такого виду розгалуження буває від двох і більше. Розглянемо випадок, коли варіанти два. Тоді керуюча конструкція має такий вигляд:
if (bool_condition) {
	statement1
} else {
	statement2
}
Тут:
  • bool_statement- boolean вираз, результатом якого є true або false. Цей вираз називають умовою.
  • statement1- команда (може бути не одна), яку необхідно виконати, якщо умова істинна ( bool_statement==true)
  • statement2- команда (може бути не одна), яку необхідно виконати, якщо умова хибна ( bool_statement==false)
Дану конструкцію можна прочитати так:

Если (bool_condition), то {statement1}
Иначе {statement2}
Наведемо приклад:
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");
    }
}
Той самий приклад про рівень заряду батареї на смартфоні. Тільки якщо минулого разу програма тільки попереджала про необхідність зарядити смартфон, то цього разу у нас з'являється додаткове повідомлення. Розберемо цей if:
if (a < 10) {
    System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
} else {
    System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
}
Якщо a < 10істинно (рівень заряду батареї менший за 10), програма виведе на друк один текст. Інакше якщо умова a < 10не виконується, то програма виведе вже зовсім інший текст. Доопрацюємо також і другий наш приклад, у якому ми виводабо на екран кількість літер у рядку. Минулого разу програма не виводила нічого, якщо переданий рядок дорівнював null. Виправимо це, перетворивши звичайний ifна 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!");
    }
}
У методі printStringSizeв конструкцію ifми додали блок else. Тепер, якщо ми запустимо програму, вона виведе в консоль вже не 2 рядки, а 4, хоча вступні (метод main) залишабося такими ж, як і минулого разу. Текст, який виведе програма:

Ошибка! Переданная строка равна null!
Кол-во символов в строке `Не представляю своей жизни без ветвлений...`=43
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Ифы это так захватывающе!`=25
Допустимі ситуації, коли після elseйдуть не команди на виконання, а ще один if. Тоді конструкція набуває наступного вигляду:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
} else {
	statementN+1
}
У цій конструкції є кілька умов:
  • bool_condition1
  • bool_condition2
  • bool_conditionN
Кількість таких умов не обмежена. До кожної умови "прив'язані" свої команди:
  • statement1
  • statement2
  • statementN
Кожен такий statementможе містити 1 або більше рядків коду. Умови перевіряються одна за одною. Як тільки визначиться перша справжня умова, буде виконано низку команд, "прив'язаних" до справжньої умови. Після виконання цих команд програма вийде з блоку ifнавіть якщо попереду були ще перевірки. Вираз “statementN+1” буде виконано у разі, якщо жодна з певних умов не виявиться істинним. Дану конструкцію можна прочитати так:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Иначе {statementN+1}
Останній рядок у разі опціональна. Можна обійтися і без останнього самотнього else. І тоді конструкція набуде наступного вигляду:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
}
І читатиметься так:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Відповідно, якщо жодна з умов не виявиться істинною, то жодна команда не буде виконана. Перейдемо до прикладів. Повернемося до ситуації із рівнем заряду на смартфоні. Напишемо програму, яка детальніше інформуватиме власника про рівень заряду його девайсу:
public static void main(String[] args) {
    String alert5 = "Я скоро отключусь, но помни меня бодрым";
    String alert10 = "Я так скучаю по напряжению в моих жилах";
    String alert20 = "Пора вспоминать, где лежит зарядка";
    String alert30 = "Псс, пришло время экономить";
    String alert50 = "Хм, больше половины израсходовали";
    String alert75 = "Всё в порядке, заряда больше половины";
    String alert100 = "Я готов к приключениям, если что..";
    String illegalValue = "Такс, кто-то ввел некорректное значення";

    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);
    }
}
Наприклад у разі, якщо користувач введе 15, то програма виведе на екран: “Пора згадувати, де лежить зарядка”. Незважаючи на те, що 15 менше і 30 і 50 і 75 і 100, виведення на екран буде лише 1. Напишемо ще один додаток, який друкуватиме в консоль, який сьогодні день тижня:
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("Сегодня суббота");
    }
}
Зручно звичайно, але в очах трохи рябить від великої кількості одноманітного тексту. У ситуаціях, коли ми маємо велику кількість варіантів краще використовувати оператор, про який піде нижче.

switch-case

Альтернативою жирним ifз великою кількістю гілок служить оператор switch-case. Даний оператор каже “Так, у нас є ось така змінна. Дивіться, якщо її значення дорівнює `x`, то робимо те й те, якщо її значення одно `y`, то робимо по-іншому, а якщо нічому не одно з вищепереліченого, просто робимо ось так ... ” Даний оператор має наступну структуру.
switch (argument) {
	case value1:
		statement1;
		break;
	case value2:
		statement2;
		break;
	case valueN:
		statementN;
		break;
	default:
		default_statement;
		break;
}
Розглянемо цю структуру докладніше. argument це деяка змінна, значення якої ми порівнюватимемо з гіпотетичними різними варіантами. Змінна має бути final. Також варто сказати, що оператор switchпідтримує як аргумент далеко не будь-який тип даних. Допустимі типи перераховані нижче:
  • byte and Byte
  • short and Short
  • int and Integer
  • char and Character
  • enum
  • String
case value1 (value2, valueN)- Це значення, конкретні константи, з якими ми порівнюємо значення змінної argument. Також кожен кейс визначає під собою набір команд, які потрібно виконати. statement1, statement2statementNце команди, які необхідно буде виконати, якщо argumentвиявиться дорівнює одному з value. Наприклад, якщо argumentдорівнюватиме value2, то програма виконає statement2. defaultі default_statement- це "за замовчуванням". Якщо argumentне дорівнюватиме жодному з представлених value, то спрацює гілка defaultі виконається команда default_statement. defaultі default_statementє опціональними атрибутами оператора switch-case. break- можна помітити, що в кінці кожного case блоку слідує операторbreak. Цей оператор також є опціональним і служить для того, щоб розмежовувати код різних кейсів. Часом буває необхідно виконувати однакові дії у різних кейсах: тоді ці кейси можна об'єднати. У такому разі ключове слово break— опускають, і структура оператора switch-caseвиглядатиме так:
switch (argument) {
	case value1:
		statement1;
		break;
	case valueX:
	case valueY:
		statementXY;
		break;
}
Варто звернути увагу: між `case valueX:` та `case valueY:` немає оператора break. Тут, якщо argumentдорівнюватиме value1, виконається statement1. А якщо argument дорівнюватиме valueXабо valueY, виконається statementXY. Розбавимо важку сприйняття теорію на легку сприйняття практику. Перепишемо приклад із днями тижня з використанням оператора 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;
    }
}
Тепер напишемо програму, яка виводить інформацію про те, чи є сьогодні буднім днем ​​або вихідним, використовуючи оператор 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;

    }
}
Трохи пояснимо. У цій програмі ми отримуємо enum DayOfWeek, який означає поточний день тижня. Далі ми бачимо, дорівнює значення нашої змінної dayOfWeekзначенням SUNDAYчи SATURDAY. Якщо це так, програма виводить “Сьогодні вихідний”. Якщо ж ні, ми перевіряємо, чи дорівнює значення змінної dayOfWeekзначенню FRIDAY. Якщо це так, програма виводить “Завтра вихідний”. Якщо ж і в цьому випадку немає, то варіантів у нас небагато, будь-який день є буднім днем, тому за замовчуванням, якщо сьогодні НЕ п'ятниця, НЕ субота і НЕ неділя програма виведе “Сьогодні робочий день”.

Висновок

Отже, у цій статті ми розібрали, що таке розгалуження в комп'ютерній програмі. А також розібралися, за допомогою яких керуючих конструкцій реалізується розгалуження в Java Java. Обговорабо такі конструкції, як:
  • if-then
  • if-then-else
  • switch-case
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ