Введение
В Visual Basic, как и в других языках программирования можно использовать массивы. Об основах работы с массивами и пойдёт речь в данной статье.
Что есть что
Массив - это набор элементов определённого типа, каждый из которых имеет свой порядковый номер, называемый индексом.
Массивы могут быть динамическими и статическими. У статических массивов количество размерностей и границы определяются при объявлении. Количество размерностей и границы динамического массива определяются впоследствии в коде.
Объявление
Массивы объявляются практически так же, как и переменные. В скобках после имени массива указываются его границы.
Dim arr (15) As String
Мы объявили одномерный массив с 16 элементами с индексами от 0 до 15. Отсчёт элементов массива начинается с нуля. Оператор Option Base позволяет задать индексацию массивов с единицы. Для этого в разделе General Declarations нужно поместить такую строку:
Option Base 1
При объявлении можно установить и нижнюю границу массива.
Dim arr (5 To 10) As String
Этот массив будет иметь 6 элементов с индексами от 5 до 12.
При объявлении многомерного массива границы размерностей указываются через запятую.
Dim arr (10, 7 To 12) As Integer
Объявляя динамический массив мы не указываем его размерности.
Dim arr () As Byte
Установка размера динамического массива
Динамический массив нельзя использовать сразу после объявления. Нужно указать его размер. Это делается с помощью инструкции ReDim.
Dim arr1 () As string
Dim arr2 () As Byte
Dim arr3 () As Date
ReDim arr1 (10 To 20)
ReDim arr2 (20)
ReDim arr3 (25, 30)
Можно также использовать переменные и выражение, что было нельзя сделать при объявлении.
Dim I As Integer
Dim arr1 () As Long
Dim arr2 () As Integer
i = 25
ReDim arr1 (i)
ReDim arr2 (25 + i, i - 1)
При изменении размера массива данные, которые он содержал, теряются. Чтобы это предотвратить нужно после ReDim поставить ключевое слово Preserve.
ReDim Preserve arr (12)
Но если Вы используете Preserve, то должны соблюдать некоторые правила:
1. Можно изменять только последнюю размерность
Dim arr () As String
ReDim arr (10, 10)
ReDim Preserve arr (10, 15) 'Работает
ReDim Preserve arr (15, 15) 'Ошибка
2. Нельзя изменять нижнюю границу массива
Dim arr () As String
ReDim arr (10 To 20)
ReDim Preserve arr (10 To 25) 'Работает
ReDim Preserve arr (15 To 25) 'Ошибка
Доступ к элементам массива
Присвоить значение элементу массива довольно просто.
arr (15, 2) = "бла-бла-бла"
получить значение элемента массива ещё проще.
Dim str As String
str = arr (15, 2)
MsgBox str
Функции Lbound и Ubound
Функции Lbound и Ubound возвращают нижнюю и верхнюю границу массива соответственно. В качестве параметра нужно указать имя массива и номер размерности, границу которой нужно определить. Если размерность не указана, то граница определяется для последней размерности.
Dim arr () As Integer
ReDim arr (10 To 25, 25)
MsgBox Lbound (arr, 1)
MsgBox Ubound (arr, 1)
MsgBox Ubound (arr)
Функции Split и Join
В Visual Basic 6 появились функции Split и Join.
Функция Split разбивает строку по разделителю и результат записывает в одномерный массив. В качестве параметров передаются строка, разделитель, количество возвращаемых элементов и тип сравнения строк. Если количество возвращаемых элементов не указано, то возвращается максимально возможное количество элементов. Значение функции присваивается динамическому массиву типа String или переменной типа Variant.
Dim arr () As String
Dim i As Integer
Dim str As String
str = "раз-два-три"
arr = Split (str, "-")
For i = 0 To Ubound (arr)
Debug.Print arr (i)
Next
Функция Join выполняет обратную задачу. Она соединяет элементы массива через разделитель и возвращает строку. В качестве параметров следует передавать одномерный массив объединяемых строк и разделитель. Возвращаемое значение - строка.
Dim arr (2) As String
Dim str As String
arr (0) = "раз"
arr (1) = "два"
arr (2) = "три"
str = Join (arr, "-")
MsgBox str
Сортировка
Поговорим о методах сортировки массивов. Допустим есть массив числового типа (Integer, Long, Single, Double). Нужно сделать сортировку всех элементов по возрастанию. Рассмотрим такой код. Положите на форму два элемента ListBox с именами List1 и List2, вставьте этот код, запустите проект и кликните по форме.
Option Explicit
Private Sub Form_Click()
Dim a() As Double
Dim n As Integer
Dim i As Integer
Dim pr As Integer
n = 500
ReDim a(1 To n)
Randomize (Timer)
For i = 1 To n
a(i) = Rnd
List1.AddItem a(i)
Next i
Do
pr = 0
For i = 1 To n - 1
If a(i + 1) < a(i) Then
Swap a(i), a(i + 1)
pr = 1
End If
Next i
Loop While pr = 1
For i = 1 To n
List2.AddItem a(i)
Next i
End Sub
Public Sub Swap(ByRef Num1 As Variant, ByRef Num2 As Variant)
Dim temp As Variant
temp = Num1
Num1 = Num2
Num2 = temp
End Sub
Разберём работу этого кода. Цикл Do. В начале каждого цикла присваиваем переменной pr значение 0. Далее следует вложенный цикл For. Количество циклов равно количеству элементов, уменьшенному на единицу. Внутри цикла следует проверка: если элемент с индексом I больше элемента с индексом i + 1 (непорядок!), то меняем эти элементы местами. Для этого используется процедура Swap. Затем меняем значение переменной pr на 1. Если все элементы стоят на своих местах, то значение переменной pr после выхода из цикла For остаётся равным 0, и при этом осуществляется выход из цикла Do, и на этом работа заканчивается. Если же значение переменной pr равно 1, то возможно в массиве остались ещё не отсортированные элементы, тогда снова заходим в цикл For.
Тот же самый алгоритм можно использовать и для сортировки трок.
Private Sub Form_Click()
Const abc As String = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
Dim a() As String
Dim n As Integer
Dim i As Integer
Dim j As Integer
Dim pr As Integer
n = 500
ReDim a(1 To n)
Randomize (Timer)
For i = 1 To n
For j = 1 To 5
a(i) = a(i) & Mid$(abc, Int(Rnd * 33) + 1, 1) 'составляем строки из пяти случайных символов
Next
List1.AddItem a(i)
Next i
Do
pr = 0
For i = 1 To n - 1
If a(i + 1) < a(i) Then
Swap a(i), a(i + 1)
pr = 1
End If
Next i
Loop While pr = 1
For i = 1 To n
List2.AddItem a(i)
Next i
End Sub
Public Sub Swap(ByRef Num1 As Variant, ByRef Num2 As Variant)
Dim temp As Variant
temp = Num1
Num1 = Num2
Num2 = temp
End Sub
Заключение
В этой статье были рассмотрены основы работы с массивами. Вместо массивов можно использовать коллекции (объекты Collection). Основное функциональное отличие массивов от коллекций - в коллекциях к элементам можно обращаться не только по индексу, но и по уникальному текстовому ключу.