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

Автор

Юрій Клебан

Опубліковано

3/18/23

10.1 Оператор if-else

Якщо є потреба перевірити у коді програми виконання якоїсь умови та за її результатами перейти до одного із блоків виконання зазвичай використовують оператор if-else. Загальний вигляд формату використання оператора if-else:

 if (умова) {
    #інструкція
  }
  else {
    #інструкція
  }

Вираз умова повинен повертати результат у вигляді елемента логічного типу. Тобто, умова може бути або true, або false.

Якщо умова рівна true, то виконається інструкція (або код) записана у дужках після if. Якщо ж умова рівна false, то виконається інструкція записана у дужках після else.

Note

Символ # перед кодом означає коментар, тобто код, який не бачитиме інтепретатор мови програмування.

Якщо після if або else тільки одна інструкція (можна ототожнити з один рядком коду), то «фігурні» дужки {} не є обов’язковими.

Конструкції if-else можуть вкладеними одна в одну без обмежень по глибині. Проте дуже глибокої вкладеності варто уникати, адже це ускладнює читання та розуміння коду програми.

if (умова1)
{
  if (умова2)
  {
    #інструкція
  }
}
Note

if є обов’язковим і повинно існувати у всіх подібних конструкціях, у той же час else – необов’язковий.

Також конструкція if-else може мати структуру дерева із багатьма розгалуженнями. Така структура зазвичай записується як if-else-if:

if (умова1)
  { #код }
  else if (умова2)
      { #код }
      else if (умова3)
          { #код }
          else { #код }

Вирази обчислюються зверху-вниз. Якщо один із виразів (умова) отримає істинний результат (true), то програмний код, пов’язаний із цією гілкою розгалуження виконається, а всі інші гілки будуть пропущені. Якщо ж не виконається жодна з умов, то буде запущено код всередині останньої інструкції else (у цьому випадку else теж не обов’язковий).

Розгялнемо приклади використання конструкції if-else. Код нижче дозволяє перевірити, яке з двох цілих чисел є більшим:

a <- 10
b <- 5

if(a > b) {
    print("A > B")
} else if (b > a){
    print("B > A")
} else {
    print("A equals B")
}
[1] "A > B"

10.2 Тернарний оператор

Тернарний оператор – це спосіб запису умовного виразу в один рядок. Він використовується, коли потрібно присвоїти значення змінній в залежності від умови. Синтаксис тернарного оператора у R відрізняється від інших мов програмування (класично це умова ? вираз_якщо_true : вираз_якщо_false).

Оператор розгалуження if-else у R може повертати та записувати значення у змінну:

value <- 10
x <- if(value %% 2 == 0) "even" else "odd"
x
[1] "even"

Проте сильною стороною R є саме робота з векторами. Тому, якщо потрібно виконати умовну перевірку для кожного елемента вектора, то краще використати функцію ifelse(). Синтаксис виклику:

ifelse(condition, a, b)

де condition – вектор умов, a – вектор значень, які будуть повернуті, якщо умова condition істинна, b – вектор значень, які будуть повернуті, якщо умова condition не істинна.

Розглянемо приклад. Потрібно створити вектор, який містить значення 1 для значень >= 0 та 0 для значень < 0 на основі наявного вектора x:

 x <- c(-6, 2, -3, 4, 5)
 binary_vector <- ifelse(x > 0, 1, 0)
 print(binary_vector)
[1] 0 1 0 1 1

Також оператор ifelse можна використовувати і для заміни значень вектора. Наприклад, потрібно замінити всі значення Yes/No на 1/0:

x <- c("Yes", "No", "Yes", "Yes", "No")
print(x)
[1] "Yes" "No"  "Yes" "Yes" "No" 
x <- ifelse(x == "Yes", 1, 0)
print(x)
[1] 1 0 1 1 0

Приклади розв’язання завдань

Завдання 1. Парні/непарні числа

Напишіть програму, що виводить консоль інформацію про те число парне чи ні. Значення \(0\) потрібно потрібно також перевірити і вивести у разі його введення "ZERO".

Розв’язання

a <- readline(prompt = "Enter A:") # read a
a <- as.numeric(a) 
remainder <- a %% 2
if(a == 0) {
  print("ZERO")  
} else if(remainder == 0) {
  print("EVEN")
} else if (remainder == 1) {
  print("ODD")
}

Результат виконання коду:

Enter A: 2
[1] "EVEN"