ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 23.03.2025
Просмотров: 1049
Скачиваний: 2
ЛАБОРАТОРНАЯ РАБОТА № 5 Обработка одномерных массивов
1.Краткие теоретические сведения
Массив – это множество однотипных элементов. Каждый массив имеет уникальное собственное имя. Каждый элемент данных, хранящийся в массиве, называется элементом массива. Для доступа к определенному элементу любого массива необходимо указать имя массива и некоторое число, которое называется индексом элемента массива.
Массивы в программе должны быть определены с помощью оператора Dim, синтаксис которого имеет следующий вид
Dim VarName([Subscripts]) [As Type] |
||
Varname |
– |
имя существующего массива; |
Subscripts |
– |
измерение (или измерения) массива; |
Type |
– |
любой допустимый тип VBA или |
тип данных, определенный пользователем. |
VBA представляет программисту возможность объявлять массивы, имеющие до 60 измерений. Одномерному массиву соответствует один Subscripts (индекс); двумерному массиву – два индекса, разделенные запятой. Каждый индекс увеличивает размерность массива на единицу. Если опустить Type, все элементы массива будут иметь тип Variant.
Следующая инструкция
Dim Array(30) As String
97
объявляет массив Array, содержащий 30 элементов. По умолчанию, индексация массивов начинается с нуля и поэтому индекс последнего элемента массива – 29, а не – 30.
Операторы
Option Base 0 |
' установка по умолчанию; |
'индексы массивов начинаются с 0 |
|
Option Base 1 |
' индексы массивов начинаются с 1 |
позволяют задавать 0 или 1 число по умолчанию для индексов массива. Следует отметить, что только верхний предел массива является обязательным. В этом случае нумерация массива происходит в зависимости от установки Option Base.
Dim StrArray(1 To 100) As String
Dim NumArray(-50 To 50) As Integer
Dim ArrByte(0 To 30) As Byte
Этот оператор эквивалентен оператору
Dim ArrByte(30) As Byte
Существуют два вида массивов – статические и динамические. Cтатическими называются массивы, размерность которых известна заранее и может быть указана при их объявлении. Однако, весьма часто возникают ситуации, когда размерность массива величина неизвестная и в этом случае VBA разрешает при объявлении массива не указывать размерность, а просто определить или переопределить ее во время исполнения процедуры.
ReDim Varname(Subscripts) [As Type]
98
Синтаксис для оператора ReDim такой же как для оператора Dim. Включение оператора Subscripts в объявление массива создает статический массив. Следовательно, при создании динамического массива оператор Subscripts использовать нельзя, хотя круглые скобки должны присутствовать обязательно.
Оператор Subscripts имеет следующий синтаксис
[lower To] upper [,[lower To] upper] . . .
lower |
– |
нижний предел допустимых индексов массива |
|
Varname; |
|||
upper |
– |
верхний предел (обязательный параметр); |
|
Примеры: |
|||
Dim A() As String |
' объявляет динамический массив А |
||
Redim A(1 To 25) |
' изменяет размер массива до 25эл. |
||
Dim A(50) |
' изменяет размер массива до 50 эл. |
||
Dim Day() As Integer |
' объявляет динамический массив Day |
||
Redim Preserve Day(1 To 20) |
' изменяет размер массива до 20 эл. |
||
' сохраняя содержимое |
|||
Dim B As Variant |
' объявляет переменную типа Variant |
||
Redim B(50) As Byte |
' создает массив из 50 переменных |
||
'типа Byte |
|||
' внутри переменной типа Variant |
|||
Размерность массива может быть записана в виде арифметического выражения, значение которого должно быть положительным числом или равно нулю. Если арифметическое выражение имеет дробное значение, то оно округляется, и целая часть определяет размерность массива.
99
Ввод-вывод массивов
Заполнить массив, т. е. определить значения элементов массива можно следующими способами:
при помощи оператора присваивания; непосредственным вводом с клавиатуры; подготовкой и вводом данных из текстового файла; использования датчика случайных чисел;
заполнением массива при помощи стандартных функций Пример 1. Заполнить одномерный массив непосредственным
вводом с клавиатуры. Результат поместить в столбец С рабочей книги Excel.
Sub InputArray1()
'*******************************************************
' Ввод с клавиатуры
'*******************************************************
Dim A(10) As Integer
Dim Title As String
Worksheets("Лист1").Cells(1, 1) = "Массив А:"
Title = "Заполнение одномерного массива"
For i = 1 To 10
A(i) = InputBox("Введите A(" & i & "):", Title)
Worksheets("Лист1").Cells(i + 1, 1) = A(i)
Next i
End Sub
Объявляем статический массив A, содержащий 10 элементов. Метод Cells используется для ссылки на одну ячейку. Доступ к
100
ячейке можно также получить, используя метод Range, однако, метод Cells в этом случае является более удобным. Так Cells(1, 1), например, указывает на ячейку A1 рабочей книги Excel, В эту ячейку и будет записана строка ″Массив А:″.
Синтаксис метода Cells:
Object.Cells(Rowlndex, Columnlndex)
Object – ссылка или на Worksheet, или на объект Range, содержащий ячейку, с которой необходимо работать. Если Object опущен, метод применяется к объекту ActiveSheet.
Rowlndex – номер строки, в которой находится ячейка. Если Object – лист, то
Rowlndex, равный 1, ссылается на строку 1 листа. Если Object – диапазон значений, то
Rowlndex, равный 1, ссылается на первую строку диапазона.
Columnlndex – номер столбца (буква или число, задающее столбец), в котором расположена ячейка.
Если Object – лист, то
Columnlndex, равный "А" или 1, ссылается на столбец А листа. Если Object – диапазон значений, то
Columnlndex, равный "А" или 1, ссылается на первый столбец диапазона.
Следующая строка предлагает увеличить ширину столбца С для того, чтобы строка, которая была записана в ячейку, не выходила за пределы ячейки С, а полностью находилась в ней. Подбор ширины столбца происходит методом проб и ошибок. Далее в цикле For…Next, с использованием функции InputBox, происходит заполнение массива А. Данный прием является очень удобным средством организации взаимодействия между пользователем и программой.
101
Функция InputBox имеет следующий синтаксис:
InputBox (Prompt [, Title])
Prompt – любое строковое выражение (обязательный аргуент). InputBox отображает эту строку как запрос в диалоговом окне;
Title – это строка, используемая в качестве заголовка для окна ввода. InputBox отображает текст этой строки в строке заголовка диалогового окна.
Пример 2. Заполнить одномерный массив, считав данные из файла File1.txt. Результат поместить в файл File1.txt..
Sub InputArray2()
'**********************************************
' запись и считывание данных из файла
'**********************************************
Dim A(10) As Variant
Dim StrNum As String
Open "Z:\VBA\File1.txt" For Input As #1
Open "Z:\VBA\File2.txt" For Output As #2
For i = 1 To 10
Input #1, StrNum
A(i) = StrNum
Next i
For i = 1 To 10
StrNum = A(i) & Chr(13)
Print #2, StrNum
Next i
102
Close
End Sub
Объявляем массив А(10) и строковую переменную StrNum. Открываем File1.txt для считывания и File2.txt для записи. Далее в цикле Do…Loop считываем построчно из файла File1.txt и помещаем результат в строковую переменную StrNum. Заполняем массив при помощи операции присваивания. Последний этап – запись массива А в файл File2.txt. Функция EOF(filenumber) возвращает значение True при достижении конца файла открытого для последовательного доступа. Аргумент filenumber содержит допустимый номер файла. Оператор Close закрывает все открытые файлы. Если этого не сделать, то при повторном запуске процедуры, компилятор сообщит о наличии ошибки.
Пример 3. Заполнить одномерный массив с помощью датчика случайных чисел. Результат поместить в файл File3.txt.
Sub InputArray3()
'***************************************************
' Заполнение одномерного массива при помощи датчика
'случайных чисел
'***************************************************
Dim A() As Integer
Dim Title As String
Open "Z:\VBA\File3.txt" For Output As #3
Randomize
Title = "Заполнение одномерного массива"
N = InputBox("Размер массива", Title)
ReDim A(1 To N)
103
For i = 1 To N
ArrayValue = Int((100 * Rnd) + 1)
A(i) = ArrayValue
Worksheets("Лист1").Cells(i + 1, 3) = A(i)
Print #3, A(i)
Next i
Close
End Sub
Объявляем массив А целых чисел, причем в данном случае необходимо создать динамический массив. Открываем File3.txt для записи. Далее с помощью оператора Randomize инициализируем функцию Rnd, которая генерирует случайные числа в диапазоне от 0 до 1. Оператор Int((100 * Rnd) + 1) заполняет массив случайными числами в интервале от 0 до 100. Полученный файл записывается в File3.txt и на Лист1 рабочей книги.
Представление данных в виде массивов очень удобный, а иногда и единственно возможный метод, который использует программист для решения тех или иных практических задач. Поэтому далее рассматриваются некоторые приемы, которые необходимо знать и уметь применять при обработке данных, представленных в матричном виде.
104
Пример 4. Вычислить сумму и среднее арифметическое всех элементов одномерного массива, состоящего из 20-ти элементов.
Sub InputArray4()
'**********************************************************
' Вычислить сумму и среднее арифметическое всех элементов
'одномерного массива, состоящего из 20-ти элементов.
' Заполнение одномерного массива происходит при помощи
'датчика случайных чисел
'**********************************************************
Dim A(1 To 20) As Integer
Dim Title As String
Dim String1 As String
Dim String2 As String
String1 = "Сумма = "
String2 = "Среднее арифметическое = "
Randomize
Title = "Сумма элементов одномерного массива"
Sum = 0
For i = 1 To 20
ArrayValue = Int((100 * Rnd) + 1)
A(i) = ArrayValue
Next i
For i = 1 To 20
Sum = Sum + A(i)
Next i
105