Лабораторная работа № 9. Подпрограммы

Теоретические сведения

 

Подпрограмма  программа, реализующая вспомогательный алгоритм. Основная программа — программа, реализующая основной алгоритм решения задачи и со­держащая в себе обращения к подпрограммам. В VBA существуют два типа подпрограмм: подпрограммы-функ­ции и подпрограммы-процедуры. Отличие функции от процедуры заключается  в том, что результатом исполнения операторов, образующих тело функции, всегда является некоторое единственное значение, поэтому обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами.

Структурным элементом программы, написанной на языке VBA, является модуль – совокупность объявлений, процедур и функций, объединенных в единое целое. Каждый модуль состоит из области описания и одной или нескольких процедур и функций. Входящие в модуль процедуры и функции объединены общей областью описания. В ней описываются данные и объекты, которые являются общепринятыми для подпрограмм модуля. Иерархия указанных объектов такова:

·         модуль;

·         область описания;

·         подпрограмма;

·         код;

·         оператор.

Подпрограмма-процедура имеет следующий синтаксис:

[Private | Public] [Static] Sub <имя процедуры> ([<список аргументов>])

         [<Инструкции>]

         [Exit Sub]

         [<Инструкции>]

End Sub

Public – указывает, что процедура Sub доступна во всех других процедурах во всех модулях;

Private – указывает, что процедура Sub доступна для других процедур только того  модуля, в котором она описана;

Static – указывает, что локальные переменные процедуры Sub сохраняются в промежутках времени между вызовами этой процедуры;

Sub, End Sub – служебные слова VBA;

<имя процедуры> – имя процедуры, удовлетворяющее стандартным правилам именования;

<список аргументов> – список переменных, представляющих аргументы, которые передаются в процедуру Sub при её вызове. Имена переменных разделяются запятой;

<Инструкции> – любой набор команд VBA;

Exit Sub – инструкция, выполнение которой приводит к выходу из процедуры.

Синтаксис элемента <список аргументов>:

[Optional] [ByVal | ByRef] [ParamArray] <Имя переменной> [As <Тип>] [ = <По умолчанию>]

Optional – ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержатся в списке аргументов, так же должны быть необязательными и описаны с помощью ключевого слова Optional. Все аргументы, описанные как Optional, должны иметь тип Variant. Не допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray;

ByVal – ключевое слово, указывающее, что аргумент передается по значению;

ByRef – ключевое слово, указывающее, что аргумент передается по ссылке. Описание ByRef используется в VBA по умолчанию;

ParamArray – ключевое слово, которое может использоваться только в качестве последнего элемента в списке <список аргументов> для указания, что конечным элементом является описанный как Optional массив значений типа Variant. Ключевое слово ParamArray позволяет задавать произвольное количество аргументов, оно не может быть использовано со словами ByVal, ByRef или Optional;

<Имя переменной>  имя переменной, удовлетворяющее стандартным правилам именования переменных;

<Тип> – тип данных аргумента, переданного в процедуру;

<По умолчанию> – любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть Nothing.

В качестве результата процедура может возвращать в вы­зывающую программу множество простых или структуриро­ванных величин или не возвращать никаких значений. Среди параметров процедуры указываются как аргументы, так и ре­зультаты.

Обращение к процедуре — отдельный оператор.

Вызов процедуры из другой процедуры можно произвести несколькими способами.

Первый способ:

<Имя процедуры> <Список фактических параметров>

<Имя процедуры>  имя вызываемой процедуры;

<Список фактических параметров> – список аргументов, передаваемых процедуре; он должен соответствовать списку, заданному в процедуре, по количеству и типу.

Второй способ:

Call <Имя процедуры> (<Список фактических параметров>)

Call – служебное слово VBA;

<Имя процедуры>  имя вызываемой процедуры;

<Список фактических параметров> – список аргументов, передаваемых процедуре; он должен соответствовать списку, заданному в процедуре, по количеству и типу.

Заметим, что при втором способе вызова процедуры в отличие от первого список фактических параметров должен быть заключен в круглые скобки; в качестве разделителя в списке используется запятая.

VBA позволяет вводить фактические параметры через имена аргументов в любом порядке и опускать необязательные (Optional). При этом после имени аргумента ставится двоеточие и знак равенства, после которого помещается значение аргумента.

Приведенный ниже пример показывает основные способы обращения к процедуре.

Option Explicit

Dim c As Double

'c - глобальная переменная

Function F(ByVal x As Integer) As Integer

'Функция, возводящая аргумент в квадрат

F = x ^ 2

End Function

Sub Assistant(ByVal a As Integer, ByVal b As Integer)

'Процедура, находящая сумму двух чисел и

'выводящая результат в диалоговом окне

c = a + b

MsgBox "Сумма: " & c, , "Результат"

End Sub

Sub Main()

'Главная процедура, вызывающая подпрограммы

Dim x As Double, y As Double

'Вызов процедуры с конкретными числами как фактическими параметрами

Assistant 1, 3

'Первоначальное присвоение переменным значений,

'с последующим вызовом процедуры

x = 1

y = 1

Assistant x, y + 2

'Использование функции как фактического параметра

x = 1

y = 3

Assistant F(x), y

'Вызов процедуры с указанием фактических параметров по имени

Assistant b:=3, a:=1

'Вызов процедуры с использованием ключевого слова Call

Call Assistant(x, y)

End Sub

Подпрограмма-функция имеет следующий синтаксис:

[Private | Public] [Static] Function <имя функции> [(<список аргументов>)]

         [<Инструкции>]

         [Exit Function]

         [<Инструкции>]

End Sub

Синтаксис инструкции Function содержит те же элементы, что и Sub. Инструкция Exit Function приводит к выходу из функции.

Тип функции может быть только простым типом. Блок содержит локальные для функции описания и раздел операторов. Для возврата значения из функции следует присвоить значение имени функции.

Обращение к функции является операндом в вы­ражении. Подпрограмма-функция вызывается в выражении по своему имени, за которым следует вписок аргументов в скобках.

При обращении к подпрограмме происходит передача ей аргументов по ссылке (если формальный параметр является параметром-переменной, описан как ByRef) или по значению (является параметром-значением, описан как ByVal).

Для того, чтобы понять, в каких случаях использовать тот или иной тип передачи аргументов, рассмотрим, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме.

Если параметр определен как параметр-значение (с помощью ключевого слова ByVal), то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передается подпрограмме. Важно учесть, что даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, все равно подпрограмме будет передана лишь копия переменной (константы). Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей подпрограммой, так как в этом случае изменяется копия фактического параметра.

Если параметр определен как параметр-переменная (по умолчанию или с помощью ключевого слова ByRef), то при вызове подпрограммы передается сама переменная, а не ее копия. Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей подпрограмме.

Если в качестве фактического параметра используется константа, транслятор блокирует любые присваивания константе нового значения в теле подпрограммы.

Представленный ниже пример поясняет изложенное. В программе осуществляется ввод целых чисел, их передача процедуре Удвоение. Один из параметров параметр-переменная, другой – как параметр-значение. Значение параметров до и после вызова процедуры, а так же результат их удвоения выводятся на экран.

Option Explicit

Sub Удвоение(ByRef c As Integer, ByVal d As Integer)

c = c + c

d = d + d

MsgBox "Удвоенные: " & c & ", " & d

End Sub

Sub Основная()

Dim a As Integer, b  As Integer

a = Val(InputBox("Введите а", "Ввод", 5))

b = Val(InputBox("Введите b", "Ввод", 7))

MsgBox "Исходные: " & a & ", " & b

Удвоение a, b

MsgBox "Результат: " & a & ", " & b

End Sub


В результате прогона программы при сохранении вводимых значений переменных a и b по умолчанию будет выведено:

Как видно из примера, удвоение второго формального параметра в процедуре Удвоение не вызвало изменения фактической переменной b, так как этот параметр описан в заголовке процедуры как параметр-значение.

Параметры-переменные используются как средство связи алгоритма, реализованного в подпрограмме, с внешним миром: с помощью этих параметров подпрограмма может передавать результаты своей работы вызывающей программе. В распоряжении программиста всегда есть и другой способ передачи результатов – через глобальные переменные. Однако злоупотребление глобальными связями делает программу, как правило, запутанной, трудной в понимании и сложной в отладке. В соответствии с требованиями хорошего стиля программирования рекомендуется там, где это возможно, использовать передачу результатов через фактические параметры-переменные.

С другой стороны, описание всех формальных параметров как параметров-переменных нежелательно по двум причинам. Во-первых, это исключает возможность вызова подпрограммы с фактическими параметрами в виде выражений, что делает программу менее компактной. Во-вторых, и главных, в подпрограмме возможно случайное использование формального параметра, например, для временного хранения промежуточного результата, т.е. всегда существует опасность непреднамеренно испортить фактическую переменную. Вот почему параметрами-переменными следует объявлять только те, через которые подпрограмма в действительности передает результаты вызывающей программе. Чем меньше параметров объявлено параметрами-переменными и чем меньше в подпрограмме используется глобальных переменных, тем проще программа в понимании и отладке. По этой же причине не рекомендуется использовать параметры-переменные в заголовке функции: если результатом работы функции не может быть единственное значение, то логичнее использовать процедуру или нужным образом декомпозировать алгоритм на несколько подпрограмм.

Демонстрационные примеры:

1. Вычислить разность двух простых дробей:   (a, b, с, d — натуральные числа). Результат получить в виде простой несократимой дроби.

Следует вычислить числитель и знаменатель по правилам вычитания дробей, и сократить их на наибольший общий делитель (НОД). Вычисление НОД двух чисел оформим в виде подпрограммы, используя известный в математике ал­горитм Евклида.

Составим два варианта программы решения этой задачи: с подпрограммой-функцией и подпрограммой-процедурой.

Решение 1

Option Explicit

Function НОД(ByVal M As Integer, ByVal N As Integer) As Integer

'Вычисление НОД двух натуральных чисел по алгоритму Евклида

Do While M <> N

If M > N Then

M = M - N

Else

N = N - M

End If

НОД = M

Loop

End Function

Sub Способ1 ( )

Dim A As Integer, B As Integer, C As Integer, D As Integer, E As Integer, F As Integer

A = Val(InputBox("Ведите числитель первой дроби", "Ввод данных"))

B = Val(InputBox("Ведите знаменатель первой дроби", "Ввод данных"))

C = Val(InputBox("Ведите числитель второй дроби", "Ввод данных"))

D = Val(InputBox("Ведите знаменатель второй дроби", "Ввод данных"))

E = A * D - B * C                                  'Вычисление числителя

F = B * D                                                               'Вычисление знаменателя

If E = 0 Then

MsgBox "Разность дробей" & E, , "Результат"

Else

E = E \ НОД(Abs(E), F)                       'Сокращение дроби

F = F \ НОД(Abs(E), F)

MsgBox "Разность дробей: " & E & "/" & F, , "Результат"

End If

End Sub

Решение 2

Option Explicit

Sub НОД(ByVal M As Integer, ByVal N As Integer, K As Integer)

'Вычисление НОД двух натуральных чисел по алгоритму Евклида

Do While M <> N

If M > N Then

M = M - N

Else

N = N - M

End If

K = M

Loop

End Sub

Sub Способ2 ( )

Dim A As Integer, B As Integer, C As Integer, D As Integer, E As Integer, F As Integer, K As Integer, L As Integer

A = Val(InputBox("Ведите числитель первой дроби", "Ввод данных"))

B = Val(InputBox("Ведите знаменатель первой дроби", "Ввод данных"))

C = Val(InputBox("Ведите числитель второй дроби", "Ввод данных"))

D = Val(InputBox("Ведите знаменатель второй дроби", "Ввод данных"))

E = A * D - B * C                                  'Вычисление числителя

F = B * D                                                               'Вычисление знаменателя

If E = 0 Then

MsgBox "Разность дробей" & E, , "Результат"

Else

НОД Abs(E), F, L                 'Обращение к процедуре

E = E \ L                                 'Сокращение дроби

F = F \ L

MsgBox "Разность дробей: " & E & "/" & F, , "Результат"

End If

End Sub

2. Составить рекурсивную подпрограмму-функцию вычисления факториала целого положительного числа.

Рекурсивной называется подпрограмма, которая в своем описании содержит обращение к самой себе. Функцию N! рекурсивно можно определить, исходя из следующей фор­мулы:

Описание функции на VBA:

Function Factorial(N As Integer) As Long

If N = 0 Then

Factorial = 1

Else

Factorial = Factorial(N - 1) * N

End If

End Function

З. В целочисленной матрице размером 10´10 произвести сортировку чисел в строках по возрастанию значений. Первоначально заполнить матрицу целыми случайными числами в диапазоне от 0 до 100.

Для решения задачи составим процедуру Sortirovka сортировки одномерного массива по убыванию значений. В основной програм­ме используем эту процедуру для сортировки каждой строки матрицы.

Option Explicit

Sub Sortirovka(X() As Integer, s As String)

Dim i As Integer, j As Integer, Z As Integer, s1 As String

Const N As Integer = 10

ReDim Preserve X(N) As Integer

For i = 1 To N

For j = i + 1 To N

If X(i) < X(j) Then

Z = X(j)

X(j) = X(i)

X(i) = Z

End If

Next

s = s & X(i) & "  "

Next

End Sub

Sub SortMatr()

Dim A() As Integer, B() As Integer

Dim m As Integer, k As Integer, t As Integer

Dim str As String, sort_str As String, s1 As String

Const N = 10

ReDim A(N, N) As Integer

ReDim B(N) As Integer

str = ""

sort_str = ""

'Заполнение матрицы случайными числами и

'формирование строки с элементами матрицы

For k = 1 To N

For m = 1 To N

A(k, m) = Int(100 * Rnd + 1)

str = str & A(k, m) & "  "

B(m) = A(k, m)

Next m

str = str & Chr(13)

Sortirovka X:=B, s:=sort_str    'Обращение к процедуре

sort_str = sort_str & Chr(13)   'Формирование строки с результатом

Next k

MsgBox "Исходный массив" & Chr(13) & str & Chr(13) & "Отсортированный массив" &  _

Chr(13) & sort_str

End Sub

Задачи для самостоятельного решения

Каждый студент должен решить одну задачу из блока А, две задачи из блока Б, одну задачу из блока В или Г. При решении задач этой лабораторной работы обязательно использование подпрограмм.

А

1.          Треугольник задан координатами своих вершин. Составить программу вычисления его площади.

2.          Составить программу нахождения наибольшего общего дели­теля и наименьшего общего кратного двух натуральных чисел:

3.          Составить программу нахождения наибольшего общего дели­теля четырех натуральных чисел.

4.          Составить программу нахождения наименьшего общего крат­ного трех натуральных чисел.

5.          Написать программу нахождения суммы большего и меньше­го из 3 чисел.

6.          Вычислить площадь правильного шестиугольника со сторо­ной а, используя подпрограмму вычисления площади тре­угольника.

7.          На плоскости заданы своими координатами n точек. Соста­вить программу, определяющую между какими из пар точек самое большое расстояние. (Указание. Координаты точек зане­сти в массив.)

8.          Проверить, являются ли данные три числа взаимно просты­ми.

9.          Написать программу вычисления суммы факториалов всех нечетных чисел от 1 до 9.

10.       Даны две дроби  и  (А, В, С, D — натуральные числа). Составить программу:
деления дроби на дробь;
умножения дроби на дробь;
сложения этих дробей.
Ответ должен быть несократимой дробью.

11.       На плоскости заданы своими координатами n точек. Создать матрицу, элементами которой являются расстояние между каждой парой точек.

12.       Даны числа X, Y, Z, T  длины сторон четырехугольника. Вычислить его площадь, если угол между сторонами длиной X и прямой.

13.       Сформировать массив X (n), n-ый член которого определяется формулой .

14.       Составить программу вычисления суммы факториалов всех четных чисел от m до n.

15.       Заменить отрицательные элементы линейного массива их мо­дулями, не пользуясь стандартной функцией вычисления мо­дуля. Подсчитать количество произведенных замен.

16.       Дан массив (n). Сформировать массив (m), элементами которого являются большие из двух рядом стоящих в массиве A чисел. (Например, массив A состоит из элементов 1, 3, 5, -2, 0, 4, 0. Элементами массива B будут 3, 5, 4.)

17.       Дан массив (n) ( – четное). Сформировать массив (m), элементами которого являются средние арифметические со­седних пар рядом стоящих в массиве A чисел. (Например, массив A состоит из элементов 1, 3, 5, -2, 0, 4, 0, 3. Элемента­ми массива B будут 2; 1,5; 2; 1,5.)

18.       Дано простое число. Составить функцию, которая будет нахо­дить следующее за ним простое число.

19.       Составить функцию для нахождения наименьшего нечетного натурального делителя k (¹ 1) любого заданного натурально­го числа n.

Б

1.        Дано натуральное число N. Составить программу формирова­ния массива, элементами которого являются цифры числа N.

2.        Заменить данное натуральное число на число, которое полу­чается из исходного записью его цифр в обратном порядке (на­пример, дано число 156, нужно получить 651).

3.        Даны натуральные числа K и N. Составить программу форми­рования массива A, элементами которого являются числа, сумма цифр которых равна K и которые не больше N.

4.        Даны три квадратных матрицы A, B, C n-го порядка. Вывести на печать ту из них, норма которой наименьшая. Нормой мат­рицы считать максимум из абсолютных величин ее элемен­тов.

5.        Два натуральных числа называются “дружественными”, если каждое из них равно сумме всех делителей (кроме его самого) другого (например, числа 220 и 284). Найти все пары “друже­ственных чисел”, которые не больше данного числа N.

6.        Два простых числа называются “близнецами”, если они отли­чаются друг от друга на 2 (например, 41 и 43). Напечатать все пары “близнецов” из отрезка [n, 2n], где заданное нату­ральное число больше 2.

7.        Написать программу вычисления суммы

для заданного числа
n. Дробь  должна быть несократимой (p, натуральные).

8.        Написать программу вычисления суммы  для заданного числа n. Результат представить в виде несокра­тимой дроби  (p, q натуральные).

9.        Натуральное число, в записи которого n цифр, называется числом Амстронга, если сумма его цифр, возведенная в сте­пень n равна самому числу. Найти все эти числа от 1 до k.

10.     Написать программу, которая находит и выводит на печать все четырехзначные числа вида , для которых выполня­ется: а) a, b, c, d — разные цифры; б) .

11.     Найти все простые натуральные числа, не превосходящие n, двоичная запись которых представляет собой палиндром, т.е. читается одинаково слева направо и справа налево.

12.     Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность (напри­мер, 1234, 5789).

13.     Найти все натуральные числа, не превосходящие заданного n, которые делятся на каждую из своих цифр.

14.     Составить программу для нахождения чисел из интервала [М; N], имеющих наибольшее количество делителей.

15.     Для последовательности составить программу печати k-го члена в виде обыкновенной несократимой дроби. Например, .

16.     Дано натуральное число n. Выяснить, можно ли представить n в виде произведения трех последовательных натуральных чисел.

17.     На части катушки с автобусными билетами номера шести­значные. Составить программу, определяющую количество счастливых билетов на катушке, если меньший номер биле­та — N, больший — М (билет является счастливым, если сумма первых трех его цифр равна сумме последних трех).

18.     Написать программу, определяющую сумму n-значных чисел, содержащих только нечетные цифры. Определить также, сколько четных цифр в найденной сумме.

19.     Из заданного числа вычли сумму его цифр. Из результата вновь вычли сумму его цифр и т.д. Через сколько таких дей­ствий получится нуль?

20.     Составить программу разложения данного натурального числа на простые множители. Например, 200 = 23 • 52.

21.     Дано натуральное число n. Найти все меньшие n числа Мерсена. (Простое число называется числом Мерсена, если оно может быть представлено в виде 2p - 1, где p тоже простое число. Например, 31 = 25 – 1 — число Мерсена.)

22.     Дано четное число n>2. Проверить для него гипотезу Гольд­баха: каждое четное n представляется в виде суммы двух про­стых чисел.

В

1.   Реализовать набор подпрограмм для выполнения следующих операций над обыкновенными дробями вида  (Р — целое, Q натуральное): а) сложение; б) вычитание; в) умножение; г) деление; д) со­кращение дроби; е) возведение дроби в степень n (n — натуральное); ж) функции, реализующих операции отношения (равно, не равно, больше или равно, меньше или равно, больше, мень­ше)

1.1.   Дан массив А  массив обыкновенных дробей. Найти сумму всех дробей, ответ представить в виде несократимой дроби. Вычислить среднее арифметическое всех дробей, ответ представить в виде несократимой дроби.

1.2.   Дан массив А — массив обыкновенных дробей. Отсортиро­вать его в порядке возрастания.

2.   Реализовать набор подпрограмм для выполнения следующих операций над векторами: а) сложение; б) вычитание; в) скалярное умножение векторов; г) умножение вектора на число; д) нахождение длины век­тора.

2.1.   Дан массив А — массив векторов. Отсортировать его в по­рядке убывания длин векторов.

2.2    С помощью датчика случайных чисел сгенерировать 2N целых чисел. N пар этих чисел задают N точек координат­ной плоскости. Вывести номера тройки точек, которые яв­ляются координатами вершин треугольника с наибольшим углом.

3.  Реализовать набор подпрограмм для выполнения следующих операций над натуральными числами в Р-ичной системе счис­ления (2 £ Р £ 9): а) сложение; вычитание;  умножение; деление; б) перевод из десятичной системы счисления в Р-ичную; в) перевод из Р-ичной системы счисления в десятичную; г) функция проверки правильности записи числа в Р-ичной системе счисления; д) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).

3.1.   Возвести число в степень (основание и показатель степени записаны в Р-ичной системе счисления). Ответ выдать в Р-ичной и десятичной системах счисления.

3.2.   Дан массив А — массив чисел, записанных в Р-ичной систе­ме счисления. Отсортировать его в порядке убывания. Ответ выдать в Р-ичной и десятичной системах счисления.

4.   Реализовать набор подпрограмм для выполнения следующих операций над натуральными числами в шестнадцатеричной системе счисления: а) сложение; б) вычитание; в) умножение; г) деление; д) перевод из двоичной системы счисления в шестнадцатеричную; е) перевод из шестнадцатеричной системы счисления в деся­тичную; ж) функция проверки правильности записи числа в шестнад­цатеричной системе счисления; з) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, мень­ше).

4.1.   Возвести число в степень (основание и показатель степени записаны в шестнадцатеричной системе счисления). Ответ выдать в шестнадцатеричной и десятичной системах счис­ления.

4.2.   Дан массив А —массив чисел, записанных в шестнадцате­ричной системе счисления. Отсортировать его в порядке убывания. Ответ выдать в шестнадцатеричной и десятич­ной системах счисления.

Г (рекурсивные подпрограммы)

1.     Найдите сумму цифр заданного натурального числа.

2.     Описать функцию C (m, n), где 0 £ m £ n, для вычисления би­номиального коэффициента Cmn по следующей формуле: C0n = Cnn = 1; Cmn = Cmn-1 + Cm-1n-1 при 0 <m < n.

3.     Описать рекурсивную логическую функцию Simm (S, I, J), проверяющую, является ли симметричной часть строки S, на­чинающаяся i-м и заканчивающаяся j-m ее элементами.

4.     Составить программу вычисления НОД двух натуральных чисел.

5.     Составить программу нахождения числа, которое образуется из данного натурального числа при записи его цифр в обрат­ном порядке. Например, для числа 1234 получаем ответ 4321.

6.     Составить программу перевода данного натурального числа в p-ичную систему счисления (2 £ p £9).

7.     Дана символьная строка, представляющая собой запись нату­рального числа в p-ичной системе счисления (2 £ p £ 9). Со­ставить программу перевода этого числа в десятичную систе­му счисления.

8.     Составить программу вычисления суммы: 1! + 2!+3! + ... +n! (n £ 15). (Тип результата значения функции — длинное целое).

9.     Составить программу вычисления суммы: 2! + 4!+6! + ... +n! (n £ 16, – четное). (Тип результата значения функции — длинное целое).