Kotlin. Оператор when

Оператор when


Зв’язані теми


Пошук на інших ресурсах:

1. Оператор when. Призначення. Синтаксис оголошення

Оператор when використовується для реалізації вибору одного варіанту з декількох. Оператор when у мові Kotlin є аналогом оператора switch у мовах Java, C#, C/C++ тільки з більш ширшими можливостями. Оператор when дозволяє оперувати довільними об’єктами на відміну від оператора switch інших мов, в якому використовувались тільки константи.

Оператор when ефективний, коли кількість варіантів (перевірок умов) становить три і більше.

Синтаксис оголошення оператора when різноманітний і в найбільш загальному випадку має наступний вигляд

when (name) {
    value1 -> statements_1
    value2 -> statements_2
    ...
    valueN -> statements_N
    else -> statements_N+1
}

тут

  • name – ім’я аргументу, який визначає перелік можливих значень value1, value2, …, valueN;
  • value1, value2, valueN – значення, які отримує змінна (посилання) name. Ці значення можуть бути окремими літералами, інтервалами, змінними. Також допускається вставляти виклики функцій, які повертають значення такого ж типу який має змінна name;
  • statement_1, statement_2, statement_N – один або декілька операторів які потрібно виконати якщо знайдено співпадіння name відповідно з value1, value2, valueN. Якщо потрібно виконати два і більше операторів, то вони беруться в фігурні дужки { };
  • statement_N+1 – один або більше операторів, які виконуються у випадку, коли не знайдено жодного співпадіння між name та value1, value2, valueN.

Оператор when працює наступним чином. Спочатку порівнюється значення name зі значенням value1. Якщо значення співпадають (рівні), то виконується оператор (блок операторів) statement1 і далі відбувається перехід до наступного оператора, що слідує після оператора when. Якщо значення name і value1 не співпадають то розглядається значення value2, якому відповідає оператор (декілька операторів) statement2.

Якщо в ході перевірок на рівність не знайдено співпадінь для N значень, то виконується оператор statement_N+1.

 

2. Використання оператора when з різноманітними об’єктами. Приклади
2.1. Визначення назви дня тижня

Умова задачі. Задано номер дня тижня (1..7). На основі цього номеру вивести назву дня тижня. Вважати, що понеділок має номер 1.

Розв’язок.

fun main(args:Array<String>) {
  val day : Int

  print("day = ")
  day = readLine().toString().toInt()

  when (day)
  {
    1 -> println("Monday")
    2 -> println("Tuesday")
    3 -> println("Wednesday")
    4 -> println("Thirsday")
    5 -> println("Friday")
    6 -> println("Saturday")
    7 -> println("Sunday")
    else -> println("Incorrect input.")
  }
}

Тестовий приклад

day = 3
Wednesday

 

2.2. Визначення пори року за назвою місяця. Групова обробка в операторі when

У прикладі показано, що оператор when можна застосовувати до групи елементів та діапазонів.

Задача. За введеним номером місяця вивести назву пори року, до якої цей місяць належить.

Розв’язок.

 

fun main(args:Array<String>) {

  // 1. Оголосити змінні
  val month : Int

  // 2. Ввести номер місяця
  print("month = ")
  month = readLine().toString().toInt()

  // 3. Обчислення. Вивести назву пори року
  when (month)
  {
    1, 2, 12 -> println("Winter")
    in 3..5 -> println("Spring") // вказується діапазон
    in 6..8 -> println("Summer")
    in 9..11 -> println("Autumn")
    else -> println("Incorrect input.")
  }
}

Тестовий приклад

month = 6
Summer

 

2.3. Оператор when без аргументів. Використання оператора when як складової умовного виразу. Приклад

Оператор when може бути використаний без аргументів. У нижченаведеному прикладі використовується оператор when без аргументів, який є частиною умовного виразу.

Приклад. Розробити програму, яка визначає, чи високосний рік чи ні.

fun main(args:Array<String>) {

  // Оператор when без аргументів. Визначення високосності року
  // 1. Оголосити змінні
  val year : Int

  // 2. Ввести рік
  print("year = ")
  year = readLine().toString().toInt()

  // 3. Перевірка на коректність вводу
  if (year < 0) {
    println("Incorrect input.")
    return
  }

  // 4. Обчислення
  // Умовний вираз + оператор when
  val leap_year : Boolean = when {
    year % 400 == 0 -> true
    year % 100 == 0 -> false
    year % 4 == 0 -> true
    else -> false
  }

  // 5. Вивести результат
  if (leap_year)
    println("Leap year")
  else
    println("Not a leap year")
}

Тестовий приклад

year = 998400
Leap year

 

2.4. Приклад. Використання складних виразів в операторі when

Умова задачі. З початку 1990 року по деякий день пройшло n місяців та 2 дні. Визначити назву місяця цього дня (січень, лютий, і т.д.).

Розв’язок.

Оскільки, в умові задачі сказано “З початку 1990 року…”, то це означає, що буде 1 січня 1990 року. Відповідно до цього розв’язується задача.

 

fun main(args:Array<String>) {

  // Оператор when. Визначення місяця в році
  // 1. Оголосити змінні
  val n : Int

  // 2. Ввести кількість місяців n
  print("n = ")
  n = readLine().toString().toInt()

  // 3. Перевірка на коректність вводу
  if (n < 0) {
    println("Incorrect input.")
    return
  }

  // 4. Обчислення

  // Умовний вираз, аргументом є вираз
  val month = when (n % 12) {
    0 -> println("January")
    1 -> println("February")
    2 -> println("March")
    3 -> println("April")
    4 -> println("May")
    5 -> println("June")
    6 -> println("July")
    7 -> println("August")
    8 -> println("September")
    9 -> println("October")
    10 -> println("December")
    11 -> println("November")
    else -> println("Incorrect input.")
  }
}

Тестовий приклад

n = 3
April

 

2.5. Використання рядкового типу в якості аргументу

Умова задачі. Задано повні назви днів тижня, які починаються з великої літери. Визначити їх порядковий номер. Вважати, що понеділок має номер 1.

Розв’язок.

 

fun main(args:Array<String>) {

  // Оператор when. Аргументом виступає тип String
  // 1. Оголосити змінні
  val day : String

  // 2. Ввести назву дня тижня
  print("day = ")
  day = readLine().toString()

  // 3. Обчислення
  // Оператор when, аргументом є тип String
  val num_day = when(day){
    "Monday" -> 1
    "Tuesday" -> 2
    "Wednesday" -> 3
    "Thirsday" -> 4
    "Friday" -> 5
    "Saturday" -> 6
    "Sunday" -> 7
    else -> "Incorrect input."
  }

  // 4. Вивід номера дня
  println("num_day = " + num_day)
}

Тестовий приклад

day = Thirsday
num_day = 4

 


Споріднені теми