Тема 4.8
Алгоритмы обработки двумерных массивов
Средства описания и работы с двумерными
Массивами данных
Базовые алгоритмы обработки двумерных
Массивов
Тестовые задания
4.8.4. Лабораторная работа по теме «Программирование алгоритмов формирования и обработки двумерных массивов»
Вопросы, подлежащие изучению
Общее задание на разработку проекта
Варианты индивидуальных заданий
4.8.4.4. Содержание отчёта
Пример выполнения задания
Контрольные вопросы
Средства описания и работы с двумерными массивами данных
При решении математических, экономических, статистических задач информация располагается в матрицах и таблицах, которые являются прототипом двумерного массива в программировании. Если в одномерных массивах каждый элемент содержит только один индекс, то в двумерных массивах каждый элемент имеет два индекса – номера строки и номера столбца.
Из предыдущей темы известно, что массив представляет собой последовательность переменных одинакового типа, объединенных общим именем.
Количество индексов (измерений) указывает на размерность (ранг) массива. Например, двумерный массив b(3,2):
b(0,0) | b(0,1) | b(0,2) |
b(1,0) | b(1,1) | b(1,2) |
b(2,0) | b(2,1) | b(2,2) |
b(3,0) | b(3,1) | b(3,2) |
Так, в приведенном выше примере размерность массива b(3,2) – 2, т.е. массив двумерный (имеет два измерения). В нашем примере количество элементов массива b(3,2) равно 12 (4 строки и 3 столбца).
Перед использованием двумерного массива в программе, его необходимо объявить с помощью оператора Dim, который выделяет место в памяти для размещения элементов статического массива. Например:
Dim b(3,2) As Single |
Необходимо обратить внимание на то, что, как при описании – A(m,n), так и при обращении – A(i,j) к элементам двумерного массива, в скобках сначала указывается номер строки, а затем номер столбца ( рис. 4.8.1-1).
Для определения параметров двумерного массива могут использоваться свойство класса Array – Rank и метод класса Array – GetLength(). Свойство Rank используется для определения количества измерений (ранга) массива (для двумерного массива ранг равен 2). Причем каждое измерение в массиве может иметь свою длину. Метод GetLength() используется для определения количества элементов в заданном измерении массива (для первого измерения используется значение 0, для второго – 1 и т.д.). Необходимо обратить внимание, что метод GetLength() возвращает значение, которое на единицу больше, чем указанное в объявлении Dim, так как индексация элементов массива в VBвсегда начинается с нуля, а метод GetLength() определяет количество элементов, считая от единицы.
Матрица прямоугольная A(n,m) - n¹m Матрица квадратная A(n,m) - n=m
|
Побочная диагональ Главная диагональ матрицы i=n-j матрицы i= j |
Рис. 4.8.1-1. Прямоугольная и квадратные матрицы
Так, для определения параметров массива Mac1(,), описанного как
Dim Mac1(4,7) As Integer |
можно воспользоваться следующими выражениями:
ArrayRank = Mac1.Rank RawCount = Mac1.GetLength(ArrayRank-2) ColumnCount= Mac1.GetLength(ArrayRank-1) |
Где ArrayRank – ранг матрицы (равен 2);
RawCount – количество строк (равно 5);
ColumnCount – количество столбцов (равно 8).
Таким образом, ArrayRank, RawCount, ColumnCount являются переменными целочисленного типа, которые принимают значения 2, 5 и 4.8.
Кроме того, для определения параметров двумерного массива можно использовать метод GetUpperBound(), который находит верхнюю границу (максимальный индекс) заданного измерения. В качестве параметра этот метод принимает значения аналогично методу GetLength(), т.е. для первого измерения (строк) используется значение 0, для второго (столбцов) – 1.
Например, для массива Mac2(4,7):
Dim Mac2(4,7) As Double Dim Cтрока1, Столбец2 As Integer Строка1 = Mac2.GetUpperBound(0) 'Значение Строка1 'равно 4 Столбец2 = Mac2.GetUpperBound(1) 'Значение Столбец2 'равно 7 |
Ввод, вывод и обработка двумерных массивов, как правило, основаны на использовании вложенных циклов, которые обеспечивают перебор всех элементов массива. В некоторых задачах может иметь значение порядок перебора элементов массива: «по строкам» или «по столбцам». Если внешний цикл будет организован по первому индексу (по строкам), а внутренний цикл по второму индексу (по столбцам), то выполняется построчный перебор элементов двумерного массива. Если внешний цикл в качестве параметра использует второй индекс, а внутренний цикл – первый индекс, то элементы массива перебираются по столбцам.
Пример 4.8.1-1. Написать процедуры ввода/вывода, которые могут использоваться в алгоритмах обработки двумерных массивов.
Некоторые процедуры ввода и вывода приведены в Темах 4.3, 4.4, 4.5, 4.6 и 4.7. Остальные процедуры ввода и вывода, которые можно использовать при написании базовых алгоритмов формирования и обработки двумерных массивов, представлены на рис. 4.8.1-2, 4.8.1-3, 4.8.1-4 и 4.8.1-5.
'Процедура ввода элементов двумерного массива Single с клавиатуры Sub vvodSngMac18(ByRef a(,) As Single) Dim i, j, m, n As Integer, y As Single m = a.GetLength(0) – 1: n = a.GetLength(1) - 1 Dim r1, r2 As String For i = 0 To m For j = 0 To n r1 = СStr(i): r2 = СStr(j) y = InputBox("эл-т массива a(" + r1 + "," + r2 + ") = ", _ "Ввод эначений эл-тов массива a()") a(i,j) = CSng(Val(y)) Next j Next i End Sub |
Рис. 4.8.1-2. Процедура ввода элементов двумерного массива
vvodSngMac18() Примера 4.8.1-1
'Процедура формирования двумерного массива случайными числами Sub vvod2(ByRef a(,) As Double, ByVal m As Integer, _ ByVal n As Integer) Dim i, j As Integer Randomize() For i = 0 To m For j = 0 To n a(i, j) = 10 * Rnd() - 5 Next i Next j End Sub |
Рис. 4.8.1-3. Процедура формирования массива vvod2()
случайными числами Примера 4.8.1-1
'Процедура форматированного вывода двумер-го массива в ListBox Sub vivodSngMac19(ByRef x(,) As Single, ByRef LB As ListBox) Dim i, j, m, n As Integer Dim z, z1 As String m = x.GetLength(0) – 1: n = x.GetLength(1) - 1 LB.Items.Clear() For i = 0 To m z= "" For j = 0 To n z1 = Format(x(i,j), "0.000") If x(i,j) < 0 Then z1 = Space(2) + z1 Else z1 = Space(3) + z1 End If z = z + z1 Next j LB.Items.Add(z) Next i End Sub |
Рис. 4.8.1-4. Процедура форматированного вывода массива vivodSngMac19()
Примера 4.8.1-1
На рис. 4.8.1-4 представлен пример процедуры вывода целочисленной матрицы в TextBox. Напомним, что для того, чтобы в элементе управления TextBox можно было записать несколько строк текста, необходимо присвоить его свойству MultiLine значение True.
'Процедура форматированного вывода двум-го массива Integer в TextBox Sub vivodIntMac20(ByRef x(,) As Integer, ByRef TB As TextBox) Dim i, j, m, n As Integer Dim z As String m = x.GetLength(0) – 1: n = x.GetLength(1) - 1 TB.Text = "" For i = 0 To m For j = 0 To n If Abs(x(i,j)) >= 100 Then z = CStr (x(i,j)) & Space(2) ElseIf Abs(x(i,j)) >= 10 Then z = CStr (x(i,j)) & Space(4) Else z = CStr (x(i,j)) & Space(6) End If If x(I,j) >= 0 Then z = Space(1) + z TB.Text = TB.Text & z Next j TB.Text = TB.Text & vbCrLf Next i End Sub |
Рис. 4.8.1-5. Процедура форматированного вывода массива
vivodIntMac20 в TextBox Примера 4.8.1-1