Розгалуження, або програми з умовами
У житті ми часто стикаємося з розгалуженням рішень, коли перед нами постає будь-яке питання. Раніше Ви вже вивчили деякі основи Java, однак до цього написаний код завжди виконувався в однаковій послідовності. Уявімо, що Ви вчитель і перевіряєте роботу учня: якщо оцінка вище (або дорівнює) 9, це добре, якщо між 6 і 9, то посередньо, а якщо менше 6, то погано. “Якщо …, то …, інакше …“ це і є типове розгалуження. Java у цьому нагадує українську мову, однак є деякі відмінності з “пунктуацією”.
Блоки
У багатьох мовах програмування є таке поняття, як блоки коду. Простіше кажучи, це групи деяких інструкцій (команд, як я називав раніше). Їх рідко використовують окремо без “структур” та спеціальних інструкцій. У Java блок обмежений фігурними дужками:
{
//блок 1
}
{
//блок 2
}
Логічні вирази й оператори
Якою може бути умова? Найчастіше це якийсь логічний вираз — порівняння значень або результат виконання іншого коду, складена умова тощо, які обов’язково в результаті дають булевий тип. boolean
, як згадувалося у типах даних, має лише 2 значення: true (істина) і false (хиба). Найпростіше порівняти із лампочкою: або вона ввімкнена (істина), або вимкнена (хиба). Раніше Ви вже бачили оператори, але математичні, а зараз слід познайомитись із логічними операторами:
==
— дорівнює!=
— не дорівнює<
,>
— менше, більше<=
,>=
— менше або дорівнює, більше або дорівнює!
— не&&
— і (й)||
— або (чи)
Інструкція if
Наразі Ви знаєте про розгалуження й умовні оператори, то ж час вивчити найпростішу інструкцію (інколи кажуть “оператор”, хоча це не зовсім доречний переклад англ. statement) — if
. У Java загальна схема така:
якщо (умова) інструкція;
інакше інструкція;
Одне “але” — як і майже всі мови програмування, писати “зарезервовані слова” потрібно англійською, тобто:
if (умова) інструкція;
else інструкція;
Повернемося до задачі на початку цієї теми про оцінки. Якщо вважати, що учень отримав оцінку grade
, а нам потрібно вивести “добре”, “посередньо” чи “погано”, то на Java весь код виглядатиме ось так:
if (grade >= 9) System.out.println("Добре.");
else if (grade >= 6) System.out.println("Посередньо.");
else System.out.println("Погано.");
Трошки пояснень: else if
це не окрема інструкція “інакше якщо”, а насправді просто вкладений ще один if. У задачі умовою для “посередньо” була “більше або дорівнює 6, але менше 9”, але тут написано лише “більше або дорівнює 6”, чому так? Справа у тому, що Java, як раніше повідомлялось, виконує інструкції послідовно, тому логіка така: “якщо оцінка більше 9, то …, а якщо ні, то якщо оцінка більше 6, то …, а якщо ні, то …”. Тобто, спочатку комп’ютер перевіряє чи оцінка вище ніж 9, і лише якщо нижче, то перевіряє, чи вище вона за 6; таким чином, якщо переставити умови місцями, то буде неправильний результат. Більш наглядно структурою, але менш практично можна це записати так:
if (grade >= 9)
System.out.println("Добре.");
else
if (grade >= 6 && grade < 9)
System.out.println("Посередньо.");
else
if (grade < 6)
System.out.println("Погано.");
Для чого тоді тут блоки? Річ у тім, що блоки — це також інструкції. Відповідно, якщо потрібно виконати більше однієї в if або else, потрібно написати блок:
if (умова) {
//Декілька інструкцій
} else {
//Декілька інструкцій
}
Зауважу, що else навіть не є обов’язковим, тобто можно просто “зробити …, якщо …”, без “інакше …”.
Інструкція switch
Інколи буває, що потрібно робити дуже багато if-else для різних значень одного виразу, наприклад, вивести назву місяця за його номером. У такому випадку зручніше використати “перемикач” — switch
. Загальна схема така:
switch (умова) {
case випадок1:
//інструкції 1
break;
case випадок2:
case випадок3:
//інструкції 2
break;
...
default:
//інструкції 3
}
Кожен case
це якесь значення, якому може дорівнювати умова, а default
виконується, якщо жодне із значень не підходить (тобто це як “інакше”) і є необов’язковим. Тут з’явилося нове для Вас слово — break
, поясню. Сам switch працює так, що виконує всі умови до кінця, починаючи від істиного випадку — “провалюється” (приклад, де це може бути корисним, згодом), тому щоб цьому запобігти, потрібно закінчувати case на break. Для кращого розуміння, схему switch вище можна також записати аналогічно через if:
if (умова == випадок1) {
//інструкції 1
} else if (умова == випадок2 || умова == випадок3) {
//інструкції 2
}
...
else {
//інструкції 3
}
Приклад, як це використати з місяцями року (після default вже не потрібен break, адже він і так стоїть останнім):
switch (nomerMisiatsia) {
case 1: System.out.println("Січень"); break;
case 2: System.out.println("Лютий"); break;
...
case 12: System.out.println("Грудень"); break;
default: System.out.println("Не існує такого місяця");
}
Провалювання, або fallthrough, може бути корисним, якщо switch використаний для вибору кількості дій, які бажаємо використати:
switch (diya) {
case "Зберегти та перезавантажити":
save();
case "Перезавантажити":
stop();
case "Запустити":
start();
}