Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КИТ_лабораторные_VBA.doc
Скачиваний:
174
Добавлен:
11.05.2015
Размер:
3.07 Mб
Скачать

4.8 Подпрограммы

Во многих случаях удобно выделить часть программы в отдельную процедуру (подпрограмму) и вызывать ее для выполнения из другой процедуры. Подпрограмма может иметь входные и выходные параметры. Входные параметры – это величины, передаваемые в подпрограмму из другой (вызывающей) процедуры и являющиеся для вызываемой подпрограммы «исходными данными». Этими величинами могут быть как переменные, так и константы (например, конкретные числа). Выходные параметры – это переменные, являющиеся результатами выполнения вызываемой подпрограммы.

Пример 4.18 – Требуется разработать программу для составления массива из элементов арифметической прогрессии. Первый элемент прогрессии a1, шаг прогрессии d и необходимое количество элементов n указываются пользователем. Составление массива требуется реализовать как подпрограмму.

Sub primer4_18()

Dim a1 As Single, d As Single, n As Byte, a() as Single

a1 = InputBox("Введите первый элемент прогрессии ")

d = InputBox("Введите шаг прогрессии ")

n = InputBox("Укажите, сколько элементов требуется ")

ReDim a (1 To n) ‘a – массив из элементов прогрессии, который требуется составить

Call arif_progr(a1, d, n, a)

For i = 1 To n

MsgBox(i & “-й элемент прогрессии равен “ & a(i))

Next i

End Sub

Sub arif_progr(nach, shag, kol, elem)

elem(1) = nach

For i=2 To kol

elem(i) = elem(i-1)+shag

Next i

End Sub

Здесь подпрограмма primer4_18 является вызывающей (или основной) подпрограммой, а arif_progr – вызываемой подпрограммой. Таким образом, данная программа в целом состоит из двух подпрограмм. При ее запуске курсор должен находиться в пределах текста основной подпрограммы.

В начале основной подпрограммы выполняется ввод данных, а также объявление массива a, который должен быть составлен в результате выполнения программы.

Оператор Call – вызов подпрограммы. В данном примере он имеет следующий вид: Call arif_progr(a1, d, n, a). Здесь arif_progr – имя вызываемой подпрограммы. Переменные a1, d и n – входные параметры, так как при вызове подпрограммы их значения уже заданы. Переменная a – выходной параметр, так как она определяется в результате выполнения подпрограммы.

Следующая строка представляет собой заголовок подпрограммы:

Sub arif_progr(nach, shag, kol, elem)

Количество параметров в вызове подпрограммы (т.е. в операторе Call) и в ее заголовке должно совпадать, и порядок параметров в этих операторах должен соответствовать друг другу.

В данном примере при вызове подпрограммы arif_progr переменная nach получает значение переменной a1, переменная shag – значение d, переменная kol – значение n. Переменная elem получает значение переменной a, т.е. она будет представлять собой массив из n элементов; так как этим элементам в основной программе не было присвоено никакого значения, они равны нулю.

Затем выполняется подпрограмма arif_progr. В результате ее выполнения вычисляются элементы массива elem. Эти же значения получают и соответствующие элементы массива a в основной программе.

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

Примечание – В данном примере имена переменных в основной программе (a1, d, n и a) отличаются от имен соответствующих переменных в вызываемой подпрограмме (nach, shag, kol и elem). Эти имена могут и совпадать.

В качестве входных параметров могут использоваться не только переменные, но и константы. Пусть, например, в рассматриваемой задаче не требуется запрашивать у пользователя начальный элемент прогрессии и ее шаг: задано, что a1 = 5, d = 2. У пользователя запрашивается только количество элементов прогрессии, которые требуется вычислить. Тогда вызов подпрограммы мог бы иметь следующий вид: Call arif_progr(5, 2, n, a). Никаких изменений в самой подпрограмме arif_progr при этом не требуется. При вызове подпрограммы переменная nach получит значение 5, а переменная shag – значение 2. Все остальные действия выполняются точно так же, как описано выше.

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

Пример 4.19 – Требуется разработать подпрограмму, которая бы меняла местами два столбца в двумерном массиве.

Private m As Byte

Sub primer4_19()

Dim a() As Single, k1 As Byte, k2 As Byte, n As Byte

‘a – двумерный массив из m строк и n столбцов

… ‘Объявление и ввод массива (см. примеры, рассмотренные выше).

‘k1 и k2 – номера столбцов, которые требуется поменять местами

k1 = InputBox("Введите первый номер столбца ")

k2 = InputBox("Введите второй номер столбца ")

Call obmen_stolbcov(a, k1, k2)

For i = 1 To m

For j = 1 To n

MsgBox("a(" & i & "," & j & ") = " & a(i,j)) ‘Вывод измененного массива на экран

Next j

Next i

End Sub

Sub obmen_stolbcov(massiv, k1, k2)

For i=1 To m

x = massiv(i, k1)

massiv(i, k1) = massiv(i, k2)

massiv(i, k2) = x

Next i

End Sub

Здесь переменная m (количество строк в массиве) используется в обеих процедурах (primer4_19 и obmen_stolbcov), поэтому ее требуется объявить как переменную уровня модуля, т.е. в операторе Private перед текстом процедур.

В подпрограмму obmen_stolbcov передаются три входных параметра: массив a (в подпрограмме он получает имя massiv) и номера столбцов k1 и k2 (в подпрограмме они получают такие же имена – k1 и k2). В подпрограмме массив изменяется: столбцы с номерами k1 и k2 меняются местами. Измененный массив возвращается в основную подпрограмму.

Примечание – Вместо того, чтобы объявлять переменную m в операторе Private (т.е. как переменную уровня модуля), можно было передать ее в процедуру obmen_stolbcov в качестве одного из параметров.