Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab5.doc
Скачиваний:
4
Добавлен:
14.08.2019
Размер:
90.62 Кб
Скачать

2.5Рекурсивные процедуры и функции

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

Fact(n) =n!, где Fact (0) =1.

Ясно, что

Fact(n) = n Fact (n - 1}

Основываясь на данном соотношении, приводимая ниже рекурсивная функция вычисляет значение факториала.

Function Fact(n As Integer) As Integer

If n<l Then

Fact = 1 Else

Fact = Fact(n - 1) n

End If

End Function

Другим стандартным примером применения рекурсивных функций является нахождение наибольшего общего делителя двух целых чисел по алгоритму Евклида. Наибольший общий делитель (нод) двух целых чисел — это наибольшее целое, на которое делятся оба числа. Например, HOД(10, 14} = 2 и НОД (15, 31} = 1.

Алгоритм Евклида состоит в следующем:

Если а делится на b, то НОД(а, b) = b

В противном случае — НОД(а, b) = НОД(b, a Mod b) Приводимая ниже рекурсивная функция программирует алгоритм Евклида.

Function НОД(Целое1 As Long, Целое2 As Long) As Long

If Целое2 Mod Целое1 = 0 Then

НОД = Целое1 Else

НОД = НОД(Целое2, Целое1 Mod Целое2)

End If

End Function

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

2.6Область определения переменной

Область определения переменной задает область, в которой может быть использована переменная. В VBA имеется три соответствующих уровня переменных:

Переменные уровня процедуры используются только в процедуре, в которой они описаны при помощи инструкции Dim, размещенной в процедуре.

Переменные уровня модуля используются только в модуле, в котором они описаны при помощи инструкции Dim, размещенной в области описания модуля, т. е. перед описанием процедур.

Общие переменные, используемые во всех модулях данного проекта. Описываются при помощи инструкции Public, размещенной в области описания модуля.

2.7Время жизни переменной

Личная (private) переменная сохраняет свое значение только пока выполняется процедура, в которой эта переменная описана. При завершении процедуры значение переменной теряется, и при повторном запуске процедуры его надо заново инициализировать. Переменные, описанные при помощи инструкции Static, сохраняют свое значение по выходу из процедуры, но пока работает программа.

2.8Использование функций пользователя на листе Excel

Вызов функции осуществляется по имени так же, как и любой другой встроенной функции Excel.

Function Ad() As String

Ad = Selection.Address

End Function

Запись в ячейке =Ad() приведёт к отображению адреса этой ячейки.

Если после заголовка указать инструкцию Application.Volatile, значение функции будет автоматически пересчитываться при каждом изменении данных листа. Эта функция будет отображать то, что и положено – последнюю изменённую ячейку или диапазон.

Function SumMas(Mas() As Integer) As Integer

M = LBound(Mas)

n = UBound(Mas)

s = 0

For i = M To n

s = s + Mas(i)

Next i

SumMas = s

End Function

Sub sss()

Dim M(1 To 20) As Integer

For i = 1 To 20

M(i) = Rnd * 100

Next i

s = SumMas(M)

MsgBox (s)

s = 0

For i = 1 To 20

s = s + M(i)

Next i

MsgBox (s)

End Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]