У цій статті ми розглянемо таке поняття як розгалуження в комп'ютерних програмах і написаних на ЯП Java. Поговоримо про такі керуючі конструкції, як:
if-then
(або жif
)if-then-else
(або жif-else
)switch-case
Розгалуження
Почнемо із базових понять. Будь-яка програма є набором команд, що виконуються комп'ютером. Найчастіше команди виконуються послідовно, один за одним. Трохи рідше (але досі часто) виникають ситуації, коли потрібно змінити послідовний хід виконання команд програми. Іноді, залежно від деяких умов, необхідно виконувати один блок команд замість іншого. А коли ці умови змінюються, чинити навпаки. Наприклад, є низка сайтів, відвідування яких заборонено особам, які не досягли віку 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
, statement2
— statementN
це команди, які необхідно буде виконати, якщо 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
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ