Загрузка данных


// Определяем псевдоним типа "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")
    }
}