До этого мы рассматривали ситуации, когда вычисление результата функций происходило без рассмотрения вариантов. Это возможный, но сравнительно редкий случай в программировании. Существует очень много задач, где приходится рассматривать различные варианты, и для этой цели программисты придумали ветвления.
Максимум из двух
В качестве простого примера рассмотрим функцию, результат которой равен наибольшему из её параметров.
fun max(m: Int, n: Int) = if (m > n) m else n
Здесь if..else — оператор или конструкция ветвления, переводится с английского как если..иначе. После ключевого слова if в скобках следует условие ветвления m > n
. Если условие истинно, в качестве результата используется выражение сразу за условием ветвления, в данном случае m
. Если же условие ложно, используется выражение за ключевым словом else, в данном случае n
. Конструкцию можно прочитать по-русски как “Если m > n, (то) m, иначе n”. Функция max
, аналогичная данной, имеется в стандартной библиотеке Котлина.
Число корней квадратного уравнения
Рассмотрим более сложный пример. Следующая функция рассчитывает число корней квадратного уравнения ax2 + bx + c = 0. Напомним, что квадратное уравнение имеет два корня, если его дискриминант больше 0, один корень, если дискриминант равен 0, и ноль корней в противном случае. Для реализации этого алгоритма следует вначале рассчитать дискриминант, а затем применить конструкцию if..else. Функция на Котлине может быть записана так:
fun quadraticRootNumber(a: Double, b: Double, c: Double): Int { // Применяем готовую функцию из первой части val d = discriminant(a, b, c) // Для сравнения на равенство применяем == return if (d > 0.0) 2 else if (d == 0.0) 1 else 0 }
Здесь мы применили запись функции в виде блока и использовали промежуточную переменную d. Последняя строчка функции читается как “вернуть: если d > 0.0, (то) 2, иначе, если d = 0.0, (то) 1, иначе 0”. Обратите внимание на возможность так называемой “каскадной” записи конструкции if..else в виде if..else if..else if..else if..else (с неограниченным количеством промежуточных элементов).
Операции сравнения
В обоих примерах в условиях мы использовали операции сравнения. Таких операций имеется восемь:
- > строго больше;
- >= больше или равно, аналог математического ≥
- < строго меньше;
- <= меньше или равно, аналог математического ≤
x in a..b
—x
принадлежит интервалу отa
доb
, аналог математического a ≤ x ≤ b;x !in a..b
—x
НЕ принадлежит интервалу отa
доb
;- != не равно, аналог математического ≠
- == равно (используется два знака равенства, чтобы не путать данную операцию с инициализацией / вычислением результата =).
Операции == и != в Котлине применимы для сравнения аргументов произвольных типов. В частности, разрешается сравнивать на равенство строки — они равны, если имеют равную длину, и соответствующие их символы совпадают: “abc” != “cba”.
Остальные операции применимы только в том случае, если для аргументов определена специальная функция сравнения compareTo
— об этом мы будем говорить позже. Первое время, нам придётся применять их только для числовых типов.
Математически, результат всех операций сравнения имеет тип Boolean
с ровно двумя возможными значениями: true, false.
не много подумал над последней задачей, не понимал условие, пока не нарисовал наглядно на системе координат