- •Тема 4.8. Программирование алгоритмов формирования и обработки двумерных массивов
- •4.8.1. Средства описания и работы с двумерными массивами данных
- •4.8.2. Базовые алгоритмы обработки двумерных массивов
- •4.8.3. Задачи для самостоятельного решения по теме «Программирование алгоритмов формирования и обработки двумерных массивов»
- •4.8.4. Тестовые задания по теме «Программирование алгоритмов формирования и обработки двумерных массивов»
- •Тема 4.8. Программирование алгоритмов формирования и обработки двум. МассивовСтраница234
- •Фрагмент программы выполняет операцию (2)
- •Двумерный массив после выполнения фрагмента программы будет отображен
- •Элемент массиваA(2,3) при выполнении фрагмента программы принимает значение
- •Элемент массива a(3,2) при выполнении фрагмента программы принимает значение
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) целыми числами таким образом, чтобы получилась следующая таблица:
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18,
а затем осуществить перестановку элементов первого и последнего столбцов.
Алгоритм и код программы данной задачи приведены на рис. 4.8.2-4.
Данный пример демонстрирует заполнение массива целых чисел f и перестановку элементов первого и последнего столбцов. Исходные данные для инициализации массива f записываются в фигурных скобках при описании массива. Вложенные циклы обеспечивают перебор элементов двумерного массива по столбцам: внутренний цикл по первому индексу, а внешний по второму индексу. Массив f после заполнения выводится на экран.
Перестановка элементов первого и последнего столбцов в программе выполняется в цикле, изменяющем номер строки i, в котором выполняется обмен значениями элементов f(i,0) и f(i,2). После этого массив выводится на экран в следующем виде:
3 2 1
6 5 4
9 8 7
12 11 10
15 14 13
18 17 16.
|
Sub Pr4824( ) Dim i, j, r As Integer Dim f(,) As Integer={{1,2,3}, {4,5,6}, _ {7,8,9}, {10,11,12}, _ {13,14,15}, {16,17,18}} Dim c1, c2 As Integer c1=0 : c2=2'номера столбцов vivodIntMac20(f, TextBox1)'Вывод исход. мас. ПерСтол(f, c1, c2)'Перест.1-го и 2-го столб. vivodIntMac20(f, TextBox2)'Вывод преобр.масс. End Sub
'Процедура перестановки столбцов Sub ПерСтол(ByRef f(,)As Integer, _ ByVal cc1 As Integer, ByVal cc2 As Integer) Dim ArrayRank, RawCount, i, r As Integer ArrayRank = f.Rank RawCount= f.GetLength(ArrayRank - 2) For i = 0 To RawCount - 1 r= f(i,cc1) : f(i,сс1)=f(i,cc2) f(i,cc2)= r Next i End Sub |
Рис. 4.8.2-4
В приведенном примере для определения параметров массива используются методы класса Array: Rank и GetLength( ).
Пример 4.8.2-3.Написать процедуру, которая формирует одномерный массив, каждый элемент которого представляет собой количество положительных элементов соответствующего столбца двумерного массива b(15,25).
Предполагается, что выделение памяти и ввод массива b(15,25)осуществляется в другой процедуре, которая вызывает процедуру Pr4823( ).
Алгоритм и код программы представлены на рис. 4.8.2-5.
Для перебора всех элементов исходной таблицы b также использованы вложенные циклы, в данном случае во внешнем цикле меняется номер столбца, а во внутреннем – номер строки. Такой порядок перебора элементов двумерного массива диктуется условиями задачи. В каждом столбце производится подсчет положительных элементов, и по окончании цикла результат записывается в соответствующий элемент одномерного массива а, номер которого совпадает с номером столбца матрицы b.
|
Sub Pr4825(ByRef b(,) As Single, _ ByRef a( ) As Integer) Dim Rank, RC, CC, j, i, n As Integer Rank = b.Rank RC = b.GetLength(Rank - 2) - 1 CC = b.GetLength(Rank - 1) - 1 ReDim a(CC) Dim m As String For j = 0 To CC n = 0 For i = 0 TO RC If b(i,j) > 0 Then n=n+1 Next i a(j)= n Next j 'vivodInt16(a, ListBox1) End Sub |
Рис. 4.8.2-5
Пример 4.8.2-4.Написать процедуру, которая из матрицы х(n,m), являющейся входным параметром, получает и выводит на экран транспонированную к ней матрицу y(m, n).
Алгоритм и программа решения данной задачи приведены на рис. 4.8.2-6.
Для решения поставленной задачи в алгоритме необходимо реализовать вложенные циклы перебора всех элементов исходной матрицы х. Транспонирование матрицы осуществляется путем перестановки (обмена) индексов транспонированной матрицы по отношению к исходной.
|
Sub Pr4926(ByRef x(,) As Single, _ ByRef y(,) As Single ) Dim ArrayRank, n, m, j, i As Integer ArrayRank = x.Rank n = x.GetLength(ArrayRank - 2) - 1 m = x.GetLength(ArrayRank - 1) - 1 ReDim y(m,n) For i = 0 To n For j = 0 To m y(j,i) = x(i,j) Next j Next i vivodSngMac19(y,ListBox2) End Sub |
Рис. 4.8.2-6
Пример 4.8.2-5.Написать процедуру, которая вычисляет и выводит на экран алгебраическое произведение р матрицы х порядка 15х20 на матрицу y порядка 20х10.
Алгоритм и программа решения данной задачи представлены на рис. 4.8.2-7.
Произведением p матрицы x порядка m х n на матрицу y порядка n х k называется матрица порядка m х k, в которой элемент, стоящий на пересечении i-й строки и j-ого столбца, равен произведению i-го вектора-строки матрицы x на j-й вектор-столбец матрицы y.
Произведением
вектора-строки a
на вектор-столбец b
с одинаковым числом элементов n
называется сумма произведений
соответствующих элементов этих векторов
.
Таким образом, произведение двух матриц
можно записать следующим образом:
Из определения следует, что в нашем случае матрица p будет иметь порядок 15х10. Для формирования такой матрицы необходимо организовать вложенные циклы: внешний цикл, изменяющий номер строки от 0 до m, и внутренний цикл, изменяющий номер столбца от 0 до k. Для вычисления произведения текущей строки матрицы x на текущий столбец матрицы y, в теле внутреннего цикла требуется организовать еще один цикл, параметр которого меняется от 0 до n.
|
Sub Pr4827(ByRef x(,) As Single _ ByRef y(,) As Single _ ByRef p(,) As Single)
Dim nx, mx, ky, j, i, k As Integer Dim XRank, YRank As Integer Dim s As Single
XRank = x.Rank YRank = y.Rank mx = x.GetLength(0)-1 nx = x.GetLength(1)-1 ny = y.GetLength(0)-1 ky = y.GetLength(1)-1 If XRank=2 And YRank=2 And nx=ny Then ReDim p(mx,ky) For i = 0 To mx For j = 0 To ky s = 0 For k = 0 To nx s= s + x(i,k) * y(k,j) Next k p(i,j)= s Next j Next i vivodSngMac19(p, ListBox1) Else TextBox1.Text ="Проверь размерности X, Y" End If End Sub |
Рис. 4.8.2-7
На рис. 4.8.2-7 представлен общий алгоритм вычисления алгебраического произведения двух матриц размерами (mx x nx) и (nx x ky). В программу добавлена проверка на соответствие количества столбцов первой матрицы количеству строк второй матрицы, причем в схеме алгоритма она отсутствует.
