Задача 17. Ввод и вывод двумерного массива (матрицы).
Ввод матрицы с клавиатуры:
For i = 1 To 5 ‘перебираем строки
For j = 1 To 7 ‘перебираем столбцы
М(i,j) = InputBox("Введите элемент матрицы")
Next
Next
Ввод матрицы с листа Excel (матрица расположена на листе в диапазоне, например, A1:G5):
For i = 1 To 5 ‘перебираем строки
For j = 1 To 7 ‘перебираем столбцы от A до G
М(i,j) = Cells(i,j)
Next
Next
Работает вложенный цикл следующим образом. Счетчик строк i получает очередное значение (здесь вначале это 1), затем полностью выполняется цикл со счетчиком j, т.е. перебираются все элементы i-той строки. После этого значение счетчика строк увеличивается на единицу (i = i +1) и вновь полностью выполняется цикл по j, перебирающий столбцы матрицы. Процедура завершается после перебора последней строки. Если i и j поменять местами в заголовках циклов, т.е.:
For j = 1 To 7
For i = 1 To 5
A(i, j) = Cells(i, j)
Next
Next
то вначале будут перебираться все элементы первого столбца, потом второго и т. д. Вывод матрицы на лист Excel , например, в диапазон A 8: G 12:
For i = 8 To 12 ‘меняем строки, начиная с восьмой
For j = 1 To 7 ‘меняем столбцы от A до G
М(i,j) = Cells(i,j)
Next
Next
Задача 18. Занести отрицательные элементы массива A ( NxM ) в массив B и напечатать его.
Решение. Алгоритм задачи состоит из трех частей: ввести матрицу A; проверить каждый ее элемент: если он отрицательный, поместить его в массив B; вывести полученный массив B на печать. Первая и третья части – ввод и вывод данных решаются стандартным способом ввода и вывода массивов. Вторая часть – основа решения, рассмотрим ее подробнее. Анализ элементов A(i,j) матрицы A можно провести, как обычно для матриц, с помощью вложенных циклов For, перечисляющих все строки (i) и столбцы (j) матрицы. Если A(i,j) – отрицательный, нужно присвоить очередному элементу массива B это значение. Здесь проблема (и источник ошибок) в том, как определить очередной элемент массива B. Поскольку заранее количество отрицательных элементов в A неизвестно, то заранее неизвестна и точная длина массива B. Очевидно только, что она не превысит NxM – количества элементов исходной матрицы A. Ясно так- же, что счетчик элементов массива B никак не зависит от очередных i и j. Отсюда следует главный вывод для решения задач такого типа: для массива- приемника необходимо завести свой, независимый счетчик элементов. Отведем для него отдельную переменную. Пусть это будет k. При записи отрицательно- го A(i,j) в B(k) счетчик k будет увеличиваться на единицу, и по окончании всей работы значение k покажет истинную длину массива B. Для примера в программе взята исходная матрица A размером N=4, M=6. Вся программа имеет вид:
Sub Перенос()
Dim A(4, 6) As Integer, B(24) As Integer, k As Integer
For i = 1 To 4
For j = 1 To 6
A(i,j)=InputBox("Введите значение элемента матрицы ")
Cells(i,j)= A(i,j) ‘вывод вводимой матрицы на лист Excel для наглядности
Next
Next
k = 0 ‘обнуление счетчика элементов массива В перед началом его заполнения
For i = 1 To 4
For j = 1 To 6
If A(i, j) < 0 Then
k = k + 1
B(k) = A(i, j)
End If
Next
Next
For i = 1 To k
Cells(7, i) = B(i) ‘вывод массива В на лист Excel в строку 7
Next
End Sub
Эту программу можно написать короче, совместив анализ с вводом и выводом и сократив, соответственно, количество внешних циклов с трех до одного:
Sub Перенос()
Dim A(4, 6) As Integer, B(24) As Integer, k As Integer
k = 0
For i = 1 To 4
For j = 1 To 6
A(i,j)=InputBox("Введите значение элемента матрицы")
Cells(i, j) = A(i, j)
If A(i, j) < 0 Then
k = k + 1
B(k) = A(i, j)
Cells(7, k) = B(k)
End If
Next
Next
End Sub