Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
27.04.2015
Размер:
425 Кб
Скачать

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). В программу добавлена проверка на соответствие количества столбцов первой матрицы количеству строк второй матрицы, причем в схеме алгоритма она отсутствует.

Соседние файлы в папке Учебное_пособие-Раздел4-Информатика-270100з