Двумерный массив – это массив, у которого количество индексов равно
Тема 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, который выделяет место в памяти для размещения элементов статического массива. Например:
Необходимо обратить внимание на то, что, как при описании – 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