// Определяем псевдоним типа "Operation" как функцию, которая принимает два Double и возвращает Double.
typealias Operation = (Double, Double) -> Double
// Функция calculate: принимает два числа и операцию (лямбду), вызывает её и возвращает результат.
fun calculate(a: Double, b: Double, operation: Operation): Double {
return operation(a, b)
}
fun main() {
// Создаём словарь (Map), где ключ – символ операции (строка), значение – лямбда (функция).
val operations = mapOf(
"+" to { a: Double, b: Double -> a + b }, // лямбда для сложения
"-" to { a, b -> a - b }, // для вычитания
"*" to { a, b -> a * b }, // умножения
"/" to { a, b -> if (b == 0.0) Double.NaN else a / b }, // деление с проверкой на 0
"%" to { a, b -> a % b }, // остаток от деления
"^" to { a, b -> Math.pow(a, b) }, // возведение в степень
"max" to { a, b -> if (a > b) a else b } // максимум из двух чисел
)
// Запрашиваем у пользователя данные (читаем строки и преобразуем в Double)
println("Введите первое число:")
val a = readLine()!!.toDouble() // "!!" означает, что мы уверены, что ввод не null (для простоты)
println("Введите второе число:")
val b = readLine()!!.toDouble()
println("Введите операцию (+, -, *, /, %, ^, max):")
val op = readLine()!!
// Ищем выбранную операцию в словаре по ключу op
val operation = operations[op]
if (operation == null) {
println("Ошибка: операция не найдена")
} else {
// Вызываем calculate, передавая числа и найденную лямбду
val result = calculate(a, b, operation)
println("Результат: $result")
}
}