ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 23.03.2025
Просмотров: 1067
Скачиваний: 2
Dim strB(-10 To 10, 25) As String |
' Переменная strB представляет |
' собой двумерный массив строк. |
|
'Так как в скобках указано |
|
'только одно целое число, то |
|
'это – верхняя граница. Если |
|
'инструкция Option Base |
|
'отсуствует, то первый 'эле- |
|
'мент массива – arrА(-10, 0), по- |
|
'следний – arrА(10,25), число |
|
'элементов массива |
|
' 21*26=546 |
Обработка двумерных массивов
Главное отличие двумерного массива от одномерного заключается в следующем: для обработки двумерного массива необходимо сформировать все возможные сочетания численных значений двух индексов. Следовательно, это можно сделать, если при обработке двумерных массивов использовать два цикла, один из которых реализуется по индексам строк, а второй – по индексам столбцов. В зависимости от того какой из этих циклов будет внешним, а какой – внутренним, возможны две схемы обработки массивов.
' обработка массива A(M, N) по |
' обработка массива A(M, N) по |
' строкам |
' столбцам |
Option Base 1 |
Option Base 1 |
For i = 1 To M |
For j = 1 To N |
For j = 1 To N |
For i = 1 To M |
A(i, j) = . . . |
A(i, j) = . . . |
Next j |
Next i |
Next i |
Next j |
118 |
Следует отметить, что хотя указание переменной цикла в операторе Next является необязательной опцией, желательно привыкнуть к такому стилю программирования. Это позволит избежать ненужных ошибок в дальнейшей работе.
Ввод двумерных массивов
Как и в случае одномерных массивов, ввод двумерных массивов можно осуществить аналогичными методами:
при помощи оператора присваивания; непосредственным вводом с клавиатуры; подготовкой и вводом данных из текстового файла; использования датчика случайых чисел;
заполнением массива при помощи стандартных функций
Пример 1. Заполнить одномерный массив непосредственным вводом с клавиатуры. Результат поместить в столбцы A - D рабочей книги Excel.
Option Base 1
Sub InputArray1()
'**********************************************************
' Ввод с клавиатуры
'**********************************************************
Dim A(3, 5) As Integer
Dim Title As String
Title = "Заполнение двумерного массива"
For i = 1 To 3
For j = 1 To 5
A(i, j) = InputBox("Введите A(" & i & ", " & j & "):", Title)
119
Worksheets("Лист1").Cells(i + 1, j) = A(i, j)
Next j
Next i
End Sub
Процедура достаточно проста и отличается от случая одномерного массива только наличием двух циклов по i и по j. Сначала происходит ввод по столбцам и заполняется первая строка, затем – вторая и, наконец, заполняется третья (последняя) строка.
При использовании оператора Option Base его следует помещать в область объявлений модуля перед объявлениями любых переменных, констант или процедур. Нельзя помещать Option Base внутри процедуры и, кроме того, в модуле должен быть только один оператор Option Base.
Пример 2. Заполнить одномерный массив, считав данные из файла File1.txt. Результат поместить в файл File2.txt.
Sub InputArray2()
'******************************************************
' запись и считывание данных из файла
'******************************************************
Dim A(10, 10) As Variant
Dim StrNum As String
Dim endStr As String
Open "Z:\VBA\File4.txt" For Input As #1
Open "Z:\VBA\File5.txt" For Output As #2
For i = 1 To 10
For j = 1 To 10
120
Input #1, StrNum
A(i, j) = StrNum
Next j
Next i
For i = 1 To 10
StrNum = ""
For j = 1 To 10
endStr = ", "
If j = 10 Then endStr = Chr(13)
StrNum = StrNum & A(i, j) & endStr
Next j
Print #2, StrNum
Next i
Close
End Sub
Данный пример аналогичен примеру, который был рассмотрен для одномерного случая. Отличие заключается в том, что в первом случае происходит считывания одного элемента, а здесь поэлементно производится считывание – целой строки.
Пример 3. Заполнить двумерный массив A(N, 3) с помощью датчика случайных чисел. Первый столбец заполнить вещественными числами, второй – целыми, а третий столбец – значениями функции Результат поместить в файл File3.txt.
121
Sub InputArray3()
'*******************************************************
' заполнение двумерного массива при помощи датчика случайных 'чисел
'*******************************************************
Dim A() As Variant
Title = "Заполнение двумерного массива"
Open "Z:\VBA\File6.txt" For Output As #3
Randomize
N = InputBox("Число строк массива", Title)
ReDim A(1 To N, 1 To 3)
Pi = 3.14159
x = -Pi / 2
For i = 1 To N
ArrayValue = Int((100 * Rnd) - 50)
A(i, 1) = ArrayValue
ArrayValue = (Int((100 * Rnd) - 50)) / 10
A(i, 2) = ArrayValue
ArrayValue = Sin(x)
A(i, 3) = ArrayValue
x = x + Pi / (N - 1)
Worksheets("Лист1").Cells(i + 1, 1) = A(i, 1)
Worksheets("Лист1").Cells(i + 1, 2) = A(i, 2)
Worksheets("Лист1").Cells(i + 1, 3) = A(i, 3)
Print #3, A(i, 1), A(i, 2), A(i, 3)
122
Next i
Close
End Sub
В первый столбец вводятся случайные числа в диапазоне от - 50 до + 50, а во второй – в диапазоне от - 5 до + 5. В третий столбец вводятся значения функции с шагом . Первый, второй и третий столбцы выводятся соответственно в столбцы A, B, C таблицы рабочего листа Excel.
Пример 4. Заполнить двумерный массив A(M, N), используя для ввода массива функцию InputBox, а для вывода – функцию
MsgBox
Sub InputArray4()
'**********************************************************
' Ввод с клавиатуры Заполнить двумерный массив A(M, N), 'используя для ввода массива функцию InputBox, а для вывода – 'функцию MsgBox
'*******************************************************
Dim A() As Integer
Dim msgString As String
Dim Title As String
msgString = ""
Title = "Заполнение двумерного массива"
M = InputBox("Число строк", "Размерность массива")
N = InputBox("Число столбцов", "Размерность массива")
ReDim A(1 To M, 1 To N)
For i = 1 To M
123
For j = 1 To N
A(i, j) = InputBox("Введите A(" & i & ", " & j & "):", Title)
Next j
Next i
For i = 1 To M
For j = 1 To N
msgString = msgString & A(i, j) & ", "
Next j
msgString = msgString & Chr(13)
Next i
MsgBox "Массив А:" & Chr(13) & msgString, , "Вывод массива"
End Sub
Этот пример демонстрирует заполнение динамического массива А() с помощью функции InputBox. Сначала вводится число строк M и число столбцов N, а затем последовательно все элементы массива A. Далее происходит формирование переменной msgString – переменной вывода. В эту переменную с помощи операции конкатенации (&) записываются все элементы первой строки, второй строки и т. д. до конца массива.
Пример 5. Вычислить сумму и среднее арифметическое всех элементов массива A(M, N)
124
Sub InputArray5()
'*******************************************************
' Заполнить двумерный массив при помощи датчика случайных чи- 'сел. Вычислить сумму и среднее арифметическое всех'элементов
'*******************************************************
Dim A() As Variant
Dim strMes As String
Title = "Заполнение двумерного массива"
Randomize
M = InputBox("Число строк массива", Title)
N = InputBox("Число строк массива", Title)
ReDim A(1 To M, 1 To N)
For i = 1 To M
For j = 1 To N
ArrayValue = 100 - Int((200 * Rnd) + 1)
A(i, j) = ArrayValue
Next j
Next i
Sum = 0
For i = 1 To M
For j = 1 To N
Sum = Sum + A(i, j)
msgString = msgString & A(i, j) & ", "
Next j
msgString = msgString & Chr(13)
125
Next i
MsgBox "Массив А:" & Chr(13) & msgString, , "Вывод массива"
mA = Sum / (M * N)
MsgBox "Массив А:" & Chr(13) & "Сумма элементов = " & Sum & Chr(13) & _
"Среднее арифметическое = " & mA, , "Вывод массива"
End Sub
Данный пример аналогичен примеру 4 предыдущей работы и отличается только организации двух циклов по номерам строк и столбцов. По окончании двойного цикла происходит формирование переменной msgString – переменной вывода, в которой находится сумма и среднее арифметическое всех элементов массива A
Пример 6. Переставить в массиве A(M, N) строки с номерами
2 и M - 1
Sub InputArray6()
'**********************************************************
'Заполнить двумерный массив A(M, N),
'используя датчик случайных чисел.
'Переставить в этом массиве строки 2 и M - 1 '**********************************************************
Dim A() As Integer
Dim msgString As String msgString = ""
M = InputBox("Число строк", "Размерность массива")
N = InputBox("Число столбцов", "Размерность массива")
ReDim A(1 To M, 1 To N)
126