Еngee как альтернатива PascalABC
Функции и их использование. ЛР №12-13
Создание функций
В языке Julia функция представляет собой объект, который сопоставляет кортеж значений аргументов с возвращаемым значением. Базовый синтаксис определения функций в Julia следующий:
function f(x,y)
x + y
end
Эта функция принимает два аргумента, x и y, и возвращает значение последнего вычисленного выражения: x + y.
Есть и второй, более сжатый синтаксис для определения функции в Julia. Традиционный синтаксис объявления функций, показанный выше, эквивалентен следующей компактной форме присваивания:
f(x,y) = x + y
В форме присваивания тело функции должно быть одним выражением. Короткий синтаксис функций довольно наглядный, он значительно сокращает объем набираемого текста и устраняет визуальный шум.
Вызывается функция всегда с помощью употребления ее имени вместе со списком значений параметров, взятым в круглые скобки:
f(2,3)
Объявления типов аргументов
Вы можете объявлять типы аргументов функций, добавляя ::TypeName к имени аргумента. Например, следующая функция рекурсивно вычисляет числа Фибоначчи:
fib(n::Integer) = n ≤ 2 ? one(n) : fib(n-1) + fib(n-2)
Ключевое слово return
Значение, возвращаемое функцией, – это значение последнего вычисленного выражения, которое по умолчанию является последним выражением в теле определения функции. В примере функции f из
раздела Создание функций это значение выражения x + y. В качестве альтернативы ключевое слово return заставляет функцию немедленно выполнить возврат, предоставляя выражение, значение которого возвращается.
Например:
function g(x,y)
return x * y
x + y
end
Создание таблиц значений
Мы можем использовать функции для расчёта значений математической функции на некотором множестве точек, либо интервале. Подобный пример использования функции приведён ниже:
Для вывода таблицы в красивом виде - установим и подгрузим пакет PrettyTables:
Pkg.add("PrettyTables");
using PrettyTables
# Определяем функцию
fun(x1::Float64)::Float64 = x1 - sin(x1)
m = 10
a = 0.0 # Находим значения в отрезке 0 до 2π
b = 2 * π # где a = 0 - начало отрезка, b = 2π - конец отрезка
h = (b - a) / m
# Создаем массивы для хранения значений
x_values = Float64[]
y_values_fun = Float64[]
y_values_direct = Float64[];
# Вычисление значений с использованием функции
for i in 0:m-1
x = a + i * h
push!(x_values, x)
push!(y_values_fun, fun(x))
end
# Вывод таблицы
println("\nНахождение точек с помощью функции")
pretty_table([x_values y_values_fun], header = ["X", "Y (fun)"])
Теперь мы можем переиспользовать нашу функцию, а также, при помощи операта . применять её к массивам данных поэлементно:
r = range(0, stop=pi, length=10)
fun.(r)
Аналогично, можем применять оператор . к арифметическим действиям, и, таким образом, перемножать векторы и матрицы поэлементно:
Введите_значения_вектора_c = "1 2 3" # @param {type:"string"}
c = parse.(Int64, split(Введите_значения_вектора_c))
Введите_значения_вектора_f = "4 5 6" # @param {type:"string"}
f = parse.(Int64, split(Введите_значения_вектора_f))
d = c.*f
# Вывод вектора d
println("Вывод вектора d:")
println(d)
Для корректной работы программы, размер массивов должен совпадать.