Розгалуження, або програми з умовами

У житті ми часто стикаємося з розгалуженням рішень, коли перед нами постає будь-яке питання. Раніше Ви вже вивчили деякі основи 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();
}

Copyleft 🄯 2020–2024 Михайло Стецюк <yaBobJonez@gmail.com>.
Сайт має ліцензію Creative Commons License.
Дякую рідній школі та вчителям!