Двумерный массив – это массив, у которого количество индексов равно
Тема 4.8
Программирование алгоритмов
формирования и обработки
двумерных массивов
4.8.1. Средства описания и работы с двумерными
массивами данных
При решении математических, экономических, статистических задач информация располагается в матрицах и таблицах, которые являются прототипом двумерного массива в программировании. Если в одномерных массивах каждый элемент содержит только один индекс, то в двумерных массивах каждый элемент имеет два индекса – номера строки и номера столбца.
Из предыдущей темы известно, что массив представляет собой последовательность переменных одинакового типа, объединенных общим именем.
Количество индексов (измерений) указывает на размерность (ранг) массива. Например, двумерный массив b(3,2):
b(0,0) | b(0,1) | b(0,2) |
b(1,0) | b(1,1) | b(1,2) |
b(2,0) | b(2,1) | b(2,2) |
b(3,0) | b(3,1) | b(3,2) |
Так, в приведенном выше примере размерность массива b(3,2)– 2,т.е. массив двумерный (имеет два измерения). В нашем примере количество элементов массива b(3,2)равно 12 (4 строки и 3 столбца).
Перед использованием двумерного массива в программе, его необходимо объявить с помощью оператора Dim, который выделяет место в памяти для размещения элементов статического массива. Например:
Dim b(3,2) As Single |
Необходимо обратить внимание на то, что, как при описании – A(m,n), так и при обращении – A(i,j)к элементам двумерного массива, в скобках сначала указывается номер строки, а затем номер столбца (рис. 4.8.1-1).
Для определения параметров двумерного массива могут использоваться свойство класса Array– Rank и метод класса Array – GetLength().Свойство Rank используется для определения количества измерений (ранга) массива (для двумерного массива ранг равен 2). Причем каждое измерение в массиве может иметь свою длину. Метод GetLength()используется для определения количества элементов в заданном измерении массива (для первого измерения используется значение 0, для второго – 1 и т.д.). Необходимо обратить внимание, что метод GetLength() возвращает значение, которое на единицу больше, чем указанное в объявлении Dim, так как индексация элементов массива в VBвсегда начинается с нуля, а метод GetLength() определяет количество элементов, считая от единицы.
Матрица прямоугольная A(n,m) - n¹m Матрица квадратная A(n,m) - n=m
|
Побочная диагональ Главная диагональ матрицы i=n-j матрицы i= j |
Рис. 4.8.1-1. Прямоугольная и квадратные матрицы
Так, для определения параметров массива Mac1(,), описанного как
Dim Mac1(4,7) As Integer |
можно воспользоваться следующими выражениями:
ArrayRank = Mac1.Rank RawCount = Mac1.GetLength(ArrayRank-2) ColumnCount= Mac1.GetLength(ArrayRank-1) |
Где ArrayRank – ранг матрицы (равен 2);
RawCount – количество строк (равно 5);
ColumnCount– количество столбцов (равно 8).
Таким образом, ArrayRank, RawCount, ColumnCount являются переменными целочисленного типа, которые принимают значения 2, 5 и 8.
Кроме того, для определения параметров двумерного массива можно использовать метод GetUpperBound(), который находит верхнюю границу (максимальный индекс) заданного измерения. В качестве параметра этот метод принимает значения аналогично методу GetLength(), т.е. для первого измерения (строк) используется значение 0, для второго (столбцов) – 1.
Например, для массива Mac2(4,7):
Dim Mac2(4,7) As Double Dim Cтрока1, Столбец2 As Integer Строка1 = Mac2.GetUpperBound(0)'Значение Строка1 'равно 4 Столбец2 = Mac2.GetUpperBound(1)'Значение Столбец2 'равно 7 |
Ввод, вывод и обработка двумерных массивов, как правило, основаны на использовании вложенных циклов, которые обеспечивают перебор всех элементов массива. В некоторых задачах может иметь значение порядок перебора элементов массива: «по строкам» или «по столбцам». Если внешний цикл будет организован по первому индексу (по строкам), а внутренний цикл по второму индексу (по столбцам), то выполняется построчный перебор элементов двумерного массива. Если внешний цикл в качестве параметра использует второй индекс, а внутренний цикл – первый индекс, то элементы массива перебираются по столбцам.
Пример 4.8.1-1. Написать процедуры ввода/вывода, которые могут использоваться в алгоритмах обработки двумерных массивов.
Некоторые процедуры ввода и вывода приведены в Темах 4.3, 4.4, 4.5, 4.6 и 4.7. Остальные процедуры ввода и вывода, которые можно использовать при написании базовых алгоритмов формирования и обработки двумерных массивов, представлены на рис. 4.8.1-2, 4.8.1-3, 4.8.1-4 и 4.8.1-5.
'Процедура ввода элементов двумерного массива Single с клавиатуры Sub vvodSngMac18(ByRef a(,) As Single) Dim i, j, m, n As Integer, y As Single m = a.GetLength(0) – 1 : n = a.GetLength(1) - 1 Dim r1, r2 As String For i = 0 To m For j = 0 To n r1 = СStr(i) : r2 = СStr(j) y = InputBox("эл-т массива a(" + r1 + "," + r2 + ") = ", _ "Ввод эначений эл-тов массива a()") a(i,j) = CSng(Val(y)) Next j Next i End Sub |
Рис. 4.8.1-2. Процедура ввода элементов двумерного массива
vvodSngMac18() Примера 4.8.1-1
'Процедура формирования двумерного массива случайными числами Sub vvod2(ByRef a(,) As Double, ByVal m As Integer, _ ByVal n As Integer) Dim i, j As Integer Randomize() For i = 0 To m For j = 0 To n a(i, j) = 10 * Rnd() - 5 Next i Next j End Sub |
Рис. 4.8.1-3. Процедура формирования массива vvod2()
случайными числами Примера 4.8.1-1
'Процедура форматированного вывода двумер-го массива в ListBox Sub vivodSngMac19(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 j LB.Items.Add(z) Next i End Sub |
Рис. 4.8.1-4. Процедура форматированного вывода массива vivodSngMac19()
Примера 4.8.1-1
На рис. 4.8.1-4 представлен пример процедуры вывода целочисленной матрицы в TextBox. Напомним, что для того, чтобы в элементе управления TextBox можно было записать несколько строк текста, необходимо присвоить его свойству MultiLine значение True.
'Процедура форматированного вывода двум-го массива Integer в TextBox Sub vivodIntMac20(ByRef x(,) As Integer, ByRef TB As TextBox) Dim i, j, m, n As Integer Dim z As String m = x.GetLength(0) – 1 : n = x.GetLength(1) - 1 TB.Text = "" For i = 0 To m For j = 0 To n If Abs(x(i,j)) >= 100 Then z = CStr (x(i,j)) & Space(2) ElseIf Abs(x(i,j)) >= 10 Then z = CStr (x(i,j)) & Space(4) Else z = CStr (x(i,j)) & Space(6) End If If x(I,j) >= 0 Then z = Space(1) + z TB.Text = TB.Text & z Next j TB.Text = TB.Text & vbCrLf Next i End Sub |
Рис. 4.8.1-5. Процедура форматированного вывода массива
vivodIntMac20в TextBox Примера 4.8.1-1
4.8.2. Базовые алгоритмы
обработки двумерных массивов
Для работы с массивами, как правило, используются алгоритмы регулярной циклической структуры.
К базовым алгоритмам обработки двумерных массивов можно отнести алгоритмы:
· Нахождение количества элементов матрицы при заданном условии
(Пример 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(,).
Function Pr821(ByRef a(,)As Integer) As Integer Dim i, j, kol As Integer = 0 For i = 1 To a.GetLength(0) – 1 For j = 1 To a.GetLength(1) – 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) As Single Dim i, j As Integer, 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) 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. Тестовые задания
Dim A (3,5) As Single
1) статический
2) динамический
3) фактический
4) вещественный
Вопросы, подлежащие изучению
1)Способы описания двумерных массивов.
2)Способы задания значений элементам двумерного массива: присваиванием; инициализацией; вводом по запросу с клавиатуры; заполнением массива данных случайными числами в заданном диапазоне.
3)Использование вложенных циклов для ввода и вывода элементов двумерного массива.
4)Методы обработки элементов двумерного массива по строкам и по столбцам.
4.8.4.2. Общее задание на разработку проекта
1) Изучите вопросы программирование алгоритмов формирования и обработки двумерных массивов (Тема 8).
2) Создайте приложение с именем Проект-8.
3) Выберите вариант задания из таблицы табл. 4.8.4-1.
4) Разработайте графический интерфейс пользователя.
5) Разработайте схемы алгоритмов процедур пользователя в соответствии с индивидуальным заданием, предварительно проведя формализацию.
6) Напишите программный код процедур в соответствии с разработанными схемами алгоритмов.
7) Разработайте проект приложения, решающий поставленную задачу, который состоит из интерфейса пользователя и соответствующего программного кода, а также написанных ранее процедур обработки и процедур ввода и вывода элементов массива. Все пользовательские процедуры должны находиться в модуле формы. Обмен данными между пользовательскими процедурами должен осуществляться через параметры, без использования глобальных переменных.
8) Подготовьте массивы чисел для решения задачи, если исходные данные не заданы.
9) Выполните приложение и получите результат.
10) Докажите правильность результата.
Варианты индивидуальных заданий
Таблица 4.8.4-1
№ | Задача |
1) | Сформируйте произвольный двумерный массив N(10,10). Из положительных элементов массива N сформировать массив M(10,max), где max – максимальное число положительных элементов строки массива N, располагая их в строках массива M подряд. Запишите нули на место отсутствующих элементов массива M. Выведите полученный массив. |
2) | Сформируйте двумерный массив L(10,8) по правилу: где r – случайное число из отрезка [0;1]. Поменяйте местами левую и правую половины этого массива. Выведите полученный массив. |
3) | Сформируйте произвольный двумерный массив L(9,9). Найдите в каждой строке наибольший элемент и поменяйте его местами с элементом главной диагонали. Выведите полученный массив. |
4) | Сформируйте произвольный двумерный массив N(12,12) по правилу: Вычислите и выведите сумму и количество положительных элементов массива, находящихся под главной диагональю. Преобразуйте матрицу, уменьшив каждый ее элемент на найденную сумму. |
5) | Сформируйте двумерный массив N(15,10) из случайных чисел, принадлежащих отрезку [-5;10]. Найдите строки с наибольшей и наименьшей суммой элементов. Выведите найденные строки и суммы их элементов. |
6) | Сформируйте двумерный массив K(8,8) по правилу: Kij=8∙(i - j)+j. Транспонируйте массив (поменяйте местами строки и столбцы), и выведите элементы главной диагонали и диагонали, расположенной под главной, разместив их в двух строках экрана |
7) | Сформируйте двумерный массив K(6,3) по правилу , где r – случайное число из отрезка [0;1]. Получите и выведите массив L(6,3), получаемый из массива K перестановкой строк: первой с последней, второй с предпоследней и т.д. |
8) | Сформируйте произвольный двумерный массив N(12,12).Вычислите и выведите сумму и кол-во положительных элементов массива, находящихся под побочной диагональю. Преобразуйте матрицу, увеличив каждый ее элемент на найденную сумму. |
9) | Сформируйте произвольный двумерный массив M(8,8). Найдите в каждой строке массива максимальный и минимальный элементы и поменять их местами соответственно с первым и последним элементами строки. Выведите полученный массив. |
10) | Сформируйте двумерный массив K(10,12) из случайных чисел, принадлежащих отрезку [-5;10]. Определите в каждом столбце количество простых чисел и запишите их в соответствующий элемент одномерного массива L.Выведите массив L. |
11) | Сформируйте произвольный двумерный массив L(7,9). Поменяйте местами левую верхнюю и правую нижнюю четверти матрицы. Выведите полученный массив. |
12) | Сформируйте двумерный массив М(4,5) по правилу: , где r – случайное число из отрезка [0;1]. Вставьте после столбца с заданным номером k (0<= k <=5) столбец из единиц (значение k вводится с клавиатуры). Выведите полученный массив M. |
13) | Сформируйте двумерный массив t(4,4) по правилу: Удалите из него столбцы, содержащие элементы, меньше, чем число 10. |
14) | Сформируйте произвольный двумерный массив Z(10,4). Вычислите максимальное значение суммы модулей элементов в столбцах массива и выведите этот столбец. |
15) | Сформируйте двумерный массив A(9,3) по правилу: . Определите наименьший элемент в каждой строке массива и запишите его в соответствующий элемент одномерного массива B. Выведите массив B. |
16) | Сформируйте двумерный массив M(6,5) из случайных чисел, принадлежащих отрезку [-15;5]. Преобразуйте массив перестановкой столбцов: первого с последним, второго с предпоследним и т.д. |
17) | Сформируйте произвольный двумерный массив B(4,4). Преобразуйте матрицу, перестановкой в каждой строке наибольшего по абсолютной величине элемента с диагональным. |
18) | Сформируйте произвольный двумерный массив N(10,10). Получите и выведите одномерный массив K(10), где Ki– наименьшее из значений элементов, находящихся в начале i-ой строки массива N до элемента, принадлежащего главной диагонали включительно. |
19) | Сформируйте произвольный двумерный массив X(4,4). Получите и выведите одномерный массив Y(4), где Yi – значение первого по порядку положительного элемента i-ой строки; если такого элемента нет, то примите Yi=1. |
20) | Сформируйте двумерный массив Z(10,3) из случайных чисел, принадлежащих отрезку [-2;15]. Получите и выведите одномерный массив P, где Pi – сумма элементов, расположенных за первым отрицательным элементом в i-й строке; если все элементы строки неотрицательны, то примите Pi=100. |
21) | Сформируйте произвольный двумерный массив F(10,3). Получите и выведите одномерный массив R, где Rj – сумма элементов, предшествующих последнему отрицательному элементу j-го столбца; если все элементы столбца неотрицательны, то примите Rj= -1. |
22) | Сформируйте произвольный двумерный массив R(8,3) Найдите и выведите значение и индексы элемента, являющегося одновременно наименьшим в своей строке и наибольшим в своем столбце. При отсутствии такого элемента выведите сообщение. |
23) | Сформируйте двумерный массив N(5,7) по правилу: Вставьте после строки с заданным номером k (0<= k <=5) строку из нулей (значение k вводится с клавиатуры). |
24) | Сформируйте произвольный двумерный массив M(5,7) Поменяйте местами строки, содержащие максимальный и минимальный элементы. Если минимум и максимум принадлежат одной строке, то поменяйте местами соответствующие столбцы. |
25) | Сформируйте произвольный двумерный массив K(8,4).Преобразуйте массив путем удаления из массива K строки и столбца, на пересечении которых находится наибольший элемент. |
26) | Сформируйте двумерный массив M(7,7) по правилу: , где r – случайное число из отрезка [0;1]. Введите одномерный массив K = {-5, -3, -1, 1, 3}. Замените нулями в массиве M те элементы, для которых имеются равные среди элементов массива K. Выведите полученный массив M. |
27) | Сформируйте произвольные двумерные массивы K(3,3) и L(3,3). Получите массив M путем прибавления к элементам каждого столбца массива K произведения элементов соответствующей строки массива L. Выведите массив M. |
28) | Сформируйте двумерный массив X(4,4) по правилу: . Вставьте столбец из единиц перед столбцом, содержащим минимальный элемент матрицы. |
29) | Сформируйте двумерный массив K(7,8) по правилу: где r – случайное число из отрезка [0;1]. Вставьте строку из нулей перед строкой, содержащей максимальный элемент матрицы. |
30) | Сформируйте произвольные двумерные массивы A(4,4) и B(4,4). Получите массив R(4,4) путем умножения элементов каждой строки массива A на наибольший из элементов соответствующей строки массива B. Выведите массив R. |
Содержание отчёта
1)Тема и название лабораторной работы.
2)Фамилия, имя студента, номер группы, номер варианта.
3)Задание на разработку проекта.
4)Формализация и уточнение задания.
5)Элементы, разрабатываемого проекта:
5.1) графический интерфейс пользователя;
5.2) таблица свойств объектов;
5.3) схема алгоритма решаемой задачи;
5.4) программный код проекта.
6)Результаты выполнения проектов.
7)Доказательство правильности работы программы.
4.8.4.5. Пример выполнения задания
1) Тема и название лабораторной работы:
Программирование алгоритмов формирования и обработки двумерных массивов.
Заполнение и преобразование двумерного массива различными
способами.
2) Фамилия, имя студента, номер группы, номер варианта:
Иванов И., БИН1405, вариант 13.
3) Задание на разработку проекта:
Введите двумерный массив натуральных чисел a(m,n) и, используя различные алгоритмы заполнения массива, сформируйте его. Обработайте сформированный массив, используя различные методы, и вычислите одну из характеристик сформированного массива.
4) Формализация и уточнение задания:
В разрабатываемом приложении ввод исходного массива может осуществляться одним из следующих способов:
· вводом с клавиатуры;
· с помощью датчика случайных чисел;
· формированием по формуле.
Обработка исходного массива осуществляться одним из вариантов:
· нахождение максимального элемента в двумерном массиве;
· нахождение суммы всех элементов двумерного массива;
· нахождение суммы элементов двумерного массива по строкам;
· нахождение суммы элементов двумерного массива по столбцам;
· нахождение суммы элементов главной диагонали двумерного массива;
· нахождение суммы элементов побочной диагонали двумерного массива.
5) Элементы, разрабатываемого проекта:
5.1) Графический интерфейс пользователя:
Форма приложения может иметь такой же вид, как на рис. 4.8.4-1.
Рис. П.1.8-1. Форма проекта Проект 8:
Заполнение и преобразование двумерного массива различными способами
5.2)Таблица свойств объектов:
Установите и сведите в табл. 4.8.4-2 свойства всех объектов.
Таблица. 4.8.4-2
Имя объекта | Свойство | Значение свойства |
Form1 | Text | Form1 |
Label3 | Font | Times New Roman, Bold (Жирный), 14-point (14 пунктов) |
ForeColor | Синий | |
Name | Label3 | |
Text | Изучение двумерных массивов | |
Label4 | Font | Times New Roman, Bold (Жирный), 10-point (10 пунктов) |
Name | Label4 | |
Text | Задание | |
Label5 | Font | Times New Roman, Bold (Жирный), 10-point (10 пунктов) |
Name | Label5 | |
Text | Ввести двумерный массив A(m, n) и преобразовать массив A(m,n), используя меню | |
Label6 | Font | Times New Roman, Bold (Жирный), 14-point (14 пунктов) |
ForeColor | Синий | |
Name | Label6 | |
Text | Исходный массив a(m,n) | |
Label7 | Font | Times New Roman, Bold (Жирный), 14-point (14 пунктов) |
ForeColor | Синий | |
Name | Label7 | |
Text | Результат: | |
Label8 | ForeColor | Red(Красный) |
Name | Label8 | |
Text | Задайте кол-во строк (m) и столбцов(n) массива | |
Label10 | Font | 10 пунктов |
Name | Label10 | |
Text | Заполнение массива | |
Label11 | AutoSize | False |
ForeColor | Синий | |
Name | Label11 | |
Text | Преобразование массива | |
Label12 | Font | Times New Roman, Bold (Жирный), 10-point (10 пунктов) |
Name | Label12 | |
Text | m= | |
Label13 | Font | Times New Roman, Bold (Жирный), 10-point (10 пунктов) |
Name | Label13 | |
Text | n= | |
ComboBox1 | Items (коллекция) | Ввод массива с клавиатуры Ввод массива по генератору случайных чисел Ввод массива по формуле |
Name | ComboBox1 | |
ComboBox2 | Items (коллекция) | Найти max элемент в массиве Найти сумму всех элементов Найти сумму элементов по строкам Найти сумму элементов по столбцам Найти сумму элементов главной диагонали Найти сумму элементов побочной диагонали |
Name | ComboBox2 | |
ListBox1 | Name | ListBox1 |
Text | ListBox1 | |
ListBox2 | Name | ListBox2 |
Text | ListBox2 | |
TextBox1 | Name | TextBox1 |
Text | ||
TextBox2 | Name | TextBox2 |
Text | ||
Button2 | Name | Button2 |
Text | Выход | |
Button3 | Name | Button3 |
Text | Повторить |
5.3)Схема алгоритма решаемой задачи:
Схемы отдельных алгоритмов представлены в Теме 4.8.
5.4)Программный код проекта:
Программный код проекта приведен на рис. 4.8.4-2
Public Class Form1 Dim a(,) As Integer 'Функция ввода данных (кол. строк и столбцов) из TextBox Function vvod(ByVal T As TextBox) As Integer Return CInt(T.Text) End Function 'Процедура вывода одномерного массива с заголовком z Sub PrintL(ByRef x() As Integer, ByVal z As String, _ ByRef LB As ListBox) Dim i As Integer LB.Items.Add(" ") LB.Items.Add(z) Dim y As String = "" For i = 0 To UBound(x) y = y + CStr(x(i)) + Space(4) Next i LB.Items.Add(y) End Sub ' Процедура вывода результата с заголовком z в ListBox Sub vivodlist(ByVal c As Integer, ByVal z As String, _ ByRef Lb As ListBox) Lb.Items.Add(" ") z = z + CStr(c) Lb.Items.Add(z) End Sub 'Процедура форматированного вывода матрицы в ListBox Sub PrintMatr(ByRef x(,) As Integer, 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), "000") If x(i, j) < 0 Then z1 = Space(2) + z1 Else z1 = Space(3) + z1 End If z = z + z1 Next j LB.Items.Add(z) Next i End Sub 'Процедура ввода ма |