Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
В том случае, когда в программе выполняется вызов процедуры или функции, то в качестве параметров необходимо указать имена тех переменных, значения которых требуется в данный момент обработать.
Ниже приведен пример пользовательской функции, вычисляющей значение факториала для заданного числа.
Листинг 6.8. Программа с вычислением факториала
Private Sub ComniandButton1_Click ()
Dim bytN As Byte
Dim strInput
Dim intR As Integer
strlnput = InputBox(_ "Ввод факториала:", "Ввод")
bytN = CByte(strlnput)
intR = MsgBox(Fact(bytN),, "Вывод")
End Sub
Function Fact(bytA As Byte) As Integer
Dim bytl As Byte
Dim intFact As Integer
intFact = 1
For bytl = 1 To bytA
intFact = intFact * bytl
Next
Fact = intFact
End Function
В результате выполнения приведенного кода при нажатии на кнопку (объект CommandButton1, процедура обработки события CommandButton1_Click) пользователю будет предложено ввести число, для которого необходимо вычислить факториал. После ввода на экран выведется сообщение о полученном результате.
Следует отметить, что для объявляемой процедуры или функции, так же, как и для переменной, может быть задана область ее видимости при помощи служебных слов Private или Public.
Основные отличия функции от процедуры:
1. Функция имеет тип (аналогично переменной) и может возвращать в программу значение, которое присваивается функции при помощи следующего оператора:
название функция = значение
2. Вызов функции, как правило, осуществляется посредством указания в правой части какого-либо оператора ее имени и параметров. С другой стороны, процедуры вызываются при помощи отдельного оператора:
Call процедура (параметры) или
процедура (параметры)
Если при вызове процедуры используется ключевое слово Call, то список ее параметров должен быть указан в скобках. Если же процедура вызывается без использования Call. то ее параметры перечисляются без скобок.
Необходимо отметить, что вызываемая процедура может не иметь параметров. В этом случае (если использовалось служебное слово Call) после имени процедуры следует ставить пустые скобки.
Пользовательские процедуры обычно используются при необходимости выполнения одной и той же последовательности операций. Например, в программе требуется неоднократно вводить в цикле значения массива аrrА, состоящего из пяти элементов. В этом случае заполнение массива лучше всего оформить в виде процедуры.
Листинг 6.9. Заполнение массива при помощи процедуры
Private arrA(1 То 5) As Integer
Option Explicit
Private Sub CommandButtonl_Click ()
Dim inti As Integer
Dim intR As Integer
Dim intMessage As Integer
Call InputArray
intR = 0
For inti = 1 To 5
intR = intR + arrA(intI)
Next
intR = intR / 5
intMessage = MsgBox(intR)
End Sub
Sub InputArray()
Dim strl
Dim intl As Integer
For intl = 1 To 5
strl = InputBox("Bвoд " & intl & " элемента:")
arrA(intI) = CInt(strI)
Next
End Sub
При запуске приведенной программы пользователю предлагается ввести поочередно 5 элементов массива аrrА. После этого вычисляется и выводится на экран среднее значение введенных элементов.
В данном примере у процедуры InputArray отсутствовали параметры, при этом массив, элементы которого вводились, был объявлен переменной уровня модуля (Private) в разделе Declarations. Такое описание было выполнено для того, чтобы в процедуре InputArray существовала возможность изменения его элементов. С другой стороны, если переменная описана в процедуре как локальная (Dim или Static), то доступ к ней из других процедур невозможен.
Параметры могут передаваться в процедуры или функции двумя способами:
1. Передача параметров по ссылке. Такие параметры еще называют параметрами-переменными. Данный режим в языке Visual Basic используется по умолчанию. При этом вызываемая процедура может изменить значения тех переменных, которые ей передаются в качестве параметров.
2. Передача параметров по значению. Эти параметры носят также название параметров-значений. При вызове процедуры в таком режиме, значения переменных, которые используются в качестве параметров, не изменятся. Т. е. в этом случае изменениям будут подвержены только "копии" переменных, передаваемых в процедуру.
Ниже приведен пример программы с процедурами, поясняющий возможные способы передачи параметров.
Листинг 6.10. Передача параметров по ссылке и по значению
Private Sub CommandButtonl_Click()
Dim x, у
x = 3
у = 5
Call ByReference(x, у) ' Результат: x = 4, у = 6
x = 3
у = 5
Call ByValue(x, у) ' Результат: x = 4, у = 5
End Sub
' Передача параметров по ссылке
Sub ByReference(a, b)
а = а + 1
b =b + 1
End Sub
' Передача параметров по значению
Sub ByValue(a, ByVal b)
a = a + 1
b = b + 1
End Sub
Вызов процедуры ByReference приводит к тому, что значения обеих переменных х и у, используемых в качестве параметров, увеличиваются на 1.
После вызова процедуры ByValue изменяется значение только переменнойх, в противоположность которой переменная у остается без изменений. Использование при описании
параметра b служебного слова ByVal привело к тому, что в переменную у при выполнении процедуры ByValue не будет передано никакого значения.
Среди параметров процедуры или функции могут быть как обязательные, указание которых необходимо, так и необязательные, которые при вызове можно не задавать. Объявление необязательных параметров при описании процедуры осуществляется при помощи служебного слова Optional, указываемого перед именем соответствующего параметра. При этом во всплывающей подсказке для процедуры он будет изображаться в квадратных скобках (см. рис. 6.19).
Если необязательный параметр не указан при вызове процедуры или функции, то его значение принимается по умолчанию как нулевое для соответствующего типа, или как Error для типа Variant. В последнем случае для проверки на наличие параметра следует использовать функцию isMissing с указанием имени, результатом которой будет значение True, если параметр указан, иначе - значение False.
Ниже приведен пример с использованием необязательных параметров при вызове процедур.
Листинг 6.11. Использование необязательных параметров
Private vntA As Byte, vntB As Byte
Option Explicit
Private Sub ConunandButtonI Click()
vntA =5
vntB = 10
Call Opt(vntA, vntB) ' Результат: vntA = 6, vntB =11
vntA = 5
vntB = 10
Call Opt(vntA) ' Результат: vntA = 6, vntB = 10
End Sub
Private Sub Opt(a As Byte, Optional b As Byte)
a = a + 1
If Not IsMissing(b) Then b = b + 1
Дата публикования: 2015-01-23; Прочитано: 221 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!