Kotlin. Интервалы (диапазоны)

Интервалы (диапазоны). Оператор .. . Применение интервалов в условиях (if), циклах (for), выборе (when). Оператор in. Интервальные типы IntRange, CharRange, LongRange


Содержание


Поиск на других ресурсах:

1. Интервалы (диапазоны). Синтаксис объявления. Оператор ..

Интервалы или диапазоны позволяют задавать последовательность возможных значений между некоторым начальным и конечным значением. Интервалы определяются с помощью оператора .. и в общем случае имеют следующий вид

begin_value .. end_value

здесь

  • begin_value – значение, определяющее начало диапазона;
  • end_value – конечное значение диапазона.

 

2. Создание переменных, которые есть интервалами. Присваивание интервала ссылке

Чтобы создать только читаему переменную, которая является интервалом, нужно использовать следующий синтаксис

val varName = begin_value .. end_value

Чтобы создать переменную интервал, которая может многократно изменяться в программе (mutable переменная), нужно использовать следующую форму записи

var varName = begin_value .. end_value

Если переменная объявлена как интервал, то ее значение может быть переопределено другим интервалом того же интервального типа.

 

3. Интервальные типы CharRange, IntRange, LongRange. Объявление и использование переменной интервального типа

В языке Kotlin поддерживаются три интервальных типа CharRange, IntRange, LongRange, которые определяют диапазон значений соответственно для типов char, int, long.

Допускается объявлять переменную интервального типа а затем присваивать ей соответствующие интервалы.

Пример.

// Объявление переменных интервальных типов

// 1. Диапазон значений типа int
var seconds : IntRange
seconds = 0..59

val miliseconds : IntRange = 0..100

// 2. Диапазон значений типа long
var bigNumbers : LongRange = 0..1_000_000_000_000_000

// переопределение диапазона типа long
bigNumbers = 0..1_000L

// 3. Диапазон значений типа char
var chars : CharRange // символьный тип
chars = 'a'..'z'

// переопределение диапазона типа char
chars = 'A'..'Z'

// так нельзя - ошибка компиляции, несовпадение типов CharRange и IntRange
//chars = 1..10

 

4. Оператор in. Сочетание оператора in с интервалами

Для того, чтобы определить, входит ли некоторое значение в интервал, используется оператор in. Синтаксис проверки вхождения значения в интервал следующий

valueName in begin_value .. end_value

здесь

  • valueName – переменная или значение, которое проверяется на принадлежность интервалу в пределах от begin_value до end_value.

Результатом оператора in является значение true (если переменная входит в интервал) или false (переменная вне интервала).

 

5. Использование интервалов в операторе if. Примеры
5.1. Определение принадлежности дня недели

Задача. Задан номер дня недели (1..7). Определить, какой это день: рабочий или выходной.

Решение.

fun main(args:Array<String>) {
  // Интервалы, оператор ..

  // 1. Объявить переменные
  val day : Int

  // 2. Ввести день недели
  print("day = ")
  day = readLine().toString().toInt()

  // 3. Вычисление
  if (day in 1..5)
    println("Workday.")
  else
  if (day in 6..7)
    println("Day off.")
  else
    println("Incorrect input.")
}

Тестовый пример

day = 3
Workday.

 

5.2. Определение возрастной категории человека

Задача. Разработать программу, которая запрашивает имя пользователя и его возраст и определяет к какой возрастной категории он относится:

  • от 1 до 10 лет – ребенок;
  • от 11 до 15 лет – подросток;
  • от 16 до 20 лет – юноша;
  • от 21 до 30 лет – молодой человек;
  • после 31 года – взрослый человек.

Решение.

fun main(args:Array<String>) {
  // Интервалы, оператор ..

  // 1. Объявить переменные
  val name : String
  val age : Int

  // 2. Ввести данные
  print("name = ")
  name = readLine().toString()
  print("age = ")
  age = readLine().toString().toInt()

  // 3. Проверка, корректен ли ввод
  if (age<=0)
    println("Incorrect input")

  // 4. Вычисления
  if (age in 1..10)
    println("Child.") // Ребенок
  else
  if (age in 11..15)
    println("Teenager") // Подросток
  else
  if (age in 16..20)
    println("Younker (young woman)") // Юноша
  else
  if (age in 21..30)
    println("Young person") // Молодой человек
  else
    println("Adult") // Взрослый человек
}

Тестовый пример

name = Ihor
age = 49
Adult

 

6. Использование интервалов в операторе when
6.1. Определение времени года по номеру месяца

Задача. Используя оператор when и интервалы разработать программу, которая по номеру месяца (1..12) определяет название времени года, к которому он принадлежит.

Решение.

fun main(args:Array<String>) {
  // Интервалы, операторы in, ..

  // 1. Объявить переменные
  val month : Int

  // 2. Ввести данные
  print("month = ")
  month = readLine().toString().toInt()

  // 3. Вычисление
  when (month) {
    in 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 = 8
Summer

 

6.2. Определение знака зодиака

Задача. Задан номер дня и номер месяца, которые определяют дату рождения человека. Разработать программу определяющую к какому знаку зодиака принадлежит дата рождения человека:

  • 20.01 — 18.02 – Водолей
  • 19.02 — 20.03 – Рыба
  • 21.03 — 19.04 – Овен
  • 20.04 — 20.05 – Телец
  • 21.05 — 21.06 – Близнецы
  • 22.06 — 22.07 – Рак
  • 23.07 — 22.08 – Лев
  • 23.08 — 22.09 – Дева
  • 23.09 — 22.10 – Весы
  • 23.10 — 22.11 – Скорпион
  • 23.11 — 21.12 – Стрелец
  • 22.12 — 19.01 – Козерог

В программе считать, что год невисокосный.

Решение.

fun main(args:Array<String>) {
  // Интервалы, оператори in, ..

  // 1. Объявить переменные
  val day : Int
  val month : Int

  // 2. Ввести данные
  print("day = ")
  day = readLine().toString().toInt()
  print("month = ")
  month = readLine().toString().toInt()

  // 3. Вычисление
  when {
    (month==1)&&(day in 1..19) ||
      (month==12)&&(day in 22..31) -> println("Козерог")
    (month==1)&&(day in 20..31) ||
      (month==2)&&(day in 1..18) -> println("Водолей")
    (month==2)&&(day in 19..28) ||
      (month==3)&&(day in 1..20) -> println("Рыба")
    (month==3)&&(day in 21..31) ||
      (month==4)&&(day in 1..19) -> println("Овен")
    (month==4)&&(day in 20..30) ||
      (month==5)&&(day in 1..20) -> println("Телец")
    (month==5)&&(day in 21..31) ||
      (month==6)&&(day in 1..21) -> println("Близнецы")
    (month==6)&&(day in 22..30) ||
      (month==7)&&(day in 1..22) -> println("Рак")
    (month==7)&&(day in 23..31) ||
      (month==8)&&(day in 1..22) -> println("Лев")
    (month==8)&&(day in 23..31) ||
      (month==9)&&(day in 1..22) -> println(ева")
    (month==9)&&(day in 23..30) ||
      (month==10)&&(day in 1..22) -> println("Весы")
    (month==10)&&(day in 23..31) ||
      (month==11)&&(day in 1..22) -> println("Скорпион")
    (month==11)&&(day in 23..30) ||
      (month==12)&&(day in 1..21) -> println("Стрелец")
    else -> println("Incorrect input.")
  }
}

Тестовый пример

day = 14
month = 1
Козерог

 

7. Использование интервалов в операторе цикла for
7.1. Конвертировать фунты в килограммы

Задача. Напечатать таблицу перевода фунтов в килограммы для значений фунтов от 1 до 10 (1 фунт = 453 грамма).

Решение.

fun main(args:Array<String>) {
  // Интервалы, операторы in, ..

  // Напечатать таблицу соответствия 1 фунт = 0.453 кг

  // 1. Объявить переменные
  var lb : Int
  var kg : Double

  // 2. Вывод таблицы
  for (lb in 1..10) {
    kg = lb * 0.453
    println("lb.: " + lb + " => " + kg + " kg.")
  }
}

Результат выполнения программы

lb.: 1 => 0.453 kg.
lb.: 2 => 0.906 kg.
lb.: 3 => 1.359 kg.
lb.: 4 => 1.812 kg.
lb.: 5 => 2.265 kg.
lb.: 6 => 2.718 kg.
lb.: 7 => 3.1710000000000003 kg.
lb.: 8 => 3.624 kg.
lb.: 9 => 4.077 kg.
lb.: 10 => 4.53 kg.

 

7.2. Вычисление среднего арифметического чисел

Задача. Дано натуральное число n и вещественные числа a1, a2, …, an. Определить среднее арифметическое этих чисел. В программе массивы не использовать.

Решение.

fun main(args:Array<String>) {
  // Интервалы, операторы in, ..

  // Определить среднее арифметическое последовательности чисел
  // 1. Объявить переменные
  var avg : Double = 0.0
  val n : Int
  var a : Double

  // 2. Ввести n
  print("n = ")
  n = readLine().toString().toInt()

  // 3. Цикл вычисления, используется интервал 1..n
  for (i : Int in 1..n) {
    // ввести число
    print("=> ")
    a = readLine().toString().toDouble()

    // прибавить к общей сумме
    avg += a
  }

  // 4. Вывести среднее арифметическое
  avg /= n
  println("average = " + avg)
}

Тестовый пример

n = 5
=> 1.2
=> 1.4
=> 1.6
=> 1.7
=> 1.1
average = 1.4

 


Связанные темы