Динамические массивы
Статические массивы
Статические массивы не меняют размерности и размера в процессе выполнения программы.
Объявление статических массивов.
Одномерный массив:
Dim <имя_массива (верхняя граница индекса)> As тип
Нижняя граница индекса по умолчанию равна 0.
Двумерный массив:
Dim <имя_массива (верхняя_граница_индекса1, верхняя_граница индекса2)> As Тип
Нижние границы индексов по умолчанию равны 0.
Примеры :
Dim A(20) As Integer
Dim Mass(10, 15) As String ‘аналогично определяются и другие
‘многомерные массивы.
При объявлении массива за ним закрепляется область оперативной памяти (ОП). Для
установки произвольных границ массива используют другое объявление.
Одномерный массив:
Dim <имя_массива(нижняя_граница_индекса> Тo <верхняя_граница индекса)> As Тип
Двумерный массив:
Dim <имя_массива (нижняя_граница_индекса1> Тo <верхняя_граница индекса1, _
нижняя_граница_индекса2> Тo <верхняя_граница_индекса2)> As Тип
Примеры:
Dim A(1 To 10, 5 To 15) As Integer ‘двумерный массив
Dim C(3 To 12) As Boolean ‘одномерный массив
Dim D(7, 10 To 20) As Single ‘двумерный массив, первый индекс – от 0 до 7
Замечание :
При объявлении массивов, как и при объявлении переменных, можно использовать вместо Dim ключевые слова Private и Public:
- Private – область определения: контейнер (форма, модуль);
- Public – область определения: всё приложение.
Нередко размер массива не может быть определен заранее. Было бы расточительно объявлять массив заведомо большего размера. В языке Visual Basic есть средство, позволяющее решить эту проблему. Это динамический массив
Объявление такого массива осуществляется в два этапа. Сначала массив определяют в секции General Declarations контейнера (формы, модуля) без указания размера:
Dim <имя_массива( )> As Тип ‘область определения – контейнер, ‘если Public, то массив глобальный
Затем в процедуре с помощью оператора переопределения (переобъявления) массива ReDim устанавливают фактический размер массива (изменять можно только верхнюю границу и только последнего индекса):
Private Sub …
ReDim <имя_массива (10, 20)>
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
End Sub
Замечание:
Первоначальные значения констант, определяющих границы изменения индексов, могут задаваться в разделе описания Const, указав имя константы, ее значение. Наиболее гибкий способ объявления массивов – размеры массивов задаются путём ввода их значений с использованием функции InputBox.
Пример :
Const M = 20, N = 10 ‘ключевое слово Const предваряет объявление констант _
более гибко: M = InputBox (“Укажите значения M и N” )
Dim A(M) As Single, B(1 To N) As Integer
Функцией InputBox предпочтительнее обеспечивать задание границ изменения индексов и при переопределении массивов, используя её перед оператором ReDim, например, перед ReDim <имя массива> (M, N).
3.4. Одномерные массивы
3.4.1. Ввод одномерных массивов
1. Ввод массива в память (создание массива) с помощью клавиатуры и функции InputBox :
Процедура ввода имеет вид:
Private Sub CmdSozd_Click ( )
Const N = 15
Dim I As Integer
Dim A(1 To N) As Single ‘объявление массива
For I = 1 To N
A(I) = InputBox (“Введите значение элемента с номером: ”& I)
Next I
End Sub
2. Ввод (создание) массива с использованием стандартной функции Choose, выполняющей выбор элементов (значений), заданных в списке. Синтаксис функции:
Choose (Index, ch_1 [, ch_2, … [, ch_n]]),
где: - index – числовое выражение или поле, принимающее значения от 1 до числа возможных элементов в списке;
ch_1, …, ch_n – элементы списка.
Пример
For I = 1 To 7 ‘занесение данных в массив Den_Ned
Den_Ned(I) = Choose(I, “Пн”, “Вт”, “Ср”, “Чт”, “Пт”, “Сб”, “Вс”)
Next I
3.4.2. Вывод одномерных массивов
Вывод массива (его отображение) может осуществляться несколькими способами:
- оператором MsgBox – сцепляя элементы массива в строку – в специальное
окно;
- в элемент ListBox – построчно, начиная с нулевой строки массива;
- в элемент TextBox – сцепляя элементы массива в строки;
- оператором Print – на форму - выводимая информация будет появляться
либо вдоль левой границы формы, либо в верхней части ЭФ в зависимости от используемых в операторе разделителей, “скрываясь” за объектами (элементами) управления, расположенными на форме (принять меры, чтобы печать была видна – переместить элементы).
Пример:
Пусть на форме имеются текстовое поле с именем TxtViv, список с именем ListViv и кнопка “Вывод” с именем CmdViv. Двойным щелчком вызовем процедуру:
Procedure Sub CmdViv_Click ( )
Dim A(1 To 5) As Single ‘массив
Dim I As Integer ‘параметр цикла
Dim Mass As String ‘строка для размещения элементов массива
‘Создание массива А (см. начало п. 3.4)
‘Вывод массива
Mass = “”: TxtViv.Text = “” ‘очистка строки для вывода массива и текстового поля
For I = 1 To 5
TxtViv.Text = TxtViv.Text & “ ” & A(I) ‘формирование строки в TextViv
Mass = Mass & Str(A(I)) & “ ” ‘подготовка строки для MsgBox
ListViv.List (I) = A(I) ‘вывод в список (5 строк)
Next I
MsgBox “Массив:” & Mass ‘вывод в специальное окно
End Sub
3.4.3. Обработка одномерных массивов
Для упрощения будем считать, что решение производится на простейшей форме с двумя кнопками Cmd1 и CmdExit, так что вся программа будет сосредоточена в процедуре связанной с кнопкой Cmd1.
Примеры :
Пример1. Определить максимальный элемент массива из заданного числа элементов. Определить также номер максимального элемента.
Private Sub Cmd1_Click ()
Dim A(1 To 10) As Single, Max As Single, I As Integer, Nom As Integer
For I = 1 To 10 ‘Ввод массива
A(I) = InputBox (“Вв.элемент с номером ” & I)
Next I
Max = A(1)
For I = 1 To 10
If A(I) > Max Then Max = A(I)
Next I
Print “Максимальный элемент = ” & Max ‘второй просмотр позволит _
определить номера всех максимальных элементов
Print “номера максимальных элементов”
For I = 1 To 10
If A(I) = Max Then Print I ‘принять меры, чтобы печать была видна
Next I
End Sub
Пример 2. Определить первый максимальный элемент из числа отрицательных элементов массива.
Private Sub Cmd1_Click ()
Dim A(1 To 20) As Single, Max As Single ‘объявление массива и переменных
Dim I As Integer, Nom As Integer
‘ввод массива – (см. выше Пример1)
Max = -1E45
For I = 1 To 20
If A(I) < 0 And A(I) > Max Then Max = A(I) : Nom = I ‘если нужно искать _
последний, то: If A(I) < 0 And A(I) >= Max Then Max = A(I) : Nom = I
Next I
If Max =-1E45 Then MsgBox “В массиве нет отрицательных элементов”
Else MsgBox “искомый максимальный элемент =” & Max & “ “ & _
“номер=” & Nom