Массив это набор однотипных переменных, объединенных одним именем и доступных через это имя и порядковый номер (индекс) переменной в наборе

Вид материалаДокументы

Содержание


Объявление массива фиксированного размера
Присвоение значений массивам
Извлечение значений из массива
Размер массива
Сравнивать массивы можно только если они имеют одинаковое количество измерений и одинаковый тип данных элементов.
Правила использования ReDim
Дополнительный материал
Заполнение массива начальными значениями
Защита содержимого массива с помощью ReDim Preserve
Работа с массивами
Подобный материал:
Массивы


Массив – это набор однотипных переменных, объединенных одним именем и доступных через это имя и порядковый номер (индекс) переменной в наборе. Элементы массива обладают непрерывной нумерацией определённого диапазона.

Каждая такая переменная называется элементом массива. Количество хранящихся в массиве элементов называется размером массива. Количество элементов массива теоретически может быть бесконечным. Ограничения накладываются конкретным языком программирования, операционной системой, объемом оперативной памяти и типом данных элементов массива.


В Visual Basic существуют массивы фиксированного размера и динамические массивы. Массив фиксированного размера имеет неизменный размер, заданный при его объявлении. Динамические массивы могут изменять размер в процессе выполнения.

Массивы в коде программы объявляются точно так же, как переменные. Как обычно, место, в котором вы объявляете массив, определяет, где его можно использовать (его область видимости). Если массив объявлен локально для процедуры, то его можно использовать только в этой процедуре. Если массив объявлен в верхней части формы, то его можно использовать во всей форме. Если массив объявлен открытым в стандартном модуле, его можно использовать в любом месте проекта.

Как и переменные, массивы объявляются не только с помощью ключевого слова Dim, но и с помощью Private, Public (задание области видимости) и других.


Объявление массива фиксированного размера

Объявляется массив так же, как и переменная, с той лишь разницей, что после имени переменной ставятся круглые скобки. Если известно количество хранимых значений, то можно также указать размер массива в описании (т.е. задать его верхнею границу – номер последнего элемента в массив; нижней границей массива всегда является 0), например:

Dim players(8) As String

Массив состоит из некоторого количества элементов, начиная с нулевого элемента и заканчивая элементом с номером, который на единицу меньше, чем число, указанное в объявлении. В этом случае массив содержит элементы от 0 до 8, всего девять элементов. При необходимости сослаться на один из элементов нужно просто вычесть 1. Например, чтобы сослаться на первый элемент, нужно ссылаться на нулевой элемент, а чтобы сослаться на девятый элемент, нужно ссылаться на элемент с номером 8. Каждый из элементов массива можно использовать точно так же, как и простую переменную.

Для каждого объекта в окне Properties (свойвтва) есть свойство TabIndex , в котором отражается его порядковый номер, начиная отсчет с нуля. Первый размещенный на форме объект имеет индекс 0, второй - 1, третий - 2 и т.д.

Объявленный выше массив называется одномерным. Но бывают и многомерные массивы: двух, трех и далее размеров, всего до 60 (в VB-6, вVB 2010 – до 32). На практике же редко используются более чем трехмерные массивы. Код двухмерного массива выглядит примерно так: Dim а (3, 2) As Integer. А вот трехмерный массив – Dim а (3, 2, 4) As Integer. В каждой элементе многомерного массива удобно хранить данные, относящиеся к одному объекту (например имя сотрудника, уникальный номер, номер телефона).

Чтобы объявить открытый двумерный массив с именем Scoreboard, который может хранить две строки и девять столбцов данных типа короткого целого, нужно ввести в процедуре события или в верхней части формы такой оператор:

Dim Scoreboard(1, 8) As Short

Когда вы создаете двумерный массив, Visual Basic выделяет для него место в памяти. Затем вы можете использовать этот массив в вашей программе так, как будто это таблица значений, как показано на следующей иллюстрации. (В этом случае элементы массива пронумерованы от 0 до 1 и от 0 до 8.)

Присвоение значений массивам

Как и с любыми переменными, необходимо присвоить значения для элементов массива. Инициализация массива осуществляется поэлементно с помощью оператора присваивания. Для этого обратитесь к номеру элемента в первой части присваивания, как показано ниже.

players(0) = "John"

players(3) = "Bart"

В приведенном выше коде значение John присваивается первому элементу массива (элементу 0), а значение Bart — четвертому элементу (элемент 3). Элементы массива необязательно присваивать по порядку, а любой элемент, которому не было не присвоено значение, получит значение по умолчанию, в этом случае — значение пустой строки.

Но присвоение значений можно сделать и при объявлении массива, поместив значения массива в фигурные скобки (литерал массива), например:

Dim strNames(2) As String = {"Андрей", "Владимир", "Иван"}

Инициализировать массив, то есть задать какие-либо ему значения, можно с помощью цикла, например, For...Next.


Извлечение значений из массива

Подобно тому, как числа используются для указания положения элемента в массиве, номер элемента используется для указания значения, которое нужно извлечь.

Dim AtBat As String

AtBat = players(3)

Приведенный выше код извлекает четвертый элемент массива и присваивает его значение строковой переменной AtBat.


Размер массива

Размер массива является произведением длин всех его измерений. Он представляет собой общее число элементов, в данный момент содержащихся в массиве.

В следующем примере показано объявление трехмерного массива:

Dim prices(3, 4, 5) As Long

Общий размер массива в переменной prices составляет (3 + 1) x (4 + 1) x (5 + 1) = 120.

Размер массива можно определить с помощью свойства Length. Длину каждого измерения многомерного массива можно получить с помощью метода GetLength.

Существует ряд особенностей, о которых следует помнить при работе с размером массива.

Длина

измерения

Индекс каждого измерения начинается с 0, что означает, что его диапазон от 0 до верхней границы. Таким образом, длина данного измерения на 1 больше объявленной верхней границы этого измерения.

Ограничения

длины

Длина каждого измерения массива ограничена максимальным значением типа LongInt, которое равно (2 31) -1. Тем не менее, общий размер массива также ограничен доступной памятью в системе. При попытке инициализировать массив, размер которого превышает объем доступной оперативной памяти, общеязыковая среда выполнения создает исключение OutOfMemoryException.

Размер и размер

элемента

Размер массива не зависит от типа его элементов. Размер всегда представляет общее число элементов, а не число байтов, занимаемое массивом при хранении.

Затраты памяти

Небезопасно делать любые предположения относительно способа хранения массива в памяти. Хранение зависит от размерности данных платформы, так один и тот же массив может потреблять больше памяти на 64-разрядных системах, чем на 32-разрядных. В зависимости от конфигурации системы при инициализации массива общеязыковая среда выполнения (CLR) может указывать такие способы хранения, как упаковка элементов максимально близко друг к другу или выравнивание всех элементов по естественным аппаратным границам памяти. Кроме того массив нуждается в хранении служебной информации, и размер этой информации возрастает при каждом добавлении измерения.


Сравнивать массивы можно только если они имеют одинаковое количество измерений и одинаковый тип данных элементов.


Объявление динамического массива

Динамические массивы – это такие массивы, размерность которых может меняться в ходе работы программы. Пожалуй, динамические массивы используются даже чаще статических. Применение динамических массивов обеспечивает эффективное управление памятью, выделяя под большой массив память лишь на время, когда этот массив используется, а затем освобождая ее.

Объявляется массив с помощью ключевых слов, используемых при создании массива фиксированного размера, с пустым списком размеров массива. При объявлении глобального массива необходимо использовать ключевое слово Public, при объявлении массива на уровне модуля — Dim, при объявлении массива в процедуре — Dim или Static.

Для объявления переменной одномерного массива добавьте одну пару скобок после имени переменной.

Dim cargoWeights() As Double

Dim intCountPar () As Integer

Для объявления переменной многомерного массива добавьте одну пару скобок после имени переменной, внутри скобок расположите запятые, разделяющие измерения массива.

Dim intCountPar (,) As Integer

Dim atmospherePressures(,,,) As Short

В отличие от массивов статичных размеров, когда обращаться к элементам можно сразу после его объявления, к элементам динамического массива сразу обращаться нельзя, т.к. они ещё не инициализированы. Для начала нужно указать его размерность. Для это в VB есть оператор ReDim. Работает он следующим образом:

ReDim myArray (4)

Теперь массив myArray имеет одну размерность с индексами от 0 до 4 (т.е. всего 5 элементов). Теперь к такому массиву можно обращаться точно так же, как и к статичному. Если в дальнейшем возникнет необходимость снова изменить размерность массива, можно ещё раз использовать ReDim.

При выполнении оператора ReDim данные, размещенные в массиве ранее, теряются. Это удобно в том случае, если данные больше не нужны, и вы хотите переопределить размер массива и подготовить его для размещения новых данных. Если вы хотите изменить размер массива без потери данных, необходимо воспользоваться оператором ReDim с ключевым словом Preserve. Например, следующий программный код увеличивает размер массива на 1 без потери хранящихся в массиве данных:

ReDim Preserve intCountPar (х + 1)

Замечание
  • Использование оператора ReDim с ключевым словом Preserve позволяет изменять только верхнюю границу последней размерности многомерных размеров. И если новый размер массива меньше, чем количество помещенных в него элементов, слово Preserve не поможет – часть данных все равно будет потеряна.
  • В таком операторе изменения размера массив должен иметь такое же количество измерений и содержать тот же самый тип данных. В дополнение к этому существует дополнительное ограничение, состоящее в том, что вы можете изменить размер только последнего измерения массива. Например, если массив имеет два или более измерений, вы можете изменить размер только последнего измерения и сохранить при этом содержимое массива. (Одномерные массивы автоматически проходят этот тест, так что вы спокойно можете расширять размер таких динамических массивов с помощью ключевого слова Preserve.)


Правила использования ReDim:
  • Можно задать только модификатор Preserve; при этом нельзя пропускать ключевое слово ReDim.
  • Оператор ReDim не может изменить тип данных переменной массива или его элементов.
  • Оператор ReDim не может предоставить новые значения инициализации для элементов массива.
  • Оператор ReDim не может изменять ранг (число измерений) массива.
  • Используя ключевое слово Preserve, можно изменить размер только последней размерности массива. Для всех остальных размерностей необходимо задать те же значения границ, которые они имели в существующем массиве.

Например, в одномерных массивах можно изменить размер размерности и сохранить все содержимое массива, поскольку изменяется только одна размерность. Однако если массив имеет две или несколько размерностей, то с помощью ключевого слова Preserve можно изменить только размер последней размерности массива.
  • Оператор ReDim можно использовать для свойств массива значений.
  • Оператор ReDim освобождает существующий массив и создает новый массив с таким же рангом. Новый массив заменяет существующий массив в переменной массива.
  • Если не указано ключевое слово Preserve, оператор ReDim инициализирует элементы нового массива с значениями по умолчанию для их типа данных.
  • Если модификатор Preserve указан, значения элементов в Visual Basic копируются из существующего массива в новый.


Дополнительный материал

Другой способ создание массива
  • Массив можно создать двумя способами. Можно указать размер массива после его объявления или, так как массив является объектом, можно создать его с использованием оператора New и присвоить его переменной массива.
  • Примеры:
  • Dim intArray1() As Integer
  • intArray1 = New Integer() {1, 2, 3, 4}
  • Dim intArray2() As Integer = {5, 6}
  • Dim intArray3() = New Integer() {6, 7, 8}
  • Можно выполнить это в рамках объявления массива или в последующей инструкции назначения, как показано в следующем примере.
  • cargoWeights = New Double() {}
  • atmospherePressures = New Short(,,,) {}
  • После выполнения этих операторов массивы имеют нулевую длину.

Примечание

В принципе, тип данных для массива можно не объявлять:

Dim MyArray (2)

В этом случае для элементов массива будет использован тип Variant. Такой массив сможет хранить в себе элементы разных типов данных, но требования к памяти у него будут выше и работать он будет чуть медленнее.


Заполнение массива начальными значениями

Можно создать массив, содержащий начальный набор значений, с помощью литерала массива. Литерал массива состоит из списка разделенных запятыми значений и заключенных в фигурные скобки {}.

При создании массива с помощью литерала массива можно либо указать тип массива, либо использовать вывод типа для определения типа массива. Оба способа иллюстрирует следующий код.

Dim numbers = New Integer() {1, 2, 4, 8}

Dim doubles = {1.5, 2, 9.9, 18}

При использовании вывода типа тип массива определяется главным типом списка значений, предоставленного для литерала массива. Главный тип — это уникальный тип, до которого могут быть расширены все другие типы литерала массива. Если такой уникальный тип нельзя определить, то главным типом будет тип, до которого можно сузить все другие типы массива. Если ни один из указанных уникальных типов нельзя определить, главным типом будет Object. Например, если список значений для литерала массива содержит значения типов Integer, Long и Double, результирующий массив будет иметь тип Double. Типы Integer и Long расширяются до типа Double и только Double. Поэтому Double является главным типом. Данные правила вывода применимы для вывода типов массивов, которые являются локальными переменными, определенными в элементе класса. Несмотря на то что можно использовать литералы массива при создании переменных уровня класса, нельзя использовать вывод типа на уровне класса. В результате литералы массива, заданные на уровне класса, определяют значения, указанные для литерала массива, как тип Object.

Можно явно задать тип элементов в массиве, созданном с помощью литерала массива. В таком случае значения литерала массива должны расширяться до типа элементов массива. В следующем примере кода создается массив типа Double из списка целых чисел.

Dim values As Double() = {1, 2, 3, 4, 5, 6}


Защита содержимого массива с помощью ReDim Preserve

Пример, как можно использовать Preserve для увеличения размера последнего измерения в динамическом массиве без стирания существующих данных, содержащихся в этом массиве.

Представьте, что вы используете в вашей программе трехмерный массив с именем myCube для хранения чисел с плавающей точкой одинарной точности. Массив myCube можно объявить с помощью следующей конструкции:

Dim myCube(,,) As Single

Затем можно изменить размер массива и добавить в него данные с помощью следующего кода:

ReDim myCube(25, 25, 25)

myCube(10, 1, 1) = 150.46

после чего увеличить размер третьего измерения массива (сохранив при этом содержимое массива) с помощью следующей записи:

ReDim Preserve myCube(25, 25, 50)

Однако в этом примере может быть расширено только третье измерение - первое и второе измерения не могут быть изменены, если вы изменяете размер массива с помощью ключевого слова Preserve. Попытка изменить размер первого или второго измерений в этом примере приведет при выполнении оператора ReDim Preserve к ошибке времени исполнения.


Работа с массивами

Все массивы переменных создаются на основе класса Array. В таблице приведены некоторые полезные методы этого класса.

Методы класса Array

Метод

Описание

BinarySearch

Позволяет осуществлять поиск в отсортированном массиве. Если элемент найден, то возвращается его индекс, иначе – отрицательное число.

GetLowerBound

Определяет в указанной размерности минимальный индекс массива

GetUpperBound

Определяет в указанной размерности максимальный индекс массива:

Dim strNames() As String - {"Андрей", "Владимир", _

"Иван"}

Dim i As Integer = strNames.GetUpperBound(0)

Reverse

Изменяет порядок следования элементов одномерного массива на обратный

Sort

Сортирует элементы одномерного массива по порядку:

Dim strNamesO As String - {"Владимир", "Андрей", "Иван"}

Array.Sort(strNames)