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

Статические массивы

 

Статические массивы не меняют размерности и размера в процессе выполнения программы.

 

Объявление статических массивов.

Одномерный массив:

 

Dim <имя_массива (верхняя граница индекса)> As тип

 

Нижняя граница индекса по умолчанию равна 0.

 

Двумерный массив:

 

Dim <имя_массива (верхняя_граница_индекса1, верхняя_граница индекса2)> As Тип

 

Нижние границы индексов по умолчанию равны 0.

Примеры :

Dim A(20) As Integer

Dim Mass(10, 15) As String ‘аналогично определяются и другие

‘многомерные массивы.

При объявлении массива за ним закрепляется область оперативной памяти (ОП). Для

установки произвольных границ массива используют другое объявление.

 

Одномерный массив:

 

Dim <имя_массива(нижняя_граница_индекса> Тo <верхняя_граница индекса)> As Тип

 

Двумерный массив:

 

Dim <имя_массива (нижняя_граница_индекса1> Тo <верхняя_граница индекса1, _

нижняя_граница_индекса2> Тo <верхняя_граница_индекса2)> As Тип

Примеры:

Dim A(1 To 10, 5 To 15) As Integer ‘двумерный массив

Dim C(3 To 12) As Boolean ‘одномерный массив

Dim D(7, 10 To 20) As Single ‘двумерный массив, первый индекс – от 0 до 7

 

Замечание :

При объявлении массивов, как и при объявлении переменных, можно использовать вместо Dim ключевые слова Private и Public:

- Private – область определения: контейнер (форма, модуль);

- Public – область определения: всё приложение.

 

 

Нередко размер массива не может быть определен заранее. Было бы расточительно объявлять массив заведомо большего размера. В языке Visual Basic есть средство, позволяющее решить эту проблему. Это динамический массив

Объявление такого массива осуществляется в два этапа. Сначала массив определяют в секции General Declarations контейнера (формы, модуля) без указания размера:

Dim <имя_массива( )> As Тип ‘область определения – контейнер, ‘если Public, то массив глобальный

Затем в процедуре с помощью оператора переопределения (переобъявления) массива ReDim устанавливают фактический размер массива (изменять можно только верхнюю границу и только последнего индекса):

 

Private Sub …

ReDim <имя_массива (10, 20)>

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

End Sub

 

Замечание:

Первоначальные значения констант, определяющих границы изменения индексов, могут задаваться в разделе описания Const, указав имя константы, ее значение. Наиболее гибкий способ объявления массивов – размеры массивов задаются путём ввода их значений с использованием функции InputBox.

Пример :

Const M = 20, N = 10 ‘ключевое слово Const предваряет объявление констант _

более гибко: M = InputBox (“Укажите значения M и N” )

Dim A(M) As Single, B(1 To N) As Integer

Функцией InputBox предпочтительнее обеспечивать задание границ изменения индексов и при переопределении массивов, используя её перед оператором ReDim, например, перед ReDim <имя массива> (M, N).

 

3.4. Одномерные массивы

 

3.4.1. Ввод одномерных массивов

 

1. Ввод массива в память (создание массива) с помощью клавиатуры и функции InputBox :

 

Процедура ввода имеет вид:

Private Sub CmdSozd_Click ( )

Const N = 15

Dim I As Integer

Dim A(1 To N) As Single ‘объявление массива

For I = 1 To N

A(I) = InputBox (“Введите значение элемента с номером: ”& I)

Next I

End Sub

 

2. Ввод (создание) массива с использованием стандартной функции Choose, выполняющей выбор элементов (значений), заданных в списке. Синтаксис функции:

Choose (Index, ch_1 [, ch_2, … [, ch_n]]),

где: - index – числовое выражение или поле, принимающее значения от 1 до числа возможных элементов в списке;

ch_1, …, ch_n – элементы списка.

Пример

For I = 1 To 7 ‘занесение данных в массив Den_Ned

Den_Ned(I) = Choose(I, “Пн”, “Вт”, “Ср”, “Чт”, “Пт”, “Сб”, “Вс”)

Next I

3.4.2. Вывод одномерных массивов

 

Вывод массива (его отображение) может осуществляться несколькими способами:

- оператором MsgBox – сцепляя элементы массива в строку – в специальное

окно;

- в элемент ListBox – построчно, начиная с нулевой строки массива;

- в элемент TextBox – сцепляя элементы массива в строки;

- оператором Print – на форму - выводимая информация будет появляться

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

Пример:

Пусть на форме имеются текстовое поле с именем TxtViv, список с именем ListViv и кнопка “Вывод” с именем CmdViv. Двойным щелчком вызовем процедуру:

Procedure Sub CmdViv_Click ( )

Dim A(1 To 5) As Single ‘массив

Dim I As Integer ‘параметр цикла

Dim Mass As String ‘строка для размещения элементов массива

‘Создание массива А (см. начало п. 3.4)

‘Вывод массива

Mass = “”: TxtViv.Text = “” ‘очистка строки для вывода массива и текстового поля

For I = 1 To 5

TxtViv.Text = TxtViv.Text & “ ” & A(I) ‘формирование строки в TextViv

Mass = Mass & Str(A(I)) & “ ” ‘подготовка строки для MsgBox

ListViv.List (I) = A(I) ‘вывод в список (5 строк)

Next I

MsgBox “Массив:” & Mass ‘вывод в специальное окно

End Sub

 

3.4.3. Обработка одномерных массивов

 

Для упрощения будем считать, что решение производится на простейшей форме с двумя кнопками Cmd1 и CmdExit, так что вся программа будет сосредоточена в процедуре связанной с кнопкой Cmd1.

Примеры :

Пример1. Определить максимальный элемент массива из заданного числа элементов. Определить также номер максимального элемента.

 

Private Sub Cmd1_Click ()

Dim A(1 To 10) As Single, Max As Single, I As Integer, Nom As Integer

For I = 1 To 10 ‘Ввод массива

A(I) = InputBox (“Вв.элемент с номером ” & I)

Next I

Max = A(1)

For I = 1 To 10

If A(I) > Max Then Max = A(I)

Next I

Print “Максимальный элемент = ” & Max ‘второй просмотр позволит _

определить номера всех максимальных элементов

Print “номера максимальных элементов”

For I = 1 To 10

If A(I) = Max Then Print I ‘принять меры, чтобы печать была видна

Next I

End Sub

Пример 2. Определить первый максимальный элемент из числа отрицательных элементов массива.

Private Sub Cmd1_Click ()

Dim A(1 To 20) As Single, Max As Single ‘объявление массива и переменных

Dim I As Integer, Nom As Integer

ввод массива – (см. выше Пример1)

Max = -1E45

For I = 1 To 20

If A(I) < 0 And A(I) > Max Then Max = A(I) : Nom = I ‘если нужно искать _

последний, то: If A(I) < 0 And A(I) >= Max Then Max = A(I) : Nom = I

Next I

If Max =-1E45 Then MsgBox “В массиве нет отрицательных элементов”

Else MsgBox “искомый максимальный элемент =” & Max & “ “ & _

“номер=” & Nom