Лекция 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

Print

End Sub

 

В этой программе применяется динамический массив a. В строке 9 тела процедуры Command1_Click происходит обращение к процедуре Ввод_вектора, которая обеспечивает ввод всех элементов массива a. Упрощенно можно действие этого обращения понимать так, как будто на месте строки 9 выполняется все тело процедуры Ввод_вектора, во всех инструкциях которого имя x заменено на имя a. Процедура Ввод_вектора обеспечивает не только ввод значений всех элементов массива, но печать на форме их значений для контроля правильности задания значений при вводе. В этой процедуре применяется обращение к функция LBound(x), которая возвращает наименьшее значение индекса массива, имя которого является аргуменом этой функции. В процедуре Ввод_вектора также применяется обращение к функция UBound(x), которая возвращает наибольшее значение индекса массива, имя которого является аргуменом этой функции.

Инструкция, находящаяся в стоке 8 процедуры Ввод_вектора, обеспечивает печать элемента массива. Следующий элемент массива будет выведен в той же самой строке (подробнее).

Инструкция, находящаяся в стоке 10 процедуры Ввод_вектора, нужна, чтобы следующая (если такая есть) инструкция Print после выхода из процедуры Ввод_вектора выводила информацию на форме не в той же самой, а в следующей строке.