|
Операции с двумерными массивами (матрицами)
Двумерным называется массив, у которого размерность равна 2. Фактически он представляет собой таблицу состоящую из строк и столбцов. Двумерные массивы, у которых значения индексов одинаковые, т.е. число строк равно числу столбцов, называют квадратной матрицей. При работе с квадратными матрицами используются специальные математические понятия, значение которых рассмотрим на примере матрицы размерами 4х4 – B(4,4): j = i – элемент находится на главной диагонали ( ); j = n - i + 1 (n – размерность матрицы) – элемент находится на побочной диагонали ( ); i < j – элемент находится над главной диагональю ( , , , , , ); i > j – элемент находится под главной диагональю ( , , , , , ). Транспонированной матрицей В(n, n) называется такая квадратная матрица, у которой столбцы соответствуют строкам исходной квадратной матрицы А(n, n): Элементы главной диагонали у матриц А и В одни и те же. Следовательно операция транспонирования матрицы А сводится к перестановке строк матрицы. Dim a() As Single Dim b() As Single n = 5 ReDim a(n, n): ReDim b(n, n) For i = 1 To n For j = 1 To n a(i, j) = Cells(i, j) b(j, i) = a(i, j) 'транспонирование матрицы Next j Next i For i = 1 To n For j = 1 To n Cells(n + 1 + i, j) = b(i, j) 'вывод результата Next j Next i Результат программы:
35. Пример 2. Ввести массив А из 10 элементов. Найти максимальный элемент массива и его положение. Если таких элементов несколько, то вывести положение всех.
В этом примере переменная max используется для запоминания текущего максимального элемента с обновлением – в случае необходи-мости – по мере перебора всех элементов, imax – для фиксации положения максимального элемента.
Sub primer_2() Dim a(10) As Single Dim i As Byte, max As Single, imax As String 'заполнение массива числами For i = 1 To 10 a(i) = Cells(1, i) Next i 'инициализация переменных max, imax max = a(1): imax = "1" 'поиск максимального элемента и его местоположения For i = 2 To 10 If a(i) > max Then max = a(i) imax = i ElseIf a(i) = max Then imax = imax & ", " & i End If Next i 'Команда MsgBox...записывается в редакторе VB в одну строку MsgBox "Максимальный элемент = " & max & ", его местоположение (ия) " & imax, , "Решение задачи" End Sub Результат выполнения программы:
Программа для решения этой же задачи, но для любого количества элементов в массиве выглядит так:
Sub primer_2() Randomize Timer Dim a() As Single Dim i As Byte, n As Byte, max As Single Dim imax As String, massiv As String massiv = "" n = InputBox("Введите размер массива", "Запрос программы") ReDim a(n) 'заполнение массива случайными числами For i = 1 To n a(i) = 50 - Int(Rnd() * 1000)/10 massiv = massiv & a(i) & Chr(9) Next i 'инициализация переменных max, imax max = a(1): imax = "1" 'поиск максимального элемента и его местоположения For i = 2 To n If a(i) > max Then max = a(i) imax = i ElseIf a(i) = max Then imax = imax & ", " & i End If Next i 'Команда MsgBox...записывается в редакторе VB в одну строку MsgBox "Исходный массив:" & Chr(13) & massiv & Chr(13) & "Максимальный элемент = " & max & ", его местоположение (ия) " & imax, , "Решение задачи" End Sub Результат выполнения программы:
38. Дана матрица А(n, m). Отсортировать каждую строку в порядке возрастания.
Для решения задачи: 1) вводим размеры массива А(n, m) и значения его элементов; 2) просматриваем строки массива и упорядочиваем их; 3) выводим матрицу. Для решения этой задачи воспользуемся алгоритмом упорядочивания одномерного массива. Сравниваем между собой первый и второй элементы строки массива и переставляем их, если это необходимо в порядке возрастания. Затем то же самое проделываем со вторым и третьим элементами и т.д. до конца строки массива. В результате этих сравнений и перестановок наибольшее число строки окажется последним. Второй этап сравнений и перестановок будем производить для (n – 1) элементов строки, начиная с первого. В этом случае предпоследним окажется наибольший из (n – 1) членов строки массива. Уменьшая каждый раз количество рассматриваемых элементов на единицу, операции сравнения и перестановок закончим тогда, когда останется всего один элемент строки массива. Подобные операции выполняем для каждой строки по отдельности. Перестановку элементов будем осуществлять с помощью промежу-точной переменной prom.
Sub primer_12() Dim a() As Integer Dim n As Integer, m As Integer, i As Integer Dim j As Integer,prom As Integer, k As Integer n = Cells(1, 4) m = Cells(2, 4) ReDim a(n, m) 'очистка рабочего листа от посторонних надписей For i = 1 To 10 * n For j = 1 To 10 * n Cells(i + 2, j) = "" Next j Next i 'заполнение массива случайными целыми числами 'вывод массива в рабочий лист Excel Cells(4, 1) = "Исходный массив:" For i = 1 To n For j = 1 To m a(i, j) = 50 - Int(Rnd() * 100) Cells(i + 4, j) = a(i, j) Next j Next i 'сортировка двумерного массива по строкам For i = 1 To n 'сортировка строки массива For k = m - 1 To 1 Step -1 For j = 1 To k If a(i, j) > a(i, j + 1) Then 'перестановка соседних элементов массива prom = a(i, j) a(i, j) = a(i, j + 1) a(i, j + 1) = prom End If Next j Next k Next i 'вывод на печать массива с отсортированными строками Cells(n + 6, 1) = "Преобразованный массив:" For i = 1 To n For j = 1 To m Cells(i + n + 6, j) = a(i, j) Next j Next i End Sub Результат выполнения программы: 39. Пример 13. Дана матрица А(n, m). Отсортировать каждый столбец в порядке убывания.
Sub primer_13() Dim a() As Integer Dim n As Integer, m As Integer, i As Integer Dim j As Integer,prom As Integer, k As Integer n = Cells(1, 4) m = Cells(2, 4) ReDim a(n, m) 'очистка рабочего листа от посторонних надписей For i = 1 To 10 * n For j = 1 To 10 * m Cells(i + 2, j) = "" Next j Next i 'заполнение массива случайными целыми числами 'вывод массива в рабочий лист Excel Cells(4, 1) = "Исходный массив:" For i = 1 To n For j = 1 To m a(i, j) = 50 - Int(Rnd() * 100) Cells(i + 4, j) = a(i, j) Next j Next i ' сортировка двумерного массива по столбцам For j = 1 To m 'сортировка столбцов массива For k = n - 1 To 1 Step -1 For i = 1 To k If a(i, j) < a(i + 1, j) Then 'перестановка соседних элементов массива prom = a(i, j) a(i, j) = a(i + 1, j) a(i + 1, j) = prom End If Next i Next k Next j 'вывод на печать массива с отсортированными строками Cells(n + 6, 1) = "Преобразованный массив:" For i = 1 To n For j = 1 To m Cells(i + n + 6, j) = a(i, j) Next j Next i End Sub Результат выполнения программы: Типы процедур Процедура – это законченная часть программы, предназначенная для решения определенной задачи. Процедура является самостоятельной частью кода, которая имеет имя и может содержать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов Существует два вида процедур: · Функция, определяемая пользователем – это функция, которая создается пользователем, а не входит в стандартный набор; функция определяемая пользователем также располагаемся отдельно от основной программы. · Подпрограмма – представляет собой определенный набор операторов, составленный пользователем и расположенный отдельно от основной программы. Отличие функции от подпрограммы состоит в том, что: – функция обязательно должна возвращать (передавать результат вычисления) результат в основную программу; – имя функции должно иметь спецификатор типа для определения типа самой функции.
|
|
|