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

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) целыми числами таким образом, чтобы получилась следующая таблица:

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