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

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

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

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