Листинг 2. Программный код функции Fact1 ( )
Public Function Fact1 (n As Integer) As Double
Dim i As Integer
Dim nn As Double
nn = 1
For i = 1 To n
nn = nn * i
Next i
Fact1 = nn
End Function
Как сама функция, так и внутренняя переменная для записи значения факториала объявлены с типом Double (действительного или вещественного типа), хотя по определению являются значениями целочисленными (о типах данных в VBA см.: http://vba-help.ru/vbahelp/all/tipDannichVBA; http://psuti-op.narod.ru/11.html). Причина в том, что факториал даже для не очень больших чисел принимает очень большие значения, выходящие за допустимые в целочисленных типах данных пределы.
Как было отмечено ранее, факториал вычисляется как произведение ряда натуральных чисел, пробегаемого индексной переменной i в рамках оператора цикла. Аргумент у функции только один – это переменная целочисленного типа, для которой вычисляется факториал.
В функции Fact2( ) вычисление факториала осуществляется путем рекурсивного вызова функции. Программный код функции Fact2( ) приводится в листинге 3:
Листинг 3. Программный код функции Fact2 ( )
Public Function Fact2 (n As Integer) As Double
If n = 1 Then
Fact2 = 1
Else
Fact2 = n * Fact2 (n-1)
End If
End Function
В теле функции размещен всего один условный оператор, в котором проверяется условие равенства аргумента функции 1. В этом случае в качестве значения функцией возвращается 1. Если же условие не выполняется, то значение функции определяется как ее аргумент, умноженный на результат вызова функции с уменьшенным на 1 аргументом. Здесь используется свойство факториала: n! = n * (n - 1)!. Как и в предыдущем случае, объявленная функция возвращает значение типа Double. Результат вызова обеих функций пользователя (а также встроенной функции ФАКТР ( ) показан на рис. 8:
Рис. 8. Результат вызова функций ФАКТР ( ), Fact1 и Fact2 для небольшого числа (N=8).
Для этого:
1) Выполните п.п. 1-2 из примера 1.
2) Введите программные коды функций Fact1 и Fact2, приведенные в листингах 1 и 2, в отдельных модулях.
3) Откомпилируйте (проверьте ошибки) каждый код с помощью команды: Debug → Compile VBAProject.
4) В рабочем документе Excel в ячейку В3 введите число 8. В ячейку В4 введите формулу: = ФАКТР(В3), в ячейку В5 введите формулу: = Fact1(B3), в ячейку В6 введите формулу: = Fact2(B3).
В результате вычисляется факториал небольшого числа, указанного в ячейке В3. В данном случае это число 8. Получившееся значение не очень большое. Это позволяет представить его в общем формате в ячейке Excel.
5
)
Скопируйте ячейки A1:B6
на другой лист. Введите в ячейку В3
число 30.
Получившийся результат будет иной,
см.
рис. 9:
Рис. 9. Результат вычисления факториала при N=30 представлен в формате действительного числа двойной точности.
Чтобы вычислять факториалы для больших чисел, при объявлении функции пользователя используется формат действительных чисел двойной точности.
Пример 3.
Вычисление синуса.
Создадим функцию пользователя, которой путем суммирования ряда Тейлора будет вычисляться синус аргумента, т.е. воспользуемся соотношением:
.
Для вычисления значения синуса будем
использовать приближенное выражение
,
где параметры x
и N
указываются аргументами создаваемой
функции. N
– количество
слагаемых ряда.
Программный код функции Mysin ( ) приведен в листинге 4:
Листинг 4. Программный код функции Mysin ( )
Public Function Mysin (x As Double, N As Integer) As Double
Dim i As Integer
Dim s As Double
Dim q As Double
s = 0
q = x
For i=1 To N
s = s + q
q = q*(-1) * x * x / (2 * i) / (2 *i + 1)
Next i
Mysin = s
End Function
Основу программного кода функции составляет оператор цикла. В каждом цикле к переменной s, в которую записывается результат вычисления синуса, добавляется очередное слагаемое ряда (переменная q). После этого значение q изменяется так, чтобы оно соответствовало следующему слагаемому ряда. Это можно проиллюстрировать в виде таблицы 1, показывающей изменение значений переменных при i=1 и i=2.
Результат вычисления синуса с помощью встроенной функции Excel и с помощью созданной функции пользователя Mysin ( ) представлен на рис.10.
