ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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