Visual Basic, .NET, ASP, VBScript
 

   
 

.NET разработчик, автор множества статей. В ранние годы (2001 - 2003) занимался разработкой на Visual Basic 6 и Active Server Pages, с 2003 года в основном занят разработкой корпоративного программного обеспечения на платформе Microsoft .NET (C#, VB.NET; ASP.NET, Silverlight). Личный блог: http://pavel.surmenok.com/

 
     
   
 

Введение

    В 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). Основное функциональное отличие массивов от коллекций - в коллекциях к элементам можно обращаться не только по индексу, но и по уникальному текстовому ключу.
 
     

   
   
     
  VBNet рекомендует