- •7. Одномерные массивы 114
- •8. Обработка двумерных массивов (матриц) 162
- •9. Обработка строк 183
- •10. Тип данных, определенный пользователем. Структуры 214
- •11. Использование подпрограмм 228
- •Приложение 52 310 Список литературы 313 Введение
- •1. Этапы создания Windows-приложения
- •2. Среда Visual Basic 2005
- •2.1. Структура среды Visual Basic 2005
- •2.2. Создание нового проекта
- •2.3. Сохранение проекта
- •2.4. Выполнение приложения
- •2.5. Основные команды среды Visual Basic 2005
- •2.6. Методы тестирования
- •2.7. Отладка приложений в среде vb
- •3. Разработка интерфейса в среде vb. Основные элементы управления
- •3.1. Метка
- •3.2. Текстовое поле
- •3.3. Кнопка
- •3.4. Окно списка
- •3.5. Выравнивание положения элементов управления
- •4. Программа линейной структуры
- •4.1. Понятие переменной
- •4.2. Типы данных
- •4.3. Объявление переменных
- •4.4. Оператор присваивания
- •Оператор присваивания работает справа налево.
- •4.5. Константы
- •4.6. Арифметические операции
- •4.7. Математические функции
- •4.8. Арифметическое выражение
- •4.9. Окно ввода (InputBox)
- •4.10. Окно вывода сообщения (MsgBox)
- •4.11. Пример. Вычисление площади треугольника
- •4.12. Пример. Нахождение цифр числа
- •5. Организация ветвлений
- •5.1. Логические константы и переменные
- •5.2. Операции сравнения
- •5.3. Логические операции
- •5.4. Логическое выражение
- •5.5. Условный оператор
- •5.6. Функция iIf
- •5.7. Оператор множественного ветвления ElseIf
- •5.8. Оператор выбора Select Case
- •5.9. Оператор безусловного перехода GoTo
- •5.10. Пример. Решение линейного уравнения
- •5.11. Пример. Программа-калькулятор
- •6. Программирование повторений
- •6.1. Цикл со счетчиком
- •6.1.1. Табуляция функции
- •6.1.2. Вычисление факториала
- •6.1.3. Обработка совокупности чисел с известным числом элементов
- •6.2. Цикл с условием
- •6.2.1. Ввод с проверкой
- •6.2.2. Обработка совокупности чисел с неизвестным числом элементов
- •6.2.3. Вычисление суммы ряда по общей формуле
- •Вычисление суммы ряда с использованием рекуррентного соотношения
- •6.2.5. Вычисление произведения ряда
- •Решение нелинейных уравнений методом простой итерации
- •7. Одномерные массивы
- •Массивы всегда обрабатываются в цикле.
- •7.1. Ввод массива
- •Вывод массива в окно списка и в текстовое поле
- •7.3. Вычисление суммы и произведения элементов массива
- •7.4. Определение количества элементов массива, удовлетворяющих некоторому условию
- •7.5. Вычисление среднего арифметического и среднего геометрического элементов массива, удовлетворяющих некоторому условию
- •7.6. Нахождение максимального элемента массива
- •7.7. Нахождение минимального элемента массива, удовлетворяющего некоторому условию
- •7.8. Поиск первого элемента массива, удовлетворяющего некоторому условию
- •7.9. Поиск последнего элемента массива, удовлетворяющего некоторому условию
- •7.10. Замена одного элемента массива
- •7.11. Замена всех элементов массива, удовлетворяющих некоторому условию
- •7.12. Перестановка местами двух элементов массива
- •7.13. Формирование нового массива из некоторых элементов исходного массива
- •7.14. Проверка совпадения всех элементов массива
- •7.15. Проверка упорядоченности всех элементов массива
- •7.16. Сортировка массива методом пузырька
- •7.17. Линейная сортировка массива (методом поиска минимума)
- •Никогда нельзя использовать одновременно оба способа перестановки элементов массива.
- •8. Обработка двумерных массивов (матриц)
- •8.1. Ввод прямоугольной матрицы
- •8.2. Вывод прямоугольной матрицы в окно списка и в текстовое поле
- •8.3. Поиск максимального элемента матрицы
- •8.4. Обработка матрицы по строкам
- •8.5. Обработка матрицы по столбцам
- •8.6. Обработка квадратных матриц
- •Для обработки элементов, стоящих на любой диагонали, достаточно одного цикла. Для обработки элементов, принадлежащих к одному из треугольников, необходимо использовать вложенные циклы.
- •9. Обработка строк
- •9.1. Основные функции обработки строк
- •9.2. Посимвольная обработка строки
- •9.3. Формирование массива слов строки
- •9.4. Формирование строки из массива слов
- •9.5. Слова-палиндромы
- •9.6. Выделение чисел из строки
- •9.7. Сравнение строк
- •9.8. Обработка многострочного текста
- •10. Тип данных, определенный пользователем. Структуры
- •10.1. Описание структуры. Область видимости. Понятие метода
- •10.2. Оператор With
- •10.3. Ввод массива структур
- •10.4. Вывод массива структур
- •10.5. Поиск в массиве структур
- •10.6. Формирование нового массива из некоторых элементов исходного массива
- •10.7. Сортировка массива структур
- •11. Использование подпрограмм
- •11.1. Определение процедуры и функции. Описание процедуры и функции
- •11.2. Передача параметров по ссылке и по значению
- •11.3. Формальные параметры и фактические переменные
- •11.4. Локальные и глобальные переменные
- •11.5. Static-переменные
- •Приложение 1
- •Приложение 2
- •Приложение 3
- •Приложение 4
- •Приложение 5
- •Приложение 6
- •Приложение 7
- •Приложение 8
- •Приложение 9
- •Приложение 10
- •Приложение 11
- •Приложение 12
- •Приложение 13
- •Приложение 14
- •Приложение 15
- •Приложение 16
- •Приложение 17
- •Приложение 18
- •Приложение 19
- •Приложение 20
- •Приложение 21
- •Приложение 22
- •Приложение 23
- •Приложение 24
- •Приложение 25
- •Приложение 26
- •Приложение 27
- •Приложение 28
- •Приложение 29
- •Приложение 30
- •Приложение 31
- •Приложение 32
- •Приложение 33
- •Приложение 34
- •Приложение 35
- •Приложение 36
- •Приложение 37
- •Приложение 38
- •Приложение 39
- •Приложение 40
- •Приложение 41
- •Приложение 42
- •Приложение 43
- •Приложение 44
- •Приложение 45
- •Приложение 46
- •Приложение 47
- •Приложение 48
- •Приложение 49
- •Приложение 50
- •Приложение 51
- •Приложение 52
- •Список литературы
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.Пример решения задачи с использованием подпрограмм