Лекция 9
Присвоение массивов
Описание динамического массива
Если массив описан как динамический, можно изменять его размер во время работы программы. Для описания динамического массива используются инструкции Static, Dim, Private или Public с пустыми скобками:
Dim a2 () As Single
При выполнении программы можно переобъявлять динамический массив с помощью инструкции ReDim.
Среди инструкций некоторой процедуры или функции можно записать:
ReDim a2 (5, 1 To 10)
Далее этот массив может быть переопределен:
ReDim a2 (15)
С помощью инструкции ReDim можно изменять размер массива (число элементов), верхние и нижние границы индексов, а также количество размерностей (индексов). Инструкцию ReDim можно применять для изменения динамического массива столько раз, сколько потребуется. Однако при каждом применении данные, содержащиеся в массиве, теряются.
Инструкция ReDim Preserve может увеличить размер массива, сохраняя при этом его содержимое. В следующем примере показывается, как можно увеличить размер массива a4 на 10 элементов без уничтожения текущих значений элементов массива. Пусть был объявлен динамический массив
Dim a4 () As Integer
Затем в программе установлен размер этого массива
ReDim a4 (n)
Далее в программе может быть, например, записано
ReDim Preserve a4(n+10)
Использование зарезервированных слов ReDim Preserve вместе с динамическим массивом позволяет изменить только верхнюю границу и только последней размерности массива. Изменение числа размерностей невозможно.
Начиная с VB 6.0, имеется возможность присвоить содержимое одного массива другому так же, как это делается для простых переменных. Но эти массивы должны иметь одинаковые значения размерностей и одинаковое количество элементов. Если же в левой части оператора присвоения стоит динамический массив, то совпадение размерностей и числа элементов не обязательно. Размерность и число элементов массива в левой части оператора присвоения при необходимости изменятся.
Пример. Найти значение наибольшего элемента одномерного массива.
1. Выбор данных.
Исходные данные:
k – Переменная целого типа, число заданных величин;
a ( ) – динамический массив с плавающей точкой обычной точности, значения заданных величин.
Результаты:
НаибЭлем – переменная с плавающей точкой обычной точности, значение наибольшего среди рассмотренных элементов массива a;
Промежуточные:
i – переменная целого типа, значение индекса элемента массива x.
2. Построение блок-схемы алгоритма (см. рис. 9.1).
Ввод массива представлен укрупненным блоком (блок 2). Основой алгоритма является цикл (блоки 4 – 8). В этот цикл входит разветвление (блоки 6 и 7).
3. Разработка интерфейса проекта
Воспользуемся тем же интерфейсом проекта, который был применен для примера, рассмотренного в предыдущей лекции (подробнее).
4. Составление программы.
Option Explicit
Option Base 1
Private Sub Command1_Click()
1: Dim i As Integer, k As Integer
Dim a() As Single
Dim НаибЭлем As Single
Cls
5: k = InputBox("Введите k")
Print "k= " & k
ReDim a(k)
Print "Ввод вектора а"
Ввод_вектора a
10: НаибЭлем = a(1)
For i = 2 To k
If a(i) > НаибЭлем Then НаибЭлем = a(i)
Next
Print "Наибольший элемент равен "; НаибЭлем
End Sub
Private Sub Ввод_вектора(x() As Single)
1: Dim i As Integer
Dim i_min As Integer
Dim i_max As Integer
i_min = LBound(x)
5: i_max = UBound(x)
For i = i_min To i_max
x(i) = InputBox("Элемент вектора (" _
& i & ")=?", "Ввод вектора")
Print x(i),
Next
End Sub
В этой программе применяется динамический массив a. В строке 9 тела процедуры Command1_Click происходит обращение к процедуре Ввод_вектора, которая обеспечивает ввод всех элементов массива a. Упрощенно можно действие этого обращения понимать так, как будто на месте строки 9 выполняется все тело процедуры Ввод_вектора, во всех инструкциях которого имя x заменено на имя a. Процедура Ввод_вектора обеспечивает не только ввод значений всех элементов массива, но печать на форме их значений для контроля правильности задания значений при вводе. В этой процедуре применяется обращение к функция LBound(x), которая возвращает наименьшее значение индекса массива, имя которого является аргуменом этой функции. В процедуре Ввод_вектора также применяется обращение к функция UBound(x), которая возвращает наибольшее значение индекса массива, имя которого является аргуменом этой функции.
Инструкция, находящаяся в стоке 8 процедуры Ввод_вектора, обеспечивает печать элемента массива. Следующий элемент массива будет выведен в той же самой строке (подробнее).
Инструкция, находящаяся в стоке 10 процедуры Ввод_вектора, нужна, чтобы следующая (если такая есть) инструкция Print после выхода из процедуры Ввод_вектора выводила информацию на форме не в той же самой, а в следующей строке.