Введение 8 Этапы создания Windowsприложения 8
Скачать 6.98 Mb.
|
8.4. Обработка матрицы по строкамОбработка прямоугольной матрицы может вестись двумя способами: по строкам и по столбцам. Как правило, способ обработки определяется условием решаемой задачи. При обработке по строкам вложенные циклы организуются таким образом, чтобы за один шаг внешнего цикла полностью обрабатывалась одна строка матрицы. В этом случае внешний цикл будет идти по строкам матрицы, а внутренний – по столбцам. В качестве примера рассмотрим задачу вычисления среднего арифметического четных элементов в каждой строке матрицы. Для решения этой задачи необходимо в каждой строке матрицы вычислить свою сумму и количество четных элементов. Затем, если это возможно, найти среднее арифметическое. Если же в какой-то строке матрицы нет четных элементов, то вместо среднего арифметического мы будем печатать поясняющее сообщение. Результаты работы программы будем выводить в окно списка. Начнем с объявления необходимых переменных. Переменные sum и kol, имеющие целочисленный тип данных, предназначены для хранения суммы и количества четных элементов в одной строке матрицы. Dim sum, kol As Integer Так как среднее арифметическое получается в результате деления, то соответствующая переменная всегда будет иметь рациональный тип данных. Dim sred As Single Для каждой строки матрицы мы будем получать отдельный результат. Поэтому удобно совместить процессы вычисления и вывода в одном цикле. Чтобы результаты вычислений зрительно отделялись от исходных данных, выведем горизонтальную черту. lstMatrix.Items.Add("-----------------------------") Результаты вычислений мы будем выводить в две колонки. В первой будет указываться номер обрабатываемой строки матрицы, а во второй – найденное значение среднего арифметического четных элементов. Выводим поясняющий заголовок. Константа vbTab позволяет организовать вывод в две колонки. lstMatrix.Items.Add("Строка" + vbTab + _ "Сред. арифм.") Так как по условию задачи требуется, чтобы каждая строка матрицы обрабатывалась отдельно, то обработку матрицы будем вести по строкам. Для этого организуем внешний цикл по строкам, а внутренний – по столбцам. For i = 0 To m За один шаг внешнего цикла мы будем полностью обрабатывать одну строку матрицы. Для этого мы будем использовать внутренний цикл. Следовательно, начальные значения для суммы и количества необходимо задать до него. sum = 0 kol = 0 Организуем внутренний цикл. Нам необходимо обработать все элементы, находящиеся в i-й строке матрицы. Для этого мы должны пройтись по всем столбцам матрицы. Соответственно, внутренний цикл будет по столбцам. For j = 0 To n На каждом шаге цикла анализируем элемент матрицы. If a(i, j) Mod 2 = 0 Then Если его значение при делении на 2 дает в остатке ноль, значит, оно четное, и данный элемент надо добавить к сумме. При этом количество четных элементов в данной строке матрицы увеличивается на единицу. sum += a(i, j) kol += 1 End If Next После завершения внутреннего цикла можно приступать к вычислению среднего арифметического четных элементов в одной строке матрицы. Сначала анализируем количество четных элементов. If kol = 0 Then Если количество четных элементов равно нулю, значит, их в рассматриваемой строке нет ни одного четного элемента. Следовательно, вычислить их среднее арифметическое невозможно. Поэтому вместо ответа выводим номер строки и поясняющее сообщение. lstMatrix.Items.Add(Str(i) + vbTab + _ "В строке нет четных") Else Иначе мы делим сумму четных элементов на их количество и получаем искомое значение. sred = sum / kol В окно списка выводим номер строки и найденное значение среднего арифметического четных элементов в этой строке. lstMatrix.Items.Add(Str(i) + vbTab + _ Str(sred)) End If Next Полный текст программы представлен в приложении 39. Пример работы программы приведен на рис. 54. Рис. 54. Пример работы программы поиска среднего арифметического четных элементов в каждой строке прямоугольной матрицы 8.5. Обработка матрицы по столбцамОбработка матрицы по столбцам практически ничем не отличается от обработки матрицы по строкам. Единственное различие – в порядке вложенных циклов. При обработке матрицы по столбцам внешний цикл организуют по столбцам, а внутренний – по строкам. В качестве примера рассмотрим задачу поиска минимального элемента в каждом столбце матрицы. Полученные результаты запишем в одномерный массив, который затем выведем в окно списка. Решение задачи начнем с описания переменных. Нам потребуется переменная для хранения минимального значения в отдельном столбце матрицы. Очевидно, что она будет иметь такой же тип данных, что и элементы исходной матрицы. Dim min As Integer Так как все найденные значения будут записываться в одномерный массив, то нам необходимо его объявить. Dim b() As Integer Сразу зададим размер результирующего массива. Поскольку мы ищем минимум в каждом столбце по отдельности, то количество результатов всегда будет совпадать с количеством столбцов матрицы. Таким образом, номер последнего элемента в массиве результатов будет равен номеру последнего столбца матрицы. ReDim b(n) Организуем вложенные циклы. Так как по условию задачи требуется обработать каждый столбец по отдельности, то внешний цикл будет идти по столбцам матрицы. For j = 0 To n Каждый столбец матрицы мы будем рассматривать как одномерный массив. Поэтому задача поиска минимального элемента в одном столбце матрицы решается точно также как задача поиска минимального элемента в одномерном массиве. Поиск начинается с нулевого элемента столбца. Этот элемент находится в нулевой строке и j-м столбце, где j – счетчик внешнего цикла. min = a(0, j) Обрабатываем все остальные элементы j-го столбца. Для этого мы должны пройти по всем строкам, входящим в этот столбец. Следовательно, внутренний цикл организуем по стокам. Чтобы не сравнивать нулевой элемент столбца с самим собой внутренний цикл начнем с первой строки. For i = 1 To m Анализируем очередной элемент столбца. If a(i, j) < min Then Если его значение меньше ранее найденного минимума, значит, значение минимума надо обновить, записав в соответствующую переменную значение текущего элемента матрицы. min = a(i, j) End If Next После завершения внутреннего цикла в переменной min хранится значение минимального элемента в j-м столбце. Это значение мы должны записать в результирующий массив на j-ю позицию. b(j) = min Next После завершения вложенных циклов результирующий массив полностью сформирован, и мы должны вывести его в окно списка. Чтобы зрительно отделить исходные данные от полученных результатов выведем горизонтальную черту. lstMatrix.Items.Add("-----------------------------") Выводим поясняющий заголовок. В первой колонке мы будем печатать номер столбца, а во втором – значение минимального элемента в этом столбце. Константа vbTab позволит нам организовать вывод в две колонки. lstMatrix.Items.Add("Столбец" + vbTab + "Минимум") Организуем цикл для вывода массива b(). Так как количество элементов в этом массиве совпадает с количеством столбцов в матрице, то значение счетчика будет изменяться в диапазоне от 0 до n, где n – номер последнего столбца матрицы. For i = 0 To n На каждом шаге цикла выводим номер элемента массива (он же – номер столбца матрицы) и значение элемента массива – это минимальный элемент в данном столбце матрицы. lstMatrix.Items.Add(Str(i) + vbTab + Str(b(i))) Next Полный текст программы представлен в приложении 40. Пример работы программы приведен на рис. 55. Рис. 55. Пример работы программы поиска минимального элемента в каждом столбце прямоугольной матрицы |