Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual Basic 2005 (word97).doc
Скачиваний:
296
Добавлен:
09.02.2015
Размер:
7.31 Mб
Скачать

11.3. Формальные параметры и фактические переменные

Параметры, указанные в заголовке подпрограммы, называются формальными. При обращении к подпрограмме на их место подставляются значения фактических (реальных) переменных. При этом по правилам Visual Basic 2005 не требуется совпадения имен формальных параметров и фактических переменных. Но обязательно должно совпадать количество формальных параметров и фактических переменных, а так же их типы. То есть каждая фактическая переменная должна по типу данных совпадать с соответствующим по порядку формальным параметром. Нарушение этого правила считается в Visual Basic 2005 синтаксической ошибкой, которая не позволяет запустить составленную программу.

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

Дан целочисленный массив. Количество элементов и их значения вводятся с клавиатуры. В новый массив перенести четные элементы исходного массива. Исходный и сформированный массивы вывести в окно списка. Определить, есть ли в новом массиве отрицательные числа. Найти количество нулей в новом массиве.

При решении задачи использовать следующие подпрограммы:

  • процедуру ввода массива;

  • процедуру вывода массива в окно списка;

  • процедуру формирования нового массива;

  • функцию, проверяющую, есть ли в массиве отрицательные числа;

  • функцию для определения количества нулей в массиве.

Сначала составим все необходимые подпрограммы. Начнем с процедуры ввода одномерного массива. В процессе ввода массива мы определяем количество элементов в этом массиве и их значения. Исходных данных у этой подпрограммы нет, следовательно, у нее не будет входных параметров. Результатами подпрограммы будут целочисленный массив a()и номер последнего элемента в этом массиве –n. Так как у подпрограммы два результата, то она будет процедурой. Выходные параметры процедуры всегда передаются по ссылке, поэтому перед ними поставим ключевое словоByRef.

Private Sub vvod(ByRef a() As Integer, _

ByRef n As Integer)

Для обработки одномерного массива нам потребуется организовать цикл со счетчиком. Опишем целочисленную переменную i, которая будет счетчиком цикла.

Dim i As Integer

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

Do

n = Val(InputBox("Количество элементов"))

Loop Until n > 0

В Visual Basic 2005 нумерация элементов массива идет с нуля, поэтому номер последнего элемента массива всегда будет на единицу меньше общего количества элементов.

n -= 1

Задаем размер массива a().

ReDim a(n)

Организуем цикл для ввода всех элементов массива.

For i = 0 To n

Так как элементами массива являются целые числа, то при их вводе необходимо использовать преобразование Val.

a(i) = Val(InputBox("Введите " + Str(i) + _

"-й элемент массива"))

Next

End Sub

Следующая подпрограмма, которую мы будем разрабатывать, - это подпрограмма вывода одномерного массива. Она тоже будет являться процедурой, так как в ней не вычисляются никакие значения. Соответственно, у этой процедуры нет выходных параметров, а есть только входные. Ими являются целочисленный массив a() и номер последнего элемента в этом массиве –n. Так как при выводе массиве не происходит изменения значений его элементов, то эти параметры мы будем передавать по значению. Для этого поставим перед ними ключевое словоByVal.

Private Sub Vyvod(ByVal a() As Integer, _

ByVal n As Integer)

Описываем целочисленную переменную i, которая будет счетчиком цикла, необходимого для обработки одномерного массива.

Dim i As Integer

Организуем цикл по всем элементам массива от нулевого до последнего.

For i = 0 To n

На каждом шаге цикла в окно списка выводим номер элемента и его значение. Использование константы vbTabпозволяет организовать вывод в две колонки.

lstA.Items.Add(Str(i) + vbTab + Str(a(i)))

Next

End Sub

Теперь рассмотрим подпрограмму формирования нового массива. Исходными данными для этой задачи будут целочисленный массив a()и номер последнего элемента в этом массиве –n. Так как в процессе формирования исходный массив не меняется, то входные параметры будем передавать по значению. Поэтому перед ними поставим ключевое словоByVal. Результатами подпрограммы формирования будут новый массивb(), элементы которого должны иметь тот же тип данных, что и в исходном массивеa(), и номер последнего элемента в новом массиве –k. Так как у данной подпрограммы два результата и, соответственно, два выходных параметра, то она будет являться процедурой. Чтобы результаты процедуры формирования нового массива были доступны в вызывающей программе, передадим их по ссылке. Для этого перед каждым выходным параметром поставим ключевое словоByRef.

Private Sub formirovanie(ByVal a() As Integer, _

ByVal n As Integer, _

ByRef b() As Integer, _

ByRef k As Integer)

Описываем целочисленную переменную i, которая будет счетчиком цикла, необходимого для обработки одномерного массива.

Dim i As Integer

Перед началом формирования новый массив пуст. В нем не содержится ни одного элемента. Поэтому начальное значение количества элементов в новом массиве возьмем равным -1.

k = -1

Организуем цикл для обработки всех элементов исходного массива от нулевого до последнего.

For i = 0 To n

Анализируем очередной элемент массива.

If a(i) Mod 2 = 0 Then

Если этот элемент без остатка делится на два, значит, он является четным, и его надо перенести в новый массив. При этом количество элементов в новом массиве увеличится на единицу.

k += 1

Изменяем размер формируемого массива b(). Использование ключевого словаPreserveпозволит нам сохранить в массиве все ранее перенесенные в него элементы.

ReDim Preserve b(k)

На последнее место в новом массиве b()записываем анализируемый элемент исходного массиваa().

b(k) = a(i)

End If

Next

По окончании цикла новый массив полностью сформирован.

End Sub

Следующая подпрограмма, которую нам необходимо составить, это подпрограмма, проверяющая, есть ли в массиве отрицательные числа. Исходными данными для этой подпрограммы будут целочисленный массив a()и номер последнего элемента в этом массиве –n. Так как в процессе формирования исходный массив не меняется, то входные параметры будем передавать по значению. Поэтому перед ними поставим ключевое словоByVal. Результатом подпрограммы будет логическая константаTrue(если в массиве есть отрицательные числа) илиFalse(если в массиве нет отрицательных чисел). Так как у подпрограммы один результат, который выражается логической константой, то она будет функцией, возвращающей значение типаBoolean.

Private Function Proverka(ByVal a() As Integer, _

ByVal n As Integer) As Boolean

Описываем целочисленную переменную i, которая будет счетчиком цикла, необходимого для обработки одномерного массива.

Dim i As Integer

Организуем цикл для обработки всех элементов исходного массива от нулевого до последнего.

For i = 0 To n

Анализируем очередной элемент массива.

If a(i) < 0 Then

Если значение данного элемента массива является отрицательным, значит, в массиве есть отрицательные числа, и функция должна вернуть значение True.

Return True

После оператора Returnвыполнение функции прекращается.

End If

Next

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

Return False

End Function

Последняя из разрабатываемых подпрограмм – это подпрограмма определения количества нулей в массиве. Исходными данными для этой подпрограммы будут целочисленный массив a()и номер последнего элемента в этом массиве –n. Так как в процессе подсчета количества нулей исходный массив не меняется, то входные параметры будем передавать по значению. Поэтому перед ними поставим ключевое словоByVal. Результатом подпрограммы будет целое число, показывающее, сколько элементов массива равны нулю. Так как у подпрограммы один результат, который выражается целым числом, то она будет функцией, возвращающей значение типаInteger.

Private Function kolichestvo(ByVal a() As Integer, _

ByVal n As Integer) As Integer

Описываем целочисленные переменные iиkol. Переменнаяiявляется счетчиком цикла, необходимого для обработки одномерного массива. В переменнойkolбудет храниться количество нулей в обрабатываемом массиве.

Dim i, kol As Integer

Перед началом анализа мы предполагаем, что в массиве нет элементов, равных нулю. Поэтому начальное значение переменной kolзададим равным нулю.

kol = 0

Организуем цикл для обработки всех элементов исходного массива от нулевого до последнего.

For i = 0 To n

Анализируем очередной элемент массива.

If a(i) = 0 Then

Если значение этого элемента массива равно нулю, значит, искомое количество надо увеличить на единицу.

kol += 1

End If

Next

После завершения цикла в переменной kolхранится количество элементов массива, значение которых равно нулю. Следовательно, значение этой переменной надо вернуть в вызывающую программу в качестве результата функции. Для этого используем операторReturn.

Return kol

End Function

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

Dim a() As Integer

Номер последнего элемента этого массива будем хранить в переменной n.

Dim n As Integer

Формируемый массив назовем b(). Его тип данных должен совпадать с типом данных массиваa().

Dim b() As Integer

Номер последнего элемента в новом массиве будем хранить в переменной k.

Dim k As Integer

Переменная kolнам потребуется для хранения количества нулей в новом массиве.

Dim kol As Integer

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

lstA.Items.Clear()

Вызываем процедуру ввода массива. Для этого указываем ее имя и в круглых скобках перечисляем фактические переменные, которые будут подставлены на место формальных параметров. Обратите внимание на то, что в заголовке процедуры сначала указан массив, а затем номер последнего элемента. Поэтому при вызове подпрограммы мы должны передавать фактические переменные в таком же порядке.

vvod(a, n)

В окно списка выводим поясняющий текст и заголовки колонок.

lstA.Items.Add("Исходный массив")

lstA.Items.Add("Номер" + vbTab + "Значение")

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

Vyvod(a, n)

На следующем шаге мы вызываем процедуру формирования нового массива.

formirovanie(a, n, b, k)

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

lstA.Items.Add("-------------------------------")

Анализируем номер последнего элемента в новом массиве.

If k = -1 Then

Если этот номер равен -1, значит, в новом массиве нет ни одного элемента, то есть он пуст. В этом случае вместо массива выводим поясняющий текст.

lstA.Items.Add("Новый массив пуст")

Else

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

lstA.Items.Add("Новый массив")

Затем вызываем процедуру вывода массива, указывая ее имя и фактические переменные. Обратите внимание на то, что для вывода двух разных массивов мы используем одну и ту же процедуру, но с разными фактическими переменными. Причем во втором случае имена формальных параметров и фактических переменных не совпадают. Это разрешено правилами Visual Basic 2005, если типы фактических переменных совпадают с типами соответствующих формальных параметров. В заголовке процедуры вывода массива сначала указан целочисленный массив, а потом номер последнего элемента в этом массиве. Поэтому при вызове данной процедуры мы обязаны сначала указать имя выводимого массива, а только потом номер последнего элемента в этом массиве. При другом порядке перечисления фактических переменных возникнет синтаксическая ошибка, которая не позволит запустить программу.

Vyvod(b, k)

После вывода сформированного массива проверяем, есть ли в нем отрицательные числа. Для этого используем разработанную функцию Proverka. Заметьте, как отличается вызов функции от вызова процедуры. Процедуру мы вызываем на отдельной строке программы, то есть пользуемся ей как самостоятельным оператором Visual Basic 2005. А Функция может вызываться только в составе какого-нибудь выражения. В данном случае функцияProverkaвызывается в качестве логического выражения в составе условного оператора. И обратите внимание на то, что имена формальных параметров и фактических переменных не совпадают.

If Proverka(b, k) Then

Если функция Proverka вернула значениеTrue, значит, в массиве есть отрицательные числа. Поэтому мы выводим соответствующее сообщение.

lstA.Items.Add("Есть отрицательные числа")

Else

Иначе, когда функция Proverkaвозвращает значениеFalse, мы делаем вывод, что отрицательных чисел в массиве нет.

lstA.Items.Add("Нет отрицательных чисел")

End If

Теперь мы можем узнать, сколько нулей содержится в новом массиве. Для этого воспользуемся функцией kolichestvo. Результат этой функции запишем в переменнуюkol. Для этого воспользуемся оператором присваивания. В левой части оператора будет стоять переменнаяkol, а в правой – вызов функцииkolichestvo. В качестве фактических переменных передадим в функцию массивb()и номер последнего элемента в этом массиве –k.

kol = kolichestvo(b, k)

Анализируем полученный результат.

If kol = 0 Then

Если значение переменной kolравно нулю, значит, в массивеb()нет ни одного нуля. Поэтому вместо искомого значения мы выводим поясняющий текст.

lstA.Items.Add("В массиве нет нулей")

Else

В противном случае мы выводим найденное значение.

lstA.Items.Add("Количество нулей =" + _

Str(kol))

End If

End If

Текст данной программы представлен в приложении 52. Примеры работы программы при различных исходных данных приведены на рис. 71.

Рис. 71.Пример решения задачи с использованием подпрограмм

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