Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
70
Добавлен:
02.05.2014
Размер:
51.71 Кб
Скачать

Массивы, записи и перечисления

На предыдущем уроке мы рассмотрели с вами такую важную вещь, как переменные. А переменные - это ведь кусочки памяти, где хранятся данные. Значит, если эффективно использовать переменные - мы эффективно используем память. А если мы эффективно используем память - то памяти для приложения нужно меньше и приложение работает быстрее. Так вот для того, чтобы эти данные использовать с максимальной эффективностью, и в то же время с лёгкостью, были придуманы "массивы" (Arrays), "записи" (Types) и "перечисления" (Enums).

Массивы

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

В программировании массивы используются довольно часто. Например, вам нужно загрузить в программу содержимое какого-нибудь файла. Если этот файл строковый, то можно использовать строку и обойтись без массива. А вот если файл бинарный (двоичный), то тут без массива просто не обойтись!

В Visual Basic массивы определяются следующим образом:

Dim myArray (10) As Long

Как вы могли заметить, определение массива отличается от определения обычной переменной только индексом, указанным в скобках. Этот индекс указывает размерность массива. В данной случае массив myArray будет содержать 11 элементов. Почему 11? Потому что нижняя граница массива начинается с нуля. [0,1,2.....9,10]. Чтобы задать определённую размерность можно использовать зарезервированное слово To:

Dim myArray (5 To 10) As Long

Здесь определяется массив, размерность которого 6 элементов (5,6,7,8,9,10).

Общий синтаксис определения массива следующий:

Dim ИмяМассива{НомПерв1 То НомПосл1, НомПерв2 То НомПосл2, ...) [As [New] ИмяТипа]

Многомерные массивы

Массивы можно делать многомерными. Например, объявим массив - таблицу поля шахматной доски:

Dim chessTable (1 To 8, 1 To 8) As String

Этот массив представляет собой таблицу с восьми ячейками по вертикали и горизонтали.

Итак, массив определён. Теперь необходимо узнать - как же можно добраться к элементам этого массива. Очень просто! К элементам массива нужно обращаться по индексу, к примеру, чтобы изменить нулевой элемент массива myArray нужно написать:

myArray(0) = 1234

Или, например:

chessTable (2,3) = "Пешка"

Массивы переменной размерности (динамические)

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

Dim fileContent (119) As Byte

Но это если файл имеет длину 120 байт. А что делать, если мы не знаем длину загружаемого файла? Определять очень большой массив, чтобы уж наверняка туда мог поместиться большой файл? Нет. Так делать нельзя. Вот здесь как раз и нужно использовать динамический массив.

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

Dim myArray () As Byte

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

ReDim myArray (4)

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

Но! Здесь есть подводный камень! Давайте рассмотрим маленький примерчик:

Dim myLong As Long Dim myArray() As Long ' объявляем массив

ReDim myArray (2) ' одна размерность [0,1,2] myArray (1) = 234 ' присваиваем второму элементу чило 234 myLong = myArray (1) ' сохраняем его в переменной myLong

ReDim myArray (3) ' снова меняем размерность-теперь [0,1,2,3] myLong = myArray (1) ' снова пытаемся сохранить второй элемент

На последней строке, переменной myLong присвоится 0 вместо 234! Это происходит потому, что оператор ReDim заново инициализирует (сбрасывает) все элементы массива к значению по умолчанию (как помните, для чисел - это 0, для строк ""). Но как же быть, если мы хотим изменить размеры массива, сохранив все старые элементы? Для этого нужно после оператора ReDim поставить слово Preserve. Примерно так:

ReDim Preserve myArray (3) ' сохраняем старые элементы myLong = myArray (1) ' всё в порядке

Теперь всё в порядке.

Полезные советы по работе с массивами в VB

Массивы могут храниться в переменных типа Variant. Иногда это бывает удобным. В некоторых случаях без этого просто не обойтись! (Например, когда вы хотите, чтобы ваша функция возвращала массив). Чтобы сохранить какой-либо массив в переменной типа Variant необходимо просто присвоить этой переменной нужный массив:

Dim myVariantArray ' переменная Variant по умолчанию myVarianrArray = chessTable

Обратите внимание, никакие индексы указывать не нужно!

Теперь можно использовать копию как обычный массив:

myVarianrArray (0) = "Это копия"

Если вам потребуется в коде программы узнать текущие размеры массива, то можно использовать встроенные функции Visual Basic - LBound и UBound. Первая функция возвращает нижнюю границу массива, вторая верхнюю. Подробнее об этих функциях читайте в справочнике (vbhelprus).

Записи

Те, кто программировал на других языках программирования (таких, как C и Pascal), наверняка сталкивались с понятием структура (C), и записью (Record в паскале). В Visual Basic аналогом структуры является запись. Запись - это новый, опеределяемый программистом тип данных, который состоит из одной и более переменных внутри. Давайте рассмотрим это на примере. Например, необходимо в программе хранить массив студентов. Причём каждый студент имеет свои характеристики: ФИО, Возраст, Ниличие Грамот. Конечно, для хранения таких данных можно использовать, например, массив, имеющий две размерности. Но это не лучший вариант. Лучше всего здесь подходят Записи! Затем из записи можно будет сделать массив! Чтобы определить запись в программе нужно использовать зарезервированное слово Type. Заканчивается запись словами End Type:

Private Type Student ' вместо Private могло быть и Public FIO As String Age As Byte HasGramot As Boolean End Type

Заметьте, что Dim перед именем переменной указывать не нужно. Итак, мы определили запись в программе. Теперь можно объявлять переменные, имеющий тип - Student (т.е. наша новая запись). Например:

Dim newStud As Student

Слово Student синим выделяться не будет, т.к. синию подсветку имеют только зарезервированные слова, встоенные в Visual Basic

Теперь, к полям записи можно обращаться при помощи точки:

newStud.FIO = "Василий Васильевич Пупкин" newStud.Age = 19 newStud.HasGramot = False

Всё как в паскале. (ну, и почти как в С).

Visual Basic предоставляет возможность не указывать каждый раз имя переменной типа запись, при обращении к её элементам. Это особенно полезно, когда запись имеет много внутренних членов. Для этого есть слово With:

With newStud .FIO = "Бабай Бабаевич Бабаев" .Age = 20 .HasGramot = True End With

Настало время объявить массив элементов типа запись (точнее типа Student):

Dim myStudArray (20) As Student

Здесь мы объявили массив из 21 студента. Теперь можно обращаться к элементам массива точно так же, как мы это делали раньше:

myStudArray(0).FIO = "Билл Гейтс Пупкинович"

Как видите всё гениальное просто! Особенно в Visual Basic! :)

Перечисления

Перечисления тоже довольно важная и нужная штука. В принципе, вы с ними уже встречались. Где? А вспомните, что происходило, когда вы напротив Boolean переменной ставили знак равенства? Правильно, Visual Basic выдавал вам список из двух значений на выбор - True и False. Это и есть перечисление. Другими словами перечисление - это список констант. Перед использованием такого списка его необходимо определить в программе. Например, рассмотрим перечисление оценок, получаямых студентами:

Enum Ocenka Neud = 3 Horosho = 4 Otlichno = 5 End Enum

Присваивать значения константам внутри Enum не обязательно. Если этого не сделать, то константы будут принимать значения 0,1,2... и т.д.

Теперь можно объявить переменную типа Ocenka:

Dim oc1 As Ocenka

И, если вы теперь попытаетесь присвоить такой переменной значение - Visual Basic выдаст список (Neud, Horosho и Otlichno) из которого вы сможете выбрать нужное значение. Также эти константы можно использовать, например, при проверке условий, т.е. If oc1 = Horosho Then ... Но об условиях позже.

Чтобы закрепить полученные знания, давайте переопределим нашу запись Student на вот какую:

Private Type Student ' вместо Private могло быть и Public FIO As String Age As Byte HasGramot As Boolean ikzamenFizika As Ocenka ikzamenMatan As Ocenka End Type

Теперь чтобы присвоить оценку 5 по матанализу студента под номером 3, необходимо написать:

myStudArray(2).ikzamenMatan = Horosho

Теперь, как видите, код очень прозрачен. Такой код гораздо легче для понимания, поэтому прежде чем определять какие-либо данные в своей программе, сначала подумайте, как это лучше реализовать? Может лучше что-то сделать с помощью записей? Или перечислений? И т.д.

Примечание: Те, кто программировал на паскале помнят про множества. Так вот, могу их огорчить, множеств в Visual Basic нет. Но в принципе, никто не мешает вам реализовать их самостоятельно, написав соответствующие функции.

Ну вот и всё. На этом закончим с массивами, записями и перечислениями. Пора переходить к более практичному - выражениям!

5