Пример программы чтения/записи на диск (на 10 точек) 5 Массивы

Вид материалаЛекция

Содержание


Объявление массива
Инструкция Option Base
Использование массива
Option Base
Динамические массивы
Пять функций для работы с массивами
Функция Array
Функция Erase
Функция IsArray
Функции LBound и UBound
As Integer
Подобный материал:

А.А.Хамухин. Информатика для направления «Нефтегазовое дело». Лекция 8. Семестр 1

Статические и динамические массивы, чтение/запись файлов на диск


Содержание


Статические и динамические массивы, чтение/запись файлов на диск 1

Массивы 1

Объявление массива 1

Использование массива 2

Динамические массивы 3

Пять функций для работы с массивами 3

Функция Array 4

Функция Erase 4

Функция IsArray 4

Функции LBound и UBound 4

Пример программы чтения/записи на диск (на 10 точек) 5



Массивы


Массивы VBA и других языков программирования весьма схожи; они незаменимы при работе с большими объемами данных. Попросту говоря, массив — это переменная, содержащая несколько значений, или еще проще — пронумерованная группа значений одного и того же типа. Если обычные переменные полезны при работе с одиночными значениями определенного типа, массив пригодится при действиях с набором значений того же типа.

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

      Двухмерный массив более сложен — в него включены наборы списков одной длины. Часто такие наборы называют таблицами или матрицами. Они состоят из строк и столбцов, на пересечении которых находятся значения в таблице.

Трехмерный массив можно считать набором таблиц, в котором все таблицы имеют одинаковые количества строк и столбцов. Трехмерные массивы напоминают рабо­чую книгу Excel , содержащую несколько листов. Для доступа к элементу трехмерно­го массива надо указывать три координаты — строку, столбец и таблицу, на пересечении которых находятся значения в таблице. Массивы VBA могут иметь до 60 измерений.

Объявление массива


      Действия с массивами очень похожи на действия с переменными. Прежде чем ис­пользовать массив, Вы должны его описать и указать, значения какого типа будете в нем хранить. В массивах используются те же типы данных, что и в одиночных переменных (см. раздел «Типы данных переменных VBA » на стр. 39), причем массив может содержать только однотипные значения. Обойти это ограничение легко — создайте массив типа Variant , в котором можно хранить данные любого типа. Вот пример описания одномерного массива для данных типа Integer .

      Dim NumberArray (10) As Integer

      Оно ничем не отличается от описания переменной, которое обсуждалось ранее, за единственным исключением — после имени переменной вводится число в круглых скобках, указывающее VBA , что Вы объявляете не одиночную переменную, а мас­сив, и определяющее его структуру. Здесь мы задали только одно число, значит, будет создан одномерный массив NumberArray , предназначенный для хранения 10 целых чисел. В действительности число 10 определяет верхнюю границу индексов массива. Если Вы указываете, что массив должен содержать 10 элементов, VBA по умолчанию полагает, что номер первого элемента — 1.

Объявление двухмерного массива выглядит так:

      Dim TableArray (10, 20) As String

      Таблица TableArray состоит из 10 строк и 20 столбцов и содержит до 200 строко­вых переменных. И еще один пример — описание трехмерного массива типа Variant :

      Dim BigArray (5, 50,100) As Variant

Инструкция Option Base

      Нумерация массивов VBA может начинаться с 0 или 1. Конкретный способ указан в инструкции Option Base в начале модуля. Так, Option Base 0 задает нумерацию всех массивов по умолчанию с 0, a Option Base 1 — с 1. В отсутствие инструкции Option Base нумерация массивов по умолчанию начинается с 0. Но в следующих примерах мы для простоты считаем, что она начинается с 1.

Использование массива


      Что можно делать с массивом после его объявления? Вот пример использования трехэлементного целочисленного массива в программе Ргос25.

      Option Base 1
      Sub Chap02dProc25_IntegerArray()
      Dim Vals(3) As Integer
      ValsCD = Int(1OO * Rnd())
      Vals(2) = Int(1OO * Rnd())
      Vals(3) = Int(1OO * Rnd())
      MsgBox "Lottery Numbers: " & Vals(1) &","&_
      Vals(2) & ", " & Vals(3) End Sub

      В строке З объявлен одномерный массив Vals, содержащий 3 числа типа Integer. В строках 4—6 элементам этого массива присваиваются значения. Операторы присваивания для элементов массива выглядят точно так же, как операторы присваивания для переменных, за исключением того, что надо каждый раз указывать номер элемента, которому присваивается значение. Номер указан в круглых скобках после имени массива.
      Обратите также внимание на формулу в правой части операторов присваивания строки 4—6. В ней для генерации случайного целого числа от 0 до 100 используются встроенные функции VBA Rnd и Int. Первая из них генерирует действительное случайное число в интервале от 0 до 1 и может принимать один аргумент «затравочное» число (подробности — в справочной системе VBA). Функция Int преобразует действительное число в целое, удаляя все цифры после десятичного разделителя (то есть, всегда округляя до меньшего). Умножая случайное число, полученное функцией Rnd, на 100 и отбрасывая дробную часть, получаем случайное целое, принадлежащее диапазону от 0 до 100. Применив эту формулу трижды, мы зададим в массиве Vals три произвольных целых числа. В строке 7 Ргос25 элементы массива, каждый со своим индексом, передаются в функцию MsgBox.

 В следующем примере мы покажем, как использовать массив типа Variant.

      Sub Chap02dProc26_VariantArray()
      Dim Data(3) As Variant
      Data(1) = "Johann"
      Data(2) =85
      Data(3) = #3/21/1912#
      MsgBox Data(1) & ", age " & Data(2) & ", born " & Data(3)
      End Sub

      Здесь элементам массива присваиваются значения различных типов: первому элементу — строка, второму — целое число, третьему — дата. Поскольку Data объявлен как массив типа Variant, его элементам можно присваивать значения любого типа. В строке 6 значения всех элементов массива передаются в функцию MsgBox для отображения в диалоговом окне.

Динамические массивы


      Кроме описанных массивов фиксированного размера в VBA есть массивы еще одного вида — динамические. До сих пор мы всегда явно указывали размерность массива в инструкции. При описании динамического массива его размер не указывается. Он определяется позже, при выполнении кода.
      Динамический массив удобен, если Вы предполагаете, что в ходе выполнения программы его размер может измениться. И в этой ситуации можно сэкономить память: сделайте так, чтобы размеры массивов точно соответствовали Вашим текущим потребностям. В противном случае Вы рискуете создать массивы, которые только попусту занимают место — а это плохо отразится на производительности. Рассмотрим динамический массив подробнее. В процедуре Ргос29 массив Data4 сначала (с помощью инструкции ReDim) объявлен как одномерный 2-элементный массив, а затем как двухмерный 30-элементный.

      Sub Chap02dProc29_UseDynamicArray()
      Dim Data4() As Variant
      ReDim Data4(2)
      Data4(1) = Int(1OO * Rnd())
      Data4(2) = Int(100 * Rnd())
      MsgBox "Lottery Numbers: " & Data4(1) & ", " & Data4(2)
      ReDim Data4(10, 3)
      Data4(1, 1) = "Johann"
      Data4(1, 2) - 84
      Data4(1, 3) = #3/21/1912#
      MsgBox Data4(1, 1) & ", age " & Data4(1, 2) & _
      ", born " & Data4(1, 3)
      End Sub

      Сначала в строке 2 Proc29 мы описали массив Data4 типа Variant, не указывая число измерений и элементов. В этой инструкции определяется динамический массив, но память под него не отводится, пока в строке 3 не встречается инструкция ReDim. В ней массив Data4 объявлен как одномерный 2-элементный массив. В строках 4 и 5 двум элементам этого массива присваиваются случайные числа. В строке 6 эти числа выводятся в информационном окне. В 7-й строке инструкция ReDim используется еще раз для описания Data4 как двухмерного массива, содержащего 30 элементов. Затем элементам первой строки этого массива присваиваются значения и выводятся в информационном окне. Так, позволяя поочередно отводить один и тот же массив под разные данные, инструкция ReDim и динамический массив экономят память при выполнении программы.

Пять функций для работы с массивами


      С массивами VBA чаще всего используют пять функций — Array, Erase, IsArray, LBound и UBound. Сейчас мы кратко расскажем о каждой из них.

Функция Array


      Она позволяет создавать массив в ходе выполнения программы, без предварительного описания:

      Sub Chap02dProc31_ArrayFunction()
      Data6 = Array("Johann", 85, #3/21/1912#)
      MsgBox Data6(1) & ", age " & Data6(2) & ", born " & Data6(3)
      End Sub

      Во второй строке Ргос31 функцией Array создается одномерный 3-элементный массив типа Variant фиксированного размера. Впрочем, это упрощенная модель. В действительности Data6 — переменная типа Variant, которая содержит массив, возвращенный функцией Array. В технические подробности мы вдаваться не будем, поскольку внешне Data6 выглядит и действует, как обычный массив. Помните, что функция Array всегда возвращает массив Variant и использует нумерацию, заданную инструкцией Option Base.

Функция Erase


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

Функция IsArray


      Эта встроенная функция VBA позволяет проверить, является ли некоторая переменная массивом. IsArray принимает один аргумент и возвращает True (если переменная является массивом) или False (если переменная не является массивом). Такая операция полезна, например, когда Вы вызываете функцию, возвращающую массив, но не уверены, что она действительно вернет его, а не обычную переменную. Действие IsArray продемонстрировано ниже.

      Sub Chap02dProc34_IsArrayFunction()
      Dim Data9(2) As Integer
      Dim ArrayBool As Boolean
      ArrayBool = IsArray(Data9)
      If ArrayBool = True Then
      MsgBox "Data9 is an array."
      End If
      End Sub

      Конечно, этот пример не имеет практического смысла, но действие IsArray показано в нем ясно. Во второй строке объявлен массив, в третьей — логическая переменная ArrayBool. Далее этой переменной присваивается значение, возвращенное функцией IsArray (True или False). Инструкция If использована для проверки результата IsArray и вывода сообщения, если значение переменной ArrayBool равно True Подробно эта инструкция описана в разделе «Управляющая инструкция If-Then-EIse»

Функции LBound и UBound


      Они помогут Вам определить верхнюю и нижнюю границы индексов массива, как показано в примере на следующей странице.

      Sub Chap02Proc35_LBoundAndBound()
      Dim Data10(4 To 15) As Integer
      MsgBox “The lower bound is ” & LBound(Data10) & “.”
      MsgBox “The upper bound is ” & UBound(Data10) & “.”
      End Sub

Примечание

      Применение этих функций к обычной переменной или динамическому массиву, не описанному инструкцией ReDim , вызывает ошибку при выполнении программы. Чтобы избежать этого, перед вызовом функций LBound и UBound проверьте переменную функцией IsArray .


чтение/запись файлов на диск рассказать подробно на следующем примере:

Пример программы чтения/записи на диск (на 10 точек)



Dim Y(2, 10) As Integer

Dim n As Integer

Sub Disk()

Open "c:\2050.txt" For Input As #1

Open "c:\IVANOV.txt" For Output As #2

While Not EOF(1)

Input #1, n

MsgBox n

Wend

For i = 1 To n

Print #2, Y(1, i), Y(2, i)

Next i

Close #1

Close #2

End Sub