- •Тема 4.8. Программирование алгоритмов формирования и обработки двумерных массивов
- •4.8.2. Базовые алгоритмы обработки двумерных массивов
- •1 2 3
- •3 2 1
- •4.8.3. Задачи для самостоятельного решения по теме «Программирование алгоритмов формирования и обработки двумерных массивов»
- •4.8.4. Тестовые задания по теме «Программирование алгоритмов формирования и обработки двумерных массивов»
- •Тема 4.8. Программирование алгоритмов формирования и обработки двум. МассивовСтраница235
4.8.2. Базовые алгоритмы обработки двумерных массивов
Для работы с массивами, как правило, используются алгоритмы регулярной циклической структуры. В примерах 4.8.2-1 – 4.8.2-5 приведены базовые алгоритмы обработки двумерных массивов.
К базовым алгоритмам обработки двумерных массивов можно отнести алгоритмы: формирование массива, перемножение матриц и векторов и другие.
Пример 4.8.2-1. Написать процедуру, которая формирует двумерный массив x, состоящий из 4 строк и 4 столбцов, по правилу: x(i,j) = 2*(i - 2) 2 - (j - 2) 2 и определяет максимальный элемент среди элементов, лежащих ниже главной диагонали, а также минимальный элемент – выше главной диагонали. Найденные максимальный и минимальный элементы поменять местами.
Общий алгоритм решения данной задачи представлен на рис. 4.8.2-1. Формирование значений элементов двумерного массива x по заданной формуле и их вывод в виде матрицы производится с помощью вложенных циклов. В переменных xmin и xmax в цикле фиксируются минимальный и максимальный элементы массива, в переменных imin, jmin и imax, jmax– их координаты (номер строки и номер столбца), вначале это 1- й элемент ниже диагонали и 1- й элемент выше диагонали.
Изменяя номера строки i с помощью внешнего цикла, отдельно просматриваются элементы, расположенные ниже (j от 0 до i-1) и выше (j от i+1 до 3) главной диагонали. После просмотра всех элементов массива x в переменных imax и jmax фиксируются координаты максимального элемента, а в переменных imin и jmin– координаты минимального элемента.
Для краткости вывод матрицы здесь, а в дальнейшем и во всех последующих схемах алгоритма представлены, укрупнено – одним блоком.
|
Рис. 4.8.2-1
В соответствии с концепцией VS .NET реальные программы должны состоять из множества отдельных процедур. Поэтому в алгоритме, приведенном на рис. 4.8.2-1, можно выделить несколько функциональных частей, описывающих определенные действия, каждую из которых можно реализовать своей процедурой: формирование двумерного массива, вывод двумерного массива, нахождение и обмен максимального и минимального элементов, вывод максимального и минимального элементов.
В этом случае программный код процедуры будет таким, как на рис. 4.8.2-2.
Sub Pr4822(ByRef x(,) As Single, _ ByRef xmin As Single, _ ByRef xmax As Single) Dim i, j As Integer Dim m As String, r As Single Dim imin, jmin, imax, jmax As Integer ReDim x(3,3) FormMac2(x) 'Формирование двумерного массива x( , ) vivodSngMac19(x,ListBox1)'Вывод сформированного массива MaxH(x,xmax, imax, jmax)'Нахождение max эл. и его индексов, vivodSng3(xmax, TextBox1) 'лежащих ниже главной диагонали, и vivodInt4(imax, TextBox2) 'их вывод в элементы TextBox vivodInt4(jmax, TextBox3) MinB(x, xmin, imin, jmin)'Нахождение min эл. и его индексов, vivodSng3(xmin, TextBox4)'лежащих выше главной диагонали, и vivodInt4(imin, TextBox5)'их вывод в элементы TextBox vivodInt4(jmin, TextBox6) Ob(x, imax, jmax, imin, jmin) 'Обмен max и min элементов vivodSngMac19(x, ListBox2)'Вывод преобразованного массива End Sub
'Формирование двумерного массива x(,) Sub FormMac2(ByRef x( , ) As Single) Dim i, j, m As Integer m = x.GetLength(0) – 1 For i = 0 To m For j = 0 To m x(i,j) = 2*(i – 2) ^2 - (j - 2)^2 Next j Next i End Sub
'Нахождение max эл. и его индексов, лежащих ниже главной диагонали Sub MaxH(ByRef x(,) As Single, _ ByRef xmax As Single, _ ByRef imax As Integer, _ ByRef jmax As Integer) Dim i, j, m As Integer m = x.GetLength(0) – 1 imax = 1 : jmax = 0 : xmax = x(1,0) For i = 0 To m For j = 0 To i - 1 If x(i,j) > xmax Then xmax = x(i,j ): imax = i : jmax = j End If Next j Next i End Sub 'Нахождение min эл. и его индексов, лежащих выше главной диагонали Sub MinB(ByRef x(,) As Single, _ ByRef xmin As Single, _ ByRef imin As Integer, ByRef jmin As Integer) Dim i, j, m As Integer m = x.GetLength(0) – 1 imin = 0 : jmin = 1 : xmin = x(0,1) For i = 0 To m For j = i + 1 To m If x(i,j) < xmin Then xmin = x(i,j ) imin = i jmin = j End If Next j Next i End Sub
'Обмен max и min элементов Sub Ob(ByRef x(,) As Single _ ByVal imax As Integer, ByVal jmax As Integer _ ByVal imin As Integer, ByVal jmin As Integer) Dim r As Single r = x(imax,jmax) x(imax,jmax)=x(imin,jmin) x(imin,jmin) = r End Sub |
Рис. 4.8.2-2
Процедура Pr4822( )может быть вызвана из любой другой процедуры или из модуля формы, например, следующим образом:
Dim xx( , ) As Single Dim xm1, xm2 As Single … Pr4823(xx, xm1, xm2) |
Рис. 4.8.2-3
На рис 4.8.2-3 двумерный массив xxи переменные xm1, xm2– фактические параметры, а на рис. 4.8.2-2двумерный массив x и переменные xmin, xmax – формальные параметры.
Обратите внимание, что при постановке задачи входной массив определен как массив, состоящий из 4строк и 4 столбцов – x(3,3) . Поэтому при написании программы, где это необходимо, была использована константа 3.
Однако, реальные процедуры должны быть универсальными, то есть в нашем случае должны обрабатывать двумерные массивы произвольного размера – x(n,n).
Это можно реализовать или с помощью передачи в процедуру параметра n, или воспользоваться методами класса Array (GetLength( )или GetLepperBound( )).
Пример 4.8.2-2.Написать процедуру, которая заполняет элементы массива f(5x2) целыми числами таким образом, чтобы получилась следующая таблица: