Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

 

Для ввода элементов двумерного массива, так же, как и одномерного, используются операторы InputBox и Cells, для вывода на печать – оператор MsgBox.

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

При вводе по строкам параметром внешнего цикла является индексная переменная, обозначающая номер строки, параметром внутреннего – индексная переменная, обозначающая номер столбца.

Пример 25: ввод матрицы А, содержащей n строк и m столбцов. Переменной i обозначим строки матрицы, переменной j – столбцы.

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For i = 1 To n

For j = 1 To m

Int_Array(i, j) = InputBox("Введите значение для " & "элемента_ (" & i & "," & j & ") ", "Ввод элементов массива; строка " & i)

Next j

Next i

 

В этой программе для одного фиксированного значения номера строки i, осуществляется перебор всех значений индекса j, т.е. вводится строка. По окончании внутреннего цикла (по j) номер строки i увеличивается на 1 и ввод элементов производится с начального, нулевого столбца j.

В программе вместо оператора InputBox можно использовать оператор Cells. В этом случае элементы матрицы должны быть записаны по строкам в рабочем листе Excel. Возможен способ ввода, когда элемент массива вычисляется по какой-либо формуле, где в качестве ее параметров могут присутствовать номера строк и номера столбцов.

 

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For i = 1 To n

For j = 1 To m

Int_Array(i, j) = Cells (i,j)

Next j

Next i

 

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For i = 1 To n

For j = 1 To m

Int_Array(i, j) =...

Next j

Next i

 

При вводе элементов двумерного массива по столбцам параметром внешнего цикла выбирается номер столбца j, параметром внутреннего – строки i.

 

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For j = 1 To m

For i = 1 To n

Int_Array(i, j) = InputBox("Введите значение для " & "элемента_ (" & i & "," & j & ") ", "Ввод элементов массива; строка " & i)

Next i

Next j

 

Как видно из обеих программ, по количеству операторов оба способа равноценны, однако следует помнить, что быстрее выполняются двойные циклы, в которых параметр внутреннего цикла имеет большее количество шагов. В оперативной памяти элементы двумерных массивов располагаются всегда по столбцам вне зависимости от способа ввода.

Алгоритмы вывода матрицы на печать аналогичны приведенным выше.

 

str_msg = ""

For i = 1 To n

For j = 1 To m

str_msg = str_msg & Int_Array(i, j) & ", "

Next j

str_msg = str_msg & Chr(13) 'перевод строки

Next i

MsgBox "Введено: " & Chr(13) & str_msg,, " Вывод ранее введенного массива"

 

По этой программе элементы каждой строки будут выведены в диалоговое окно. Строка

str_msg = str_msg & Chr(13)

подготавливает печать каждой новой строки матрицы на очередной строчке диалогового окна (выполняет функцию "перевода каретки" как только напечатается очередная строка).

 

Пример 26. Ввод-вывод двумерного массива

 

Sub DemoStatArray()

Dim str_msg As String

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For i = 1 To n

For j = 1 To m

Int_Array(i, j) = InputBox("Введите значение для " & "элемента_ (" & i & "," & j & ") ", "Ввод элементов массива; строка " & i)

Next j

Next i

str_msg = ""

For i = 1 To n

For j = 1 To m

str_msg = str_msg & Int_Array(i, j) & ", "

Next j

str_msg = str_msg & Chr(13) 'перевод строки

Next i

MsgBox "Введено: " & Chr(13) & str_msg,, "Вывод ранее введенного массива "

End Sub

 

 

 

 

 

9.12.8. Использование ReDim с динамическими массивами

 

Иногда могут сложиться обстоятельства, при которых точно неизвестно, сколько элементов потребуется в массиве. В VBA имеется возможность переопределять размерность массивов, а во время объявления не указывать размерность. Используя динамический массив, можно создавать массив такой большой или такой маленький, какой необходимо. Динамические массивы создаются с помощью оператора Dim, затем их размер устанавливается с помощью оператора ReDim во время выполнения процедуры.

Оператор R eDim имеет следующий синтаксис:

 

ReDim [Preserve] varname (subscripts) [As type] [varname_

(subscripts) [As type]]

 

Необязательное ключевое слово Preserve указывает VBA сохранять данные в имеющемся массиве, когда изменяется размер массива с помощью ReDim; varname – имя массива; subscripts – это новый размер массива; type – тип элементов массива. Необходимо использовать отдельный оператор As type для каждого массива, который определяется.

 

Dim aMonth() As String ReDim aMonth(1 To 30) ReDim aMonth(31) ReDim Preserve aMonth(1 To 31)   Dim Table()As Integer ReDim Table (3, 15) ReDim Table(4, 20) ReDim Preserve Table(4, 25) Dim Mas as Variant ReDim Mas(20) As Integer 'объявляет динамический массив aMonth 'изменяет размер массива до 30 элементов 'изменяет размер массива до 31 элемента 'изменяет размер массива до 31 элемента, сохраняя содержимое массива 'объявляет динамический массив 'делает массив двумерным 'изменяет размер двумерного массива 'только изменяет последний размер массива 'объявляет переменную типа Variant 'создает массив 20 целых в Variant

 

Важные моменты:

1. Можно изменять только последнее измерение многомерного массива, когда используется ключевое слово Preserve;

2. Можно использовать ReDim для создания типизированного массива внутри переменной типа Variant; так как переменные типа Variant могут содержать данные любого типа, можно использовать переменную типа Variant для сохранения динамического массива. (Использование переменной типа Variant для сохранения динамического массива дает возможность изменять размер массива с помощью ReDim и изменять тип данных массива.)

Обычно оператор ReDim используется для изменения размера динамического массива, который уже был объявлен ранее с помощью операторов Dim. Можно использовать оператор ReDim для изменения числа элементов и измерений в динамическом массиве столько раз, сколько необходимо. Однако нельзя использовать оператор ReDim для изменения типа данных массива, если только массив не содержится в переменной типа Variant или сами элементы массива не имеют тип Variant. Если динамический массив сохраняется в переменной типа Variant, можно изменять тип данных, используя оператор As type в операторе ReDim.

Пример 27. Программа заполняет массив до тех пор, пока не будет введена пустая строка. При заполнении массива размерность массива увеличивается. При этом сохраняются предыдущие значения массива и очередному (новому) элементу присваивается введенное значение.

Option Base 1

Sub DemoDinArray()

Dim Int_Array() As Integer

Dim str_msg As String, i As Integer

Dim Num

str_msg = " "

i = 0

Do

i = i + 1

Num = InputBox("Введите целое число для " & i & "-го элемента массива", "Ввод элементов массива")

If Len(Num) = 0 Then Exit Do ' выход из цикла

' изменение размера массива с сохранением элементов

ReDim Preserve Int_Array(i)

'ввод данных в i-й элемент' массива

Int_Array(i) = Num

Loop

For j = 1 To i - 1

str_msg = str_msg & Int_Array(j) & ", "

Next j

MsgBox "Введено: " & str_msg,, "Вывод ра нее введенного массива"

End Sub

 

Пример 28. В первой части процедуры DemoDinArray в динамический массив Int_Array записывается первая строка будущего многомерного массива и определяется его вторая (количество столбцов) размерность. Как только пользователь во время ввода первой строки отказался от ввода, формирование первой строки заканчивается. В этот момент программе известна вторая размерность будущего двумерного массива: m=i-1. Функция MsgBox запрашивает ввести первую размерность массива Int_Array. Далее объявляется этот двумерный массив. Далее данные из одномерного массива Int_Arrayl переписываются в первую строку двумерного массива Int_Array/

 

Option Base 1

Sub DemoDinArray2()

Dim Int_Arrayl() As Integer

Dim str_msg As String

Dim i As Integer, m As Integer, n As Integer

Dim Num

str_msg = ""

i = 0

Do

i = i + 1

Num = InputBox("Введите целое число для " & i & "-го элемента массива", "Ввод элементов массива")

If Len(Num) = 0 Then Exit Do ' выход из цикла

ReDim Preserve Int_Arrayl(i) 'изменение размера массива с сохранением элементов

Int_Arrayl(i) = CStr(Num) 'ввод данных в i-й элемент массива

Loop

m = i - 1 'вторая размерность массива

n = InputBox("Введите количество строк массива ")

ReDim Int_Array(n, m)

' запись в выходной массив уже введенной строки

For j = 1 To m

Int_Array(1, j) = Int_Arrayl(j)

Next j

'теперь работаем с обычным двумерным массивом,

'только первую строку не заполняем:

For i = 2 To n

For j = 1 To m

Int_Array(i, j) = InputBox("Введите целое число для " & " элемента (" & i & "," & j & ")", "Ввод элементов массива; строка " & i)

Next j

Next i

'подготовка строки выдачи

For i = 1 To n

For j = 1 To m

str_msg = str_msg & Int_Array(i, j) & ", "

Next j

str_msg = str_msg & Chr(13) ' перевод строки

Next i

MsgBox "Введено: " & Chr(13) & str_msg,, "Вывод ранее введенного массива"

End Sub


<== предыдущая лекция | следующая лекция ==>
Ввод одномерных массивов. Вывод одномерных массивов | Решение задач с помощью стандартных программ
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 2945; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.044 сек.