Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Базовые алгоритмы обработки двумерных

Поиск

Массивов

 

Для работы с массивами, как правило, используются алгоритмы регулярной циклической структуры.

К базовым алгоритмам обработки двумерных массивов можно отнести алгоритмы:

· Нахождение количества элементов матрицы при заданном условии
(Пример 4.8.2-1).

· Нахождение суммы значений элементов матрицы при заданном условии (Пример 4.8.2-2).

· Нахождение произведения значений элементов матрицы при заданном условии (Пример 4.8.2-3).

· Поиск экстремальных значений элементов матрицы
(Пример 4.8.2-4 – 4.8.2-5).

· Формирование матрицы в соответствии с определенными правилами (Пример 4.8.2-6 – 4.8.2-7).

· Формирование одномерного массива из двумерного в соответствии с некоторым условием ((Пример 4.8. 2-8)).

· Транспонирование матриц ((Пример 4.8.2-9)).

· Произведение двух матриц ((Пример 4.8.2-10)).

 

Пример 4.8.2-1. Написать процедуру, которая определяет количество элементов матрицы a(,) при условии a(i,j) > 0.

Function Pr821(ByRef a(,)) As Integer Dim kol As Integer = 0 For i = 1 To a.GetLength(0) – 1 For j = 1 To a.GetLength(0) – 1 If a (i,j) > = 0 Then kol = kol + 1 Next j Next i Return kol END Function

 

Рис. 4.8.2-1. Программный код процедуры Pr821()

Примера 4.8.2-1

Пример 4.8.2-2. Написать процедуру, которая вычисляет сумму значений элементов матрицы b(,) для элементов b(i,j) > 0.

 

Function Pr822(ByRef b(,) As Single Dim i, j, sum As Single sum = 0 For i = 1 To b.GetLength(0) – 1 For j = 1 To b.GetLength(1) – 1 If b(i,j) > 0 Then sum = sum + b(i,j) Next j Next i Return sum END Function

 

Рис. 4.8.2-2. Программный код процедуры Pr822()

Примера 4.8.2-2

Пример 4.8.2-3. Написать процедуру, которая вычисляет произведение значений элементов матрицы для элементов x(i,j) < 0.

Function Pr823(ByRef x(,) As Single Dim i, j As Integer Dim proizv As Single proizv = 1 For i = 1 To x.GetLength(0) – 1 For j = 1 To x.GetLength(1) – 1 If a(i, j) < 0 Then proizv = proizv * a(i, j) Next Next END Function

 

Рис. 4.8.2-3. Программный код процедуры Pr823()

Примера 4.8.2-3

 

Пример 4.8.2-4. Написать процедуру, которая определяет максимальный элемент среди элементов, лежащих ниже главной диагонали массива.

В переменной xmax в цикле фиксируется мак­симальный элемент массива, в переменной imax, jmax – номер строки и номер столбца.

Sub Pr824(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

 

Рис. 4.8.2-4. Программный код процедуры Pr824()

Примера 4.8.2-4

 

Пример 4.8.2-5. Написать процедуру, которая определяет минимальный элемент, лежащий выше главной диагонали матрицы.

Алгоритм и программный код процедуры представлен на рис. 4.8.2-5.

 

Sub Pr825(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

Рис. 4.8.2-5. Программный код процедуры Pr825()

Примера 4.8.2-5

Пример 4.8.2-6. Написать процедуру, которая заполняет элементы массива f(5,2) целыми числами, а затем переставляет элементы первого и последнего столбцов.

     
     
     
     
     
     

Алгоритм и код программы приведены на
рис. 4.8.2-6.

     
     
     
     
     
     

Данный пример демонстрирует заполнение массива целых чисел f(,) и перестановку элементов первого и последнего столбцов. Исходные данные для инициализации массива f(,) записываются в фигурных скобках при описании массива. Вложенные циклы обеспечивают перебор элемен­тов двумерного массива по столбцам: внутренний цикл по пер­вому индексу, а внешний по второму. Перестановка элементов первого и последнего столбцов в программе вы­полняется в цикле, изменяющем номер строки i, в котором выполняется обмен значениями элементов f(i,0) и f(i,2).

После этого мас­сив выводится на экран в следующем виде:

 

 

Sub Pr826() Dim i, j, r, c1, c2 As Integer Dim f(,) As Integer={{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}, _ {13,14,15},{16,17,18}} c1 = 0: c2 = 2 'номера столбцов vivodIntMac20(f, TextBox1)'Вывод мас. Pr826(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-6. Программный код процедуры Pr826() Примера 4.8.2-6

Пример 4.8.2-7. Написать процедуру, которая формирует двумерный массив x по правилу: x(i,j) = 2*(i - 2) 2 - (j - 2)2).

Алгоритм и процедура данной задачи приведены на рис. 4.8.2-7.

 

'Формирование двумерного массива x(,) Sub Pr827(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) = CSng(2 * (i - 2) ^ 2 - (j - 2) ^ 2) Next Next End Sub

 

Рис. 4.8.2-7. Программный код процедуры Pr827()

Примера 4.8.2-7

 

Пример 4.8.2-4.8. Написать процедуру, которая формирует одномерный массив, каждый элемент которого представляет собой количество положительных элементов соответствующего столбца массива b(,).

 

Sub Pr828(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 End Sub

Рис. 4.8.2-8. Программный код процедуры Pr828()

Примера 4.8.2-8

Предполагается, что выделение памяти и ввод массива b(,) осуществляются в процедуре, которая вызывает процедуру Pr828().

Алгоритм и код программы представлены на рис. 4.8.2-5.

Для перебора всех элементов исходной таблицы b(,) также использованы вложенные циклы, в данном случае во внешнем цикле меняется но­мер столбца, а во внутреннем – номер строки. Такой порядок перебора элементов двумерного массива диктуется условиями задачи. В каждом столбце про­изводится подсчет положительных элементов, и по окончании цикла ре­зультат записывается в соответствующий элемент одномерного массива а(), номер которого совпадает с номером столбца матрицы b(,).

Пример 4.8.2-9. Написать процедуру, которая из матрицы х(n,m), являющейся входным параметром, получает транспонированную к ней матрицу y(m, n).

Алгоритм и процедура приведены на рис. 4.8.2-9.

Для решения поставленной задачи в алгоритме необходимо реализовать вложенные циклы перебора всех элементов исходной матрицы х(,). Транспонирование матрицы осуществляется путем перестановки (обмена) индексов транспонированной матрицы по отношению к исходной.

 

Sub Pr829(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 End Sub

 

Рис. 4.8.2-9. Программный код процедуры Pr829()

Примера 4.8.2-9

 

Пример 4.8.2-10.Написать процедуру, которая вычисляет алгебраическое произ­ведение матрицы х(n,m) на матрицу y(m,n).

Алгоритм и процедура решения задачи представлены на рис. 4.8.2-10.

Произведением матрицы x(n,m) на матрицу y(m,k) называется матрица p(m,k), в которой элемент, стоящий на пересечении i -й строки и j -го столбца, равен произведению i -го вектора-строки матрицы x(n,m) на j -й вектор-столбец матрицы y(m,k).

Произведением вектора-строки a(n) на вектор-столбец b с одинаковым числом элементов n называется сумма произведений соответствующих элементов этих векторов . Таким образом, произведение двух матриц можно записать следующим образом:

Sub Pr8210(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="Проверь размерности" End If End Sub

Рис. 4.8.2-10. Программный код процедуры Pr8210()

Примера 4.8.2-10

 

Для формирования такой матрицы необходимо организовать вложенные циклы: внешний цикл, изменяющий номер строки от 0 до m, и внутренний цикл, изменяющий номер столбца от 0 до k. Для вычисления произведения текущей строки матрицы x(i,t) на текущий столбец матрицы y(t,j) в теле внутреннего цикла требуется еще один цикл, параметр которого меняется от 0 до n.

На рис. 4.8.2-10 представлен общий алгоритм вычисления алгебраического произведения двух матриц размерами (mx*nx) и
(nx*ky). В программу добавлена проверка на соответствие количества столбцов первой матрицы количеству строк второй матрицы, причем в схеме алгоритма она отсутствует.

 

Пример 4.8.2-11. Создать проект, в котором формируется двумерный массив x, состоящий из четырех строк и четырех столбцов, по правилу: x(i,j)=2*(i-2)2-(j-2)2, а затем определяется максимальный элемент среди элементов, лежащих ниже главной диагонали, а также минимальный элемент, расположенный выше главной диагонали. Найденные максимальный и минимальный элементы необходимо поменять местами.

Формирование значений элементов двумерного массива x(,) по заданной формуле и их вывод в виде матрицы производятся с помощью вложенных циклов. В переменных xmin и xmax в цикле фиксируются минимальный и мак­симальный элементы массива, в переменных imin, jmin и imax, jmax – их координаты (номер строки и номер столбца).

Программный код проекта представлен на рис. 4.8.2-11.

 

Option Strict On Option Explicit On Public Class Form1 'Формирование двумерного массива x(,) Sub Form(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) = CSng(2 * (i - 2) ^ 2 - (j - 2) ^ 2) Next Next End Sub 'Процедура форматного вывода двумерного массива в ListBox Sub vivod1(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 LB.Items.Add(z) Next End Sub 'Процедура вывода результата в TextBox Sub vivod3(ByVal Z As Double, ByRef T As TextBox) T.Text = CStr(Z) End Sub 'Процедура вывода данных типа Integer в TextBox Sub vivod4(ByVal Z As Integer, ByVal T As TextBox) T.Text = CStr(Z) End Sub 'Нахождение max элемента и его индексов, 'лежащих ниже главной диагонали Sub MaxN(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 Next End Sub 'Нахождение min элемента и его индексов, 'лежащих выше главной диагонали Sub MinV(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 Next 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 'Основная процедура Sub Pr8211(ByRef x(,) As Single, ByRef xmin As Single, _ ByRef xmax As Single) Dim imin, jmin, imax, jmax As Integer Form(x) 'Формирование двумерного массива x(,) vivod1(x, ListBox1) MaxN(x, xmax, imax, jmax) vivod3(xmax, TextBox1) vivod4(imax, TextBox2) vivod4(jmax, TextBox3) MinV(x, xmin, imin, jmin) vivod3(xmin, TextBox4) vivod4(imin, TextBox5) vivod4(jmin, TextBox6) Ob(x, imax, jmax, imin, jmin) vivod1(x, ListBox2) 'Вывод преобразованного массива End Sub Private Sub Button1_Click(sender As Object, _ e As EventArgs) Handles Buton1.Click Dim xx(3, 3) As Single Dim xm1, xm2 As Single Pr8211(xx, xm1, xm2) End Sub End Class

 

Рис. 4.8.2-11. Программный код проекта Пример 4.8.2-11

 

 


4.8.3. Тестовые задания



Поделиться:


Последнее изменение этой страницы: 2016-12-27; просмотров: 291; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.69.134 (0.009 с.)