2. Основы Kotlin. Ветвления

Табличная форма ветвлений (when)

Каскадную запись if..else if..else часто можно представить более изящно в табличной форме, используя конструкцию when (когда). Для примера quadraticRootNumber это делается так:

Конструкция when состоит из последовательности записей вида условие -> результат. В последней записи условие заменяется на ключевое слово else (иначе).

Частый случай применения when — ситуация, когда одно и то же выражение необходимо последовательно сравнить на равенство с несколькими другими. Для примера, рассмотрим задачу формирования словесной нотации для оценки. Согласно принятым сейчас стандартам, оценка «5» записывается как «отлично», «4» как «хорошо», «3» как «удовлетворительно» и «2» как «неудовлетворительно». Представим подобное преобразование в виде функции на Котлине, используя when:

Эта функция принимает на вход целочисленную оценку (grade) и формирует на выходе соответствующую ей строку. Напомним, что строкам в Котлине соответствует тип String и записываются они в двойных кавычках.

Для проверки возможного значения grade мы используем конструкцию when (grade), в которой оно последовательно сравнивается с 5, 4, 3 и 2. Обратите внимание, что в нашей записи when имеется и пятый случай (else). Его присутствие необходимо, так как функция должна знать, какой результат ей следует вернуть на выход, для любого допустимого значения входа (в данном случае это тип Int с его диапазоном допустимых значений). Строго говоря, ветка else здесь соответствует ошибочной ситуации, которая может предусматривать специальную обработку — но об этом позже. В функции gradeNotation в этой ситуации мы формируем строку «несуществующая оценка», дописывая к ней значение переданной оценки, например: «несуществующая оценка 0».

Логические функции и операции

Условие в операторе if часто в свою очередь вычисляется с помощью функции с результатом типа Boolean. Пусть, например, имеется круг на плоскости с центром в точке (x0, y0) и радиусом r, а также точка на плоскости с координатами (x, y). Необходимо определить, лежит ли точка внутри круга. Особенность данной задачи в том, что у неё есть только два ответа: ДА или НЕТ, либо, более формально, ИСТИННО (true) или ЛОЖНО (false).

Для решения данной задачи необходимо воспользоваться неравенством круга: (x-x0)2 + (y-y0)2 ≤ r2. Если точка (x, y) удовлетворяет этому неравенству, то она лежит внутри круга, если же нет, то она находится снаружи. Функция очень проста и записывается так:

Здесь вновь используется функция sqr из урока 1 для вычисления квадратов чисел. Тип результата функции pointInsideCircle — Boolean. При написании тестовых функций для неё удобно использовать готовые функции assertTrue и assertFalse, например:

Обе функции имеют один параметр типа BooleanassertTrue (проверить на истину) приводит к неудачному исходу теста, если её аргумент равен false, и продолжает выполнение теста, если он равен trueassertFalse (проверить на ложь) работает с точностью до наоборот.

Функцию pointInsideCircle в свою очередь можно использовать для решения более сложных задач. Например, условие принадлежности точки пересечению или объединению двух кругов может выглядеть так:

В этом примере используются логические операции:

  • && — логическое И, результат равен true, если ОБА аргумента true
  • || — логическое ИЛИ, результат равен true, если ХОТЯ БЫ ОДИН из аргументов равен true
  • ! — логическое НЕ, результат равен true, если аргумент false
Добавить комментарий